我需要在c中编写一个基本的网络堆栈,但对正确的做法有一些疑问。我们假设我只需要在L4支持UDP,在L3支持IP。
当我想发送需要分段的大消息时。处理这个问题的正确顺序是什么?
1)初始化udp头并计算整个数据字段的校验和(加上udp和伪头)然后对数据字段进行分段,为每个片段构建IP头,然后发送片段。
2)对数据字段进行分段,然后构建一个udp标头,在每个片段的前面加上不同的校验和。然后构建一个IP头来解决每个片段的问题。然后发送我们的片段。
我的困惑源于udp校验和是否应包含整个汇编数据报,或仅包含单个片段。非常感谢您提供的任何帮助。
答案 0 :(得分:4)
网络层彼此独立工作。当IP层分组数据包时,UDP层不知道它。当应用程序层UDP侦听器收到数据包时,它将被重新组装,并且不知道数据包是否曾被碎片化。
有了这些知识,我们可以说UDP校验和必须覆盖完全组装的数据包,并且在分段期间不必更改。事实上,UDP标头中的 nothing 会发生变化。
要对碎片数据包进行错误检查,请使用IPv4校验和标头字段。 IPv6报头没有校验和字段,因为较低层预计会有无差错的数据包传送。
当您对IPv4数据包进行分段时,必须重新计算该分段的IPv4标头。 IPv4 wikipedia entry告诉我们在对数据包进行分段时必须更改的内容:
- 总长度字段是分段大小。
- 为除最后一个之外的所有段设置了更多片段(MF)标志,该标志设置为0.
- 基于原始数据有效载荷中的段的偏移来设置片段偏移字段。这是以八字节块为单位测量的。
- 重新计算[IPv4]标头校验和字段。
总之,您可以执行以下操作:
答案 1 :(得分:0)
数字1和数据包之前的整体校验和应该与重建回原始形式的校验和相匹配