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

发布于 2024-10-02 19:51:54 字数 716 浏览 6 评论 0原文

问题的后续原始套接字的数据包碎片

如果我有一个原始套接字实现为例如:

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

谁能指出一个示例代码吗?

Follow-up of question packet fragmentation for raw sockets

If I have a raw socket implemented as such:

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

how can I set the ipHdr->fragment_offset (16 bits including 3 bit flags) if I have a packet of size 1756 (not including the IP header)?
Do I need to prepare two packets-one of size 1480 and another of size 276, and then slap IP headers on both packets?

Can anyone point to an example code for this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

等待圉鍢 2024-10-09 19:51:54

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

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

  • Fragment Offset:设置为 0在第一个数据包中,1480 在第二个数据包中;
  • 总长度:设置为1480加上第一个数据包中的标头长度,设置为276加上第二个数据包中的标头长度;
  • MF 标志:在第一个数据包中设置为 1,在第二个数据包中设置为 0
  • 标头校验和:根据不同的标头重新计算。

Yes, you need to prepare two packets, each with their own IP header.

If you put 1480 bytes of data in the first packet and 276 in the second, then the IP headers should be identical, except for these fields:

  • Fragment Offset: set to 0 in the first packet, and 1480 in the second;
  • Total Length: set to 1480 plus the header length in the first packet, and 276 plus the header length in the second packet;
  • MF flag: set to 1 in the first packet and 0 in the second;
  • Header Checksum: Recalculated over the different headers as appropriate.
单身情人 2024-10-09 19:51:54

注意:片段偏移值以 8 字节块表示。所以对于上面的
第一个数据包,片段偏移值将为零,但将设置更多片段位ipHdr->fragment_offset = 0x01 << 13

对于第二个数据包,片段偏移值为 1480/8 = 135(与右移 3 位相同)且 flags 为零
ipHdr->fragment_offset = 1480>>> 3

NOTE: the fragment offset value is expressed as 8byte blocks. So for the above
the first packet, fragment offset value will be zero but more fragments bit will be set ipHdr->fragment_offset = 0x01 << 13

For the second packet, fragment offset value is 1480/8 = 135 (same as right shift by 3bits) and flags is zero
ipHdr->fragment_offset = 1480 >> 3

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文