第四章:IP 协议
IP作为整个TCP/IP 中至关重要的协议,主要负责将数据包发送给最终的目标计算机。
4.1 IP 即网际协议
TCP/IP 的心脏是互联网层。这一层主要由IP 和 ICMP 两个协议组成。在这里现主要介绍IP协议。
4.1.1 IP 相当于OSI 参考模型中的第三层
IP 相当于OSI 参考模型中的第三层——网络层。
网络层的主要作用是“实现终端节点之间的通信”。(点对点通信)
网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两个端节点之间的数据包传递。
IP的作用:
4.1.2 网络层于数据链路层的关系
数据链路层提供直连两个设备之间的通信设备。与之相比,作为网络层的IP 则负责在没有直连的两个网络之间进行通信传输。
IP的作用与数据链路的作用:
举个例子:比如说我要去丽江旅游,我从西安出发先制定一个详细的行程表。从我家出发先坐地铁到达咸阳机场,换成飞机到达三义机场,在乘坐公交到达目的地。行程表中详细的列出了具体行程。每个区间内的出发点和目的地如同某一个数据链路的源地址和目标地址等首部信息,整个全程的行程表的作用就相当于网络层。我们旅行不仅需要详细的行程表,也需要每个区间的车票。与之类似,计算机网络中也需要数据链路层和网络层这个分层才能实现最终目标地址的通信。
4.2 IP 基础知识
IP 大致分为三大作用模块,它们是IP 寻址、路由以及IP分包与组包。
4.2.1 IP 地址属于网络层地址
我们在第三章中介绍过数据链路的MAC地址,MAC地址正是用来标识同一个链路中不同的计算机的一种识别码。
作为网络层的IP,也有这种地址信息。(IP地址)。IP地址用于在“连接到网络中的所有主机中识别出进行通信的目标地址”。
在网桥或交换集线器等物理层或数据链路层数据包转发设备中,不需要设置IP地址。
4.2.2 路由控制
路由控制是指将分组数据发送到最终目标地址的功能。一个数据包之所以能够成功地到达最终的目标地址,全靠路由控制。
- 发送数据至目标地址
Hop 译为中文叫“跳”。它是指网络中地一个区间。IP包正是在网络中一个跳间被转发。因此IP路由也叫做多跳路由。在每一个区间内决定着包在下一跳被转发地路径。
多跳路由:
一跳的范围
一跳(1 Hop)是指利用数据链路层以下分层的功能传输数据帧的一个区间。
以太网等数据链路中使用MAC地址传输数据帧。
此时的一跳是指从源MAC地址到目标MAC地址之间传输帧的区间。
就是说它是主机或路由器网卡不经其他路由器而能直接到达的相邻主机或路由器网卡之间的一个区间。
在一跳的这个区间内,电缆可以通过网桥或交换集线器相连,不会通过路由器或网关相连。
多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通路全都指定出来。因为每一个区间(跳)在在转发IP数据包时会分别指定下一跳的操作,直至包达到最终的目标地址。
例如:每到一站再打听接下来该坐什么车
IP数据包地传输亦是如此,我们可以将旅行者看作IP数据包,将车站和工作人员看作路由器。IP数据包也犹如快递包裹,而货车犹如数据链路。
IP包地发送
- 路由控制表
为了将数据包发给目标主机,所有主机都维护着一张路由控制表(Routing Table)。该表记录IP数据在下一步应该发给哪个路由器。IP包将根据这个路由表在各个数据链路上传输。
4.2.3 数据链路的抽象化
IP是实现多个数据链路之间通信的协议。数据链路根据种类的不同各有特点。对这些不同数据链路的相异特性进行抽象化也是IP的重要作用之一。数据链路的地址可以被抽象化为IP地址。因此,对IP的上一层来说,不论底层数据链路使用以太网还是无线LAN、PPP,都将被一视同仁。
不同数据链路有个最大的区别,就是它们各自最大传输单位(MTU:Maximum Transmission Unit)不同。就好像人们在邮寄或行李时有各自的大小限制一样。
不同数据链路的最大传输单位:
MTU的值在以太网中是1500字节,在FDDI中是4352字节,而ATM则为9180字节。IP的上一层可能会要求传送比这些MTU更多字节的数据,因此必须在线路上传送比包长还要小的MTU。
为了解决这个问题,IP进行分片处理(IP Fragmentation),所谓分片,就是讲较大的IP包分成多个较小的IP包。分片的包到了对端目标地址后再被组合起来传给上一层。从IP的上层看,它完全可以忽略数据包在途中的各个数据链路上的MTU,而只需要按照源地址发送的长度接收数据包。IP以这种方式抽象化了数据链路层,使得从上层更不容易看到底层网络构造的细节。
4.2.4 IP属于面向无连接型
IP面向无连接。即在发包之前,不需要建立与对端目标地址之间的连接。上层如果遇到需要发送给IP的的数据,该数据会立即被压缩成IP包发送出去。
面向有连接的情况下,需要事先建立连接。一个没有建立连接的主机也不能发送数据过来。
面向无连接的情况不同,即使对端主机关机或不存在,数据包还是会被发送出去。反之,对于一台主机来说,它会何时从哪里收到数据也是不得而知的。
为什么IP要采用面向无连接呢?
主要有两点原因: 一是为了简化,二是为了提速。 面向连接比起面向无连接处理相对复杂。甚至管理每个连接本身就是一个相当繁琐的事情。 此外,每次通信之前都要实现建立连接, 又会降低处理速度。需要有连接时,可以委托上一层提供此项服务。因此,IP为了实现简单化与高速化采用面向无连接的方式。
为了提高可靠性,上一层的TCP采用面向有连接型
IP提供尽力服务(Best Effort),意指”为了把数据包发送到最终目标地址,尽最大努力。”
然而,它并不做”最终收到与否的验证”。 IP数据包在途中可能会发生丢包、错位以及数据量翻倍等问题。
如果发送端的数据未能真正发送到对端目标主机会造成严重问题。
例如,发送一封电子邮件,如果邮件内容中很重要的一部分丢失,会让收件方无法及时获取信息。
因此提高通信的可靠性很重要。TCP就提供这种功能。如果说IP只负责将数据发给目标主机,那么TCP则负责保证对端主机确实收到数据。
那么,有人可能会提出疑问:为什么不让IP具有可靠传输的功能,从而把这两种协议合并到一起呢?
这其中的缘由就在于,如果要一种协议规定所有的功能和作用, 那么该协议的具体实施和编程就会变得非常复杂,无法轻易实现。相比之下,按照网络分层,明确定义每层协议的作用和责任以后,针对每层具体的协议进行编程会更加有利于该协议的实现。
网络通信中如果能进行有效分层,就可以明确TCP与IP各自协议的最终目的,也有利于后续对这些协议进行扩展和性能上的优化。分层也简化了每个协议的具体实现。互联网能够发展到今天,与网络通信的分层密不可分。
4.3 IP 地址的基础知识
在用TCP/IP通信时,用IP地址识别主机和路由器。为了保证正常通信,有必要为每个设备配置正确的IP地址。在互联网通信中,全世界都必须设定正确的IP地址。否则,根本无法实现正常的通讯。 因此,IP地址就像是TCP/IP通信的一块基石。
4.3.1 IP 地址的定义
IP地址(IPv4)由32位正整数来表示。TCP/IP通信要求将这样的IP地址分配给每一个参与通信的主机。IP地址在计算机内部都以二进制方式被处理。 然而,由于人类社会并不习惯于采用二进制方式,需要采用一种特殊的标记方式。那就是将32位的IP地址以每8位为一组,分成4组,每组以”.”隔开,再将每组数转换为十进制数。下面举例说明这一方法。
实际上,IP地址并非是根据主机台数来配置的,而是每台主机上的每一块网卡(NIC)都要设置IP地址。通常一块网卡只设置一个IP地址,其实一块网卡也可以配置多个IP地址。此外,一台路由器通常都会配置两个以上的网卡,因此可以设置两个以上的IP地址。
每块网卡可以分配一个以上的IP地址:
4.3.2 IP 地址由网络和主机两部分标识组成
IP地址由“网络标识(网络地址)”和“主机标识(主机地址)”两部分组成。
网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP地址的“主机标识”则不允许在同一个网段内重复出现。
可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的IP地址都不会相互重叠,即IP地址具有了唯一性。
IP包被转发到途中某个路由器,正是利用目标IP地址的网络标识进行路由。因为就是不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机。
IP地址的主机标识:
IP 地址的网络标识:
4.3.3 IP 地址的分类
IP地址分为四个级别,A、B、C、D类(还有一个一直未使用的E类)。它根据IP地址中从第1位到第4位的比特列对其网络标识和主机标识进行区分。
-
A类地址
A类IP地址是首位以“0”开头的地址,从第1位到第8位(去掉分类位剩下7位)是它的网络标识。用十进制表示的话,0.0.0.0-127.0.0.0是A类网络地址。A类地址的后24位相当于主机标识。因此,一个网段内可容纳的主机地址上限为16,777,214个。
-
B类地址
B类IP地址是前两位为“10”的地址,从第1位到第16位是它的网络标识,用十进制表示,128.0.0.1-191.255.0.0是B类网络地址,B类地址的后16位相当于主机地址。因此,一个网段内可容纳主机地址上限为65,534个。
-
C类地址
C类IP地址是前三位为“110”的地址。从第1位到第24位是它的网络标识。用十进制表示的话,192.168.0.0-239.255.255.0是C类的网络地址。C类地址的后8位相当于主机标识。因此,一个网段内可容纳主机地址上限为254个。
-
D类地址
D类IP地址是前四位为“1110”的地址。从第1位到第32位是它的网络标识,用十进制表示,224.0.0.0-239.255.255.255是D类的网络地址。D类没有主机标识,常被用于多播。
关于分配IP主机地址的注意事项
要用比特位表示主机地址时,不可以全部为0或全部为1。因为全部为0在标识对应的网络地址或IP地址不可获知的情况下才使用。全部为1的主机通常作为广播地址。
因此,在分配过程中,应该去掉这两种情况。这也是为什么C类地址每个网段最多只能有254(2的8次方-2=254)个主机地址的原因。
4.3.4 广播地址
- 两种广播:本地广播&直接广播
4.3.5 IP 多播
单播、广播、多播通信
4.3.6 子网掩码
-
分类造成浪费?
一个IP地址只要确定了其分类,也就确定了它的网络标识和主机标识。例如A类地址前8位(除首位“0”还有7位)、B类地址前16位(除首位“10”还有14位)、C类地址前24位(除首位“110”还有21位)分别是它们各自的网络标识部分。
由此,按照每个分类所表示的网络标识的范围如下所示:
用“1”表示IP网络地址的比特范围,用“0”表示IP主机的地址范围。
将它们以十进制表示,如下图所示。其中“1”的部分是网络地址部分,“0”的部分是主机地址部分。
网络标识相同的计算机必须同属同一个链路。例如,架构B类IP网络时,理论上一个链路内允许6万5千多台计算机连接。然而,在实际网络架构当中,一般不会有在同一个链路上连接6万5千多台计算机的情况。因此,这种网络结构实际上市不存在的。
因此,直接使用A类或B类地址,确实有些浪费。随着互联网的覆盖范围逐渐增大,网络地址会越来越不足以应对需求,直接使用A类、B类、C类地址就更显的浪费资源。为此,人们已经开始一种新的组合方式以减少这种浪费。
-
子网和子网掩码
现在,一个IP地址的网络标识和主机标识已不再受限于该地址的类别,而是一个叫做“子网掩码”的识别码通过子网网络地址细分出比A、B、C更小粒度的网络。这种方式实际上就是将原来A、B、C类等分类中的主机地址部分用作子网地址,可以将原网络分为多个物理网络的一种机制。
子网划分实际上就是将原来的两级IP地址转变为三级IP地址,表示如下:
IP地址 ::= {<网络号>, <子网号>, <主机号>}
从上面的表示可以看出,子网划分就是在32位中借了几位用来表示子网号,注意,这里的网络号的位数是不变的,子网号是从主机号中借走的,子网划分实际上就是减少了主机数,分配到不同的子网,每个子网包含一定的主机数。
子网的概念也就可以理解为,将一个大的网络在其内部划分成几个小的子网,但是需要注意的是,对于该网络的外层来看,还是一个大的网络,只有该网络内部才可以看到其进行了子网划分。例如:某个机构给某高校分配了一个大的网络,而该高校内部又进行了子网划分,将不同的子网分配给不同的学院,此时对于该机构来说,该高校还是一个大的网络,在其看来并没有变化,只有该高校自己才知道自己内部又进行了子网划分。
自从引入子网后,一个IP地址就有了两种识别码。一是IP地址本身,另一个是标识网络部的子网掩码。那么什么是子网掩码呢?在传输的过程中,路由器是怎么识别子网划分后的IP地址中的网络地址的?如果不提供任何信息,路由器肯定还是傻傻分不清楚,所以就出现了子网掩码。
子网掩码用二进制标识,也是一个32位的数字。它对应IP地址网络标识部分的位全部是“1”,对应IP地址主机标识的部分全部为“0”。由此,一个IP地址可以不再受限于自己的类别,而是可以用这样的子网掩码自由的定位自己的网络标识长度。当然,子网掩码必须是IP地址的首位开始连续的“1”。
对于子网掩码,目前有两种表示方法。以172.20.100.52的前26位是网络地址的情况为例,以下是其中一种表示方法,它将IP地址与子网掩码地址分别用两行来表示。
另一种标识方式如下。它在每个IP地址后面追加网络地址的位数用“/”隔开。
不难看出,在第二种方式下记述网络地址时可以省略后面的“0”。例如172.20.0.0/16跟172.20/16其实是一个意思。
子网掩码可以灵活指定网络标识的长度:
4.3.7 CIDR 与 VLSM
4.3.8 全局地址与私有地址
4.4 路由控制
发送数据包时所使用的地址是网络层的地址,即IP地址。然而仅仅有IP地址还不足以实现将数据包发送到对端目的地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。保存这种信息的就是路由控制表(Routing Table)。实现IP通信的主机和路由器都必须持有一张这样的表,它们也正是在这个表格的基础上才得以进行数据包发送的。
== 路由控制表==的形成方式有两种:一种是管理员手动设置,另一种是路由器与其他路由器相互交换信息时自动刷新。前者叫静态路由控制,后者叫动态路由控制。为了让动态路由即时刷新路由表,在网络上互连的路由器之间必须设置好路由协议,保证正常读取路由控制信息。
IP协议始终认为路由表是正确的。然而,IP本身并没有定义制作路由控制表的协议。即IP没有制作路由控制表的机制。该表是由一个叫做“路由协议”的协议制作而成。
4.4.1 IP地址与路由控制
IP地址的网络地址部分用于进行路由控制。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。最为吻合是指相同位数最多的意思。
-
默认路由
如果一张路由表中包含所有的网络及其子网的信息,将会造成浪费。这时,默认路由(Default Route)是不错的选择。默认路由是指路由表中任何一个地址都能与之匹配的记录。
默认路由一般标记为0.0.0.0/0或default。这里的0.0.0.0/0并不是指地址是0.0.0.0.由于后面是“/0”,所以没有标识IP地址。它只是为了避免人们误以为0.0.0.0是IP地址。
默认路由是一种特殊的静态路由,指的是当路由表中与包的目的地址之间没有匹配的表项时路由器能够做出的选择。如果没有默认路由,那么目的地址在路由表中没有匹配表项的包将被丢弃· 默认路由在某些时候非常有效,当存在末梢网络时,默认路由会大大简化路由器的配置,减轻管理员的工作负担,提高网络性能。
-
主机路由
“IP地址/32” 也被称为主机路由。 -
环回地址
127.0.0.1
4.4.2 路由控制表的聚合
4.5 IP 分割处理与再构成处理
4.5.1 数据链路不同,MTU则相异
4.5.2 IP 报文的分片与重组
4.5.3 路径MTU发现
为了应对路由器的负荷加重,只要允许,是不希望由路由器进行IP数据包的分片处理的。且分片处理中,一旦某个分片丢失,则会照成整个IP数据报作废。
为了应对以上问题,产生了一种新的技术“路径MTU发现”(Path MTU Discovery)。所谓路径MTU(Path MTU)是指从发送端主机到接收端主机之间不需要分片时最大MTU的大小。即路径中存在的所有数据链路中最小的MTU。而路径MTU发现从发送主机按照路径MTU的大小将数据报分片后进行发送。进行路径MTU发现,就可以避免在中途的路由器上进行分片处理,也可以在TCP中发送更大的包。
路径MTU发现机制(UDP情况下)
路径MTU发现机制(TCP情况下)
4.6 IPv6
4.7 IPv4 首部
4.8 IPv6 首部格式
参考文献《图解TCP_IP》