网络层关注的是如何将源端数据包一路送到接收方,沿途可能需要经过许多跳(hop)中间路由器。

1. IPv4

1.1 首部格式

  • 版本:对于IPv4,版本字段始终为4
  • 首部长度:占四位,最大值为15。值为1代表1个32bit长度,即4字节。IPv4首部固定长度为20字节,因此首部长度最小为5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。
  • 区分服务:共8bit,前6位用来标记数据包的服务类别(如加速服务、确保服务),后2位用来携带显示拥塞通知信息(如数据包是否经历了拥塞)。
  • 总长度:包含首部和数据,共2个字节。因此数据包的最大长度为$2^{16}-1=65535$个字节。
  • 标识: IP软件在存储器中维持一个计数器,每产生一个数据包,计数器就加1,并将此值赋给标识字段。在数据包长度过长从而发生分段的情况下,相同数据包的不同分段具有相同的标识符。
  • 标志:标志字段共3位。其中第一位未使用,第二位DF为“不分段”标志位,值为1时表示不允许路由器分割该数据段。第三位MF表示“更多的段”,除了最后一个段以外,其他所有的段都必须设置为1,用途是接受方可以知道什么时候一个数据包的所有数据分段都已经到达了。
  • 片偏移:指明了当前数据分段在完整数据包中的位置(单位字节)。比如片偏移为185,则代表该片在完整数据包的偏移是185*8=1480字节。片偏移共13位,因此数据包最多有$2^{13}=8192$个段。
  • 生存时间:TTL,它的存在是为了防止无法交付的数据包在互联网中不断兜圈子。以路由器跳数为单位,在每一跳上递减,且当数据包在一台路由器上排队时间较长时,该计数器必须多倍递减。当 TTL 为 0 时就丢弃数据包,并且路由器给数据包的源主机发回一个报警包。
  • 协议:当网络层组装完成一个完整的数据包之后,该协议指明了该将它交给哪个传输进程。例如 ICMP、TCP、UDP 等。
  • 首部校验和:校验首部数据,因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。
  • 源地址和目标地址:指明源地址和目标地址的ip地址。
  • 选项:IP选项如今很少被使用。

1.2 IPv4地址

IPv4地址共32位。一个IP地址并不真正指向一台主机,而是指向一个网络接口,所以如果一台主机在两个网络上,那么它必须有两个ip地址(路由器有多个接口和多个IP地址)。

1.2.1 分类

由两部分组成,网络号和主机号,其中不同分类具有不同的网络号长度,并且是固定的。主机号全0或全1不可用,主机号全1代表网段,主机号全1为广播地址。

地址范围 默认子网掩码 保留地址 适用范围
A 1.0.0.1-126.255.255.254 255.0.0.0 10.0.0.0-10.255.255.255和127.0.0.0-127.255.255.255 大型网络
B 128.0.0.1-191.255.255.254 255.255.0.0 172.16.0.0-172.31.255.255 中型网络
C 192.0.0.1-223.255.255.254 255.255.255.0 192.168.0.0-192.168.255.255 小型网络

B类地址中的169.254.0.0到169.254.255.255是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器,这时你将会从169.254.0.0到169.254.255.255中临时获得一个IP地址。

1.2.2 子网划分(VLSM)

VLSM(可变长子网掩码)用于IPv4子网的划分,也就是把一个大的网络划分成多个小的子网。子网划分可以在内部将一个网络块分成几个部分供多个内部网络使用,但对外部世界仍然像单个网络一样。子网划分通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址。一个 B 类地址的默认子网掩码为 255.255.0.0,如果将一个B 类地址划分为4个子网,那么子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0。

1.2.3 无类域间路由(CIDR)

CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀(即子网掩码前20位为1)。CIDR用于IPv4子网的路由聚合,通过CIDR可以把多个小的子网路由条目汇总成一个大网络的路由条目,以减少路由器中路由条目的数量,提高路由效率。例:192.24.0.0/20,192.24.16.0/20可以聚合成一个表项192.24.0.0/19。使用路由汇聚时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成,在查找路由表时可能会得到不止一个匹配结果,应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配,网络前缀越长,其地址块就越小,因而路由就越具体。

2. IPv6

一般而言,IPv6并不与IPv4兼容,但与其他一些辅助性的Internet协议则是兼容的(分层模型的好处),包括TCP/UDP/ICMP/IGMP/OSPF/BGP/DNS等。

2.1 首部格式

  • 版本:对于IPv6,版本字段始终为6
  • 通信量类:同IPv4中的区分服务
  • 流标号:该字段为源端和目标端提供了一种建立伪连接的方式,把一组具有同样需要并希望得到网络同等对待的数据包打上标记。当一个流标号字段非0的数据包出现时,所有路由器都在自己内部表中查找该留标号值,看它要求哪种特殊待遇。每个流由源地址、目标地址和流标号共同决定。
  • 有效载荷长度:指明了40个字节头之后还有多少字节数。在IPv4中该字段为总长度(包括首部)。
  • 下一个首部:如果当前头之后还有扩展首部的话,该字段指明了当前头之后还有哪种扩展首部,如果当前头是最后一个ip头,那么该字段指明了数据被应该被传递给哪个协议处理(如TCP或UDP)
  • 跳数限制:同IPv4中的TTL。
  • 源地址和目标地址:分别为16字节的IPv6地址。

2.2 IPv6地址

IPv6地址长度为128位,共16字节。16个字节被分成8组,每组4个十六进制数字表示,组之间用冒号隔开,如:8000:0000:0000:0000:0123:4567:89AB:CDEF。由于地址内部可能有很多个0,所以可以进行优化:

  • 在一个组内可以省略前导0,因此0123可以写成123
  • 16个0构成的一组或多组可以用一对冒号表示,因此上面地址可以写为8000::123:4567:89AB:CDEF
  • IPv4地址可以写成一对冒号再加老式点分十进制数,如::192.168.10.46

3. NAT

由于IP地址匮乏,导致了一些保守使用IP地址的技术,其中一种方法是为每一台连在网上并使用网络的计算机分配一个IP地址,而在该主机不活跃时回收分配给它的IP地址(DHCP),然后在一些大型企业,大量活跃的网络设备导致IP地址快速耗尽,因此出现了一种叫做NAT(Network Address Translation,网络地址转换)的技术。

NAT的基本思想是ISP为每个家庭或每个公司分配一个或少量IP地址,用这些IP地址来传输Internet流量。在客户网内部,每台计算机有唯一的内部IP地址(A,B,C类保留地址),该地址主要用来传输内部流量。当一个数据包需要离开内部网络,发向其他ISP时,必须执行地址转换,把唯一的内部IP地址转换为共享的公共IP地址。

NAT主要分为三类,静态NAT、动态NAT、端口NAT(PAT)

  • 静态NAT:内部网络中的每个主机都被永久的映射成外部网络中的某个合法地址
  • 动态NAT:在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络
  • PAT:将内部IP:端口映射为外部IP:端口。NAT设备维护一个映射表,当内部数据包发往外部时,NAT设备记录下数据包内部IP地址和端口,并将数据包IP地址替换为外部IP地址,同时将端口号替换为NAT设备的65536(ip端口通过16bit编号,最多$2^{16}=65536$)个表项之一,记录在映射表中。当外部服务器响应时,NAT设备根据端口号查找映射表,将IP地址和端口号替换为内部设备信息,交由内部网络设备路由。