IP协议
IP(Internet Protocol,网际协议)是TCP/IP协议族中重要的协议,主要负责将数据包发送给目标主机。IP相当于OSI(图1)的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点对点(point-to-point)通信。
图1:OSI参考模型
1. IP的功能作用
1)IP寻址
作为网络层的IP,一般称为IP地址,主要用于在连接到网络中的所有主机中识别出进行通信的目标地址,因此在TCP/IP通信中所有主机(在互联网中,将那些配有IP地址的设备叫主机,严格意义上说,配有IP地址且不进行路由控制的设备叫主机,既配有IP地址又具有路由控制能力的设备叫路由器,而节点则是主机和路由器的统称。)或路由器必须设定自己的IP地址。如图2所示,连接互联网的主机需要配置IP地址,不论哪一台主机与哪种数据链路连接,其IP地址的形式都一样,以太网、无线局域网、PPP等都不会改变IP地址的形式。另外,在网桥或交换机集线器等物理层或者数据链路层数据包转发设备中,不需要设置IP地址。因为这些设备只负责将IP包转化为0、1比特流转发或对数据链路帧的数据部分进行转发,而不需要应对IP协议。
图2:主机在互联网互联需要IP地址
2)路由
路由控制(Routing)是指将分组数据发送到最终目标地址的功能。即使网络很复杂,也可以通过路由控制确定到达目标地址的通路。一旦这个路由控制的运行出现异常,分组数据极有可能“迷失”,无法到达目标地址。因此,一个数据包之所以能够成功地到达最终的目标地址,全靠路由控制。
IP包在网路中一个个跳间(一跳(1Hop)是指利用数据链路层以下分层的功能传输数据帧的一个区间。以太网等数据链路中使用MAC地址传输数据帧。此时的一跳是指从源MAC地址到目标MAC地址之间传输帧的区间。也就是说它是主机或路由器网卡不经其他路由器而能直接到达的相邻主机或路由器网卡之间的一个区间。在一跳的这个区间内,电缆可以通过网桥或交换集线器相连,不会通过路由器或网关相连)被转发,因此IP路由也叫多条路由。在每一个区间内决定着包在下一跳被转发的路径。
多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通路全都指定出来。因为每一个区间(跳)在转发IP数据包时会分别指定下一跳的操作,直至包达到最终的目标地址。
为了将数据包发给目标主机,所有主机都维护着一张路由控制表(Routing table)。该表记录IP数据在下一步应该发给哪个路由器。IP包将根据这个路由表在各个数据链路上传输。
图3:路由控制表
3)IP分包和组包
IP是失陷多个数据链路之间通信的协议。数据链路根据种类的不同各有特点。对不同数据链路的特异性进行抽象化也是IP的重要作用。不同数据链路有个最大的区别,就是各自的最大传输单位(Maximum Transmission Unit,MTU)不同。以太网的MTU是1500字节,FDDI(Fiber Distributed Data Interface,光纤分布式数据接口)的MTU是4352字节,ATM(Automated Teller Machine,自动取款机)的MTU是9180字节。IP的上一层会要求传送比MTU更多字节的数据,因此必须在线路上传送比包长还要小的MTU。为解决这个问题,IP进行分片处理(IP Fragmentation)。所谓分片处理就是将较大的IP包分成多个较小的IP包。分片的包到了对端目标地址后再被组合起来传给上一层。从IP的上层看,它完全可以忽略数据包在途中的各个数据链路上的MTU,而只需要按照源地址发送的长度接收数据包。IP就实现了数据链路层的抽象,使得从上层更不容易看到底层网络构造的细节。
4)IP属于无连接型
IP面向无连接,也就是在发包之前,不需要建立与目标地址之前的连接。当数据链路层有需要发送的数据,该数据会立即被压缩成IP包发送出去。而面向有连接的情况则不同,目标主机关机或者不存在则不可能建立连接,那么也不可能发送数据过去。为什么IP要采用面向无连接呢?原因在于简化和提速。有连接型要比无连接型复杂的多,如前期需要握手,而且在处理连接过程中,需要耗费时间。
IP提供尽力服务(Best Effort),就是尽最大努力将数据包发送到最终目标地址,然而其并不做“最终是否收到的验证”。因此IP数据包在途中可能会发生丢失、错位以及数据翻倍等问题。为了提高通信的可靠性,TCP发挥重要作用,如果说IP只负责将数据发给目标主机,那么TCP则负责保证对目标确实收到数据。为什么不让IP具有可靠传输的功能呢?原因在于如果要一种协议规定所有的功能和作用,那么该协议的具体实现和编程会变得非常复杂,无法轻易实现,而且难以维护。相比而言,按照网络分层,明确定义每层协议的作用和责任后,针对每层具体的协议进行编程会更加有利于该协议的实现。
2. IP地址基础知识
1)IP地址定义
在使用TCP/IP通信时,用IP地址识别主机和路由器。为了保证正常通信,有必要为每个设备正确配置IP地址。IP地址分为IPv4和IPv6。IP地址(以IPv4为例)由32位正整数来表示。TCP/IP通信要求将这样的IP地址分配给每一个参与通信的主机。IP地址在计算机内部以二进制(二进制是指用0、1表示数字的方法)方式被处理。而我们并不习惯用二进制方式计数,因而将32位的IP地址以每8位为一组,分为4组,每组以“.”隔开,再将每组数转为十进制数。以图4为例。注意在这里2进制转10进制=2^7 + 2^5 +2^3 + 2^2 = 172如图5,而10进制转2进制=10101100如图6。
图4:IP地址数字表示
图5:二进制转10进制计算方法
图6:10进制转2进制计算方法
将表示成IP地址的数字整体计算,最多大概允许2^32 = 4294967296台计算机连接到网络。
2)IP地址组成
IP地址由网络标识和主机标识两部分组成。例如IP地址192.168.128.10/24,“/24”表示从第一位到24位属于网络标识,在这里“192.168.128”属于网络标识也就是网络地址,而最后的“10”为主机标识也就是主机地址。网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP地址的主机标识不允许在相同的网段内重复出现。由此,可以通过设置网络地址和主机地址在相互连接的整个网络中保证每台主机的IP地址都不会相互重叠。即IP地址具有唯一性。如图7所示,IP包被转发到途中某个路由器时,正是利用目标IP地址的网络标识进行路由。路由器只要一看IP地址的网络标识就可以进行转发。
图7:IP地址的网络标识
3)IP地址的分类
IP地址分为A类、B类、C类、D类四类。根据IP地址中从第1位到第4位的比特列对其网络标识和主机标识进行区分。如图8所示,A类IP地址是首位以“0”开头的地址从第1位到第8位是网络标识(去掉分类位剩下7位)。用十进制表示的话,0.0.0.0~127.0.0.0是A类的网络地址。A类地址的后24位相当于主机标识。因此一个网络内可容纳的主机地址上限为16,777,214个。B类地址是前两位为“10”的地址。从第1位到第16位是网络标识。用十进制表示的话,128.0.0.0~191.255.0.0是B类的网络地址。B类地址的后16位相当于主机标识。因此一个网络内可容纳的主机地址上限是65,534个。C类地址是前三位“110”的地址。从第1位到第24位是它的网络标识。用十进制表示的话,192.0.0.0~223.255.255.0是C类的网络地址。C类地址的后8位相当于主机标识,因此一个网络内可容纳的主机地址上限为254个。D类地址是前四位为“1110”的地址。从第1位到第32位是它的网路地址。用十进制表示的话,224.0.0.0~239.255.255.255是D类的网络地址。D类地址没有主机识别地址,常被用于多播。注意分配IP地址时,不可以全部为0或全部为1.因为全部为0在表示对应的网络地址或IP地址不可获知的情况下才使用。而全部为1的主机地址通常作为广播地址。因此C类地址的个数是2^8-2=254个。
图8:IP地址的分类
广播地址用于在同一个链路相互连接的主机之间发送数据包。将IP地址中的主机地址部分全部设置为1,就成了广播地址。在以太网中如果将MAC地址的所有位都改为1,则形成FF:FF:FF:FF:FF:FF的广播地址。因此广播的IP包以数据链路的帧的形式发送时,得通过MAC地址全为1比特的FF:FF:FF:FF:FF:FF转发。例如把172.20.0.0/16用二进制表示:10101100.00010100.00000000.00000000,将这个地址的主机部分全部改为1,则形成广播地址:10101100.00010100.11111111.11111111再将这个地址用十进制表示,则为172.20.255.255。
广播分为本地广播和直接广播两种。在本网络内的广播叫做本地广播。例如网络地址为192.168.0.0/24的情况下,广播地址是192.168.0.255。因为这个广播地址的IP包会被路由器屏蔽,所以不会到达192.168.0.0/24以外的其他链路上。在不同网络之间的广播叫做直接广播。例如网络地址为192.168.0.0/24的主机向192.168.1.255/24的目标地址发送IP包。收到这个包的路由器,将数据转发给192.168.1.0/24,从而使得所有192.168.1.1~192.168.1.254的主机都能收到这个包,由于直接广播有一定的安全问题,所以多数情况下载路由器上设置为不转发。
2. IP数据报文格式
图9:IPv4数据报格式
通过IP进行通信时,需要在数据的前面加入IP首部信息。IP首部中包含着用于IP协议进行发包控制时所有的必要信息。如图9所示为IPv4数据报格式。
1)IPv4首部
- 版本(Version)
由4比特构成,表示标识IP首部的版本号。IPv4的版本号为4,因此在这个字段上值也是4。
- 首部长度(IHL:Internet Header Length)
由4比特构成,表明IP首部的大小,单位为4字节(32比特)。对于没有可选项的IP包,首部长度则设为5.也就是说在没有可选项时,IP首部的长度为20字节。
- 区分服务(TOS:Type Of Service)
由8比特构成,用来表明服务质量。每一位的具体含义如表所示。
比特 | 含义 |
0 1 2 | 优先度 |
3 | 最低延迟 |
4 | 最大吞吐 |
5 | 最大可靠性 |
6 | 最小代价 |
(3~6) | 最大安全 |
7 | 未定义 |
这个值通常由应用指定。而且现在也鼓励这种结合应用的特性设定TOS的方法。然而在目前,几乎所有的网络都无视这些字段。这不仅仅是因为在符合质量要求的情况下按其要求发送本身的功能实现起来十分困难,还因为若不符合质量要求就可能会产生不公平的现象。因此实现TOS控制变得极其复杂。这也导致TOS整个互联网几乎就没有被投入使用。不过已有人提出将TOS字段本身再划分为DSCP(Differentiated Services Codepoint)和ECN(Explicit Congestion Notification)两个字段的建议。在图10中DSCP和ECN分别为6比特和2比特。DSCP(Differential Services Codepoint,差分服务代码点)是TOS(Type Of Service)的一部分。现在统称为DiffServ,用来进行质量控制。ECN(Explicit Congestion Notification,显示拥塞通告)用来报告网络拥堵情况。第6位的ECT用以通告上层TCP协议是否处理ECN。当路由器在转发ECN为1的包的过程中,如果出现网络拥堵的情况,就将CE位设置为1。
图10:DSCP和ECN
比特 | 简称 | 含义 |
6 | ECT | ECN-Capable Transport |
7 | CE | Congestion Experienced |
- 总长度(Total Length)
表示IP首部与数据部分合起来的总字节数。该字段长16比特。因此IP包的最大长度65535(=2^16)字节。目前还不存在能够传输最大长度为65535字节的IP包的数据链路。不过由于有IP分片处理,从IP的上一层的角度看,不论底层采用哪种数据链路,都可以认为能够以IP的最大包长传输数据。
- 标识(ID:Identification)
由16比特构成,用于分片重组。同一个分片的标识值相同,不同分片的标识值不同。通常每发送一个IP包,它的值也逐渐递增。此外,即使ID相同,如果目的地址、源地址或协议不同的话,也会被认为是不同的分片。
- 标志(Flags)
由3比特构成,表示包被分片的相关信息。每一位的具体含义参考下表:
比特 | 含义 |
0 | 未使用。现在必须是0 |
1 |
指示是否进行分片(don't fragment) 0-可以分片 1-不能分片 |
2 |
包被分片的情况下,表示是否为最后一个包(more fragment)。 0-最后一个分片的包 1-分片中段的包 |
- 片偏移(FO:Fragment Offset)
由13比特构成,用来标识被分片的每一个分段相对于原始数据的位置。第一个分片对应的值为0.由于FO字段占13位,因此最多可以表示8192(=2^13)个相对位置。单位为8字节,因此最大可表示原始数据8*8192=65535字节的位置。
- 生存时间(TTL:Time To Live)
由8比特构成,它最初的意思是以秒为单位记录当前包在网络上应该生存的期限。然而在实际中它是指可以中转多少个路由器的意思。没经过一个路由器,TTL会减少1,直到变成0则丢弃该包。
- 协议(Protocol)
由8比特构成,表示的是IP包传输层的上层协议编号。目前常使用的协议如下表所示
分配编号 | 简称 | 协议 |
0 | HOPOPT | IPv6 Hop-by-Hop Option |
1 | ICMP | Internet Control Message |
2 | IGMP | Internet Group Management |
4 | IP | IP in IP(encapsulation) |
6 | TCP | Transmission Control |
8 | EGP | Exterior Gateway Protocol |
9 | IGP | any private interior gateway(Cisco IGRP) |
17 | UDP | User Datagram |
33 | DCCP | Datagram Congestion Control Protocol |
41 | IPv6 | IPv6 |
43 | IPv6-Route |
Routing Header for IPv6 |
44 | IPv6-Frag | Fragment Header for IPv6 |
46 | RSVP | Reservation Protocol |
50 | ESP | Encap Security Payload |
51 | AH | Authentication Header |
58 | IPv6-ICMP | ICMP for IPv6 |
59 | IPv6-NoNxt | No Next Header for IPv6 |
60 | IPv6-Opts | Destination Options for IPv6 |
88 | EIGRP | EIGRP |
89 | OSPFIGP | OSPF |
97 | ETHERIP | Ethernet-within-IP Encapsulation |
103 | PIM | Protocol Independent Multicast |
108 | IPComp | IP Payload Compression Protocol |
112 | VRRP | Virul Router Redundancy Protocol |
115 | L2TP | Layer Two Tunneling Protocol |
124 | ISIS over IPv4 | ISIS over IPv4 |
132 | SCTP | Stream Control Transmission Protocol |
133 | FC | Fibre Channel |
134 | RSVP-E2E-IGNORE | RSVP-E2E-IGNORE |
135 | Mobility Header(IPv6) | Mobility Header(IPv6) |
136 | UDPLite | UDP-Lite |
137 | MPLS-in-IP | MPLS-in-IP |
- 首部校验和(Header Checksum)
由16比特(2字节)构成,也叫IP首部校验和。该字段只校验数据报的首部,不校验数据部分。它主要用来确保IP数据报不被破坏。校验和的计算过程,首先要将该校验和的所有位置设置为0,然后以16比特为单位划分IP首部,并用1补数计算所有16位字的和。最后将所 得到这个和的1补数赋给首部校验和字段。
- 源地址(Source Address)
由32比特(4字节)构成,表示发送端IP地址
- 目的地址(Destination Address)
由32比特(4字节)构成,表示接收端IP地址
- 可选项(Options)
长度可变,通常只在进行实现或诊断时使用。该字段包含如下几点信息:
-
- 安全级别
- 源路径
- 路径记录
- 时间戳
- 填充(Padding)
也称为填充物。在有可选项的情况下,首部长度可能不是32比特的整数倍。为此,通过向字段填充0,调整为32比特的整数倍。
- 数据(Data)
存入数据。将IP上层协议的首部也作为数据进行处理。