重写Ping命令时对ICMPv6校验和验证机制的疑问
ICMPv6报文校验和验证机制说明
核心差异:ICMPv6 vs ICMPv4校验和处理
- ICMPv4:需手动计算校验和,返回时可通过校验和验证报文有效性,计算规则遵循RFC1071第4.1节
- ICMPv6:出站(outgoing)报文的校验和由TCP/IP栈自动计算填充,无需手动操作
ICMPv4校验和计算规则(RFC1071第4.1节翻译)
- 将校验和字段初始化为0
- 把待校验的数据按16位为单位拆分,逐次累加所有16位值
- 若累加结果超过16位,将高16位与低16位相加,重复此步骤直到得到一个16位的数值
- 对最终的16位数值取反,所得结果即为校验和
ICMPv6报文校验和验证机制
- ICMPv6的校验和计算必须包含伪头部,这是和ICMPv4的核心区别。伪头部包含IPv6源地址、IPv6目的地址、ICMPv6报文长度、下一个头部类型(固定为58,标识ICMPv6)。
- 接收端验证流程:
- 取出报文中的校验和字段暂存,然后将该字段设为0
- 把伪头部和整个ICMPv6报文主体按16位分割,依次累加所有16位值,处理进位后得到一个16位结果
- 对该结果取反,若与暂存的校验和值完全一致,则报文有效;否则判定报文已损坏
- 注意:出站报文的校验和由TCP/IP栈自动完成,但接收端的校验和验证逻辑需要自行实现
内容的提问来源于stack exchange,提问作者knocknock
相关产品推荐
相关产品推荐

