Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IP碎片导致校验和错误消息_C#_Packet_Packet Sniffers_Pcap.net - Fatal编程技术网

C# IP碎片导致校验和错误消息

C# IP碎片导致校验和错误消息,c#,packet,packet-sniffers,pcap.net,C#,Packet,Packet Sniffers,Pcap.net,我正在使用PcapDorNetdll,我试图将我的流量分割成碎片: private IEnumerable<Packet> SplitPacket(Packet packet, int numberOfFragments) { IpV4Datagram ipV4Datagram = packet.Ethernet.IpV4; Datagram datagram = packet.Ethernet.IpV4.Payload

我正在使用
PcapDorNet
dll,我试图将我的流量分割成碎片:

private IEnumerable<Packet> SplitPacket(Packet packet, int numberOfFragments)
        {
            IpV4Datagram ipV4Datagram = packet.Ethernet.IpV4;
            Datagram datagram = packet.Ethernet.IpV4.Payload;
            TransportLayer transportlayer = GetTransportLayer(packet);
            if (transportlayer != null)
            {
                EthernetLayer ethernet = (EthernetLayer)packet.Ethernet.ExtractLayer();
                ILayer layer = packet.Ethernet.IpV4.ExtractLayer();
                IpV4Layer ipV4Layer = (IpV4Layer)packet.Ethernet.IpV4.ExtractLayer();
                ipV4Layer.HeaderChecksum = null;
                DateTime packetTimestamp = packet.Timestamp;                
                PayloadLayer payload = (PayloadLayer)packet.Ethernet.IpV4.Payload.ExtractLayer(); //extract the data

                int totalLength = payload.Length;
                int partialLength = totalLength / numberOfFragments; //split data into smaller segments
                partialLength = (partialLength / 8) * 8; //make sure it's divisible with 8
                if (partialLength == 0)
                    partialLength = 8;
                //(http://en.wikipedia.org/wiki/IPv4#Fragmentation_and_reassembly)
                ushort offset = 0; //send one by one

                while (offset < totalLength)
                {
                    int fragmentLength = partialLength; //get length for this fragment
                    IpV4FragmentationOptions options = IpV4FragmentationOptions.MoreFragments;

                    if (offset + fragmentLength >= totalLength) //is this the last fragment ? trim length if needed
                    {
                        options = IpV4FragmentationOptions.None;
                        fragmentLength = totalLength - offset;
                    }

                    byte[] newBuffer = ipV4Datagram.Payload.ToArray(); //copy the actual data into a new buffer
                    PayloadLayer newPayload = new PayloadLayer { Data = new Datagram(newBuffer, offset, fragmentLength) };
                    ipV4Layer.Fragmentation = new IpV4Fragmentation(options, offset); //change IP layer fragmentation options
                    transportlayer.Checksum = null;
                    yield return PacketBuilder.Build(packetTimestamp, ethernet, ipV4Layer, transportlayer, newPayload);
                    offset += (ushort)fragmentLength; //next offset
                }
            }
        }
private IEnumerable SplitPacket(数据包包,int numberOfFragments)
{
IpV4数据报IpV4数据报=packet.Ethernet.IpV4;
数据报数据报=packet.Ethernet.IpV4.Payload;
TransportLayer TransportLayer=GetTransportLayer(数据包);
如果(transportlayer!=null)
{
EthernetLayer ethernet=(EthernetLayer)packet.ethernet.ExtractLayer();
ILayer layer=packet.Ethernet.IpV4.ExtractLayer();
IpV4Layer IpV4Layer=(IpV4Layer)packet.Ethernet.IpV4.ExtractLayer();
ipV4Layer.HeaderChecksum=null;
DateTime packetTimestamp=packet.Timestamp;
PayloadLayer有效负载=(PayloadLayer)packet.Ethernet.IpV4.payload.ExtractLayer();//提取数据
int totalLength=有效载荷长度;
int partialLength=totalLength/numberOfFragments;//将数据分割成更小的段
partialLength=(partialLength/8)*8;//确保它可以被8整除
if(partialLength==0)
部分长度=8;
//(http://en.wikipedia.org/wiki/IPv4#Fragmentation_and_reassembly)
ushort offset=0;//逐个发送
而(偏移量<总长度)
{
int fragmentLength=partialLength;//获取此片段的长度
IpV4FragmentationOptions=IpV4FragmentationOptions.MoreFragments;
if(offset+fragmentLength>=totalLength)//这是最后一个片段吗?如果需要,修剪长度
{
选项=IPV4碎片选项。无;
碎片长度=总长度-偏移量;
}
byte[]newBuffer=ipV4Datagram.Payload.ToArray();//将实际数据复制到新的缓冲区中
PayloadLayer newPayload=new PayloadLayer{Data=new Datagram(newBuffer,offset,fragmentLength)};
ipV4Layer.Fragmentation=新IpV4Fragmentation(选项,偏移量);//更改IP层碎片选项
transportlayer.Checksum=null;
返回PacketBuilder.Build(packetTimestamp、以太网、ipV4Layer、transportlayer、newPayload);
偏移量+=(ushort)碎片长度;//下一个偏移量
}
}
}
我的输入数据包是
TCP数据包
,输出是4个数据包:3个
IPv4数据包
,最后一个是
TCP
,但我收到的数据包显示在TCP层字段下此消息:

校验和:0x5d17[不正确,应为0xabb7(可能由“TCP”引起 校验和卸载“)]

使用UDP时,似乎每个UDP数据包都被分成几个IPv4数据包,最后一个数据包是UDP,但在UDP情况下看起来很好。 我做错什么了吗


请查看原始数据包和碎片:

中似乎有一个非常类似的问题,并对代码进行了更正

我相信遵循那里的建议将有助于解决您的问题