4.1 IP即网际协议
网络层和链路层的关系大致如下:
4.2 IP基础知识
IP大致分为三大作用模块:IP寻址、路由(最终节点为止的转发)、IP分包与组包。
IP地址属于网络层地址
MAC地址是用来标识同一个链路中不同计算机的识别码。
在网络层中,也有这种地址信息——IP地址。IP地址用于在连接到网络中的所有主机中识别出进行通信的目标地址。因此在TCP/IP通信中的所有主机或路由器必须设定自己的IP地址。
IP地址是永远保持不变的,而MAC不一定固定不变。
路由控制
路由控制是指将分组数据发送到最终目标地址的功能。即使网络非常复杂,也可以通过路由控制确定到达目标地址的通路。
Hop——“跳”,是指网络中的一个区间。IP包就是在网络中一个个跳间被转发。因此IP路由也叫做多跳路由。在每一个区间内决定包在下一条被转发的路径。
多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是直接将到最终目标地址的所有通路全都指定出来。因为每一跳在转发IP数据包时会分别指定下一跳的操作,直到包到达最终目标地址。
- 路由控制表
所有主机都维护一张路由控制表。该表记录IP数据再下一步应该发给哪个路由器。IP包将根据这个路由表在各个数据链路上传输:
数据链路的抽象化
IP是实现多个数据链路之间通信的洗衣。数据链路根据种类的不同各有特点,各自的最大传输单位(MTU)也不同。所以在数据链路上传输IP数据包时,会遇到包长大于MTU的情况。
IP通过采用分片处理,解决这个问题。将较大的IP包分为多个较小的IP包。分片的包在到达对端目标地址后会再被组合起来,传给上一层。所以在IP的上面层次看来,没有这么多复杂的操作,IP通过这种抽象化方式,使得上层更不容易看到底层网络构造的细节。
IP属于面向无连接型
IP面向无连接,即在发包之前,不需要建立与对端目标地址之间的连接。上层如果遇到需要发送给IP的数据,该数据会立即被压缩成IP包发送出去。
IP采用面向无连接的原因:
- 面向连接比起面向无连接处理相对复杂,甚至管理每个连接本身就很繁琐。
- 每次通信之前都要实现建立连接,会降低处理速度。需要连接的时候,可以委托上层提供这个服务即可。(靠上层的TCP来偷懒)
为了提高可靠性,上一层的TCP采用面向有连接型:
IP提供尽力服务,尽最大努力,但不保证将数据包发送到最终目标地址。IP数据包在途中可能会发生丢包、错位和数据量翻倍等问题。
所以TCP提高通信可靠性。IP只负责将数据发给目标主机,而TCP则负责保证对端主机确实接收到数据。
4.3 IP地址的基础知识
IP地址(IPv4)由32位正整数表示。IP地址在计算机内部以二进制方式被处理。将32位IP地址以每8位为一组,分成4组,每组以“.”隔开,再将每组数转换为十进制数:
按照这种计算逻辑,可以用43亿台主机联网。实际上,IP地址并非根据主机台数来配置。而是每一台主机上的每一块网卡都得设置IP地址。通常一块网卡只设置一个IP地址,其实一块网卡也可以配置多个IP地址。此外,一台路由器通常都会配置两个以上网卡,因此可以设置两个以上的IP地址。
IP地址由网络和主机两部分标识而成
IP地址由网络标识(网络地址)和主机标识(主机地址)两部分组成:
e.g. 192.168.128.10/24 中的/24
表示从第一位开始到多少位属于网络标识,此例中192.168.128之前的都是该IP的网络地址。
网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。而“主机标识”则不允许在同一个网段内重复出现。
IP包被转发到途中某个路由器时,就是利用目标IP地址的网络标识进行路由。因为不需要看主机标识,只要一见到网络标识就能判断是否为该网段内的主机:
IP地址的分类
感觉前几位的数字,来分A、B、C、D类:
在用比特位表示主机地址时,一般全为0只有在对应的网络地址或IP地址不可获知的情况下才使用;而全为1的主机地址通常用作广播地址。所以每一类(除D类)所能容纳的主机数都是计算得到的数字-2。
子网掩码
一个IP地址只要确定了其分类,也就确定了它的网络标识和主机标识。
在宿实际网络架构中,一般不会出现同一条链路上出现几万台计算机的情况,所以直接使用A类、B类地址,有些浪费。所以使用子网和子网掩码来减少这种浪费。
现如今一个IP地址的网络标识和主机标识不再受限于该地址的类别,而是由一个叫做子网掩码的识别码通过子网网络地址细分出比A类、B类、C类更小粒度的网络。实际上是将这几种分类中的主机地址部分用作子网地址。
引入子网后,一个IP地址就有了两种识别码,一种是IP地址本身,另一种是表示网络部分的子网掩码。子网掩码如果用二进制表示也是32位数字。它对应IP网络标识部分全部是1,对应IP主机标识部分全部是0。
全局地址与私有地址
起初,互联网中任何一台主机或路由器都必须培优一个唯一的IP地址,一旦出现IP地址冲突,就会使发送端无法判断究竟应该发送给哪个地址。而接收端收到数据报以后发送ACK时,由于地址重复,发送端也无从得知是哪个主机返回的信息。
如果一直按照该方法,那么IP地址有耗尽的危险。所以出现一项技术:不要求为每一台主机或者路由器分配一个固定的IP地址,而是在必要的时候只为相应数量的设备分配唯一的IP地址。
对于那些没有链接互联网的独立网络中的主机,只要保证在这个独立的网络内地址唯一,可以不用考虑互联网即可配置相应的IP地址。不过也会有问题:一旦它们需要连接到互联网,就会发生地址冲突。
所以出现了私有网络的IP地址:
在此范围内的IP地址都属于私有IP,而在此范围之外的IP地址称为全局IP(也叫公网IP)。
起初私有IP不能连接互联网,只用于互联网之外的独立网络,等到能够互换私有IP和全局IP的NAT技术诞生后,配有私有地址的主机与配有全局地址的互联网主机实现了通信。
私有IP地址结合NAT技术称为现在解决IP地址分配问题的主流方案。
4.4 路由控制
发送数据包时使用的是IP地址。然而仅有IP地址不足以实现将数据报发送到对端目标地址地址。在数据发送过程中还需要指明路由器或主机的信息,以便真正发往目标地址。保存这种信息的事路由控制表。实现IP通信的主机和路由器都必须持有一张这样的表。
路由控制表的形成方式有两种:
- 静态路由控制:管理员手动设置。
- 动态路由控制:路由器与其他路由器相互交换信息时自动刷新。
IP地址与路由控制
IP地址的网络地址部分用于进行路由控制。
路由控制表中记录网络地址与下一步应该发送至路由器的地址。
在发送IP包时,首先要确定IP包首部中的目标地址再从路由控制表中找到与该地址有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。
如果路由控制表中存在多条相同网络地址的记录,就选择一个最吻合的网络地址。
默认路由:如果一张表中包含所有的信息会造成浪费。默认路由是指表中任何一个地址都能与之匹配的记录。一般标记为0.0.0.0/0
或default
。
- 主机路由
IP地址/32被称为主机路由。例如192.168.153.15/32
表示的子网掩码是255.255.255.255
。他的意思是整个IP地址的所有位都参与路由。进行主机路由,意味着要基于主机上网卡配置的IP地址本身,而不是基于该地址的网络地址部分进行路由。
主机路由多被用于不希望通过网络地址路由的情况(但是使用主机路由会导致路由表膨大,路由负荷增加,进而造成网络性能下降)。
路由控制表的聚合
利用网络地址的比特分布可以有效进行分层配置。对内即使有多个子网掩码,对外呈现出的也是同一个网络地址。通过路由信息的聚合可以有效减少路由表的条目。
4.5 IP分割处理与再构成处理(MTU)
IP报文的分片与重组
分片往往在网络上遇到比较大的报文无法一下子发送出去才会处理。分片以8个字节的倍数为单位进行。
路径MTU发现
分片机制也有不足:路由器的处理负荷加重。由于对网络安全的要求提高,撸游戏需要做的其他处理越来越多,如网络过滤。所以一般不希望由路由器进行IP数据包的分片处理。
而且在分片处理中,一旦某个分片丢失,会造成整个IP数据报作废。
解决问题的技术——路径MTU发现:从发送端主机到接收端主机之间不需要分片时最大的MUT的大小。即路径中存在的所有数据链路中最小的MTU。
采用这种技术,即可在发送主机处就根据路径MTU大小对数据报分片,然后再开始发送,避免了在中途的路由器上进行分片处理。
路径MTU发现的工作原理如下:
在发送端主机发送IP数据报时将其首部的分片禁止标志位设置为1.根据该标志位,图中的路由器即使遇到需要分片才能处理的大包也不会分片,而是将包丢弃。随后,通过一个ICMP的不可达消息将数据链路上的MTU值发送给主机。
下一次,在获得ICMP通知的MTU值以后,将它设置为当前MTU。发送主机根据该MTU对数据报分片。如此反复,直到数据报被发送到目标主机为止没有再收到任何ICMP,就认为最后一次ICMP所统治的MTU就是一个合适的MTU值。一般MTU值最少可以缓存约十分钟。
前面的例子是UDP,在TCP情况下,根据路径MTU计算出最大段长度MSS,再进行发送。如果在TCP中采用路径MTU发现,IP层不会再进行分片处理。
4.6 IPv6
IPv6是为了根本解决IPv4地址耗尽问题二倍标准化的国际网络协议。IPv4地址长度为32比特,而IPv6为128比特,一般写为8个16位字节。从IPv4切换到IPv6非常耗时,需要将网络中的所有主机和路由器的IP地址进行重新设置。
IPv6的特点
- IP地址扩大与路由控制表的聚合
IP地址依然适用互联网分层构造。分配与其地址结构相适应的IP地址,尽可能避免路由表膨大。
- 性能提升
包首部长度采用固定值(40字节),不再采用首部校验码。简化手部结构,减轻路由器复合。路由器不再做分片处理。
- 支持即插即用功能
即使没有DHCP服务器也可以实现自动分配IP地址。
- 采用认证与加密功能
应对伪造IP地址的网络安全功能以及防止线路窃听的功能(IPsec)。
- 多播、Mobile IP称为扩展功能
IPv6中IP地址标记方法
IPv6的IP地址长度为128位,每16位为一组,用冒号:
分割;如果出现连续的0可以用两个冒号::
隔开,最多出现一次两个连续的冒号。
全局单播地址
全局单播地址是指世界上唯一的一个地址。是互联网通信以及各个域内通信中最常用的一个IPv6地址。
现在的地址格式为 n = 48 m = 16 128-n-m = 64,即前64位为网络标识,后64位为主机标识。
链路本地单播地址
链路本地单播地址是指在同一个数据链路内唯一的地址。它用于不经过路由器,在同一个链路中的通信。
唯一本地地址
唯一本地地址是不进行互联网通信时使用的地址。
设备控制的限制性网络以及金融机关的核心网等会与互联网隔离。企业内网与互联网通信时通常会通过NAT或网关代理进行。而唯一的本地地址正是在这种不联网或通过NAT以及代理联网的环境下使用的。
IPv6分段处理
Ipv6的分片处理只在作为起点的发送端主机上进行,路由器不参与分片。所以Ipv6中的路径MTU发现功能必不可少。
4.7 IPv4首部
- 版本
由4比特构成,表示标识IP首部的版本号。
- 首部长度
由4比特构成,表明IP首部大小,单位为4字节。对于没有可选项的IP包,首部长度设置为5。
- 区分服务
由8比特构成,用来表明服务质量,每一位含义如下:
这个值通常由应用指定,但是一般所有的网络都无视这些字段。
- DSCP段与ECN段
TODO
- 总长度
表示IP首部与数据部分合起来的总字节数。该字段长16比特。因此IP包的最大长度为65535字节。
- 标识
由16比特构成,用于分片重组。同一个分片的标识值相同,不同分片的标识值不同。通常,每发送一个IP包,它的值也逐渐递增。此外,即使ID相同,如果目标地址、源地址或协议不同的话,也会被认为是不同的分片。
- 标志
由3比特构成,表示包被分片的相关信息:
- 片偏移
由13比特构成,用来表示被分片的每一个分段相对于原始数据的位置。
- 生存时间(TTL)
由8比特构成,最初的意思是以秒为单位记录当前包在网络上应该生存的期限。实际上它是指可以中专多少个路由器的意思。每经过一个路由器TTL减1,直到变成0就丢弃该包。(TTL占8位,因此可以表示0~255的数字,因此一个包的中专路有次数不会超过256个。由此可以避免IP包在网络内无限传递的问题)
- 协议
由8比特构成,表示IP首部的下一个首部隶属于哪个协议。如TCP、UDP等。
- 首部校验和
由16比特构成,也叫IP首部校验和。只负责校验数据报的首部,不校验数据部分。
- 源地址
由32比特构成,表示发送端IP地址。
- 目标地址
由32比特构成,表示接收端IP地址。
- 可选项
长度可变,通常只在实验或诊断时使用。
- 填充(Padding)
再有可选项的情况下,首部长度可能不是32比特的整数倍。为此向字段填充0调整为32比特的整数倍。
- 数据
存入数据。将IP上层协议的首部也作为数据进行处理。
4.8 IPv6首部格式
IPv6为了减轻路由器负担,省略了首部校验和字段(因为TCP和UDP在做校验和计算的时候使用伪首部,所以可以验证IP地址或协议是否正确。因此即使IP层无法提供可靠传输,在TCP或UDP层也可以提供可靠传输的服务。)提高了包的转发效率。
分片处理所用的识别码成为可选项。为了让64位CPU的计算机处理起来更方便,IPv6的首部及可选项都由8字节构成。
- 版本
由4比特构成,IPv6在该字段上的值为6
。
- 通信量类
相当于IPv4的区分服务字段,也由8比特构成。由于历史遗留原因得以保留该字段。
- 流标号
由20比特构成,准备用于服务质量控制。
- 有效载荷长度
指包的数据部分。IPv4的整体长度指的是包含首部在内的所有长度。而IPv6的这个有效载荷长度不包括首部,只表示数据部分的长度。
- 下一个首部
相当于IPv4的协议字段。由8比特构成,表示IP的上一层是协议是TCP或UDP。
- 跳数限制
由8比特构成,与IPv4中的TTL意思相同。
- 源地址
由128比特构成,表示发送端IP地址。
- 目标地址
由128比特构成。表示接收端IP地址。