2015-01-24 6 views
0

내가 PcapDorNet DLL을 사용하고 그리고 난 내 트래픽 단편화하려고 :IP 단편화의 원인 체크섬 잘못된 메시지

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 
       } 
      } 
     } 

내 입력 패킷이 TCP packet이고 출력이 4 개 패킷 : 3 IPv4 packets와 마지막 TCP입니다하지만,이

체크섬 : 제가받은 패킷을 TCP 계층 필드 아래 메시지 쇼 0x5d17 [(? 미정 ' TCP 체크섬 오프로드 "에 의한) 부정확 0xabb7되어야한다]

UDP와 마찬가지로 모든 UDP 패킷이 여러 IPv4 패킷으로 분할되고 마지막 UDP는 UDP이지만 UDP 경우에는 잘 보입니다. 내가 잘못하고 있니?

원래 패킷 단편화 참조하십시오 http://www.filedropper.com/desktop_122

답변

0

코드에 대한 수정과 Pcap.Net site에서 매우 비슷한 질문이있을 것입니다.

나는 귀하의 문제를 해결하는 데 도움이 될 조언을 따르는 것으로 믿습니다.