IPv4 和 IPv6

接触过网络编程的人会听到这样一种说法:IPv4 的地址马上就不够用了,快去用 IPv6 吧,因为它的地址有 2¹²⁸ 个,不会面临 IP 地址短缺的情况。

IP 协议简介

现行的 IP 协议存在两个版本,IPv4(Internet Protocol version 4)和 IPv6。

IPv4 是网际协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署的版本。IPv4 是互联网的核心,也是使用最广泛的网际协议版本,其后继版本为 IPv6。直到 2011 年,IANA IPv4 地址完全用尽时,IPv6 仍处在部署的初期。

设计 IPv6 的目的是取代 IPv4,然而长期以来 IPv4 在互联网流量中占据主要地位,IPv6 的使用增长缓慢。在 2017 年 7 月,通过 IPv6 使用 Google 服务的用户首次超过 20%。

IPv4

IPv4 数据报

IPv4 数据数据报的关键字段如下:

  • Version 版本号。
    • 这 4 bit 规定了数据报的 IP 协议版本,IPv4=0100。
    • 通过查看版本号,路由器能确定如何解释 IP 数据报的剩余部分(不同 IP 版本使用的数据报格式不同)。
  • Header length 首部长度。
    • 包括了 Options 的长度,但不包括 Data 长度。
    • 这个字段占 4 个 bit,其中每一个 bit 表示 4 个字节(units of 32 bits)。这个字段的最大值是 0xFFFF (15),所以 Header 最长占 60 个字节,去掉 Header 中固定的 20 个字节,剩下 40 个字节留给 Options。
  • Type of service TOS。
    • 该字段用来区分 IP 数据报的类型。
    • 可以将实时流量(如 IP 电话应用)与非实时流量(如 FTP)区分开。
  • Datagram length(bytes)数据报长度。
    • 这是 IP 数据报的总长度(Header+Data),以字节计。
    • 因为该字段长 16 bit,所以 IP 数据报理论上最大长度为 65535 字节。然而,数据报很少有超过 1500 字节的。
  • 16-bit Identifier、Flags、13-bit Fragmentation offset 标识、标志、片偏移。(IPv6 中已废除
  • Time-to-live TTL。
    • 该字段用来确保数据报不会一直在网络中循环(当路由选择存在环路时)。
    • 每当数据报由一台路由器处理时,该字段的值减 1。若 TTL 值减为 0,则数据报被丢弃。
  • Upper-layer protocol 协议号。
    • 该字段仅在 IP 数据报到达其最终目的地才会有用。
    • 该字段值指示了 IP 数据报的数据部分应交给哪个特定的运输层协议。例如,值为 6 表明数据部分要交给 TCP,而值为 17 表明数据要交给 UDP。
    • 该字段在 IP 数据报中所起的作用,类似于端口号字段在传输层报文中所起的作用。协议号是将网络层与传输层绑定到一起的粘合剂,而端口号是将传输层和应用层绑定到一起的粘合剂。
  • Header checksum 首部校验和。(IPv6 中已废除
    • 首部检验和帮助路由器检测收到的 IP 数据报中的比特差错。首部校验和的计算可以参考 这篇博客
    • 路由器要对收到的每个 IP 数据报计算其首部检验和(因为 TTL 字段以及 Options 字段会改变),如果首部中携带的检验和与计算得到的检验和不一致,则检测出比特差错。路由器一般会丢弃检测出差错的数据报。
  • 32-bit Source/Destination IP address 源和目的 IP 地址。
    • 源主机可以通过 DNS 来查找目的地址。
  • Options(if any) 。(IPv6 中已废除
    • 选项字段允许 IP 首部被扩展。
    • 选项的存在的确是件复杂的事,因为数据报头长度可变,故不能预先确定数据字段从何处开始。而且还因为有些数据报要求处理选项,而有些数据报则不要求,故导致一台路由器处理一个 IP 数据报所需的时间变化很大。
  • Data 有效载荷。
    • 这是最后的也是最重要的字段!
    • 大多数情况下 IP 数据报中的数据字段是要交付给目的地的传输层报文(TCP 或 UDP)。当然,该数据字段也可承载其他类型的数据,如 ICMP 报文

一个 IPv4 数据报的首部长度为 20 字节(假设无选项字段)

IPv6

IPv6 数据报

IPv6 数据数据报的关键字段如下:

  • Version 版本号。
    • IPv6=0110。
  • Traffic class 流量类型。
    • 该字段占 8 bit ,与 IPv4 中 TOS 字段的含义相似。
  • Flow label 流标签。
    • 它提醒路由器重复使用之前的接力路径,这样 IP 包可以自动保持出发时的顺序。这对于流媒体之类的应用有帮助。
    • Flow label 的进一步使用还在开发中。
  • Payload length 有效载荷长度。
    • 该 16 bit 值作为一个无符号整数,给出了 IPv6 数据报中 Data 部分的长度。
    • 与 IPv4 中 Datagram length 字段类似,但 IPv4 中表示的是整个数据报的长度,IPv6 只表示有效载荷的长度。
  • Next header。
    • 该字段与 IPv4 首部中 Upper-layer protocol 字段含义类似。
  • Hop limit 跳限制。
    • 该字段与 IPv4 首部中 TTL 字段含义类似。
  • Source/Destination address 源和目的地址。
  • Data 有效载荷。

一个 IPv6 数据报的首部长度固定为 40 字节

小结

IPv4 与 IPv6 首部字段对比图

IPv6 对比于 IPv4 有以下几点重要变化:

  • 拓展了地址空间(由 2³² 变为 2¹²⁸)。
    • 解决了 IP 地址不足的问题。
  • IPv6 数据报不允许在路由器上分片,这个操作只能在源和目的执行。
    • 如果中间链路的 MTU 较小,这时候路由器就直接丢包,然后向发送发发一个『分组太大』的 ICMP 报文,然后源就根据这个报文,把数据报分成更小的几个再重传。
    • 这种设计是合理的,因为路由器的分片是耗时的操作,这样可以提升 IP 数据报转发的速度。
  • 去掉了首部校验和字段。
    • 把这个字段去掉之后,可以提升 IP 数据报转发的速度。
    • 因为在传输层、数据链路层中,有很多协议都有具备错误检测的功能,而首部校验和因为有 TTL 等参数变化,计算的开销很大。
  • 去掉了首部中的 Options 字段。
    • 固定首部长度,使路由器在处理数据报首部时更加明确。

引用