计算机网络: 网络层协议
网络层协议
网络层的功能
- 主要功能:分组转发和路由选择
- 其它功能:不同系统的设备间通信、拥塞控制
IPv4协议
IP地址:在此介绍ipv4的32位地址(ipv6为128位),由网络号和主机号组成,分为有类别和无类别两种地址;注意,网络层始终讲述的是不同的网络号间如何转发,并不关心同一网段下的不同主机如何转发(那是数据链路层的任务)- 有两种特殊的主机号不能分配给主机:全零和全一
主机号全零的
IP地址表示一个网段本身 主机号全一的IP地址表示特定子网的广播地址,可以跨网段广播到特定网段的所有主机号(但这个功能默认被拦截,需要管理员开放) - 有两个特殊的
IP地址有特殊用途:0.0.0.0表示本地网段内的所有主机,通常作为路由器的默认路由255.255.255.255表示受限广播地址,和仅主机号全一的IP地址相比,它只能在本地网段广播该分组、而后者可以 - 有类别(比较古老的做法):分为
A、B、C、D、E类,A、B、C类分别以前8、16、24位作为网络号 为了区分不同的有类别地址,它们有不同的前缀,分别为0、10、110、1110、1111A类总共提供27 = 128个网络号,224 = 16777216个主机号B类总共提供214 = 16384个网络号,216 = 65536个主机号C类总共提供221 = 2097152个网络号,28 = 256个主机号 缺陷显而易见,非常不灵活,例如:当出现103量级的主机号数量需求时,显然只能用B类,导致白白浪费一个网段的大部分主机号D类和E类不区分网络号和主机号,它们的后28位可以随意修改,D给因特网体系结构委员会使用,E类作为保留地址 - 无类别:网络号位数x可变的
IP地址,用于无类别域间路由选择(Classless Inter Domain Routing, CIDR) 为了区分不同的无类别地址,不同网段由不同的子网掩码来标识,子网掩码是网络号全为1、主机号全为0的32位掩码,所谓子网掩码的长度指的是x的大小 无类别地址简记形式:a.b.c.d/x,x为网络号长度 如果主机号数量的需求为L,则找到2k − 1 − 2 < L ≤ 2k − 2,其中的k即最少需要的主机号位数,因此子网掩码最长为x = 32 − k
- 有两种特殊的主机号不能分配给主机:全零和全一
主机号全零的
IPv4报文:第一行:版本号(
4)+首部长度(4)+服务类型(8)+数据报长度(16)- 版本号:处于不同版本的兼容,版本号用于标识使用的
IP协议版本 - 首部长度:单位为
4个字节 - 服务类型:区分不同的
IP报文,提供不同的优先级 - 数据报长度:单位为
1个字节
- 版本号:处于不同版本的兼容,版本号用于标识使用的
第二行:标识(
16)+标志(3)+片偏移(13),用于IP分组(分片),由于分片/重组相当耗时,ipv6不允许在中间路由进行IP分片,这一行字段被弃用,但应该了解分组的过程:- 标识:分割出去的分组的该字段继承原
IP分组的标识 - 标志位:包含保留位、
DF位(不分片位)和MF位(更多分片位)DF置1则不允许分片,并在数据大小超过MTU后返回ICMP错误信息MF置1表示本分组是分片后的分组,且后续还有分组未到达MF置0表示本分组是分片后的分组,且后续没有更多分片,MF方便重组方能够确认原来分组的大小 - 片偏移:标识本分组首字节在原分组首字节的位置,这个字段的单位是
8个字节(因为13位比数据报长度16位少了3位),即实际位置是片偏移乘8也因为这个,每个分片(除最后一个分片)的有效数据大小必须能被8整除
本身分组分割就是因为要使
IP分组小于MTU,因此要使分片的有效数据大小L满足: Lmax + 首部长度 ≤ MTU且8|Lmax- 标识:分割出去的分组的该字段继承原
第三行:
TTL(8)+上层协议(8)+首部检验和(16)TTL:Time-To-Live,一个分组的最长寿命,每经过一个路由减少一定寿命,防止分组永久地在网络中循环转发
第三、第四行:源
IP地址、目的IP地址
路由器工作原理
分组从一个网段到另一个网段,可能需要经过路由器转发 路由器需要先经过路由选择,才能进行转发
- 路由选择:通过软件计算,选择一条从源主机到目的主机的端到端路径
- 转发:将分组从入接口移动到某个离出接口(由路由选择决定向哪个接口移动),这是一次较快的硬件操作
静态转发表:由目标网络、子网掩码、下一站
IP地址、离出接口组成 静态是指,由管理者手动增删表项- 目标网络号:标识本路由器可以到达的网段,通过使分组的目的
IP地址和表项的子网掩码按位相与再和目标网络比对,得出离出接口 用0.0.0.0表示默认路由,即没有任何表项和分组的目的IP网段相匹配的时候,使用的表项 - 下一站
IP地址:标识下一个路由设备接口的IP地址,这个是整个IP地址而不仅是网络号 每个路由器的每个接口都有IP地址,这个字段表示的就是接口的IP地址C表示下一个接口就在本地路由器,即目的网段和本路由器相邻 - 离出接口:即本地对接口的标识
- 目标网络号:标识本路由器可以到达的网段,通过使分组的目的
路由聚合和最长子网掩码匹配:有些时候,一个路由器有多个表项的离出接口相同,目标网络不同但有一定长度的公共前缀,这时可以进行路由聚合,将它们合为一个表项,因为它们虽然目的网段不同,但是转发结果是一致的,而路由表越短、传输延迟越短 但可能会出现问题:分组本应转发到接口
A,但因为接口B的表项被路由聚合了,同时意味着这些表项的子网掩码变短了,按位相与后分组可能被误转发到接口B;最长子网掩码匹配即,分组总是先和子网掩码较长的表项比对,因为较长的子网掩码通常包含更详细的地址信息动态路由选择算法:仅少数表项由管理者初始化,其余表项由路由器学习得到
- 集中式路由选择算法,又称链路状态(
LS)算法:在路由开始学习前知道了所有链路的开销,使用Dijkstra算法学习 学习完成后,路由器可以得知和其它所有网段的最短距离以及最合适的离出接口 - 分布式路由选择算法,又称距离向量(
DV)算法:使用Bellman-Ford算法,通过报文跳数估计距离,适用于中小型网络 LS和DV算法对比: 更新开销方面:前者需要向所有路由转发链路状态报文、后者只在相邻的链路发生改变时向相邻的路由器报告,后者开销较小 收敛速度和健壮性方面:前者较优,DV算法收敛很慢
- 集中式路由选择算法,又称链路状态(
自治系统:因特网是多个
ISP(网络业务提供商)的网络,不同ISP有自己的管理方式,因此出现了自治域(Autonomous System, AS)AS内部有一类路由选择协议,它们统称为IGP(Interior Gateway Protocol内部网关协议);不同AS间需要用统一的路由选择协议管理,称为BGP(Border Gateway Protocol边界网关协议) 即,IGP是一类开发商自行实现的协议、BGP是一个由RFC规范的协议,IGP有以下协议:- 路由信息协议(
Routing Information Protocol, RIP):它是一个DV协议,仅适用于中小型网络 - 内部网关路由协议(
Interior Gateway Routing Protocol, IGRP):它是一个DV协议,现在已经被淘汰,注意和IGP区分 - 开放最短路优先(
Open Shortest Path First, OSPF):Open意味着这个协议的实现细节是所有人可见的,它是一个LS协议,适用于大型网络,支持分层拓扑架构 - 中间系统到中间系统(
IS-IS):它是一个LS协议
BGP规定的边界网关的路由表经过高度路由聚合- 路由信息协议(
DHCP协议
DHCP协议全称Dynamic Host Configuration Protocol,即动态主机配置协议,又称即插即用(plug-and-play)或零配置(zeroconf)协议DHCP为随时进入局域网的设备自动配置IP地址、设备离开后自动回收IP地址- 发现报文:主机进入局域网后,没有
IP地址可用,也不知道该网段的网络号,于是向该局域网内的DHCP主机通过UDP协议广播DHCP发现报文(端口号67),使用0.0.0.0作为本机地址 - 提供报文:
DHCP主机收到后(只有DHCP主机会进行处理),仍用广播方式响应一个DHCP提供报文,其中在数据段附上推荐的IP地址,以及其它的限制如IP地址租用期 - 请求报文:局域网内可能有若干个
DHCP主机,新进入的主机收到多个DHCP提供报文后,尝试选择一个IP地址作为自己的IP地址,并广播发送DHCP请求报文,并仍使用0.0.0.0作为本机地址- 使用
0.0.0.0作为源地址的原因:需要得到DHCP的认可后才能正式租用该IP地址 - 使用
255.255.255.255作为目的地址的原因:因为可能有多个DHCP服务器,广播是为了让其它未被选择的DHCP主机也接收到租用请求报文,更新它们的可用IP表
- 使用
- 响应报文:只有被选中的
DHCP主机会用广播形式发送DHCP响应报文,交互完毕后,新主机就可以使用租用的IP地址了;在租用期结束前,新主机可能再次发送请求报文进行续租 仍用广播,是因为新主机还没有正式租用IP地址
NAT
NAT全称Network Address Translation,即网络地址转换 用于搭建专用网络,专用网络内的所有主机的IP地址对外界都不可见,仅有一个NAT路由器有合法的IP地址 可以节省网络号,但NAT是基于TCP或UDP端口号实现的,在面对不经过传输层的通信要求时需要额外配置- 对于专用网络内部,一切通信都是正常的,当需要和外部通信时,
NAT路由将所有IP分组的源IP地址改为NAT路由的IP地址,并将里面的端口号改为一个由NAT路由服务器新分配的端口号 同时通过NAT转发表,维护从NAT路由端口号到内部主机IP及原端口号的映射 最后在接收来自外部的报文时,将目的IP地址和目的端口号再映射回去
ICMP
ICMP全称Internet Control Message Protocol,即因特网控制报文协议,通常用于差错报告ping就是用ICMP实现的,通过发送类型8编码0的回显请求到目的主机,目的主机发送类型0编码0的回显回答来实现Traceroute也是通过ICMP实现的,源主机通过逐渐增大UDP分组的TTL来发现到某个目的主机之间的所有路由,路由收到TTL恰好降为0的分组时,报告一个类型11编码0的TTL过期报文,主机就可以知道到这个路由的时延、包括该路由的IP地址 当TTL足够大以至于到达目的主机时,Traceroute刻意将UDP分组的端口号设置为不可达端口号,因此目的主机会报告一个表示目的端口不可达的ICMP报文,当源主机收到该报文时,就知道不用再发送UDP探测报文了