IP协议

IP相当于OSI参考模型的第3层

IP相当于OSI参考模型中的第3层——网络层。

网络层的主要作用是“实现终端节点之间的通信”。这种终端节点之间的通信也叫“点对点”通信。

从前面的章节可知,网络层的下一层是数据链路层,数据链路层的主要作用是再互联同一种数据链路的节点之间进行包传递。而一但快遇多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。

IP基础知识

在计算机通信中,为了识别通信对端,必须要有一个类似于地址的识别码进行标识,MAC地址正是用来标识同一数据链路中不同计算机的一种识别码;而IP地址用于在“连接到网络中的所有主机中识别出进行通信的目标地址”,因此在TCP/IP通信中所有注解或路由器必须设定自己的IP地址。

路由控制

路由控制(Routing)是指将分组数据发送到最终目标地址的功能,即使网络非常复杂,也可以通过路由控制确定到达目标地址的通路。一旦这个路由控制的运行出现异常,分组数据极有可能迷失,无法到达目标地址。因此,一个数据包之所以能成功地到达最终的目标地址,全靠路由控制。

当某个IP包到达路由器时,路由器首先查找目标地址,从而再决定下一步应该将这个包发往哪个路由器,然后将包发送过去。当这个IP包到达那个路由器以后,会再次经历查找下一目标地址的过程,并由该路由器转发给下一个被找到的路由器。这个过程可能会反复多次,知道找到最终的目标地址,将数据包发送给这个节点。

为了将数据包发给目标主机,所有主机都维护着一张路由控制表。该表记录IP数据在下一步应该发给哪个路由器。IP包根据这个路由表在各个数据链路上传输。

数据链路的抽象化

IP是实现多个数据链之间通信的协议。数据链路根据种类的不同各有特点,不同数据链路有个最大的区别:就是它们各自的最大传输单位(MTU)不同。MTU的值再以太网是1500字节,再FDDI中是4352字节,而ATM则为9180字节。IP的上一层可能会要求传送比这些MTU更多字节数据,因此必须在线路上传送比包长还要小的MTU。

为了解决这个问题,IP进行分片处理。顾名思义,所谓分片处理是指,将较大的IP包分成多个较小的IP包。分片的包到了对端目标地址以后会再被组合起来传给上一层。

IP属于面向无连接型

IP面向无连接,即在发包之前,不需要建立与对端目标地址之间的连接,上层如果遇到需要发送给IP的数据,该数据会立即被压缩成IP包发送出去。

IP采用面向无连接的主要原因有两点:

  • 一是为了简化。面向连接比起面向无连接处理相对复杂。甚至管理每个连接本身就是一个相当繁琐的事情。
  • 二是为了提速。每次通信之前都要事先建立连接,又会降低处理速度。

需要连接时,可以委托上一层提供此项服务。因此IP为了实现简单化与高速化采用面向无连接的方式。

IP提供尽力服务,意指“为了把数据包发送到最终目标地址,尽最大努力”。然而,它并不做“最终收到与否的验证”。IP数据包在途中可能会发生丢包、错位以及数据量翻倍等问题。

IP地址基础知识

IP地址的定义

IP(IPv4)地址由32为正整数来表示。TCp/IP通信要求将这样的IP地址分配给每一个参与通信的主机。采用将32位的IP地址以每8位为一组,分成4组,每组以“.”隔开,再将每组数转换为十进制数。

IP地址并非是根据主机台数来配置的,而是每一台主机上的每一块网卡都得设置IP地址。通常一块网卡只设置一个IP地址,但其实一块网卡也可以设置多个IP地址。此外,一台路由器通常都会配置两个以上的网卡,因此可以设置两个以上的IP地址。

IP地址的组成

IP地址由“网络标识(网络地址)”和“主机标识(主机地址)”两部分组成。

网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP地址的“主机标识”则不允许在同一个网段内重复出现。由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的IP地址都不会相互重复。即IP地址具有了唯一性。

最初二者以分类进行区别,而现在基本以子网掩码(网络前缀)区分。

IP地址的分类

IP地址分为四个级别,分别为A类、B类、C类、D类。它根据IP地址中从第1位到第4位的比特列对其网络标识和主机标识进行区分。

  • A类地址:A类IP地址是首位以“0”开头的地址。从第1位到第8位是他的网络标识。用十进制表示的话,0.0.0.0~127.0.0.0是A类的网络地址。A类地址的后24位相当于主机标识。
  • B类地址:B类IP地址是前两位为“10”的地址。从第1位到第16位是它的网络标识。用十进制表示的话,128.0.0.0~191.255.0.0是B类的网络地址。B类地址的后16位相当于主机标识。
  • C类地址:C类IP地址是前三位为“110”的地址。从第1位到第24位是它的网络标识。用十进制表示的话,192.0.0.0~223.255.255.0是C类的网络地址。C类地址的后8位相当于主机标识。
  • D类地址:D类IP地址是前四位为“1110”的地址,从第1为到第32位是它的网络标识。用十进制表示的话,224.0.0.0~239.255.255.255.255是D类的网络地址。D类网络地址没有主机标识,常被用于多播。

    在IP地址分配时有一点需要注意,不可以全部为0或全部为1。因为全部为0在表示对应的网络地址或IP地址不可获知的情况下才使用。而全部为1的主机地址通常作为广播地址。

