【读】这一次,让我们再深入一点 - IP协议

网络是我们工程师的基础技能之一, 毕竟没有网络我们什么也干不了! 从各大公司的招聘要求上看,网络也是重点的考核部分. 今天就和大家一起复习下(还)大学里的课程(欠下的债)! TCP/IP 协议簇的 IP 协议.

理解网络模型

网络的设计大佬们想出了分层的设计,将各个功能分开,交付给不同的层,这样的好处是便于更新和维护(IPv6 的到来并没有使整个网络重新设计),也便于我们的学习和理解.下面是各个版本的网络体系的结构图: layers

让我们明确下各层的工作职责(以五层协议为例):

  • 应用层,该层协议主要负责各个应用程序之间交互的规则.如 HTTP,DNS.
  • 运输层,为应用层提供通用的数据传输服务.为上层跑腿的.TCP,UDP 均是运输层协议.
  • 网络层,为网络中不同的主机提供通信服务.IP 协议工作在该层.
  • 数据链路层,负责相邻两点的数据传送.
  • 物理层, 传输比特流, 0 或 1.

每一层将数据封装成自己能理解的数据格式,交付给下一层,下一层将收到的作为自己的数据再次添加本层的必要数据,向下交付,直到链路层,传递到目的地后,每层再将该层的必要数据去掉,交付给上层.如下图: layers-work

理解 IP 协议

在理解了网络模型和各层直接的配合之后,下面进入今天的正题,网际协议(IP).

该节主要理解 IP 协议给我们提供的功能有哪些,说白了就是它能干嘛.

  • 为网络中的主机(PC 或路由或网关)提供身份证.
  • 定义了网络主机的基本交流方式, 从 IP 数据报的格式可以看出.
  • 为路由寻址提供方便, 从路由表结构可以看出.

任何一个协议都可以由语法,语义和同步三部分组成.

  • 语法,交换信息的格式,对于 IP 协议,就是 IP 报文的格式.
  • 语义,即需要发出何种控制信息,以及接收到信息后如何响应.
  • 同步,对事件顺序的详细说明.

也就是定义了使用 IP 协议进行交流的法则.

IPv4

IPv4 是 IP 协议的第 4 个版本,就是我们现在使用的.下面从多个方面了解下该版本.

IP 地址

网络上的主机都需要一个 IP 地址,这样才能知道彼此的位置.IPv4 地址由 32bit 构成,常使用点分十进制表示(192.168.1.1).

分类

IP 地址的分类就是把所有 IP 划分为若干类别, 每一类都由固定长度的字段组成.分别为网络号主机号.下面是各类地址组成示意图: ip-category

  • A 类地址,8 位网络号,第一位固定为0,可用的网络号只有 126 个(2^7 - 2),网络号从 0 到 127. 减去 2 是因为:IP 地址全为 0 表示”本网络”,保留; 网络号为127作为软件回环测试使用, 若主机发出目的地为127.0.0.1的数据时,该数据不会向任何网络上的主机发送.也就是说127开头的地址不能使用.

    对于 A 类地址中的每一个网络号,对应的主机号有(2^24 - 2)个: 主机号全 0 表示,其网络号对应的网络地址, 全 1 表示所有主机的意思.

  • B 类地址网络号为 16 位,但前面 2 位以固定为1 0.无论怎么取值,无法出现全 0 或全 1 的情况.128.0.0.0的网络是不使用的,实际使用的最小 B 类网络地址为128.1.0.0.所以 B 类的网络地址有(2^14 - 1)个.
  • C 类的地址有 24 位的网络号,最前面的 3 位固定为1 1 0.192.0.0.0的网络地址也是不使用的,最小的 C 类地址为192.0.1.0

总结如下:

网络类别 网络数量 第一个可以使用的网络号 最后一个可以使用的网络号
A 126(2^7 - 2) 1 126
B 16383(2^14 - 1) 128.1 191.255
C 2097151(2^21 - 1) 192.0.1 223.255.255

分类的好处:

  • 方便管理,IP 地址管理机构只需管理网络号,剩下的可以由下级管理.
  • 路由寻址时根据网络地址转发分组,减小路由表.

数据报格式

先看下 IP 数据报的基本格式: message-format

