原始套接字的 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
,在第二个数据包中设置为1480
;
Total Length
:设置为 1480 加上第一个数据包的头长度,以及 276 加上第二个数据包的头长度;
MF
标志:在第一个数据包中设置为1
,在第二个数据包中设置为0
;
Header Checksum
:根据不同的标题重新计算。
【讨论】:
是的,我搞定了。还有一件事。两个片段的标识符必须相同。谢谢。 当然 - 所有我列出的 4 个以外的字段在片段之间应该是相同的。 绝对。我的意思是说标识符必须相同且非零。以上是关于原始套接字的 udp 数据包分段的主要内容,如果未能解决你的问题,请参考以下文章