广播地址

广播地址用于在一个链路中相互连接的主机之间发送数据包。将IP地址中的主机地址部分全部设置为1,就成为了广播地址。

广播地址分为本地广播直接广播两种。在本网络内的广播叫做本地广播,在不同网络之间的广播叫做直接广播。

子网掩码

起初一个IP地址只要确定了其分类,也就确定了它的网络标识和主机标识,网络标识相同的计算机必须同属于同一个链路。但是这样会造成很多的IP地址浪费,因此后来人们改进使用子网掩码进行区分。

对于子网掩码,目前有两种标识方式。以172.20.100.52的前26位是网络地址的情况为例,以下是其中一种表示方法,它将IP地址与子网掩码的地址分别用两行来表示:

1
2
3
4
5
6
7
8
IP地址		172.	20.	100.	52
子网掩码 255. 255. 255. 192

网络地址 172. 20. 100. 0
子网掩码 255. 255. 255. 192

广播地址 172. 20. 100. 63
子网掩码 255. 255. 255. 192

另一种表示方法如下所示,它在每个IP地址后面追加网络地址的位数用“/”隔开。

1
2
3
IP地址		172.	20.	100.	52	/26
网络地址 172. 20. 100. 0 /26
广播地址 172. 20. 100. 63 /26

路由控制

发送数据包时所使用的地址是网络地址,即IP地址。然而仅仅有IP地址还不足以将数据包发送到对端目标地址,在数据发送过程中还需要类似于“知名路由器或主机”的信息,以便真正的发往目标地址。保存这种信息的就是路由控制表。

该路由控制表的形成方式有两种:一种是管理员手动设置,另一种是路由器与其他路由器相互交换形信息时自动刷新。前者也叫静态路由控制,后者叫做动态路由控制。

IP地址与路由控制

路由控制表中记录着网络地址与下一步应该发送至路由器的地址,在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。如果控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址,所谓最为吻合是指相同位数最多的意思。

如果一张路由表中包含所有的网络及其子网的信息,将会造成无端的浪费,这是,默认路由是不错的选择。默认路由是指路由表中任何一个地址都能与之匹配的记录。默认路由一般标记为0.0.0.0./0或default。

“IP地址/32”也被称为主机路由。它的意思是整个IP地址的所有位都将参与路由。进行主机路由,意味着基于主机上网卡配置的IP地址本身,而不是基于该地址的网络地址部分进行路由。主机路由多被用于不希望通过网络地址路由的情况。

IP分割处理与再构成处理

如前面介绍所说,每种数据链路的最大传输单元(MTU)不尽相同,简与IP数据数据链路上一层,它必须不受限于不同数据链路的MTU大小。

IP报文的分片与重组

任何一台主机都有必要对IP分片进行相应的处理。分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。

分片默认以8个字节的倍数为单位进行,经过分片之后的IP数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但是不会进行重组。

路径MTU发现

分片机制也有它的不足,例如路由器的处理符合加重,一旦某个分片丢失,会造成整个IP数据报作废等等。为了应对这些问题,产生了一种新的技术“路径MTU发现”。

所谓路径MTU是指从发送端主机到接收端主机之间不需要分片时最大的MTU的大小。即路径中存在的所有数据链路中最小的MTU。而路径MTU发现从发送主机按照路径MTU的大小将数据报分片后进行发送,进行路径MTU发现,就可以避免在中途的路由器上进行分片处理,也可以在TCP中发送更大的包。

路径MTU发现的工作原理如下:
首先在发送端主机发送IP数据报时将其首部的分片禁止标志设置为1。根据这个标志位,途中的路由器即使遇到需要分片才能处理的大包,也不会去分片,而是将包丢弃。随后,通过一个ICMP的不可达消息将数据链路上MTU的值给发送主机。

下一次,从发送给同一目标主机的IP数据报获得ICMP所通知的MTU值以后,将它设置为当前MTU。发送主机根据这个MTU对数据报进行分片处理。如此反复,直到数据报被发送到目标主机为止没有再收到任何ICMP,就认为最后一次ICMP所统治的MTU即是一个合适的MTU值。

那么,当MTU的值比较多时,最少可以缓存约10分钟。在这10分钟内使用刚刚求得的MTU,但过了这10分钟以后则重新根据链路上的MTU做一次路径MTU发现。

下面是UDP和TCP的路径MTU发现过程:

