昨天在和同学调试时, 发现同学的路由器偶尔能收到一些UDP校验和错误的RIPng报文。我一开始觉得是同学代码有bug, 但是仔细查看了校验和计算相关逻辑, 都没有发现任何问题。今天, 经抓包, 我发现我主机发出的UDP校验和没有任何问题。然而, 用另一个主机抓包, 我又发现我的USB网卡(AX88179芯片)发出的UDP校验和本身就是错的, 这说明是这个芯片的UDP校验和卸载的问题。具体而言, 这个出错的UDP报文的校验和字段是ffff
, 但芯片的UDP校验和卸载将其改成了0000
。这是不对的, 因为IPv6的UDP要求, 如果算出来的校验和是0000
, 需要填写ffff
。0000
表示没有校验和, 对于IPv6的UDP不合法。
差点让同学以为自己代码写错了。
注: 关闭发送方校验和卸载的命令为: sudo ethtool --offload <网络接口> tx off
发表评论