内核构造skb数据包的实现总结

本文详细介绍了在内核中构造IPv4、TCP和UDP数据包时的校验和计算,包括IP、TCP和UDP校验和的算法以及在内核中构造skb数据包时需要注意的问题。内容涵盖了不同场景下的数据包处理,如路由器更新校验和、NAT处理、分片等。此外,还讨论了内核中计算UDP数据包校验和的函数`skb_checksum`和`csum_tcpudp_magic`的使用方法。
摘要由CSDN通过智能技术生成

一、IPv4、TCP和UDP的校验和计算

校验和是网络协议用来识别传输错误的冗余域。有些校验和不但能检测错误,还能自动修正某些类型的错误。校验和的想法很简单。在传输一个数据 包之前,发送方计算出一个很小的、固定长度的域 (校验和)包含数据的某种散列。如果在传输过程中某几位数据被改变,很可能损坏的数据会产生一个不同的校验和。取决于你用来产生校验和使用的函数,校验和提供不同级别的可靠性。IP协议采用的校验和是简单的一个包括求和取反码,这个方法太弱了,不能被认为是可靠的。对于更可靠的完整性检查,你必须依赖于 L2 CRC或者SSL/IPSec消息认证码。


不同的协议可以使用不同的校验和算法。IP协议校验和只覆盖IP头。大多数L4协议的校验和均覆盖头和数据。看起来在L2(比如,以太网)有校验和,L3(比如,IP)有另一个,L4(比如,TCP)还有一个的做法是冗余的,因为它们全都应用于数据的重叠部分,但是检查是有价值的。错误不只在传输过程中发生,也会在层之间移动中发生。而且,每个协议负责保证他自己的正确传输,不能假设高或低的层完成这个任务。


举一个可能发生的复杂情况的例子,想象LAN1上的PC A通过Internet发送数据给LAN2上的PC B。假设LAN1中使用的L2协议使用校验和而LAN2上的不使用。那么最少一个高层提供某种形式的校验和来减小接受损坏数据的可能性是很重要的。
每个协议的定义中都建议使用校验和,虽然它不是必须的。然而,必须承认的是一个好的相关协议的设计可以去掉一些不同层协议之间的重叠特性带来的开销。因为大多数L2和L4协议提供校验和,在L3中也有校验和就不是严格必须的。正是由于这个原因,IPv6中去掉了这个校验和。


在IPv4中,IP校验和是一个16位域覆盖整个IP头,包括选项。校验和最初由数据包源来计算,并在整个到目标的过程中一个跳跃一个跳跃的被更新以反映每个路由器带来的头部变化。在更新校验和之前,每个跳跃首先必须检查包的完整性通过比较包中的和本地计算的校验和。如果完整性检查失败,包会被丢弃,但是不会产生ICMP:L4 协议会处理的(例如,使用在给定时间内没有应答就强制重发的定时器)。


这里是一些会触发更新校验和需求的情况:
1、减小TTL
路由器在转发数据包前必须减小包IP头中的TTL。由于IP校验和同样覆盖了那个域,原始的校验和就不再有效了。你将在第20章"ip_forward函数"节中看到TTL被ip_decrease_ttl减小,这个函数也处理校验和。
数据包破坏(包括NAT)
所有带来一个或多个IP头部域改变的特性均强制重新计算校验和。NAT大概是最著名的例子。
2、IP选项处理
由于选项是头的一部分,它们也被校验和覆盖。于是,每次它们被需要增加或者修改IP头(例如,时间戳的增加)的方式处理时,强制重新计算校验和。
3、分片
当一个数据包被分片时,每个分片有一个不同的头。大多数的域保持不变,但是与分片有关的域,比如偏移,就是不同的了。因此,校验和不得不重新计算。
由于IP协议适用的校验和使用与TCP、UDP、ICMP相同的简单算法,它们共用一组通用的函数。也有一个为了IP校验和特殊优化的函数。按照IP校验和算法的定义,头部被分成16位的字进行求和和取补码。图18-13显示了一个校验和计算的例子,为了简单只对两个16位字求和。Linux不对16位字求和,它对32位甚至64位字求和,目的是更快速计算(这需要在求和和取反码之间增加一个额外的步骤;参看下一节中csum_fold的描述)。实现这个算法的函数叫做ip_fast_csum,在大多数体系结构中直接用汇编语言。

 

分组头的校验和(checksum)算法是16位累加和后的反码,TCP和UDP数据报头也使用相同的校验算法,但参与运算的数据与IP分组头不一样。

IPv4分组头的结构如下所示:

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值