Net:IPv4

来自WHY42

Pv4在IETF于1981年9月发布的 RFC 791 中被描述,此RFC替换了于1980年1月发布的 RFC 760。

IPv4是一种无连接的协议,操作在使用分组交换的链路层(如以太网)上。此协议会尽最大努力交付数据包,意即它不保证任何数据包均能送达目的地,也不保证所有数据包均按照正确的顺序无重复地到达。这些方面是由上层的传输协议(如传输控制协议)处理的。

地址空间

  • A类:0.0.0.0~127.255.255.255
  • B类:128.0.0.0~191.255.255.255
  • C类:192.0.0.0~223.255.255.255
  • D类:224.0.0.0~239.255.255.255
  • E类:240.0.0.0~255.255.255.255

报文结构

  • 版本: IPv4即为4
  • 首部长度: 首部长度说明首部有多少32位字(4字节)。由于IPv4首部可能包含数目不定的选项,这个字段也用来确定数据的偏移量。这个字段的最小值是5(二进制0101),相当于5*4=20字节(RFC 791),最大十进制值是15。
  • 区分服务: 只有在使用区分服务时,这个字段才起作用,在一般的情况 下都不使用这个字段。例如需要实时数据流的技术会应用这个字段,一个例子是VoIP。
  • 显式拥塞通告( Explicit Congestion Notification,ECN):在RFC 3168中定义,允许在不丢弃报文的同时通知对方网络拥塞的发生。ECN是一种可选的功能,仅当两端都支持并希望使用,且底层网络支持时才被使用。
  • 全长: 报文总长,包含首部和数据,单位为字节。这个字段的最小值是20(20字节首部+0字节数据)
  • 标识符: 主要被用来唯一地标识一个报文的所有分片,因为分片不一定按序到达,所以在重组时需要知道分片所属的报文。每产生一个数据报,计数器加1,并赋值给此字段。
  • 标志 : 这个3位字段用于控制和识别分片,它们是:
    • 位0:保留,必须为0;
    • 位1:禁止分片(Don’t Fragment,DF),当DF=0时才允许分片;
    • 位2:更多分片(More Fragment,MF),MF=1代表后面还有分片,MF=0 代表已经是最后一个分片。
  • 分片偏移:指明了每个分片相对于原始报文开头的偏移量,以8字节作单位。
  • 存活时间: 避免报文在互联网中永远存在(例如陷入路由环路)。存活时间以秒为单位,但小于一秒的时间均向上取整到一秒。在现实中,这实际上成了一个跳数计数器:报文经过的每个路由器都将此字段减1,当此字段等于0时,报文不再向下一跳传送并被丢弃,最大值是255。常规地,一份ICMP报文被发回报文发送端说明其发送的报文已被丢弃。这也是traceroute的核心原理。
  • 协议: 定义了该报文数据区使用的协议。
  • 首部检验和: 只对首部查错,不包括数据部分。重新计算的必要性是因为每一跳的一些首部字段(如TTL、Flag、Offset等)都有可能发生变化,不检查数据部分是为了减少工作量。
  • 源地址: 请注意,因为NAT的存在,这个地址并不总是报文的真实发送端
  • 目的地址: 报文的接收端。
  • 选项: 并不被经常使用

分片和组装

互联网协议(IP)是整个互联网架构的基础,可以支持不同的物理层网络,即IP层独立于链路层传输技术。不同的链路层不仅在传输速度上有差异,还在帧结构和大小上有所不同,不同MTU参数描述了数据帧的大小。为了实现IP数据包能够使用不同的链路层技术,需要将IP数据包变成适合链路层的数据格式,IP报文的分片即是IP数据包为了满足链路层的数据大小而进行的分割。

分片

当设备收到IP报文时,分析其目的地址并决定要在哪个链路上发送它。MTU决定了数据载荷的最大长度,如IP报文长度比MTU大,则IP数据包必须进行分片。每一片的长度都小于等于MTU减去IP首部长度。接下来每一片均被放到独立的IP报文中,并进行如下修改:

  • 总长字段被修改为此分片的长度;
  • 更多分片(MF)标志被设置,除了最后一片;
  • 分片偏移量字段被调整为合适的值;
  • 首部检验和被重新计算。

组装

当一个接收者发现IP报文的下列项目之一为真时:

  • DF标志为0;
  • 分片偏移量字段不为0。
  • 它便知道这个报文已被分片,并随即将数据、标识符字段、分片偏移量和更多分片标志一起储存起来。

当接受者收到了更多分片标志未被设置的分片时,它便知道原始数据载荷的总长。一旦它收齐了所有的分片,它便可以将所有片按照正确的顺序(通过分片偏移量)组装起来,并交给上层协议栈。