2

raw socket问题包分片的跟进

如果我有一个这样实现的原始套接字:

  if ((sip_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
      {
    cout << "Unable to create the SIP sockets."<< sip_socket<<" \n";
    return -3;
      }

   if ( setsockopt(sip_socket, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) == -1)
      {
   cerr << "Unable to set option to Raw Socket.\n";
   return -4;
      };  

如果我有一个大小为 1756 的数据包(不包括 IP 标头) ,如何设置ipHdr->fragment_offset(16 位,包括 3 位标志)?
我是否需要准备两个数据包——一个大小为 1480,另一个大小为 276,然后在两个数据包上打 IP 标头?

任何人都可以指出一个示例代码吗?

4

1 回答 1

2

是的,您需要准备两个数据包,每个数据包都有自己的 IP 标头。

如果您在第一个数据包中放入 1480 个字节的数据,在第二个数据包中放入 276 个字节,那么 IP 标头应该是相同的,除了以下字段:

  • Fragment Offset0在第一个数据包中设置为,1480在第二个数据包中设置;
  • Total Length:设置为 1480 加上第一个数据包中的标头长度,以及 276 加上第二个数据包中的标头长度;
  • MFflag:1在第一个数据包和0第二个数据包中设置;
  • Header Checksum:根据不同的标题重新计算。
于 2010-11-16T05:00:20.067 回答