TCP/UDP 校验和如何工作?

TCP/UDP 校验和如何工作?

我使用原始套接字创建一些 UDP 数据包,然后将它们发送到 UDP 服务器

我注意到,当我输入错误的 UDP 校验和数字时,UDP 服务器不会接受它,但如果我在校验和上输入全 0,UDP 服务器会接受它吗?

为什么?

另外,我注意到一个现象:校验和卸载我检查了我的计算机:

[root@kit temp]# ethtool --show-offload  eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off
receive-hashing: on

我的机器上似乎有校验和卸载。如果我随机设置 TCP 校验和值,如果启用了校验和卸载,NIC 可以将其修改为正确值?

最后,数据包在传输过程中可能会被修改,例如,TTL 将减少跳数,NAT 也可能会修改源 IP 地址,然后校验和将过时,在这些情况下,校验和如何工作?路由器会相应地修改校验和吗?或者目标机器可以智能地检测到这些并相应地计算校验和?

答案1

对于 IPv4,UDP 校验和是可选的。将校验和设置为 0 表示未使用。请参阅维基百科文章了解详情。

TCP、UDP 和 IP 校验和计算可以卸载到 NIC。NIC 将在硬件中计算校验和。这比在软件中计算要快得多。再次引用 Wikipedia知道一切

路由器在减少 TTL 或以其他方式更改数据包(对于所有更新数据包的协议)后会重新计算校验和。这必须在路由器上完成。目标计算机不能使用校验和无效的数据包,并以某种方式确定它在源端启动时是正确的。目标只能拒绝校验和无效的数据包。

相关内容