Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 拆分数据包(碎片化)后-只有TCP数据包带有错误的TCP校验和_C#_.net_Packet - Fatal编程技术网

C# 拆分数据包(碎片化)后-只有TCP数据包带有错误的TCP校验和

C# 拆分数据包(碎片化)后-只有TCP数据包带有错误的TCP校验和,c#,.net,packet,C#,.net,Packet,我正在使用PcapDotNetdll拆分数据包,似乎TCP数据包带有错误的TCP校验和,但UDP数据包接收正常 这是我收到数据包并返回IEnumerable的代码: private IEnumerable SplitPacket(数据包包,int numberOfFragments) { IpV4数据报IpV4数据报=packet.Ethernet.IpV4; if(ipV4Datagram.Protocol==IpV4Protocol.Tcp | | ipV4Datagram.Protocol

我正在使用
PcapDotNet
dll拆分数据包,似乎
TCP数据包
带有
错误的TCP校验和
,但
UDP数据包
接收正常

这是我收到
数据包并返回
IEnumerable
的代码:

private IEnumerable SplitPacket(数据包包,int numberOfFragments)
{
IpV4数据报IpV4数据报=packet.Ethernet.IpV4;
if(ipV4Datagram.Protocol==IpV4Protocol.Tcp | | ipV4Datagram.Protocol==IpV4Protocol.Udp)
{
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层碎片选项
数据包newPacket=null;
if(packet.Ethernet.IpV4.Protocol==IpV4Protocol.Tcp)
{
TcpLayer TcpLayer=(TcpLayer)packet.Ethernet.IpV4.Tcp.ExtractLayer();
tcpLayer.Checksum=null;
newPacket=PacketBuilder.Build(packetTimestamp、以太网、ipV4Layer、tcpLayer、newPayload);
}
else if(packet.Ethernet.IpV4.Protocol==IpV4Protocol.Udp)
{
UdpLayer UdpLayer=(UdpLayer)packet.Ethernet.IpV4.Udp.ExtractLayer();
udpLayer.Checksum=null;
newPacket=PacketBuilder.Build(packetTimestamp、以太网、ipV4Layer、udpLayer、newPayload);
}
产生返回新包;
//yield return PacketBuilder.Build(packetTimestamp,ethernet,ipV4Layer,tcpLayer,newPayload);//return
偏移量+=(ushort)碎片长度;//下一个偏移量
}
}
}

知道为什么吗?

原始TCP数据包是由您的代码生成的还是由其他程序发送的?你是说输入数据包有一个错误的校验和,还是所有的输出都有一个错误的校验和?原始数据包来自没有错误校验和的Pcap文件,代码tcpLayer.checksum=null;应该计算校验和
    private IEnumerable<Packet> SplitPacket(Packet packet, int numberOfFragments)
    {
        IpV4Datagram ipV4Datagram = packet.Ethernet.IpV4;

        if (ipV4Datagram.Protocol == IpV4Protocol.Tcp || ipV4Datagram.Protocol == IpV4Protocol.Udp)
        {
            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
                Packet newPacket = null;

                if (packet.Ethernet.IpV4.Protocol == IpV4Protocol.Tcp)
                {
                    TcpLayer tcpLayer = (TcpLayer)packet.Ethernet.IpV4.Tcp.ExtractLayer();
                    tcpLayer.Checksum = null;
                    newPacket = PacketBuilder.Build(packetTimestamp, ethernet, ipV4Layer, tcpLayer, newPayload);
                }
                else if (packet.Ethernet.IpV4.Protocol == IpV4Protocol.Udp)
                {
                    UdpLayer udpLayer = (UdpLayer)packet.Ethernet.IpV4.Udp.ExtractLayer();
                    udpLayer.Checksum = null;
                    newPacket = PacketBuilder.Build(packetTimestamp, ethernet, ipV4Layer, udpLayer, newPayload);
                }

                yield return newPacket;
                //yield return PacketBuilder.Build(packetTimestamp, ethernet, ipV4Layer, tcpLayer, newPayload); //return
                offset += (ushort)fragmentLength; //next offset
            }
        }
    }