linux内核 checksum,Linux内核分析 - 网络[十三]:校验和

内核版本:2.6.34

报文的IP校验和、ICMP校验和、TCP/UDP校验和使用相同的算法,在RFC1071中定义,网上这方面的资料和例子很多,就不解释算法流程了,而是侧重于在实现的变化和技巧。

The

checksum algorithm is simply to add up all the 16-bit words in one's

complement and then to take the one's complement of the sum.

校验和的计算可以分为两步:累加、取反。这个划分很重要,它大大减少了校验和计算的消耗。校验和计算首要要明确一点:校验和计算是很耗时的!原因并不在于

算法复杂,而是在于输入数据的庞大,试想传送500M文件,则内核要校验500M字节的数据,并且对于每个报文,都是要进行校验和。所以协议栈的校验和实

现并不是简单明了的,使用了很多方法来规避这种开销。

第一:推迟校验和计算

按照协议的规定,报文到达每一层,首先验证校验和是否正确,丢弃掉不正确的报文,再才会进行后续操作。对于传输层下的协议,内核是这样做的,因为IP只需

要校验IP报头,最多60字节;而对于网络层上的协议,内核就不是这样做的,ICMP/TCP/UDP都需要校验报文的内容,而这部分消耗是很大的。

以UDP为例,在报文传递到UDP处理时,它并不会去验证校验和是否正确,而是直接将报文skb插入到相应socket的接收队列

sk_receive_queue中。等到真正有程序要接收这个报文,从接收队列中取出时,内核才去计算校验和。考量下这种做法,由于推迟了校验和计算,

因此很多错误的报文都被接收了,它们会占用处理报文的流程,直到报文准备进入用户空间时,这时候才计算了校验和,发现错误并丢弃掉。这样看似乎平白无故增

加了开销,必竟校验和的计算是一定要进行的。但这样做,将校验和计算推迟到了拷贝报文到用户空间时,这两个操作的绑定是很关键的。本来,校验和计算要遍历

一次报文,而拷贝又要遍历一次报文,这样就是两次遍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值