IP作为整个TCP/IP中至关重要的协议。主要负责将数据包发送给最终的目标计算机。因此,IP能够让世界上任何两台计算机之间进行通信。
4.1 IP即网际协议
TCP/IP的心脏是互联网层。这一层主要由IP(Internet protocol)和ICMP(Internet control message protocol)两个协议组成。
IPv4、IPv6。
4.1.1 IP相当于OSI参考模型的第3层
IP(IPv4、IPv6)相当于OSI参考模型中的网络层。
实现终端节点之间的通信。这种终端节点之间的通信也叫点对点通信。
数据链路层进行互连同一种数据链路的节点之间进行包传递。一旦跨越多种数据链路,就需要借助网络层。
4.2 IP基础知识
IP大致分为3大作用模块:IP寻址、路由(最终节点为止的转发)以及IP分包与组包。
4.2.1 IP地址属于网络层地址
IP地址用于在连接到网络中的所有主机中识别出进行通信的目标地址。因此,在TCP/IP通信中所有主机或路由器必须设定自己的IP地址。
4.2.2 路由控制
routing是指将分组数据发送到最终目标地址的功能。即使网络非常复杂,也可以通过路由控制确定到达目标地址的通路。一旦这个路由控制的运行出现异常,分组数据极有可能“迷失”,无法到达目标地址。一个数据包全靠路由控制到达最终目标地址。
发送数据至最终目标地址:
Hop为跳。是指网络中的一个区间。IP包正是在网络中一个跳间被转发。因此IP路由也叫做多跳路由。在每一个区间内决定着包在吓一跳被转发的路径。
多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将最终目标地址为止的所有通路全都指定出来。因为每一个区间(跳)在转发IP数据包时会分别指定下一跳的操作,直至包到达最终的目标地址。
路由控制表:
为了将数据包发给目标主机,所有主机都维护一张路由控制表(routing table)。该表记录IP数据在下一步应该发给哪个路由器。IP包将根据这个路由表在各个数据链路上传输。
4.2.3 数据链路的抽象化
IP是实现多个数据链路之间通信的协议。数据链路根据种类的不同各有特点。对这些不同数据链路的相异特性进行抽象化也是IP的重要作用之一。
不同数据链路有个最大的区别,就是它们各自的最大传输单位(MTU)不同。
MTU在以太网中是1500字节,在FDDI中是4352字节,而ATM则为9180字节。IP必须选择在线路上最小的MTU。
为了解决这个问题,IP进行分片处理(IP fragmentaion)。所谓分片处理是指,将较大的IP包分成多个较小的IP包。分片的包到了对端目标地址以后会再被组合起来传给上一层。这些细节对上层协议来说是隐藏的。
4.2.4 IP属于面向无连接型
IP面向无连接。即在发包之前,不需要建立与对端目标地址之间的连接。上层如果遇到需要发给IP的数据,该数据会立即被压缩成IP包发送出去。
IP采用面向无连接原因:简化、提速。
面向连接比面向无连接处理相对复杂。传输的可靠性依靠上层的TCP完成。
4.3 IP地址的基础知识
在TCP/IP通信时,用IP地址识别主机和路由器。每个设备配置正确的IP地址。
4.3.1 IP地址的定义
IPv4地址由32位正整数来表示。TCP/IP通信要求将这样的IP地址分配给每一个参与通信的主机。IP地址在计算机内部以二进制方式被处理。但人为将32为IPv4地址以每8位一组,分为4组,每组以“."隔开,再将每组转换为十进制数。
每一台主机上的每一块网卡NIC都得设置IP地址。通常一块网卡配置一个IP地址,但也可以配置多个。此外,一台路由器通常都会配置两个以上的网卡,因此可以设置两个以上的IP地址。
4.3.2 IP地址由网络和主机两部分标识组成
IP地址由“网络标识(网络地址)”和“主机标识(主机地址)”两部分组成。
网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP地址的“主机标识”则不允许在同一个网段内重复出现。
在相互连接的整个网络中每台主机的IP地址都不会相互重叠,即IP地址具有了唯一性。
4.3.3 IP地址的分类
IP地址分为4个级别:A、B、C、D。它根据IP地址中从第1位到第4位的比特列对其网络标识和主机标识进行区分。
A类地址:
A类IP地址是首位以0开头的地址。从第1位到第8位是它的网络标识。0.0.0.0~127.0.0.0是A类的网络地址。后24位为主机标识。
B类地址:
B类地址是前两位为“10”的地址,从第1位到第16位是它的网络标识。128.0.0.1~191.255.0.0是B类的网络地址。B类地址的后16位相当于主机标识。
C类地址:
C类地址是前三位为“110”的地址。从第1位到第24位是它的网络标识。192.168.0.0~239.255.255.0是C类的网络地址。C类地址的后8位相当于主机标识。
D类地址:
D类IP地址的前四位为“1110”的地址。从第1位到第32位是它的网络标识。224.0.0.0~239.255.255.255是D类的网络地址。D类地址没有主机标识,常被用于多播。
全0或全1的主机地址分别表示网络地址和广播地址。
4.3.4 广播地址
IP地址的主机位全1.
两种广播:
本地广播和直接广播。
本地广播是在本网络内的广播;直接广播是在不同网络之间的广播。
4.3.5 IP多播
同时发送提高效率:
多播用于将包发送给特定组内的所有主机。由于其直接使用IP协议,因此也不存在可靠传输。
IP多播与地址:
多播使用D类地址。也就是说首位开始的4位是“1110”。
多播需要地址外,还需要IGMP(Internet group management protocol)等协议的支持。
4.3.6 子网掩码
分类造成浪费?
根据A、B、C和D类进行IP地址划分,一类网络中可能会有很多的主机标识。需要采用更小粒度的划分。
子网与子网掩码:
现在,一个IP地址的网络标识和主机标识已不再受限于该地址的类别,而是由一个叫做“子网掩码”的识别码通过子网网络地址细分出比A类、B类、C类更小粒度的网络。这种方式实际上就是将原来A类、B类C类等分类中的主机地址部分用作子网地址,可以将原网络分为多个物理网络的一种机制。
自从引入了子网以后,一个IP地址就有了两种识别码。一种是IP地址本身,另一个是表示网络部的子网掩码。子网掩码用二进制方式表示的话,也是一个32位的数字。它对应IP地址网络表示部分的位全部为“1”,对应IP地址主机标识的部分则全部为“0”。由此,一个IP地址可以不再受限于自己的类别,二是可以用这样的子网掩码自由地定位自己的网络标识长度。当然,子网掩码必须是IP地址的首位开始连续的“1”。
4.3.7 CIDR与VLSM
CIDR:放弃IP地址的分类,采用任意长度分割IP地址的网络标识和主机标识。无类型域间选路。可以在IP8位一组的组内进行网络标识和主机标识的分割。
VLSM:可变长子网掩码。修改组织内部各个部门的子网掩码长度的机制。通过域间路由协议转换为RIP2以及OSPF实现。根据VLSM可以将网络地址划分为主机数为500个时子网掩码长度为/23,主机数为50个时子网掩码长度为/26.
4.3.8 全局地址与私有地址
全局地址:接入互联网的主机,在互联网中唯一。
局部地址:没有接入互联网的独立网络中,只用考虑其地址在该网络中唯一就行。
私有地址和NAT技术一起使用使私有地址可以访问互联网获取数据。
4.4路由控制
发送数据包时所使用的地址是网络层的地址,即IP地址。然而仅仅有IP地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。保存这种信息的就是路由控制表(routing table)。实现IP通信的主机和路由器都必须有一张这样的表。
该路由控制表的形成方式有两种:一种是管理员手动设置,另一种是路由器与其它路由器相互交换信息时自动刷新。前者叫静态路由控制,后者叫动态路由控制。
动态路由需要设置好路由协议。
IP协议始终认为路由表是正确的。IP本身并没有定义制作路由控制表的协议。该表通过路由协议制作而成。
4.4.1 IP地址与路由控制
IP地址的网络地址部分用于进行路由控制。
路由控制表由一条条的“IP地址”及其对应的“下一跳路由器”组成。IP地址的形式为:x.x.x.x/y
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。所谓最为吻合是指相同位数最多的意思。
例如:172.20.100.52的网络地址与172.20/16和172.20.100/24都匹配,此时选择匹配前缀更长的。
:IP包中的IP地址是一个32位的地址,路由控制表中的IP地址是网络地址/掩码形式。下一条路由通过特定接口指向。
默认路由:
如果一张路由表中包含所有的网络及其子网的信息,将会造成无端的浪费。这时,默认路由(default route)是不错的选择。默认路由是指路由表中任何一个地址都能与之匹配的记录。
默认路由一般标记为0.0.0.0/0或default。掩码0表示没有标识IP地址。
主机路由:
“IP地址/32”也被称为主机路由host route。例如,192.168.153.15/32就是一种主机路由。它的意思是整个IP地址的所有位都将参与路由。进行主机路由,意味着要基于主机上网卡上配置的IP地址本身,而不是基于该地址的网络地址部分进行路由。
主机路由多被用于不希望通过网络地址路由的情况。
环回地址:
环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。127.0.0.1作为环回地址。名为localhost的主机名。使用这个IP或主机名时,数据包不会流向网络。
4.4.2 路由控制表的聚合
聚合用于减小路由表的大小。
如一个路由器可以到达192.168.2.0/24和192.168.3.0/24时,可以聚合成192.168.2.0/23,然后对“可到达192.168.2.0/3”进行公示。。
4.5 IP分割处理与再构成处理
4.5.1 数据链路不同,MTU则相异
每种数据链路的最大传输单元MTU不尽相同。
IP属于数据链路的上一层,它必须不受限于不同数据链路的MTU大小。IP抽象化了底层的数据链路。
4.5.2 IP报文的分片与重组
任何一台主机都有必要对IP分片(IP fragmentation)进行相应的处理。分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。
以太网的默认MTU是1500字节。因此4324字节的IP数据报无法在一个帧当中发送完成。这时,路由器将此IP数据报划分为3个分片进行发送。而这种分片处理只要路由器认为有必要,会周而复始地进行。
经过分片之后的IP数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。
4.5.3 路径MTU发现
分片机制也有它的不足。首先,路由器的处理负荷加重。计算机网络的物理传送速度不断上升,对路由器和计算机网络提出了更高的要求。而且人们对网络安全的要求提高,路由器需要做的其它处理也越来越多,如网络过滤等。因此,只要允许,是不希望由路由器进行IP数据报包的分片处理的。
其次,在分片处理中,一旦某个分片丢失,则会造成整个IP数据报废。为了避免此类问题,TCP的初始设计还曾使用过更小的分片进行传输。其结果是网路的利用率明显下降。
为了应对以上问题,产生了一种新的技术“路径MTU发现”。所谓路径MTU是指从发送端主机到接收端主机之间不需要分片的最大MTU大小。
路径MTU发现的工作原理如下:
首先在发送端主机发送IP数据报时将首部的分片禁止标志位设置为1.根据这个标志位,途中的路由器即使遇到需要分片才能处理的大包,也不会去分片,而是将包丢弃。随后,通过一个ICMP的不可达消息将数据链路上MTU的值给发送主机。
下一次,从发送给同一个目标主机的IP数据报获得ICMP所通知的MTU值以后,将它设置为当前MTU。发送主机根据这个MTU对数据报进行分片处理。如此反复,直到数据报被发送到目标主机为止没有再收到任何ICMP,就认为最后一次ICMP所通知的MTU即是一个合适的MTU值。那么,当MTU的值比较多时,最少可以缓存约10分钟。在这10分钟内使用刚刚求得的MTU,但过了这10分钟以后则重新根据链路上的MTU做一次路径MTU发现。
前面是UDP的例子。那么在TCP的情况下,根据路径MTU的大小计算出最大段MSS,然后再根据这些信息进行数据报的发送。因此,在TCP中如果采用路径MTU发现,IP层则不会再进行分片处理。
4.6 IPv6
4.6.1 IPv6的必要性
IPv6是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议。IPv4的地址长度为4个8位字节,即32比特。而IPv6的地址长度则是原来的4倍,即128比特,一般写成8个16位字节。
从IPv4切换到IPv6极其耗时,需要将网络中所有主机和路由器的IP地址进行重新设置。
所以IPv6不仅仅能解决IPv4地址耗尽的问题,它甚至试图弥补IPv4中的绝大多数缺陷。目前,人们正着力于进行IPv4与IPv6之间的相互通信与兼容性方面的测试。
4.6.2 IPv6的特点
IP地址的扩大与路由控制表的聚合。
性能提升,包首部长度采用固定的值(40字节),不再采用首部检验码,简化首部结构,减轻路由器负荷。路由器不再做分片处理(通过路径MTU发现只由发送端主机进行分片处理)。
支持即插即用功能,即使没有DHCP服务器也可以实现自动分配IP地址。
采用认证与加密功能。应对伪造IP地址的网络安全功能以及防止线路窃听功能(IPsec)。
多播、mobile IP成为扩展功能。多播和Mobile IP被定义为IPv6的扩展功能。由此可以预期,曾在IPv4中难于应用的这两个功能在IPv6中能够顺利使用。
4.6.3 IPv6中IP地址的标记方法
IPv6的IP地址长度为128位。它所能表示的数字高达38位数。
一般将128比特IP地址以每16比特为一组,每组用冒号(“:”)隔开进行标记。而且如果出现连续的0时还可以将这些0省略,并用两个冒号(“::”)隔开。但是,一个IP地址中只允许出现一次两个连续的冒号。
4.6.4 IPv6地址的结构
IPv6类似IPv4,也是通过IP地址的前几位标识IP地址的种类。
在互联网通信中,使用一种全局的单播地址。它是互联网中唯一的一个地址,不需要正式分配IP地址。
限制型网络,即那些不与互联网直接接入的私有网络,可以使用唯一本地地址。该地址根据一定的算法生成随机数并融合到地址当中,可以像IPv4的私有地址一样自由使用。
在不使用路由器或者在同一个以太网网段内通信时,可以使用链路本地单播地址。
而在构建允许多种类型IP地址的网络时,在同一个链路上也可以使用全局单播地址以及唯一本地地址进行通信。
在IPv6的环境下,可以同时将这些IP地址全都配置在同一个NIC上,按需灵活使用。
4.6.5 全局单播地址
全局单播地址是指世界上唯一的一个地址。它是互联网通信以及各个域内部通信中最为常用的一个IPv6地址。
全局单播地址:前64比特为网络标识,后64比特为主机标识。(48位全局路由前缀、16位子网ID、64位接口ID)
4.6.6 链路本地单播地址
链路本地单播地址是指在同一个数据链路内唯一的地址。它用于不经过路由器,在同一个链路中的通信。通常接口ID保存64位的MAC地址。
10比特1111111010、54比特0、64比特接口ID。
4.6.7 唯一本地地址
唯一本地地址是不进行互联网通信时所使用的地址。
企业内部的网络与互联网通信时通常会通过NAT或网关(代理)进行。而唯一本地地址正是在这种不联网或通过NAT以及代理联网的环境下使用的。
唯一本地地址虽然不会与互联网连接,但是也会尽可能地随机生成一个唯一的全局ID。
4.6.8 IPv6分段处理
IPv6的分片处理只在作为起点的发送端主机上进行,路由器不参与分片。这也是为了减少路由器的负荷,提高网速。因此,IPv6中的“路径MTU发现”功能必不可少。不过IPv6中最小MTU为1280字节。
4.7 IPv4首部
通过IP进行通信时,需要在数据的前面加入IP首部信息。IP首部中包含着用于IP协议进行发包控制时所有的必要信息。
------------------------------------------------------------------------------------------------------------
4比特版本 | 4比特首部长度 | 8比特区分服务 | 16比特总长度
16比特标识 | 3比特标志 |13比特片偏移
8比特生存时间 | 8比特协议 | 16比特首部校验和
32比特源地址
32比特目标地址
可变比特可选字段 | 填充0
数据部分
------------------------------------------------------------------------------------------------------------------
版本version:
由4比特构成,表示标识IP首部的版本号。IPv4的版本号即为4,因此在这个字段上的值也是“4”。为6时是IPv6。
首部长度IHL(Internet header length):
由4比特构成,表明IP首部的大小,单位为4字节(32比特)。对于没有可选项的IP包,首部长度则设置为“5”。也就是说,当没有可选项时,IP首部的长度为20字节。
区分服务TOS(type of service):
由8比特构成,用来表明服务质量。0~2优先度、3~6最大安全、7未定义。3最低延迟、4最大吞吐、5最大可靠性、6最小代价。
这个值通常由应用指定。
总长度:
表示IP首部与数据部分合起来的总字节数。该字段长16比特。因此IP包的最大长度为65535字节。
标识:
由16比特构成,用于分片重组。同一个分片的标识值相同,不同分片的标识值不同。通常,每发送一个IP包,它的值也逐渐递增。此外,即使ID相同,如果目标地址、源地址或协议不同的话,也会被认为是不同的分片。
标志:
由3比特构成,表示包被分片的相关信息。第0bit表示未使用(现在必须是0)、第1bit表示是否进行分片(0可分片,1不能分片)、第2bit表示包被分片的情况下,表示是否为最后一个包(0最后一个分片的包、1分片中段的包)。
片偏移FO:
由13比特构成,用来标识被分片的每一个分段相对于原始数据的位置。第一个分片对应的值为0.由于FO域占13位,因此最多可表示8192个相对位置。单位为8字节,因此最大可表示原始数据65536字节的位置。
生存时间TTL:
由8比特构成,它最初的意思是以秒为单位记录当前包在网络上应该生存的期限。然而,在实际中它是指可以中转多少个路由器的意思。每经过一个路由器,TTL会减少1,直到变为0则丢弃该包。
协议:
由8比特构成,表示IP首部的下一个首部隶属于哪个协议。目前常使用的协议有:
首部校验和:header checksum
由16比特(2个字节)构成,也叫IP首部校验和。该字段只校验数据报的首部,不校验数据部分。它主要用来确保IP数据报不被破坏。校验和的计算过程,首先要将该校验和的所有位置设置为0,然后以16比特为单位划分IP首部,并用1补数计算所有16位字的和。最后将所得到的这个和的1补数赋给首部校验和字段。
(IP校验和只校验首部、TCP校验和校验TCP包整个包、以太网尾部FCS使用CRC更复杂的计算)。
源地址:
由32比特构成,表示发送端IP地址。
目标地址:
由32比特构成,表示接收端IP地址。
可选项:
长度可变,通常只在进行实验或诊断时使用。该字段包含如下几点信息:安全级别、源路径、路径记录、时间戳
填充padding:
也称作填充物。在有可选项的情况下,首部长度可能不是32比特的整数倍。为此,通过向字段填充0,调整32比特的整数位倍。
数据:
存入数据。将IP上层协议的首部也作为数据进行处理。
4.8 IPv6首部格式
版本。
通信量类。相当于IPv4的服务类型字段。8比特。
流标号。20比特。用于服务质量控制。
有效载荷长度。
下一个首部。
条数限制。与IPv4的存活时间类似。8比特。
源地址:128比特,8个16位字节。
目标地址:128比特。