目录
一、IPv4分组
1、IPv4分组的格式
2、IP数据报分片
3、网络层转发分组的流程
二、IPv4地址与NAT
1、IPv4地址
2、NAT
三、子网划分与子网掩码、CIDR
1、子网划分
2、子网掩码
3、CIDR
四、ARP、DCHP(待补充)、ICMP
1、ARP
2、DCHP
3、ICMP
一、IPv4分组
1、IPv4分组的格式
- 一个IP由首部和数据部分组成。首部前一部分的长度固定,共20B,是所有IP分组必须具有的。
- 在首部的固定部分后面是可变部分,长度可变 (从1个字节到40个字节不等),用来提供错误检测及安全等机制。
- 默认情况下,我们将IP数据报首部看成是20B即可,因为可变部分基本不被使用。
IP首部的各部分字段含义如下:
- 版本:占4位,指IP的版本,比如是IPv4还是IPv6版本,通信双方的版本必须一致。
- 首部长度:占4位,可表示的最大数值是 15 个单位(一个单位为 4 字节),因此IP的首部长度的最大值是 60 字节 (实际上IP数据报的首部长度为60B,但是有40B基本从不使用,所以我们默认IP数据报首部是20B)。
- 总长度:占16位,指首部和数据部分长度之和,单位为字节,因此数据报的最大长度为(2^16 - 1) = 65535B。(小贴士:有些人不明白为什么-1,这个可以自己举例子体会,比如1111转化成字节数,相当于2^0+2^1+2^2+2^3 <=> 2^4-1) 由于以太网帧(MAC帧)的最大传送单元(MTU)为1500B,因此当一个IP数据报封装成帧时,数据报的总长度(首部加数据)一定不能超过下面数据链路层的MTU的值。为避免这种情况,需要切割后再发送,这就是IP数据报分片(后面再具体讲解)。
- 标识(identification):占 16 位,用来产生 IP 数据报的标识。它是一个计数器,每产生一个数据报就加1,并赋值给标识字段。但这个 “标识” 并不等同于序号,因为IP是无连接服务,数据报不存在按序接收的问题。当一个数据报长度超过MTU时,必须分片,这个标识字段的值就会被复制到所有的数据报片的标识字段中,相同的标识字段的值使得分片后的各数据报片最后都能正确地重装成为原来的数据报。
- 标志(flag):占3位,目前只有前两位有意义。标志字段的最低位是 MF (More Fragment)。MF=1 表示后面还有分片,MF=0 表示最后一个分片。标志字段中间的一位是 DF (Don't Fragment) 。只有当 DF=0 时才允许分片。 它们的具体使用,后面会进行讲解。
- 片偏移:占13位,它指出了较长的分组在分片后,某片在原分组中的相对位置。片偏移以8个字节为偏移单位,即每个分片的长度一定是8B(64位)的整数倍。
- 生存时间(Time To Live):占8位,表明这是数据报在网络中的寿命,即数据报在网络中可通过的路由器数的最大值。路由器在每次转发数据报前,就把TTL值减1。若TTL值减为零时,就丢弃这个数据报。
- 协议:占8位,指出此数据报携带的数据使用何种协议,及分组的数据部分应交给哪个传输层协议,如TCP、UDP等。其中值为6表示TCP,为17表示UDP。
- 首部校验和:占16位,校验数据报 头部 在传输中是否出错。这个字段只校验数据报的首部,不校验数据部分。注意这边不采用CRC检验码计算,采用的是其它更简单的计算方式,这里不展开。
- 源地址:占32位,表示发送端主机的IP地址。
- 目的地址:占32位,表示接收方的IP地址。
注意:IP数据报首部中有三个关于长度的标记,一个是首部长度,一个是总长度,一个是片偏移,基本单位分别是4B、1B、8B,题目中常常会出现这几个长度之间的加减运算。另外读者需要熟悉首部各个字段的意义和功能。
2、IP数据报分片
如果IP数据报的总长度大于以太网帧的MTU(Maximum Transmission Unit),就需要将IP数据报中的数据分装在两个或多个较小的IP数据报汇总,这些较小的数据报称为片。
分片重组方式:目的主机使用IP首部的标识、标志和片偏移字段来完成对片的重组。
-
标识的作用:创建一个IP数据报后,源主机会为该数据报加上一个标识号。当目的主机收到来自同一发送主机的一批数据报时,它可以通过检查数据报的标识号,来确定哪些数据报属于同一个原始数据报的片。
-
标志的作用:IP首部标志位有3比特,其中有2比特有意义,分别是MF位和DF位。MF=1 表示后面还有分片,MF=0 表示最后一个分片,DF=0 时才允许分片。可以这么理解,接收端在等待并合并切割后的数据报,MF=0,就说明这个是最后一片了,接收端就不会再等待了,如果MF=1,那么接收端就保持等待状态。
-
片偏移的作用:目的主机对片进行重组时,使用片偏移字段来确定片应放在原始数据报的哪一个位置。比如,假设已经收到了最后一个分片,那么怎样将所有分片合并呢?这就需要片偏移,接收端会按照片偏移从小到大合并即可。注意合并过程中一定要将首部的20B删除。
分片方式:IP分片涉及一定的计算,举个例子,一个长为3820N的IP数据报(20B的首部,3800B的数据部分),需要被转发到一条MTU为1500B的链路上。这意味着原始数据报中3800B的数据必须被分配到3个独立的片中(每片也是一个IP数据报),如下图所示:
可以看出,由于偏移值的单位是8B ,所以除了最后一个片外,其他所有片中的有效数据部分都是8的倍数。
3、网络层转发分组的流程
转发过程按以下顺序依次执行:
- 从数据报首部提取目的主机的IP地址D,得出目的网络地址N。
- 若网络N与此路由器直接相连,则把数据报直接交付给目的主机D,这称为路由器的直接交付;否则就是间接交付。
- 若路由表有目的地址为D的特定主机路由(对特定的目的主机指明一个特定的路由,通常是为了控制或测试网络,或出于对安全的考虑才采用的),则把数据报传送给路由表中所指明的下一跳路由器。
- 若路由表中有到达网络N的路由,则把数据报传送给路由表指明的下一跳路由器。
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器。
- 否则就报告转发分组出错。
二、IPv4地址与NAT
1、IPv4地址
IP地址就是给每个连接在因特网上的主机(或路由器)分配一个在全世界范围是唯一的32位的标识符。无论哪类IP地址,都由网络号和主机号两部分组成。一般将IP地址分为A、B、C、D、E 五类地址:
这里介绍下ABC类地址,D类地址是后面章节的内容,这里先不介绍。E类地址保留为以后使用,不需要介绍。
- A类地址:A类地址的网络号是主机前8位,且第一位规定为0。A类地址可以指派的网络数为2^7-2,2^7表示网络号前8位,除去固定的第一位,剩下可以分配的数量,-2代表减去了两个特殊的地址:1、网络号全为0的IP地址,前八位是00000000。这个IP地址有特殊用途,它表示“本网络”。 2、网络号为127的(即01111111)的IP地址,它用来本地软件环回测试本主机的进程之间的通信。A类地址的主机号占3个字节,最大主机数为2^24-2个,2^24代表了主机号共有24位,每位要么0要么1有两种分法。-2代表减去两个特殊的地址:1、主机号全0的地址,表示该网络(例如,若主机的IP地址为5.6.7.8,那么该主机所在的网络号就是5,该网络的网络地址为5.0.0.0;若主机的IP地址为12.0.0.1,那么该主机所在的网络地址就是12.0.0.0)。2、主机号全1的地址,它表示广播地址,如12.255.255.255。所以说,合法的主机地址就是介于网络地址和广播地址之间的地址(即12.0.0.0 ~ 12.255.255.255)。
- B类地址:B类地址网络号为前面的16位,且前面2位固定为10,所以无论后面14位怎么设置,都不可能出现全0,所以B类地址可指派的网络数为2^14。(旧教材会指出B类地址128.0.0.0是不指派的,所以结果是2^14-1,但是根据最新的[RFC 6890],这个网络地址已经可以指派了!) 同理,B类地址的最大主机数是2^16-2,-2代表扣除全0和全1的主机号。
- C类地址:C类网络号为前面24位,并且前面前3位规定为110,由于不管后面怎么设置,都不可能出现全0,所以可以指派的网络数是2^21(这里也是,旧教材会指出C类地址192.0.0.0是不指派的,所以结果是2^21-1,但是根据最新的[RFC 6890],这个网络地址已经可以指派了!),同理,C类地址的最大主机数是2^8-2=254。
上述归纳成下面的表格:
注意↓
需要牢记
分类的 IP 地址的优点和缺点:管理简单;使用方便;转发分组迅速;划分子网,灵活地使用。
但是设计上不合理:采用大地址块,浪费地址资源;即使采用划分子网的方法,也无法解决 IP 地址枯竭的问题。
因此无分类编址CIDR被提出(后面会讲到)。
2、NAT
接下来来介绍下网络地址转换NAT(Network Address Translation)。先来了解下什么是专用地址:专用地址是专门用作一些只需内部通信的机构使用的地址,无需连接到因特网,路由器看到专用地址就不转发,所以说专用地址作为目的地址是不可能在因特网上被传送的。因特网已经规定了以下地址作为专用地址:
- 10.0.0.0 ~ 10.255.255.255 (相当于一个A类网络)
- 172.16.0.0 ~ 172.31.255.255 (相当于16个连续的B类网络,小提示:这边的16算的是可分配的网络号)
- 192.168.0.0 ~ 192.168.255.255 (相当于256个连续的C类网络)
现在的问题是:如果专用网想和因特网的主机通信,怎么办?这时NAT派上用场了。NAT的作用:所有使用本地地址的主机在和外界通信时,都要在 NAT 路由器上将其本地地址转换成全球 IP 地址,才能和互联网连接,工作过程如下图:
简单来说,就是:
- 离开专用网时:替换源地址,将内部地址替换为全球地址。
- 进入专用网时:替换目的地址,将全球地址替换为内部地址。
NAT有个局限性:当 NAT 路由器具有n个全球 IP 地址时,专用网内最多只可同时有n台主机接入到互联网。所以此时NAPT(Network Address Port Translation)派上用场:
这样,用一个全球IP地址,就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。
需要注意的是,通过 NAT 路由器的通信必须由专用网内的主机发起,因此,专用网内部的主机不能充当服务器用。简单来说,专用网主机不主动联系因特网的主机,因特网的主机就一定不会主动联系专用网的主机。
三、子网划分与子网掩码、CIDR
1、子网划分
两级IP地址(网络号+主机号)设计的并不合理:
- IP地址空间的利用率有时很低。例如,对于一个只有200台主机的公司,分配一个A类网络,显然IP地址的利用率极低。
- 给每个物理网络都分配一个网络号,会使得路由表变得太大而使得网络性能变坏。
- 两级的IP地址不够灵活。
后来,人们在IP地址中增加了一个“子网号字段”,使两级IP地址变成了三级IP地址。这种做法叫做子网划分。
子网划分的基本思路:从主机号借用若干个比特作为子网号,而主机号也就相应减少了若干个比特,网络号不变。不过需要注意的是,子网划分纯属一个单位内部的事,单位对外仍然表现为没有划分子网的网络。
于是三级IP地址即:
IP地址::={<网络号>,<子网号>,<主机号>}
发送IP分组时,先根据IP数据报的目的网络号,先找到连接到本单位网络的路由器,然后改路由器在收到IP数据报后,按照目的网络号和子网号找到目的子网,最后把IP数据报直接交付给目的主机。
2、子网掩码
为了告诉主机或路由器对一个A类、B类、C类网络进行了子网划分,使用子网掩码来表达对原网络中主机号的借位。子网掩码是一个与IP地址对应的、长32位(bit)的二进制串,由一串1和跟随的一串0组成。其中1对应于IP地址中的网络号及子网号,而0对应于主机号。计算机只需要将IP地址和其对应的子网掩码逐位“与”(AND运算),就可以得出相应子网的网络地址。
现在的因特网标准规定:所有网络都必须使用子网掩码。如果一个网络未划分子网,就采用默认子网掩码。ABC类地址默认的子网掩码分别是:255.0.0.0、255.255.0.0、255.255.255.0。
使用子网掩码后,路由表所包括的主要内容是目的网络地址、子网掩码和下一跳地址。此时路由器的分组转发算法如下:
- 从收到的分组首部提取目的IP地址,记为D。
- 先判断是直接交付还是间接交付,方法是用D和路由器直接相邻的网络的子网掩码逐位相“与”,看看是否和相应地的网络匹配。若匹配,说明目的主机在本网络上,直接交付,否则就是间接交付。
- 若路由表中有目的地址为D的特定主机路由,则将分组传送给指明的下一跳路由器,否则执行第4步。
- 对路由表中每一行子网掩码和D逐位相“与”。若其结果与该行的目的网络地址匹配,则将分组传送给该行指明的下一跳路由器。否则执行第5步。
- 若路由表有一个默认路由,那么将分组传送给路由表中所指明的默认路由器,否则执行第6步。
- 报告转发分组出错。
3、CIDR
CIDR(Classless Inter-Domain Routing)无分类域间路由选择,作用是:消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,可以更加有效地分配 IPv4 的地址空间。
- CIDR用各种长度的“网络前缀”来代替分类地址中的网络号和子网号。于是IP地址又从三级编址回到了两级编址:IP 地址 ::= { <网络前缀>, <主机号>}。为了区分网络前缀,通常采用斜线记法 (slash notation):a.b.c.d / n:二进制 IP 地址的前 n 位是网络前缀。例如128.14.35.7/20:前 20 位是网络前缀,注意,网络前缀的位数 n 不固定,可以在 0 ~ 32 之间选取任意值;网络前缀所占比特殊,对应于网络号的部分,等效与子网掩码中连续1的部分,比如128.14.35.7/20,它的掩码是20个连续的1和后续12个连续的0。
- CIDR 把网络前缀都相同的所有连续的 IP 地址组成一个 CIDR 地址块。一个CIDR地址块可以表示很多地址,这种地址的聚合称为路由聚合(也称构成超网),路由聚合使得路由表中的一个项目可以表示多个原来传统分类地址的路由,有利于减少路由器之间的路由选择信息的交换,从而提高网络性能。
- CIDR地址块中的地址数一定是2的整数次幂,实际可指派的地址数通常为2^N-2,N代表主机号的位数,-2表示减去主机号全0(代表网络号)和主机号全1(代表广播地址)的地址。所以说,网络前缀越短,其地址块所包含的地址数就越多。
- CIDR的优点在于网络前缀长度的灵活性。由于上层网络的前缀长度较短,因此相应路由的表示项目就少。内部又可以进一步采用延长网络前缀的方法来灵活地划分子网。
- 有时候查找路由表会查找到不止一个匹配结果(谢希仁《计算机网络第8版》P142有详细描述),应当从匹配结果中选择具有最长前缀的路由,因为网络前缀越长,地址块就越小(主机号位数越小,CIDR地址块越小),这样路由就越具体。
- CIDR常用二叉线索树进行查找最长前缀匹配(谢希仁《计算机网络第8版》P144有详细描述)。
知识点巩固↓
四、ARP、DCHP(待补充)、ICMP
1、ARP
ARP地址解析协议 (Address Resolution Protocol ) ,作用:从 IP 地址解析出 MAC 地址。
在发送主机中的ARP模块将取在相同局域网上的任何IP地址作为输入,然后返回相应的MAC地址,如下图:
若发送主机222. 222. 222. 220向它的ARP模块提供了 IP地址222.222.222.222,其ARP模块便会返回了相应的MAC地址49-BD-D2-C7-56-2A。
那么ARP是如何工作的呢?每台主机或路由器在其内存中具有一个ARP表(ARP table),这张表包含IP地址到MAC地址的映射关系。 该ARP表也包含一个寿命(TTL)值,它指示了从表中删除每个映射的时间。 每台主机设有一个ARP 高速缓存 (ARP cache)来存放ARP表。注意到这张表不必为该子网上的每台主机和路由器都包含一个表项,因为某些可能从来没有进入到该表中,某些可能已经过期。从一个表项放置到某ARP表中开始,一个表项通常的寿命值是20分钟。
在主机发送数据报时,发送方先在ARP高速缓存中查看是否有目的主机的IP地址,有,就查处其硬件地址,并将此硬件地址写入MAC帧,然后通过局域网将改MAC帧发往次硬件地址;如果没有,
主机便指示适配器使用用MAC广播地址(即FF-FF-FF-FF-FF-FF)来发送ARP请求分组,ARP请求分组的目的是询问子网上所有其他主机和路由器,以确定对应于要解析的IP地址的那个MAC
地址。适配器在链路层帧中封装这个ARP分组,用广播地址作为帧的目的地址,并将该帧传输进本网络中。当目的主机接收到该ARP请求后,便发回一个响应ARP分组,响应ARP分组包括了主机B的IP与MAC地址的映射关系,主机A收到后将次映射写入自己的ARP缓存,最后按查询到的硬件地址发送MAC帧。
总结ARP的工作流程:
- 发送方是主机,目的主机在本网络,直接用ARP找到目的主机的硬件地址。
- 发送方是主机,目的主机不在本网络,先用ARP找到本网络上的一个路由器硬件地址,再通过路由器进行进一步操作。
- 发送方是路由器,目的主机在本网络,直接用ARP找到目的主机的硬件地址。
- 发送方是路由器,目的主机不在本网络,先用ARP找到本网络上的一个路由器硬件地址,再通过路由器进行进一步操作。
流程图如下:
2、DCHP
3、ICMP
ICMP (Internet Control Message Protocol) 允许主机或路由器报告差错情况和提供有关异常情况的报告,ICMP最典型的用途是差错报告。ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。ICMP 报文的格式如下图:
ICMP 报文的种类有两种:ICMP差错报告报文和ICMP询问报文。下表给出几种常用的ICMP报文类型:
对于ICMP差错报告,有以下四种类型(注意,一些教材上提到的“源点抑制”已经不再使用):
- 终点不可达:路由器或主机不能交付数据报时就向源点发送终点不可达报文。
- 时间超过:路由器收到生存时间为零的数据报,或者不在预先规定的时间内收到一个数据报的全部数据报片时,丢弃已收到的数据报并向源点发送时间超过报文。
- 参数问题:路由器或目的主机收到的数据报首部中有的字段值不正确,就丢弃所有已收到的该数据报片并向源点发送参数问题报文。
- 改变路由(重定向):路由器把改变路由报文发送给主机,让主机直到下次应将数据报交给另外的路由器。(简单来说:路由器早已通过和其它路由器交换信息,确认了比自己更优的转发路径。于是如果主机传送数据报时经过了该路由器,该路由器就会发送改变路由报文给主机,告诉它,最佳路线不是我哦,你应该选择另一个路由才能走最佳路线呢!)
下面是ICMP 差错报告报文的数据字段的内容:
ICMP差错报告报文,它的数据部分,由收到的需要进行差错报告的IP数据报的首部和其数据字段的前8个字节提取出来组成。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。
下面是不应发送 ICMP 差错报告报文的几种情况:
- 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
- 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
- 对具有多播地址的数据报都不发送 ICMP 差错报告报文。
- 对具有特殊地址(如127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP差错报告报文。
常用的ICMP 询问报文有以下两种:
- 回送请求或回送回答:由主机或路由器向一个特定的目的主机发出的询问,收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。这种询问报文用来测试目的站是否可达,以及了解其有关状态。
- 时间戳请求或时间戳回答:发出时间戳请求报文,就能收到对方响应的时间戳回答报文。利用报文中记录的时间戳(如报文的发送时间和接收时间),发送方就可以计算出当前网络的往返时延。时间戳请求与回答也可用于时钟同步和时间测量。
ICMP 的应用举例
课本中提到两个应用,具体实现参见《谢希仁计算机网络第八版P148~P149页》
1、PING (Packet InterNet Groper) 作用是用来测试两个主机之间的连通性。它使用了 ICMP 回送请求与回送回答报文。是应用层直接使用网络层 ICMP 的例子,没有通过运输层的 TCP或UDP。
2、Traceroute,这是UNIX操作系统中名字。在 Windows 操作系统中这个命令是 tracert。它用来跟踪一个分组从源点到终点的路径。利用 IP 数据报中的 TTL 字段、ICMP 时间超过差错报告报文和ICMP 终点不可达差错报告报文实现对从源点到终点的路径的跟踪。