本文章来自GitHub项目:从0学计算机网络
二.计算机网络-网络层详解
1.网络层概述
网络层关注的是如何将IP数据报从源主机沿着网络发送到目标主机。其具体步骤为将上一层传输层的报文段或者用户数据报添加必要的控制信息封装成IP数据报,并使用下一层数据链路层的服务将IP数据报发送给指定的主机。
2.网络层功能
- 分组转发
当一个分组到达路由器的一条输出线路时,该路由器必须将该分组转发到适当的输出链路。所以,在路由器内部,需要有一个转发表。 在转发分组时,读取从IP数据报中首部的转发标识并在转发表中查询,其查询结果指出了该分组将被转发的路由器的链路接口。
- 路由选择
当分组从发送方转发到接收方时,网络层必须决定这些分组采用的路由或者路径,这就是路由选择。路由选择的结果就是生成了供分组转发需要的转发表
其具体步骤为: 路由选择(人工/自动) ➡ 路由表 ➡ 转发表
- 路由选择和分组转发的关系
3.网络层提供的两种服务
- 虚电路服务(Virtual-Circuit Network)
面向连接的服务
在发送数据时,先建立连接,即建立一条虚电路,保证双方通信所需要的网络资源。这样分组首部不需要填写完整的目标主机,只需要填写一条虚电路的编号,因此减少了分组的开销。
- 数据报服务(Datagram Network)
面向无连接的服务
网络在发送数据时不需要提前建立连接,每个分组都独立发送,都携带完整的目标主机地址。
因为计算机网络的端系统是智能的,并且有相当强的计算能力和差错检测能力。所以在网络层向上只提供简单灵活,无连接,尽最大努力交付的数据报服务。也就是说,网络层不提供服务质量,是由运输层提供的。因特网的这种设计思想被称为“端到端原则”,将复杂的网络处理纠错置于网络边缘,将简单的尽最大努力的交付置于因特网核心。这样网络的造价降低,方式灵活。
- 虚电路和数据报对比
4. IP协议(网际协议)
IP协议是TCP/IP体系中最主要的协议之一,与之配套的共有四个协议
- ARP: 地址解析协议 : 提供从IP地址到物理地址的映射服务,网络层使用下层链路层服务时使用
- RARP: 逆地址解析协议 : 提供从物理地址到IP地址的服务
- ICMP: 网际控制报文协议
- IGMP: 网际组管理协议
ARP和RARP在IP协议的下方,因为IP协议要使用这两个协议,ICMP和IGMP在IP协议上方,因为这两个要使用IP协议。
5. IP地址
### IP地址概念
在网络上的每一台主机都会被分配一个32位的唯一标识符
点分十进制记法
将32位的IP地址按8位一组分为四组,并转化为十进制,数字之间加.
IP地址阶段
- 分类编码
IP地址::={<网络号>,<主机号>} (定长网络号)
好处:
- IP地址管理机构只需要分配网路号,主机号由单位自行分配。便于管理
- 路由器根据IP地址所在网络号进行转发,减小了路由器的转发表所占的空间以及查找路由表的时间
- 划分子网
从主机号中借用不定长的若干位作为子网号
IP地址::={<网络号>,<子网号>,<主机号>}
好处:
减少了分类编址中AB类地址的浪费,可以将其划分给多个组织使用
- 无分类编址(CIDR) (正在使用)
IP地址::={<网络前缀>,<主机号>}
将32位IP地址划分为前边不定长的网络前缀,并且引入的32位的地址掩码,地址掩码中1 的个数表示表示IP地址中前
多少位为网络号。
对应分类编址中的默认地址掩码
斜线记法: 在IP地址后加入/数字 表示网络地址的个数 比如 192.168.1.1/20 表示前20位为网络前缀。
### 特殊的IP地址
5.物理地址
物理地址是数据链路层和物理层使用的地址,IP地址是网络层以及上层使用的地址
IP地址放到IP数据报的首部,物理地址放到数据链路层中MAC帧的首部。
6.ARP地址解析协议
目的:解决从IP地址到物理地址的动态映射问题
方法:每一个主机都动态维护一个ARP高速缓存(ARP Cache),这个缓存中存放本局域网上各个主机的IP地址和物理地址的映射关系。
以主机A(192.168.38.10)向主机B(192.168.38.11)发送数据为例。
- 当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到就知道目标MAC地址为(00-BB-00-62-C2-02),直接把目标MAC地址写入[帧]里面发送就可。
- 如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播(ARP request),广播中携带自己的主机名称,IP地址,物理地址 ,以及需要查询的IP地址”
- 网络上其他主机接受到广播后,将广播中A主机的信息更新到自己的ARP缓存中。主机B接收到这个帧时,也将A的数据存入自己缓存中,并向主机A做出这样的回应(ARP response):“192.168.38.11的MAC地址是00-BB-00-62-C2-02”,此回应以单播方式。这样,主机A就知道主机B的MAC地址,它就可以向主机B发送信息。
- 下次再向主机B发送信息时,直接从ARP缓存表里查找就可。
生存时间
ARP高速缓存中的每一个映射地址都有一个生存时间,当时间结束之后,就重新发送该广播更新地址。保证数据的正确性。
7. IP数据报格式
注 :图中括号内为该部分的长度 单位: 位(bit)
版本 4bit
表示IP协议的版本,通信双方必须使用相同的IP协议版本。目前最广泛的是IPv4版本
首部长度 4bit
最大表示的十进制是2^4-1 即15 此字段的单位是4字节,也就是当此字段的值位1时,表示首部长度为1个4字节。当1111时,表示首部长度(15*4)= 60个字节
最常用的首部长度为20个字节,也就是此字段为0101
区分服务 8bit
服务类型,一般不使用
总长度 16bit
首部和数据部分之和,单位是字节。因此IP数据报的最大长度为2^16=65535字节
标识 16bit
每产生一个IP数据报,此字段+1,当IP数据报分片时,同一个IP数据报的分片此字段相同。
标志 3bit
- 最低位: MF: 有没有更多分片 =1表示还有分片 =0表示无分片
- 中间位: DF: 是不是不能分片 =1表示不能分片 =0表示能分片
片偏移 13bit
经过分片之后,此分片在原分组中的相对位置。
生存时间 8bit
TTL(Time To Live) 之前表示数据报在网络中的寿命 后来改为跳数限制,但名字没变。 路由器在转发之前,将该值-1,当为0时,丢弃此分组。 若该值为1,则表示该IP数据报只在本局域网传播。
协议 8bit
首部检验和 16bit
检验数据报的首部,通过将首部划分为许多16位的序列,将该字段置0,反码运算把所有16位字相加,结果写入此字段。 接受方接受之后,将首部的16位反码运算相加,结果与此字段取反码,若数据无错,则结果为0;
可变部分
支持排错,测量及其安全措施。
填充字段
首部长度必须时4的整数倍,当不够时,用填充字段填充。
因此,数据部分总是在4字节的整数倍开始
8.IP数据报的转发
1. 路由表
按照主机所在网络地址制作路由表
实际路由表
2.IP数据报的转发流程
路由器R1的转发表
例子
主机1向主机2发送数据报过程
- H1主机将要发送的数据封装成IP数据报,其中包括目标IP(主机2的IP地址)自己的IP(主机1的IP地址)
- H1先将目标IP地址(128.30.33.128)和本网络的子网掩码进行按位与(AND)运算,得到目标IP地址的网络地址128.30.33.128,与H1的网络地址不匹配,说明目标主机和源主机不在同一个局域网
- 此时,将数据报发送给H1局域网上的默认路由器R1,由R1来转发。注:在H1的网络配置中有IP地址,子网掩码,默认路由等信息。
- 路由器R1收到此数据报的时候,将该数据报中的目标IP地址读出,然后与自己转发表中的第一行的子网掩码进行按位与运算,得到目标的网络地址与第一行的目的网络地址对比,发现不匹配。
- 用同样的方法逐行对比,直到第二行,对比成功,说明网络2就是目标网络,将分组从接口1直接交付给H2 (他们在同一个网络上)
基本过程
- 从收到的数据报中提取目标IP地址D
- 先判断是否是直接交付,用路由器直接相连的网络的子网掩码和D进行按位与,看结果是否和对应的网络地址匹配,如果匹配,则通过接口信息直接交付,将目标的IP地址D用ARP转化为物理地址,封装成MAC帧,发送给H2主机。任务结束。如果不是直接交付,转到3
- 如果执行到这里,说明不是直接交付,而是间接交付,依然执行2,得到对应匹配的网络地址,将数据报发送给对应的下一跳的路由器。如果没有找到对应的网络地址,则转到4
- 发送给路由表中的默认路由,任务结束。如果没有默认路由,则报告转发数据报出错。
注意
- 步骤3中,当路由器收到一个待准发的数据包,并获取到了下一跳的路由器地址之后,将该数据报体哦国内给下层的接口软件,接口软件将下一跳的IP地址转化为物理地址,并放入链路层的MAC帧的首部,然后发送。
- 在发送一连串的数据报时,上述的步骤是不断重复的运行的。有一定的开销,那么为什么不直接使用物理地址呢? 因为使用逻辑的IP地址,本来是为了屏蔽各种底层网络的复杂性,便于研究问题。这样不避免的要付出代价。反过来,在网络层用物理地址,会带来更多的麻烦。
9.ICMP 网际控制报文协议详解(Internet Control Message Protocol)
功能
提供报告差错情况和提供有关的异常情况的报告。
几种常见的ICMP报文类型
ICMP的差错报告报文
- 终点不可达:
当路由器找不到路由或者主机不能交付IP数据报时,就丢弃IP数据报,路由器或者主机向IP数据报的源站发送“目的不可达”报文。
- 源点抑制
IP没有流量控制机制。路由器和主机的缓冲区有限,如果发送方发送数据的速率过快。将会导致缓冲区产生溢出。这时路由器或主机只能把某些IP数据报丢弃。
- 超时
- 可分为两种情况,第一种是TTL=0:当IP数据报通过路由器时,IP首部的TTL字段减一,当路由器发现收到IP数据报的TTL=0时,就丢弃该报文,同时该路由器向源站点发送ICMP超时报文。第二种是分片不能重组:如果组成IP数据报的所有分片未能在规定的时限内达到目的主机,就不能进行分片的重组,则目的主机会丢弃已经收到的分片,并向源站点发送ICMP超时报文。
- 超时报文的应用:Windows下的Tracert命令行工具是一个探测路由的程序,可以探测IP数据报达到目的时所经过的路由,它利用时间超过ICMP报文和IP数据报首部中的TTL值来实现其功能。
- 参数问题
- 如果路由器或目的主机发现IP数据报首部的某个字段不正确时,就丢弃该数据报并向源站发送ICMP参数问题报文。
- 改变路由(重定向)
在特定情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由,路由器也会把初始数据报向它的目的转发。
ICMP的询问报文
- 回送请求和回答
通常用来测试主机和服务器的连通,类型为8时是请求,类型是0时响应
- 时间戳请求和回答
请求主机或者服务器回答当前的日期和时间,类型13为请求,14为响应
用来进行时钟同步或者测量时间。
ICMP应用举例
ping
作用:用来测试两台主机是否可以连通。
原理:向目标主机发送类型为8的ICMP询问报文 如果目标主机正常工作且返回类型为0的ICMP询问报文。 往返的ICMP中有时间戳,可以计算出往返时间。
通过抓包工具,可以看到,本主机向目标主机发送了type为8的ICMP询问报文
目标主机返回了type为0的ICMP询问报文
UNIX系统:traceroute (发送UDP用户数据报)/ Windows系统:tracert(发送ICMP回送请求报文)
作用:用来列出从主机到目标主机连接路径
原理:首先向目标主机发送一个TTL为1R的数据报,当到达第一个路由器R1时,将其值-1,此时,值为0,数据报被抛弃,并向源主机发送一个ICMP超时差错报告报文。接着发送第二个数据报,此时,TTL为2,到达第二个路由器R2后,执行以上同样操作。直到最后一个数据报到达目的主机,此时,数据报中封装的是无法交付的运输层UDP用户数据报(当系统为windows时,发送ICMP回送请求报文),因此向源主机发送ICMP终点不可达差错报告报文。这样,源主机收到了路径中所有经过的路由器的IP地址,以及往返时间。
路由选择协议