UDP校验和如何更改IP片段?

时间:2014-11-24 18:14:59

标签: c sockets networking udp

我需要在c中编写一个基本的网络堆栈,但对正确的做法有一些疑问。我们假设我只需要在L4支持UDP,在L3支持IP。

当我想发送需要分段的大消息时。处理这个问题的正确顺序是什么?

1)初始化udp头并计算整个数据字段的校验和(加上udp和伪头)然后对数据字段进行分段,为每个片段构建IP头,然后发送片段。

2)对数据字段进行分段,然后构建一个udp标头,在每个片段的前面加上不同的校验和。然后构建一个IP头来解决每个片段的问题。然后发送我们的片段。

我的困惑源于udp校验和是否应包含整个汇编数据报,或仅包含单个片段。非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:4)

网络层彼此独立工作。当IP层分组数据包时,UDP层不知道它。当应用程序层UDP侦听器收到数据包时,它将被重新组装,并且不知道数据包是否曾被碎片化。

有了这些知识,我们可以说UDP校验和必须覆盖完全组装的数据包,并且在分段期间不必更改。事实上,UDP标头中的 nothing 会发生变化。

要对碎片数据包进行错误检查,请使用IPv4校验和标头字段。 IPv6报头没有校验和字段,因为较低层预计会有无差错的数据包传送。

当您对IPv4数据包进行分段时,必须重新计算该分段的IPv4标头。 IPv4 wikipedia entry告诉我们在对数据包进行分段时必须更改的内容:

  
      
  • 总长度字段是分段大小。
  •   
  • 为除最后一个之外的所有段设置了更多片段(MF)标志,该​​标志设置为0.
  •   
  • 基于原始数据有效载荷中的段的偏移来设置片段偏移字段。这是以八字节块为单位测量的。
  •   
  • 重新计算[IPv4]标头校验和字段。
  •   

总之,您可以执行以下操作:

  1. 获取应用程序级数据并将其包装在UDP标头中。
  2. 将带有UDP标头的数据包发送到IP层。
  3. 将数据划分为片段。
  4. 对于每个片段,在其上放置一个IPv4片段标头。
    • 将片段提供给第2层并在其上放置第2层标题。
    • 发送片段。

答案 1 :(得分:0)

数字1和数据包之前的整体校验和应该与重建回原始形式的校验和相匹配