可以看到 IP 数据报包含了首部和数据部分. 其中首部包含固定的 20 字节和可变的部分. 下面是各部分的解释:

  • 版本,占 4 位,IP 协议的版本号,通信双方需要相同.
  • 首部长度,占 4 位, 单位4字节.最大能表示(2^4-1) * 4 = 60字节.当 IP 分组的首部长度不是 4 的整数倍时,需要使用填充字段填充.
  • 区分服务,占 8 位, 表示服务类型,未使用.
  • 总长度, 占 16 位,表示首部和数据部分的总长度(单位字节).因此数据报的最大总长度为(2^16 - 1 = 65535)字节.
  • 标识(identification), 占 16 位.当数据报长度超过下层的 MTU 时,需要分片, 被分片的数据报的标识一样,这样可以进行重组.
  • 标志(Flag), 占 3 位, 目前只有 2 位有意义
    • 最低位,MF(More Fragment) = 1 表示后面还有分片. MF = 0 表示分片中的最后一个.
    • 中间一位,DF(Don’t Fragment),不要分片,只有当 DF=0 才允许分片
  • 片偏移, 占 13 位.较长的分组在分片后, 某片在原分组的相对位置.必须是 8 字节的整数倍.
  • 生存时间, 占 8 位, Time To Live(TTL),开始指生存的秒数,后来变为经过路由的跳数,每经过一个路由,TTL 减小 1,当为 0 时,丢弃该数据.显然,最大跳数为 255, 为 1 时就只能在局域网中传播了.
  • 协议, 占 8 位.支出该数据报的数据是使用何种协议, 以便目的主机 IP 层知道将数据交付给哪个协议处理.

    常用的协议及对应数值:

    协议名称 ICMP IGMP IP TCP EGP IGP UDP IPv6 ESP OSPF
    协议字段值 1 2 4 6 8 9 17 41 50 89
  • 首部校验和, 占 16 位.数据报的首部校验和,不包括数据部分.
  • 源地址, 目的地址, 各占 32 位

IPv6

IPv6 的出现是解决 IPv4 资源枯竭的问题.其仍然支持无连接的传送, 但传送的是 PDU 分组,而不是 IPv4 的数据报.其地址是 128bit,在可预见的未来是够用的.但和 IPv4 版本并不兼容, 若使用 IPv4 版本的主机 A 和使用 IPv6 版本的主机 B 之间通信是需要特殊处理的,在后面会介绍方法.

IPv6 的地址表示

IPv6 的地址采用冒号十六进制记法 , 8 组 4 个 16 进制数字,中间使用冒号隔开.例如:

1
6845:8C64:FFFF:FFFF:0:1180:9000:FFFF
  • 若一组中全是 0,可以省略三个.
  • 若存在连续多组 0,可以使用冒号取代,但只能压缩一次

    1
    2
    3
    FF05:0:0:0:0:0:0:B3 可以压缩为 FF05::B3
    1090:0:0:0:8:800:200C:417A 可以压缩为 1090::8:800:200C:417A
    全零可记为 ::
    
  • 最后的 2 组可以使用 IPv4 的点分十进制表示

    1
    0:0:0:0:0:0:128.10.2.1 可表示为 ::128.10.2.1
    

数据报格式

IPv6 数据报由两大部分组成, 基本首部有效载荷.有效载荷运行有 0 个或多个扩展首部. ipv6-message

可以看到,IPv6 的首部是固定的 40 字节,和 IPv4 不同;在组成上也有很大区别,下面看下各部分的意思.

  • 版本, 占 4 位, 协议的版本,通信双方需要相同
  • 通信量类, 占 8 位.区分不同的 IPv6 的数据报或优先级.
  • 流标号, 占 20 位. IPv6 一个新机制就是支持资源预分配, 运行路由把每个数据报与特定的资源分配和联系.IPv6 提出流的概念.指互联网上从特定源点到特定终点的一系列数据报(如实时的音频或视频传输), 在这个流经过的路径上路由都保证指明的服务质量.所有属于同一个流的数据报具有相同的流标号.赋值为 0 即为关闭.
  • 有效载荷长度, 占 16 位.指明除基本首部以外的字节数.最大 64KB.
  • 下一首部, 占 8 位.相当于 IPv4 的协议字段或可选字段
    • 当 IPv6 没有扩展首部时, 该字段和 IPv4 的协议字段一样.
    • 有扩展首部时,表示第一个扩展首部的类型
  • 跳数限制, 和 IPv4 的 TTL 一样
  • 源地址,目的地址, 各占 128 位

从 IPv4 向 IPv6 过渡

网络如此庞大,从 IPv4 向 IPv6 的变换不可能一蹴而就.若要在两个版本的协议下通信,有下面的 2 个方法

双协议栈

简单的说就是一个主机能够理解两个版本的内容,这样主机也要有 2 个版本对应的 IP 地址.具有双协议栈的主机, 可以通过 DNS 系统知道目的主机使用的协议版本.

下面是两台使用 IPv6 的主机通信示意图,它们之间需要通过 IPv4 网络, 在必要的时候经过双协议栈的主机进行协议的转换,当然转换的时候有些信息可能丢失,这也是不可避免的.

double-protocol

使用隧道技术

隧道技术的原理是,在 IPv6 的数据需要进入 IPv4 网络时,将 IPv6 的数据报(准确的说是 PDU)当成 IPv4 数据报的数据部分,使用 IPv4 版本传输,在离开 IPv4 网络时在此组装成 IPv6 的数据,发往目的地.下面是一个示意图: tunnel

结语

关于 IP 协议,还有很多可以谈的地方, 这里就不再深入了.读完希望你能有一个”明镜一样”的感觉.我们下篇再见.