- 网络层提供的两种服务
网络层位于数据链路层之上,应用层之下,提供两种服务:数据报和虚电路,前者为无连接的网络服务,后者为面向连接的网络服务。这里有点类似TCP和UDP。
数据报服务:网络随时都可以接受主机发送的分组(数据报),网络为每个分组独立选择路由,尽最大努力将分组交付给目的主机,所以数据报服务提供的是不可靠的,不能保证服务质量。
虚电路服务:A要与B通信,首先A向B发送一条特定的消息,要求进行通信,B收到后返回响应,此时虚电路就建立起来了,然后传送数据即可,所以服务质量有着较好的保证。
项目 | 虚电路服务 | 数据报服务 |
---|---|---|
思路 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
连接的建立 | 必须有 | 不要 |
目的站地址 | 仅在连接建立阶段使用,每个分组使用短的虚电路号 | 每个分组都有目的站的全地址 |
分组的转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组独立选择路由进行转发 |
当结点出故障时 | 所有通过出故障的结点的虚电路均不能工作 | 出故障的结点可能会丢失分组,一些路由可能会发生变化 |
分组的顺序 | 总是按发送顺序到达目的站 | 到达目的站时不一定按发送顺序 |
端到端的差错处理和流量控制 | 可以由分组交换网负责也可以由用户主机负责 | 由用户主机负责 |
- IP网的出现
如果将全世界范围内大大小小的网络通过路由器互连起来,并进行通信,会遇到许多问题需要解决:不同的寻址方案、不同的最大分组长度、不同的超时控制、不同的路由选择技术等等。
因为用户的需求是多种多样的,所以没有一种单一的网络具备所有用户的需求。
将网络互连起来需要使用一些中间设备:
1、物理层的中间设备称为转发器
2、数据链路层使用的中间设备叫网桥或桥接器
3、网络层使用的中间设备叫路由器
4、网络层以上使用的中间设备叫网关,通常用网关连接两个使用不同协议的网络。
一般情况下所说的网络互连是指用路由器进行网络互连和路由选择。可以将路由器看做一台专用计算机,只是负责在互联网中进行路由选择。
TCP/IP体系在网络互连上采用的做法是在网络层采用了标准化协议,通过路由器进行互连的网络都使用相同的网际协议IP,因此可以可以把互连后形成的网络看做虚拟互连网络,所谓虚拟互连也就是逻辑互连。
这样,我们互连起来的各种物理网络虽然都是异构的,但是在网络层上看起来就好像是一个统一的网络,这样的使用IP协议的虚拟互连网络也称为IP网。
IP网的好处:隐藏了各种互连网络的底层具体异构细节,当IP网上的主机进行通信时,就好像是在一个单个的网络上进行通信一样。
- IP协议
IP协议是TCP/IP体系中最核心的协议。TCP、UDP、ICMP及IGMP都以IP数据报的格式传输数据。
IP协议提供无连接不可靠的服务。
不可靠:不能保证IP数据报能成功到达目的地。只是尽最大努力传输。
无连接:说明每个IP数据报处理是相互独立的,即IP数据报可以不按照顺序接收。
与其配套使用的还有4个协议:
ARP:地址解析协议
RARP:反地址解析协议
ICMP:因特网控制报文协议
IGMP:因特网组管理协议
后两者需要用到IP协议,所以在上方,而IP协议需要经常使用前面两个,因而在下方。
- IP地址
将因特网看成是单一的,抽象的网络,IP地址就是给每个接入因特网的主机分配的一个全世界范围内唯一的32bit的标识符。这样IP地址使我们很方便在因特网上进行寻址。
IP地址的编址经历了三个阶段:
1、分类的IP地址
2、子网的划分
3、构成超网
- 分类IP地址
将IP地址划分为若干个固定类,每一类地址都由网络号和主机号组成。一个主机号在前面网络号指定的网络范围内是唯一的,所以这种IP地址可以记为
IP地址:{<网络号>,<主机号>}
图中网络号字段最前面1~4位表示类别位,用于区分这几类地址。
A、B、C类地址都属于单播地址(一对一通信),D属于多播(一对多通信),而E则保留为以后使用。
前面提到,IP地址是32bit的二进制代码,为了提高可读性,将用等效的十进制表示:
最常用的IP地址是A、B、C类地址
IP地址空间总共有2^32个地址,A类地址空间共有2^31个地址,占总地址空间的50%
B类地址空间共有2^30个地址,占总地址的25%,C类地址约有2^29个地址,占整个IP的12.5%
所以IP的范围:
一般不使用的IP地址:
IP的特点:
1、IP地址是一种分等级的地址结构,好处:IP地址管理机构只需要分配网络号(第一级),主机号(第二级)由使用该网络号的单位自己分配,方便管理;路由器仅根据目的主机所连接的网络号来转发分组,不用考虑主机号,这样就可以简化路由表以及查找路由表的时间。
2、一个主机连接到两个网络上时,就必须同时具有两个相应的IP地址,所以由于一个路由器至少应当连接到两个网络,至少一个路由器至少应有两个不同的IP地址
3、局域网都具有相同的网络号
4、所有分配到的网络号的网络都是平等的。
- IP地址与硬件地址
物理地址是指数据链路层和物理层使用的地址
而IP地址是网络层及以上各层使用的地址,是一种逻辑地址
IP地址放在IP数据报的首部,而硬件地址放在MAC帧的首部,IP数据报放入数据链路层的MAC帧后,整个IP数据报就成为MAC帧的数据,因而在数据链路层是看不见数据报的IP地址的,只有在剥去MAC帧的首部和尾部把MAC帧上交给网络层,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。
实例:
现在H1要与H2进行通信,H1->经过R1转发->经过R2转发->H2
下图表示了不同层次、不同区间的源地址和IP地址
我们可以看出:虽然IP数据报经过路由器的两次转发,但是在其首部的源地址和目的地址始终分别是H1的IP地址和H2的IP地址,经过的两个路由器的地址并不会出现在IP数据报的首部中,路由器只根据目的站的IP地址的网络号对其进行路由选择
MAC帧在不同的网络之间传送时,其源地址和目的地址要改变,从表中我们就可以看到他的变化情况。但是MAC帧的这种变化,在IP层上是看不见的。
我们可以看出,虽然不同网络之间的硬件地址各不相同,但是IP地址却很巧妙的屏蔽了这些复杂的细节。
- 地址解析协议和反地址解析协议
地址解析协议(ARP):将IP地址转换为物理地址 反地址解析协议(RARP):将物理地址转换为IP地址
RARP:
反地址解析协议曾经起重要作用,但是如今DHCP中已经包含RARP的功能,因此没有人单独的使用RARP协议了,只需知道是自己主机的硬件地址可以通过RARP协议得到其IP地址即可。
ARP:
虽然网络层使用的是IP地址,但是我们在实际的链路上传输数据帧时,必须使用该网络的硬件地址。
但是IP地址与硬件地址之间不存在简单的映射关系,ARP解决这个问题的方法是在主机的ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表动态更新。
每一个主机都设有一个ARP高速缓存,里面有所在局域网的各主机和路由器的IP地址到硬件地址的映射表,那么主机怎么知道这些地址?
实例:
当主机A要向本局域网的某个主机B发送IP数据包,就现在ARP高速缓存中查找有无主机的IP地址,如果有,就在ARP高速缓存中查出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网将MAC帧发送此硬件地址。
如果主机B刚入网或者主机A刚刚加电(高速缓存是空的),就会找不到主机B的IP地址,
此时,主机A会自动运行ARP,按照以下步骤找出主机B的硬件地址:
1、ARP进程在本局域网上广播发送一个ARP请求分组,请求分组的内容是:
自己(主机A)的IP地址和硬件地址以及主机B的IP地址。
2、在本局域网上的所有主机运行的ARP进程都会收到这个请求分组。
3、主机B在ARP请求分组中见到自己的IP地址,就向主机A发送ARP响应分
组,并写入自己的硬件地址。其余的主机都不会理会这个ARP的请求分组。
(ARP请求分组是广播发送,但是响应分组是普通的单播,从某一个源地址
发送到一个目的地址)
4、主机A收到主机B的ARP响应分组,就在其ARP高速缓存中写入主机B的IP
地址到硬件地址的映射。
以后主机B可能会向主机A通信,所以还得反着来一次,为了减少网络上的通信量,主机A发送的请求分组中包括自己的IP地址到硬件地址的映射写入ARP请求分组。当主机B接收到主机A发来的ARP请求分组时,就顺便把主机A的这地址映射写入主机B自己的ARP高速缓存中,以后直接去高速缓存中查找即可。
图解:
前面说到ARP表示动态更新的,当A与B通信的时候,刚开始好着,后面B的网络适配器换了,B立即更换了一块,因此B的硬件地址就改变了,但是A还要和B通信,由于IP地址还存在,但是以前的硬件地址已经失效了,所以A无法找到B的硬件地址。
ARP中的每一个项目都设置由生存时间,凡是超过生存时间的项目就会从高速缓存中删除掉。因此上面的场景,A找不到主机B,但是过了生存时间,A的ARP缓存中已经删除了B的原先的硬件地址,所以A此时重新广播发送ARP请求分组,找到B。
如果通信的两台主机不再同一个局域网内,那则需要记录路由器的ip地址和硬件地址。
这种IP地址到硬件地址是自动进行的,主机的用户对这种地址解析过程是不知道的,只要主机或路由器和本网络上一个已知IP地址的主机或路由器进行通信,ARP就会自动把这个IP转换为硬件地址。
为什么不直接用硬件地址进行通信,而非要调用ARP来寻找相应的硬件?
这有点类似最开头说的IP网的出现,全世界存在各种网络,有各种各样的硬件地址,要通信就得进行非常复杂的转换,几乎是不可能的。所以抽象出统一的IP地址,连接到因特网的主机只要用统一的IP地址,他们之间的通信就像连接在同一个网络上那么简单方便。而且ARP是自动的,对用户而言是看不到的,所以是非常方便的。
这IP地址有点像抽象类,有各种各样的子类,但是这些子类要和另外一个区域的子类进行通信,那么就需要写大量大量的代码,所以抽象出基类,两个基类互相通信,方便简单。
- IP数据报
版本:
占4位,指IP协议的版本。通信双方使用的IP协议版本要一致
首部长度——占 4 位,可表示的最大数值
是 15 个单位(一个单位为 4 字节)
因此 IP 的首部长度的最大值是 60 字节。
总长度:
是指首部和数据之和的长度,单位是字节。总长度字段为16,因此数据报的最大长度为2^6-1(65535),总长度必须不超过最大传送单元 MTU
生存时间:
8位,表明数据报在网络中的寿命,指数据报在因特网中最多可经过多少个路由器,显然最大值是255
协议
指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程
协议 | ICMP | IGMP | TCP | EGP | IGP | UDP | IPV6 | OSPF |
---|---|---|---|---|---|---|---|---|
协议字段名 | 1 | 2 | 6 | 8 | 9 | 17 | 41 | 89 |
首部校验和
思路:
首先将IP首部即40位16进制的字符串转化为二进制字符串,
然后以每16位为一个字段,分为10个二进制字段。存放在IP1~IP10字符串中;
然后求出每个字段的反码,根据IP数据报格式,可以知道IP6存放的就是校验和,将校验和IP6置位全0;
利用求反码和,求出10个字段反码相加后的值sum,然后对字符串sum取反,得到发送时所用的校验码。
假设接收端的IP首部与发送的是相同的,那么其10个字段的利用反码和算法求出的值应为0
图解:
- IP层转发分组的流程
前面已经说过如果按照目的主机号来制作路由表,那最终的路由表则会过于庞大
所以为了简化路由表,我们用主机所在的网络地址制作路由表,如下图所示:
所以在路由表中,对每一路由最主要的是以下信息:
(目的网络地址,下一跳地址)
所以我们用目的网络来确定下一跳路由器,这样就说明:
IP数据报最终一定可以找到目的主机所在目的网络上的路由器
IP数据报只有到达最后一个路由器时,才试图向主机进行直接交付
同时,路由器还可以采用默认路由简化路由表和减少搜索路由表所用的时间。如下图所示:当目的网络不是N1和N2,就一律选择默认路由,把数据报先交付给路由器R1,让R1在转发给下一个路由器,一直转发到目的网络上的路由器。
IP数据报中只有源IP地址和目的IP地址,数据报是怎么找到下一跳路由器?
是通过ARP,首先在路由表中得到下一跳的路由器的IP地址,然后将这个地址通过ARP转换成硬件地址,然后发送到下一跳路由器,然后不断重复进行
分组转发算法 :
(1)从数据报的首部提取目的主机的 IP 地址 D,得出目的网络地址为 N。
(2)若网络 N 与此路由器直接相连,则把数据报直接交付目的主机 D;否则是间接交付,执行(3)。
(3) 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由
表中所指明的下一跳路由器;否则,执行(4)。(特殊情况)
(4) 若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行(5)。
(5) 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
(6) 报告转发分组出错。
摘自:计算机网络.第五版.谢希仁
参考:TCP/IP详解.卷一
版权声明:本文为博主原创文章,未经博主允许不得转载。