原始套接字的 udp 数据包分段

Posted

技术标签:

【中文标题】原始套接字的 udp 数据包分段【英文标题】:udp packet fragmentation for raw sockets 【发布时间】:2011-05-10 15:03:18 【问题描述】:

问题跟进packet fragmentation for raw sockets

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

  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 标头?

谁能指出一个示例代码?

【问题讨论】:

【参考方案1】:

是的,你需要准备两个包,每个包都有自己的IP头。

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

Fragment Offset:在第一个数据包中设置为0,在第二个数据包中设置为1480Total Length:设置为 1480 加上第一个数据包的头长度,以及 276 加上第二个数据包的头长度; MF 标志:在第一个数据包中设置为1,在第二个数据包中设置为0Header Checksum:根据不同的标题重新计算。

【讨论】:

是的,我搞定了。还有一件事。两个片段的标识符必须相同。谢谢。 当然 - 所有我列出的 4 个以外的字段在片段之间应该是相同的。 绝对。我的意思是说标识符必须相同且非零。

以上是关于原始套接字的 udp 数据包分段的主要内容,如果未能解决你的问题,请参考以下文章

原始 UDP 套接字卡在 recvfrom 上

原始套接字

原始套接字和普通的TCP套接字有啥不同?

原始套接字

网络骇客初级之原始套接字(SOCK_RAW)

Python原始套接字编程