深入理解Linux网络技术内幕学习笔记第十八章:因特网协议第四版(IPv4)

Ip报头中的选项:

除了End of Option 和No Operation选项,每个报头中每个选项最多只能有一个实例。

单字节选项是一个一个8位字段,叫type,可以进一步分为number,class,copied三个字段。

多字节选项除了8位的type字段,还有Length(8位),pointer(8位),option_data三个字段。Length表示选项长度,pointer是从选项开端起算的偏移量。

下面介绍一些选项的作用:

End of Option 和No Operation选项:

    当ip选项的大小不是4字节的倍数时,传送者会以IPOPT_END选项为ip报头补齐,使其对齐4字节边界。IPOPT_NOOP用于填补选项之间的空白。

Source Route选项:

    来源地路由选项可以让传送者指定封包传送至接收者时所走的路径。这是一个多字节选项,分为严格的和松散的两种类型。严格的Source Route选项必须指出传送路径上的每台路由器地址,而且沿途不能修改。松散的选项可以指指定路径上的部分路由器地址。

Record Route选项:

    用于请求发送方和目的地址之间的路由器存储它们转发封包时所用的外出接口ip(存在ip头的选项部分),报头空间有限,最多只能存9个,超过9个后的地址,不会记录。

Timestamp选项:

    该选项比较复杂,见下图:

    上图中的子类型可以改变该选项的功能,可能的值如下:

        RECORD TIMESTAMPS:每个路由器会记录其收到封包的时间。

        RECORD ADDRESSES AND TIMESTAMPS:路由器除了记录收到封包的时间,还会存储接收接口的ip地址。

        RECORD TIMESTAMPS ONLY AT THE PRESPECIFIED SYSTEMS:只针对传送者选定的特定ip记录其封包接收的时间。

    当记录的消息超过了ip报头的最大空间(40字节)时,直接丢弃后续消息,每丢弃一次,overflow字段递增,由于其只有4为,       超过15便会溢出,此时,路由器会返回一个ICMP参数错误消息给原来的传送者。

Router Alert选项:

    这个选项标记封包需要特殊处理。如RSVP(资源保留协议)会用此选项告诉路由器,用特殊方式处理该包。

封包的分段和重组:

    对封包进行分段和重组都会用到额外的cpu时间和内存,许多应用会通过下列因素来避免分段:

        首先,内核不一定只能用出口接口的MTU,也可以用PMTU(路径mtu发现功能)来发现路径上可以使用的最大MTU,避免在特定路径上分段。

        MTU设为一个相当安全的小值576(规范要求)。许多应用的默认行为都是使用此MTU

    

分段和重组引发的问题:

IP封包彻底重组之前,它将无法传递给下一个较高分层。因此,每个路由器都有一个定时器,如果某些片段在特定时间内没有接收到,就会清理对应ip封包的那些片段所占用的资源。由于传送者不知道发送的包在路上有没有分片,更无法知道哪些片段丢失了,所以传送者只会等待 ,知道较高分层通知其重传整个封包。

重传的封包不会重用原先的id,但是主机还是可能收到几个具有相同id的同一个ip片段副本,所以主机要能处理这种情况。每次重新传输都可能引发下面这些特殊情况:

    重叠:一个片段内的某些数据可能在前一个封包内抵达了,重传的封包有不同的id,因此,对于良好的操作系统不会有什么问题,但是有问题的操作系统可能没有为重传的封包使用不同的id,这就导致了重叠。

    重复:两个片段的开始偏移量相同,长度相同,就视为重复。但是对有效载荷内容未做检查。

    重组完成后又接收到:就此而言,ip层会认为此片段是新ip封包的第一个片段。

在重组一个封包时,内核需要考虑这些参数:目的地址和源地址,ip封包的id,L4协议。可惜的是,不同封包的这些参数可能会一模一样。例如,两台主机都位于NAT路由器后面,且和同一个目的地址通信,同时,id是一个16为字段,在一个高速网络上很快会卷绕,这会导致两个封包的id有可能一样。这样一来,接收方会认为两个片段属于同一封包。

路径MTU发现原理(PMTU):

    路径MTU用于发现封包传输至指定目的地址而不用被分段的最大尺寸。每个目的地址会使用不同的PMTU,其值会缓存在相关的路由表中。

    PMTU算法原理简述:传输一个ip报头中设置了DF的包,而且路上没有人抱怨,就表示你当前使用的pmtu没有问题,然后逐渐增大pmtu,直到收到icmp报文,该报文会告诉你有抱怨的设备的mtu,然后更新本地的MTU。

L4检验和的特殊情况:

    TCP和UDP的校验和计算会包含伪头部,而伪头部和源id相关。当报文通过NAT路由器时,其ip会被修改,导致L4的检验和失败,接收方的IP层不会检测到错误,但TCP层会认为封包有问题。这种情况必须由内核处理。

    另外,下面这些情况下,已接收的数据帧中硬件计算的L4检验和会失效:

        当输入的L2数据帧包含一些填充字节时,NIC在计算检验和时没有识别到,导致计算出的L4校验和有问题。

        输入ip片段和前一个已接收片段重叠。参见二十二章。

        输入ip片段使用IPsec套件的协议之一时,NIC无法计算出正确的L4校验和。因为L4报头和有效载荷要么被压缩,要么被消化或是加密了。

        因为IP层发生NAT或类似干扰,检验和必须重新计算。

用于计算检验和的API放在include/asm-xxx/checksum.h

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值