【问题标题】:udp packet fragmentation for raw sockets原始套接字的 udp 数据包分段
【发布时间】: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 标头?

谁能指出一个示例代码?

【问题讨论】:

    标签: c++ sockets udp fragmentation


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,我搞定了。还有一件事。两个片段的标识符必须相同。谢谢。
    • 当然 - 所有我列出的 4 个以外的字段在片段之间应该是相同的。
    • 绝对。我的意思是说标识符必须相同且非零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2020-12-24
    • 2016-08-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多