路由器是否验证 UDP 和 TCP 校验和?

Bra*_*any -1 routing

出于某种原因,我在尝试谷歌搜索这个问题的答案时遇到了非常困难的时间,这在开始时似乎很简单:网络堆栈中的路由器是否验证 UDP 和 TCP 校验和,如果数据包不正确,则丢弃数据包?我的理解是路由器只考虑 IP 标头中的校验和,UDP/TCP 校验和在端点完成,但我不能 100% 确定这是否正确。

kas*_*erd 8

简短回答:否

更长的答案:仅实现路由器功能的路由器不会也无法验证 UDP 和 TCP 校验和。然而,路由器确实存在具有附加功能。如果路由器具有 NAT 和/或防火墙功能,答案可能会有所不同。

路由器不验证校验和的原因有很多:

  • 它会减慢数据包处理速度。
  • 路由器甚至可能不知道更高级别的协议,因此不知道它是否有校验和以及如何检查它。
  • 它可以被分段,使得校验和(仅出现在第一个分段中)覆盖所有数据包。
  • 它增加了不必要的复杂性,使其更难实现 - 特别是如果您想要硬件实现而不是软件实现。

但是,如果路由器同时实施 NAT 和/或防火墙,则必须考虑更高级别的协议。这消除了不验证校验和的一个原因。如果它破坏了数据包(根据定义 NAT 会这样做),则传输层校验和不再有效,因此必须对其进行更新。

无需验证旧校验和或从头开始计算新校验和即可更新校验和。相反,可以修改旧的校验和以仅补偿对实际数据包所做的更改。由于校验和的工作方式,这是可能的。由于 NAT 需要修改的字段与校验和在同一个数据包中,这使得 NAT 可以修改数据包并更新校验和,而无需完全重新组装数据包。(不幸的是,所有其他片段都没有 NAT 路由数据包所需的完整信息,因此 NAT 设备仍然需要保持其他片段的状态,并且在某些情况下缓冲片段,直到它知道将它们发送到哪里为止。)

防火墙可能希望对跨多个片段的数据包进行检查。如果要检查整个重组的数据包,那么也验证校验和是一个好主意,否则可能会构造无效数据包,这些数据包将通过防火墙中的验证,然后只需要一个 bitflip 就可以将其变成恶意数据包有效的校验和。要利用它需要很大的运气,但无论如何,如果防火墙要重新组装数据包以进行检查,则值得防范。(这样的防火墙可能会通过缓冲数据包来增加延迟,但它不必这样做,因为它可以转发除最后一个之外的所有数据包,这样防火墙发现的恶意数据包永远不会在目的地重新组装。)

还有其他校验和确实由路由器验证。在 IPv4 中,每个数据包都有一个报头校验和,路由器应该在转发之前对其进行验证。由于必须更新报头中的 TTL 字段,因此也必须在每一跳更新校验和。

在 IPv6 中,报头校验和被认为是不必要的并被消除了。路由器中所需的额外处理是一个问题,并且在 IP 上下层中的校验和具有覆盖 IP 标头中重要字段的校验和,这并不重要。出于这个原因,UDP 中的校验和是强制性的,而在 IPv4 中,UDP 校验和是可选的。

如果较低层是以太网,则它具有在路径上的每一跳上计算和验证的数据包校验和。与传输层校验和不同,以太网层校验和涵盖单个片段。