1.IP 协议特点

IP是 Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议
设计IP协议的目的是提高网络的可扩展性:

  • 解决不同网络互联问题,实现大规模、异构网络的互联互通。
  • 分割顶层网络应用和底层网络技术之间的耦合关系,以利于两种独立开发。

IP 协议只为主机提供一种无连接不可靠的尽力而为的数据包传输服务。

2.IP 数据报结构

IP数据报结构-20220312160047-mmght8p.svg

  • 版本:定义IP协议版本,所有字段都要按照此版本协议解释。如果接收方使用其他版本,则丢弃数据报。
  • 首部长度:单位为 32bit。首部长度最短为5,即没有可选项;最长为15,即可选项全选。
  • 服务类型:包括一个 3 位的优先权字段,4 位的服务类型字段和 1 位的置 0 保留字段。4 位的服务类型字段分别表示:最小延时、最大吞吐量、最高可靠性和最小费用。其中最多有一个能置 1,应用程序应该根据实际需要来设置它。比如像 ssh 和 telnet 这样的登陆程序需要的是最小延时服务,而文件传输程序 ftp 则需要最大吞吐量的服务。
  • 总长度:该字段定义整个数据报的字节长度,包括协议头部和数据,最大值为 65535 字节。但由于 MTU 的限制,长度超过 MTU 的数据报都将被分片传输,所以实际传输的 IP 数据报的长度都远远没有达到最大值。
  • 标识:该字段包含一个整数,用于识别当前数据报。当数据报分段时,标识字段的值被复制到所有的分段之中。该字段由发送端分配帮助接收端集中数据报分段。
  • 标记:该字段由3位字段构成,其中靠右最低位(MF)控制分段,存在下一个分段置为 1,否则置 0,代表该分段是最后一个分段。中间位(DF)指出数据报是否可进行分段,如果为 1 则机器不能将该数据报进行分段。第三位即最高位保留不使用,值为0。
  • 片偏移:该字段指出分段数据在源数据报中的相对位置,片偏移单位的 8byte。
  • 生存时间:是数据报到达目的地址之前允许经过的路由器跳数,由发送端设置,防止数据报陷入路由循环后占用网络资源。数据报在转发过程中每经过一个路由,该值就被路由器减 1。当 TTL 值减为 0 时,路由器将丢弃数据报,并向源端发送一个 ICMP 差错报文。
  • 协议:该字段指出在IP处理过程完成之后,有哪种上层协议接收导入数据报。
  • 首部校验和:确保 IP 协议首部完整性,由发送方填充,接收方校验。
  • 源地址目的地址:用来标识数据报的发送方和接收方。一般情况下,不论它中间经过多少个中转路由器,这两个地址在整个数据报的传递过程中始终保持不变。
  • 可选项
    • 记录路由:告诉数据报途径的所有路由器都将自己的IP地址填入IP头部的选项部分,用于跟踪数据报的传递路径。
    • 时间戳:告诉每个路由器将数据报被转发的时间填入IP头部的选项部分,用于测量途径路由之间数据报传输时间。
    • 松散路由选择:指定一个路由器IP地址列表,数据报发送过程必须经过其中所有的路由器。
    • 严格路由选择:指定一个路由器IP地址列表,数据报只能经过被指定的路由器。

      3.IP 分片

      IP 协议数据报最大长度为65535B,但链路层协议能承载的最大数据量通常比 IP 协议的最大数据量小。例如,以太网的 MTU 为1500B,而许多广域网的 MTU 不超过576B。所以当 IP 数据报的总长度大于链路层协议的 MTU 时,就需要将 IP 数据报的数据分装在多个较小的 IP 数据报中,这些较小的数据报成为
      片在目的主机的网络层被重新组装,组装过程则是依据 IP 首部的标识[1]、标记[2]、片偏移[3]
      如例:在 MTU 为 1500B 的链路层对一个 4000B 的 IP 数据报进行分片。
      IP数据报分片-20220313150219-8wv1zss.svg
      IP 分片时,每个分片都会带有原始数据报的标识号,而目的主机则根据标识号来确定哪些片属于同一个原始数据报,然后根据片偏移来确定片在原始数据报中的位置,根据 MF=0 判断一共分了多少片。

      4.IP 路由

      下图是操作系统中 IP 模块的工作流程:
      IP路由基本过程-20220313163047-yqa4jts.svg
  1. IP 模块接收到来自数据链路层的 IP 数据报后,对其头部执行差错校验,确认无误后再分解析其头部信息。
  2. 若该数据报头部的可选项设置了松散源路由选择或严格源路由选择,或该数据报并非发送给本机,则调用数据报转发子模块来处理该数据报;
  3. 若该数据报头部的目的 IP 地址为本机的 IP 地址,或目的地址是广播地址,则根据 IP 数据报头部中的协议字段来决定将该报派发往哪个上层应用。
  4. IP 数据报转发子模块收到数据报后,首先检查系统是否允许转发,若不允许则丢弃数据报;如果允许,则对该数据报执行一些操作,然后将它交给路由模块。
  5. 路由模块会决定数据报应该发送至哪个下一跳路由或者目标主机,以及经过哪个网卡来发送。另外,路由模块不仅接收来自数据转发模块的数据,还接收来自上层协议的数据。

在路由模块中,其大致流程如下:

  1. 查找路由表中是否存在与数据报目标 IP 地址完全匹配的主机 IP 地址。如果找到,就是用该路由项,没找到则转到下一步。
  2. 查找路由表中是否存在与数据报目标 IP 地址具有相同网络 ID 的网络 IP 地址。如果找到,就使用该路由项;没找到则转到下一步。
  3. 选择默认路由项,这通常意味着数据报的下一跳路由是网关。