发送方和接收方之间的 UDP 校验和不一致

发送方和接收方之间的 UDP 校验和不一致

我想编写一个程序来生成 udp 校验和。

为了验证我的程序,我需要一些真实数据。我从一台机器向另一台机器发送一个 udp 数据包,该数据包可以被 udp 服务器正确接收。我在两台机器上使用 tcp dump 捕获了该数据包

从 udp 客户端机器来看,udp 数据包和伪 IPV4 头字节为(HEX 格式):

pseudo header
src dst ip:    8a60c948 8a60c96d
proto_num len: 0011 0016

UDP header:    83d87d000016 a79e 
      data:    49276d206e6f 742068657265210a

在udp服务器机器上(接收方):

pseudo header
src dst ip:        8a60c948 8a60c96d
proto_num and len: 0011 0016

UDP header:        83d87d000016 c2c5 
      data:        49276d206e6f 742068657265210a

校验和应该计算

8a60c9488a60c96d0011001683d87d000016000049276d206e6f742068657265210a

其中校验和字段被 0x0000 替换

但我们看到校验和从客户端的 0xa79e 更改为服务器端的 0xc2c5。为什么会发生这种变化?哪个是正确的 UDP 标头校验和?谢谢!

答案1

某些网络接口卡 (NIC) 会通过更改校验和来“帮助”您。这称为“校验和卸载”。搜索该术语会有所帮助。

答案2

尝试使用“tcpdump -K”或类似 tcpdump 手册页:

-K            Don't attempt to verify IP, TCP, or UDP checksums.  This is use-
              ful for interfaces that perform some or all  of  those  checksum
              calculation  in  hardware; otherwise, all outgoing TCP checksums
              will be flagged as bad.

答案3

我使用第 3 层的 netfilter 捕获发送方和接收方机器中的 udp 校验和。在发送方,udp 校验和不包括有效载荷数据。在接收方,udp 校验和包括有效载荷数据。这就是 udp 校验和不一致的原因。

相关内容