IPv6

IPv6是为了根本解决IPv4地址耗尽的问题而被标准化的网络协议。IPv4的地址长度为4个8位字节,即32比特。而IPv6的地址长度则是原来的4倍,即128比特,一般写成8个16字位字节。

IPv6的特点

IPv6通过改进IPv4的缺点,减轻了管理员的负担。

  • IP地址的扩大与路由控制表的聚合
  • IP地址依然适应互联网分层构造。分配与其地址结构相适应的IP地址,尽可能避免路由表膨大
  • 性能提升
  • 支持即插即用功能,即使没有DHCP服务器也可以实现自动分配IP地址
  • 采用认证与加密功能,应对伪造IP地址的网络安全功能以及防止路线窃听的功能
  • 多播、Mobile IP称为扩展功能

IPv6在IP地址的标记方法

一般人们将128比特IP地址以每16为一组,每组用冒号“:”隔开进行标识。而且如果出现连续的0时还可以将这些0省略,并用两个冒号“::”隔开,但是一个IP地址中只允许出现一次两个连续的冒号。

IPv6分段处理

IPv6的分片处理只在作为起点的发送端主机上进行,路由器不参与分片。这也是为了减少路由器的负荷、提高网速。因此IPv6中的“路径MTU发现”功能必不可少。

不过IPv6中最小的MTU为1280字节,因此,在嵌入式系统中对于那些有一定系统资源限制的设备来说,不需要进行“路径MTU发现”,而是在发送IP包时直接以1280字节为单位分片发出。

IPv4首部

通过IP进行通信时,需要在数据的前面加入IP首部信息。IP首部中包含用于IP协议进行发包控制时所有的必要信息。

  • 版本:由4比特构成,表示标识IP首部的版本号,IPv4的版本号为4,因此在这个字段上的值即为“4”,IPv6的版本号为6。
  • 首部长度:由4比特构成,表明IP首部的大小,单位为4字节。对于没有可选项的IP包,首部长度则设置为5.
  • 区分服务:由8比特构成,用来表明服务质量,如下表:
  • DSCP段与ECN段:DSCP(差分服务代码点)是TOS的一部分,用来进行质量控制。ECn(显示拥塞通告)用来报告网络拥堵情况,由两个比特构成。
  • 总长度:表示IP首部与数据部分合起来的总字节数,该字段长16比特,因此IP包的最大长度为65535字节。
  • 标识(ID):由16比特构成,用于分片重组,同一个分片的标识值相同,不同分片的标识值不同。通常每发送一个IP包,它的值也逐渐递增。此外,即使ID相同,如果目标地址、源地址或协议不同的话,也会被认为是不同的分片。
  • 标志:由3比特构成,标识包倍分片的相关信息。具体含义如下:
  • 片位移:由13比特构成,用来标识被分片的每一个分段相对于原始数据的位置。第一个分片对应的位置为0。
  • 生存时间(TTL):由8比特构成,最初意思是以秒为单位记录当前包在网络上应该生存的限期,实际中它是指可以中转多少个路由器的意思,每经过一个路由器,TTL就会减少1,直到变成0则丢弃包。TTl不会超过256,由此可以避免IP包在网络内无限传递的问题。
  • 协议:由8比特构成,表示IP包传输层的上层协议编号。
  • 首部校验和:由16比特构成,也叫IP首部校验和。盖子都安只校验数据报的首部,不校验数据部分。它主要用来确保IP数据报不被破坏。
  • 源地址:由32比特构成,表示发送端IP地址。
  • 目标地址:由32比特构成,表示接收端IP地址。
  • 可选项:长度可变,通常只在进行实验或诊断时使用,包含信息有如下几点:安全级别、源路径、路径记录和时间戳。
  • 填充:也称作填充物,在有可选项的情况下,首部长度可能不是32比特的整数倍,为此,通过向该字段填充0,调整为32比特的整数倍。
  • 数据:存入数据。将IP上层协议的首部也为作为数据进行处理。

IPv6首部格式

IPv6的IP数据首部格式相比IPv4已经发生巨大变化:

  • 版本:同IPv4一样。
  • 通信量类:相当于IPv4的TOS字段。至今没什么用。
  • 流标号:由20比特构成,准备用于服务质量控制,现在也没有用。只有流标号、源地址以及目标地址三项完全一致时,才被认为是一个流。
  • 有效载荷长度:有效载荷是指包的数据部分,这里不包括首部,只表示数据部分的长度。
  • 下一个首部:相当于IPv4的协议字段,由8比特构成。
  • 跳数限制:由8比特构成,相当于IPv4的TTL。
  • 源地址:由128比特构成,表示发送端IP地址。
  • 目标地址:由128比特构成,表示接收端IP地址。

IPv6的首部长度固定,无法将可选项加入其中,取而代之的是通过扩展首部对功能进行了有效扩展。