Linux - 网络子系统 - Network Layer: IPv4

引用


一. Arch

1.1 HLD

1.2 LLD

1.3 Neighboring Subsystem

     邻居:是指在同一个IP局域网内的主机,或者 邻居之间在三层多行仅隔一跳的距离。而邻居子系统,则提供了三层协议地址(IP)与二层协议地址(MAC)之间的映射关系。此外,还提供二层首部缓存,以加速发送数据包。

     在发送数据的时候,先进行路由查找,如果找到了到目的地地址的路径,再查看邻居表中是否存在相应的映射关系,如果没有,则新建邻居项;然后,判断邻居项是否为可用状态,如不可用,则把数据报存至发送缓存队列后发送请求;

     在接收到请求应答后,将对应邻居项置为可用,并将其缓存队列中的数据包发送出去;如果在指定时间内未收到响应包,则将对应邻居项置为无效状态。

1.4 ARP

   在以太网上传输IP数据报时,以太网设备并不能识别32bit的地址。而是以48bit以太网地址传输以太网数据包的。因此,IP数据报在以太网上传输前需要分装成以太帧,而以太网帧的目的地址正是通过IP数据报的目的IP查询得到的。因此,IP地址和以太网地址之间存在着映射,通过查看ARP表就可以得到这两地址间的对应关系。地址解析协议(Address Resolution Protocol-ARP)就是用来确定这些对应关系的协议。

   当通过ARP根据IP地址获取以太网地址时,会发送出一个含有所希望的IP地址的以太网广播数据包。目的地主机收到该ARP查询报文后,会回应一个含有IP和以太网地址对的数据包作为应答。发送者会将得到的以太网地址缓存在ARP表中,用于以后数据报的发送,以节省ARP通信成本。

1.5 Routing

   路由子系统的核心是转发信息库(Forwarding Information Base, FIB),即路由表。

路由表是用来存储:

1. 用以确定输入数据报是应该上传给本机的上层协议还是继续转发的消息。

2. 如果需要转发,正确转发数据报所需的信息。

3. 输出数据报应该从哪个具体的网络设备输出的信息。

1.6 IP Fragment(IP分片)

     当要发送的IP数据报的长度超出了最大传输单位MTU(链路层), 且允许分片时,就会进行IP分片。IP分片通常发生在网络环境中,例如,在以太网环境中MTU为1500B, 而如果传输的数据大于1500B, 就需要用到分片技术,经分片后才能传输此数据报。

通常,使用UDP协议发送的数据报很容易导致IP分片,而TCP协议不会产生分片。

     IP数据报被分片后,各分片(fragment)分别组成一个具有IP首部的分组,并各自独立地选择路由,在其分别抵达目的主机后,目的主机的IP层会在传送给传输层之前将接收到的所有分片重组成一个完整的IP数据报。

     IP数据报是通信双方IP层之间的传输单位,分片是IP层与二层之间的传输单位,二分片对应传输层是透明的。

      尽管分片对于传输层是透明的,但在快速分片时,传输层似乎能够感知到分片的存在,而提前将要传递给IP层的数据按MTU分割完成。

对于TCP:

坏处:

    当IP数据报被分片后,到达目的主机后会对IP数据报分片进行重组,进而组成一个IP数据报,如果其中缺少一个IP分片,也就缺少了,因为IP没有超时重传机制,这是由上层协议支持的。而对于上层协议(如TCP),发现少了IP数据报不完整,会进行整个IP数据报
的重传,而不是只重传其中某一个分片。

避免:

    在TCP协议的3次握手中,除了确认SYN分节外(MSS选项只出现在SYN报文段中,即TCP三次握手的前两次),通信的两端还进行协商了一个值MSS(最大分段大小),这个值用来告诉对方,能够发送的TCP分节的大小。这个值一般是取其链路层的MTU大小减去TCP头部大小和IP头部的大小。MSS=MTU-TCP头部大小-IP头部大小,MTU的值可以通过询问链路层得知。
     当两端确认好MSS后进行通信,当TCP层往IP层传输数据时,如果TCP层缓冲区的大小大于MSS,那么TCP层都会将其发送缓冲区中的数据切分成MSS大小的分组进行传输 (TCP Segment, tcp分段),由于MSS是通过MTU减去TCP头部大小和IP头部的大小计算得出的,MSS肯定比MTU小,那么到IP层的时候就可以避免IP层的分片。

快速分片:

当传输层已将数据分块,并将这些链接在 skb_shinfo(skb)->frag_list, 此时,则可以通过快速分片进行处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值