网路子系统之IP层

引用

  • IP 层收发报文简要剖析1-ip报文的输入
  • [译] Linux 网络栈监控和调优:接收数据(2016)
  • Monitoring and Tuning the Linux Networking Stack: Receiving Data
  • LINUX邻居子系统(一)
  • 【Linux4.1.12源码分析】邻居子系统实现分析
  • TCP UDP 分段 IP分片
  • 【网络协议】TCP分段与IP分片

 


一. Arch

1.1 HLD

网路子系统之IP层_第1张图片

1.2 LLD

 

网路子系统之IP层_第2张图片

 

1.3 Neighboring Subsystem

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

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

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

网路子系统之IP层_第3张图片

 

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. 输出数据报应该从哪个具体的网络设备输出的信息。

网路子系统之IP层_第4张图片

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层的分片。

 

网路子系统之IP层_第5张图片

快速分片:

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

网路子系统之IP层_第6张图片

你可能感兴趣的:(linux系统开发,协议)