《深入理解Linux网络技术内幕》阅读笔记(十六)

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
当copied被设定时,若封包需要分段,IP层就必须把该选项拷贝至每个片段。class会根据四条准则对此选项分类;这些字段可根据IP选项过滤封包,或者把不同的Qos参数施加至这些封包。
不含选项的IP报头的大小是20字节。当 IP选项的大小不是4字节的倍数时,传送者会以IPOPT_END选项为IP报头补白,使其对齐4字节边界。这是必要的,因为IP报头的Header Length字段是以4字节的倍数表示的。
IPOPT_NOOP选项可用于填补选项之间的空白,例如,为了让后续的IP选项对齐特定边界。Linux可以利用此选项作为从IP报头中删除选项的简便方式(实现方式是把选项用IPOPT_NOOP覆盖吧,我猜)。
这里写图片描述
以上图为例,假设主机X想使用Strict Source Routing选项把封包传给主机Y。这时,主机X必须指定所有居中路由器的地址。严格来源地路由的范例之一就是R_1 R_2 R_3 主机Y。以宽松来源地路由而言,像 R_1 R_3这样的路径就够了。使用非相邻的路由器是允许的,而且有些优:如果R_2失败了,就可改用R_2b,反之亦然。
这里写图片描述
这里写图片描述
这里写图片描述
上图中,每个路由器在接收到封包时,都会记录接收时间,但是只是针对传送者选择的一些特定IP地址。
这里写图片描述
这里写图片描述
因为内核无法将其数据交换到磁盘上(只交换用户空间数据),为了处理片段而造成的内存浪费对路由器的性能有很大的冲击。Linux对片段能用的内存量可设限制。
要识别一个片段所属的IP封包,内核会考虑下列参数:
1.发送方和目的地IP地址
2.IP封包ID
3.L4协议
可惜,不同封包可能共享所有这些参数。例如,两个不同的传送者可能碰巧为封包选择了相同的封包ID,而且封包又碰巧同时抵达。如果两台主机都位在NAT路由器会后,而NAT路由器又将其自己的IP地址放在封包上,接收端的IP将无法区分那些片段。你也不能仰赖IP ID字段,因为这是一个16位字段,因此在一个高速网络上很快就会卷绕。
通过数个同时运行的全局定时器,卷绕问题得以部分解决。Linux内核不是使用一个全局IP ID,而是为每个目的IP地址都持有一个不同的计数器(直到可能的IP目的地达到的最大数目)。注意,通过使用数个IP ID,可以让ID拖久一点才卷绕,但是它们最终还是会卷绕。
这里写图片描述
这里写图片描述
IPV6协议的设计决定只在源头主机上允许IP分段,而在中间主机上(例如路由器)不允许。
这里写图片描述
这里写图片描述
较新的NIC在硬件中提供了IP和L4校验和计算能力。虽然Linux利用了多数现代NIC的L4硬件校验和计算能力,但是没有利用IP硬件校验和计算能力,因为不值得多花这种复杂度(也就是说软件计算已经够快了,因为IP报头的尺寸有限)。
计算校验和时,TCP和UDP所用的伪报头:
这里写图片描述
TCP和UDP协议所计算的校验和会包括其报头,有效载荷以及所谓的伪报头。伪报头基本上就是一个区块,为了方便起见,其中的字段是从IP报头中取来。注意,伪报头只是为了计算校验和而定义,伪报头不存在于网络中传送的封包内。
可惜,为了NAT或其他活动,IP层偶尔必须修改一些IP报头字段,而这些字段又会被TCP和UDP用在其伪报头中。对IP层的修改会使得L4校验和失效。如果保留校验和,IP层的节点就不会检测到任何错误,因为它们只验证IP校验和。然而,目的主机的TCP层会认为封包已损毁。因此,这种情况必须由内核处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值