网络层

· ☕ 8 分钟 · 👻 Victor
🏷️

网络层

网际协议IP是TCP/IP体系中两个最主要的协议之一[STEV94][COME06][FORO10],也是最重要的因特网标准协议之一。

与IP协议配套使用的还有三个协议:

  • 地址解析协议ARP (Address Resolution Protocol)
  • 网际控制报文协议ICMP (Internet Control Message Protocol)
  • 网际组管理协议IGMP (Internet Group Management Protocol)

在这一层中,ARP画在最下面,因为IP经常要使用这个协议。ICMP和IGMP画在这一层的上部,因为它们要使用IP协议。由于网际协议IP是用来使互连起来的许多计算机网络能够进行通信,因此TCP/IP体系中的网络层常常称为网际层(internet layer),或IP层。

网络层协议依赖

虚拟互连网络

从一般的概念来讲,将网络互相连接起来要使用一些中间设备。根据中间设备所在的层次,可以有以下四种不同的中间设备:

(1) 物理层使用的中间设备叫做转发器(repeater)。

(2) 数据链路层使用的中间设备叫做网桥或桥接器(bridge)。

(3) 网络层使用的中间设备叫做路由器(router)[插图]。

(4) 在网络层以上使用的中间设备叫做网关(gateway)。

用网关连接两个不兼容的系统需要在高层进行协议的转换。

IP网:

IP网

异构的互联网链路

H1→R1→R2→R3→R4→R5→H2

异构互联网链路

ARP协议

已经知道了一个机器(主机或路由器)的IP地址,需要找出其相应的硬件地址

IP—ARP

ARP协议工作原理

当主机A要向本局域网上的某个主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址。如有,就在ARP高速缓存中查出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。

当找不到时,执行下面的操作:

  1. ARP进程在本局域网上广播发送一个ARP请求分组
  2. 在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组
  3. 主机B的IP地址与ARP请求分组中要查询的IP地址一致,就收下这个ARP请求分组,并向主机A发送ARP响应分组,并在这个ARP响应分组中写入自己的硬件地址。

在网络链路上传送的帧最终是按照硬件地址找到目的主机的,那么为什么我们不直接使用硬件地址进行通信,而是要使用抽象的IP地址并调用ARP来寻找出相应的硬件地址呢?

由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此由用户或用户主机来完成这项工作几乎是不可能的事。但统一的IP地址把这个复杂问题解决了。连接到因特网的主机只需拥有统一的IP地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为上述的调用ARP的复杂过程都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。

IP数据报

IP报文格式:

IP报文

片偏移的列子:

一数据报的总长度为3 820字节,其数据部分为3 800字节长(使用固定首部),需要分片为长度不超过1 420字节的数据报片。因固定首部长度为20字节,因此每个数据报片的数据部分长度不能超过1 400字节。于是分为3个数据报片,其数据部分的长度分别为1 400,1 400和1000字节。原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。下如给出分片后得出的结果(请注意片偏移的数值)

片偏移例子

下面是数据报首部与分片有关的字段中的数值,其中标识字段的值是任意给定的(12345)。具有相同标识的数据报片在目的站就可无误地重装成原来的数据报。

数字报字段

首部检验和 占16位。这个字段只检验数据报的首部,但不包括数据部分

这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。为了进一步减小计算检验和的工作量,IP首部的检验和不采用复杂的CRC检验码而采用下面的简单计算方法:在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算[插图]把所有16位字相加后,将得到的和的反码写入检验和字段。接收方收到数据报后,将首部的所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃。

数据报校验码

IP层转发分组

网络拓扑图:

网络拓扑

在简化图中,网络变成了一条链路,但每一个路由器旁边都注明其IP地址。使用这样的简化图,可以使我们不用关心某个网络内部的具体拓扑以及连接在该网络上有多少台计算机,因为这些对于研究分组转发问题并没有什么关系。这样的简化图强调了在互联网上转发分组时,是从一个路由器转发到下一个路由器。

总之,在路由表中,对每一条路由最主要的是以下两个信息:

(目的网络地址,下一跳地址)

于是,我们就根据目的网络地址来确定下一跳路由器,这样做得出以下的结果。

(1) IP数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。

(2) 只有到达最后一个路由器时,才试图向目的主机进行直接交付。

网际控制报文协议ICMP

为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP。

ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告.一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。所以我们就需要一种协议来完成这样的功能–ICMP协议。

ICMP报文格式

ICMP报文格式

ICMP报文的种类有两种,即ICMP差错报告报文ICMP询问报文

几种常用的ICMP报文类型

ICMP类型

ICMP报文的代码字段是为了进一步区分某种类型中的几种不同的情况。检验和字段用来检验整个ICMP报文。我们应当还记得,IP数据报首部的检验和并不检验IP数据报的内容,因此不能保证经过传输的ICMP报文不产生差错。

ICMP差错报告

ICMP差错报文共有五种,即:

  1. 终点不可达 当路由器或主机不能交付数据报时就向源点发送终点不可达报文。

  2. 源点抑制 当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。

  3. 时间超过 当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。

  4. 参数问题 当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。

  5. 改变路由(重定向) 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。

    如果默认路由器发现主机发往某个目的地址的数据报的最佳路由不应当经过默认路由器而是应当经过网络上的另一个路由器R时,就用改变路由报文把这情况告诉主机。于是,该主机就在其路由表中增加一个项目:到某某目的地址应经过路由器R (而不是默认路由器)。

所有的ICMP差错报告报文中的数据字段都具有同样的格式:

ICMP数据报格式

下面是不应发送ICMP差错报告报文的几种情况。

● 对ICMP差错报告报文不再发送ICMP差错报告报文。

● 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文。

● 对具有多播地址的数据报都不发送ICMP差错报告报文。

● 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文。

ICMP询问报文

常用的ICMP询问报文有两种,即:

  1. 回送请求和回答 ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
  2. 时间戳请求和回答 ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用来进行时钟同步和测量时间。

应用

ping

ICMP报文的一个最大用途就是ping命令,用来测试两个主机之间的连通性:

ping

tracert

Traceroute从源主机向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报[插图]。第一个数据报P1的生存时间TTL设置为1。当P1到达路径上的第一个路由器R1时,路由器R1先收下它,接着把TTL的值减1。由于TTL等于零了,R1就把P1丢弃了,并向源主机发送一个ICMP时间超过差错报告报文。源主机接着发送第二个数据报P2,并把TTL设置为2。P2先到达路由器R1,R1收下后把TTL减1再转发给路由器R2。R2收到P2时TTL为1,但减1后TTL变为零了。R2就丢弃P2,并向源主机发送一个ICMP时间超过差错报告报文。这样一直继续下去。当最后一个数据报刚刚到达目的主机时,数据报的TTL是1。主机不转发数据报,也不把TTL值减1。但因IP数据报中封装的是无法交付的运输层的UDP用户数据报,因此目的主机要向源主机发送ICMP终点不可达差错报告报文。

tracert

这样,源主机达到了自己的目的,因为这些路由器和最后目的主机发来的ICMP报文正好给出了源主机想知道的路由信息——到达目的主机所经过的路由器的IP地址,以及到达其中的每一个路由器的往返时间

分享

redisread
作者
Victor
Full Stack