在层次结构这章中,我们了解到网络层主要负责的功能是数据路由,就是决定数据在网络中传输的路径。
IP协议
IP协议解决了在虚拟网络中数据报传输路径的问题。
虚拟互联网络
实际的计算机网络是错综复杂的,物理设备通过使用IP协议,屏蔽了物理网络之间的差异 。
当网络中的主机使用IP协议连接时,则无需关注网络细节。
回到上一章内容,假设主机A要跨设备传输到主机E,此时将BCD看成一个虚拟的互联网络,此时A和E都和这个虚拟互联网络相连,此时的数据传输又符合数据链路层的以太网传输协议了。
MAC地址是48位的,使用十六进制表示。
eg:30-B4-9E-ED-85-CA ==> 00110000-10110100-10011111-11111110-10000101-11001010
IP地址是32位的,使用点分十进制表示。
eg:192.168.11.11 ==> 11000000.10101000.00001011.00001011
MAC地址唯一标示了物理设备,是不可改变的。
IP地址则是在网络中唯一标识网络设备,但IP地址是可以被重新分配的。
IP数据报
在前面两章我们了解到,物理层负责传输01比特流,到了数据链路层后传输的是数据帧。
而帧数据结构的定义则是IP数据报,其结构如下。
IP首部的详细结构如下图。
版本:占4位,指的是IP协议的 版本,通信双方的版本必须一 致,当前主流版本是4,即IPv4, 也有IPv6。
首部位长度:占4位,最大数值 为15,表示的是IP首部长度, 单位是“32位字”(4个字节), 也即是IP首部最大长度为60字节。
总长度:占16位,最大数值为 65535 (MTU),表示的是IP数据报总长 度(IP首部+IP数据)。
标识:16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
标志:占3位,但只有2位有意义。表示数据报能否分片。
片偏移:占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,除了最后一个分片,每个分片的长度一定是8字节(64位)的整数倍。
TTL:占8位,表明IP数据报文 在网络中的寿命,每经过一个 设备,TTL减1,当TTL=0时, 网络设备必须丢弃该报文。
协议:占8位,表明IP数据所携 带的具体数据是什么协议的 (如:TCP、UDP等)。
首部校验和:占16位,校验IP 首部是否有出错。
源IP地址:发送方IP地址。
目的IP地址:接收方IP地址。
一些协议码
协议名 | ICMP | IGMP | IP | TCP | UDP | OSPF |
---|---|---|---|---|---|---|
字段值 | 1 | 2 | 4 | 6 | 17 | 89 |
IP协议工作过程
IP报文传输采用的是逐跳(hop-by-hop)转发,即IP报文在数据链路中是一步步逐级跳到下一个物理设备直到目的设备为止。
IP路由表
在数据链路层可知其维护了一个MAC地址表,而网络层则维护了一个IP路由表。
MAC地址表由MAC地址和硬件接口组成,IP路由表则由目的IP地址和当前设备下一跳IP地址组成。
计算机和路由器都拥有路由表。
转发流程
以下图所示为例。
从网络层开始数据传输的过程。
简易版:
A发出目的地为C的IP数据报,查询路由表发现下一跳为E,A将数据报发送给E。
E查询路由表发现下一跳为F,将数据报发送给F。
F查询路由表发现目的地C直接连接,将数据报发送给C。
详细版:
A发出目的地为C的IP数据报,查询路由表发现下一跳为E,
A将IP数据报交给数据链路层,并告知目的MAC地址是E,
数据链路层填充源MAC地址A和目的MAC地址E
数据链路层通过物理层将数据发送给E
E的数据链路层接收到数据帧,把帧数据交给网络层
E查询路由表,发现下一跳为F
E把数据报交给数据链路层,并告知目的MAC地址为F
E的数据链路层封装数据帧并发送
F的数据链路层接收到数据帧,把帧数据交给网络层
F查询路由表,发现下一跳为C
F把数据报交给数据链路层,并告知目的MAC地址为C
F的数据链路层封装数据帧并发送
数据链路层拥有了在相邻两个节点传输数据得能力,网络层则借助路由表的机制,利用数据链路层的传输能力逐级的传输数据。
IP地址的子网划分
IP地址是32位的,常分成4个8位,使用点分十进制表示。
分类的IP地址
将32位的IP地址划分成2部分:网络号
和主机号
。32位的IP地址分为4个8位,根据网络号位1个8位、2个8位以及3个8位来将IP地址分类成A、B、C三类地址。
一些特殊的主机号
主机号全0(eg: 1.0.0.0)表示当前网络段,不可分配为特定主机
主机号为全1(eg: 1.255.255.255)表示广播地址,向当前网络段所有主机发消息
A类地址网络段全0(00000000)表示特殊网络
A类地址网络段后7位全1(eg:01111111 = 127)表示回环地址
B类地址网络段(10000000.00000000 = 128.0)是不可使用的
C类地址网络段(192.0.0)是不可使用的
127.0.0.1,通常被称为本地回环地址(Loopback Address),不属于任何 一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远 不会宕掉的接口。在Windows操作系统中也有相似的定义,所以通常在 安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络 协议、基本数据接口等是否正常的。
排除特殊IP地址后的子网划分
子网掩码
通过上面的子网划分后,再加上去除一些特殊IP地址,很难一下子判断出当前IP属于哪一类IP地址,于是提出了子网掩码的概念。
子网掩码和IP地址一样都是32位,子网掩码由连续的1和连续的0组成。某一个子网的子网掩码具备网络号位数个连续的1,和主机号位数i数连续的0。
例如A类地址拥有8位网络号和24位主机号,那么A类地址的子网掩码即为8个1和24个0组成,即255.0.0。
同理可得B类地址的子网掩码为255.255.0,C类为255.255.255.0。
无分类编址CIDR
CIDR由网络前缀和主机号组成,其中网络前缀是任意位数的。
CIDR中没有A、B、C类网络号、和子网划分的概念,CIDR将网络前缀相同的IP地址称为一个CIDR地址块
。
使用斜线记法来标识CIDR地址
例如193.10.10.129/25,标识这32位的地址,其中有25位为网络号。
ARP与RARP协议
(R)ARP协议是TCP/IP协议栈里面基础的协议,主要用于协调网络层和数据链路层。
根据数据链路层MAC地址表的知识可知:
当路由器的MAC地址表中没有目的地址,此时路由器会将此MAC地址进行广播(发送方A除外),接收局域网中与该路由其相连的其他设备的MAC地址并记录。
根据上文网络层IP路由表的知识可知:
A发出目的地为C的IP数据报,查询路由表发现下一跳为E,
A将IP数据报交给数据链路层,并告知目的MAC地址是E,
数据链路层填充源MAC地址A和目的MAC地址E
数据链路层通过物理层将数据发送给E
结合这两者可知,这些表都是根据MAC地址来的,那MAC地址和IP地址怎么转换呢?
ARP: Address Resolution Protocol 地址解析协议
ARP协议的作用就是将网络层的IP地址转换为数据链路层的MAC地址。
ARP协议维护了一份ARP缓存,ARP缓存是个用来储存IP地址和MAC地址的缓冲区,其本质就是一个IP地址==>MAC地址的对应表,表中每一个条目分别记录了网络上其他主机的IP地址和对应的MAC地址。由前文的知识可知,MAC地址是永久不变的,但IP地址是可变,所以ARP缓存记录是有期限的。
工作过程(参考百度百科):
主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:
第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。
数据格式
ARP数据报文是直接封装在数据链路层的数据帧里的。
ARP数据报文格式如下:
其中28位的请求/应答报文具体如下:
PAD:填充数据,以太网的帧最小为64位,不足的需要填充到64位。
RARP: Reverse Address Resolution Protocol 逆地址解析协议
ARP(地址解析协议)是设备通过自己知道的IP地址来获得自己不知道的物理地址的协议,RARP以与ARP相反的方式工作。RARP发出要反向解析的物理地址并希望返回其对应的IP地址,应答包括由能够提供所需信息的RARP服务器发出的IP地址。虽然发送方发出的是广播信息,RARP规定只有RARP服务器能产生应答。许多网络指定多个RARP服务器,这样做既是为了平衡负载也是为了作为出现问题时的备份。(百度百科)
RARP数据报文格式如下:
工作原理:
- 发送主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;
- 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
- 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
- 如果不存在,RARP服务器对此不做任何的响应;
- 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。
NAT:Network Address Translation 网络地址转换
IPv4最多只有40+亿个IP地址,随着设备的增多,IP地址开始不够用了。并且早期的IP规划不合理,导致IP号的浪费。
这时引入了内网
和外网
的概念。
内网地址(局域网IP)是在内部机构使用的,需要避免和外网地址重复。外网地址(因特网IP)是在全球范围内使用的,全球公网唯一。
三类内网地址
10.0.0.0~10.255.255.255(支持千万数量级设备)
172.16.0.0~172.31.255.255(支持百万数量级设备)
192.168.0.0~192.168.255.255(支持万数量级设备)
内网中的众多设备共同使用外网中的一个IP。内网多台设备使用同一个IP请求外网服务,为了区分具体是哪一台设备在请求,使用了NAT技术。NAT用于多台主机通过一个共有IP访问互联网的私有网络(内网)中。
那么NAT是怎么解决这个问题的呢?
假设现在有两台局域网设备AB以及一台路由器C,
NAT的作用就是将内网中的地址转换为外网的地址。这一步是对程序员透明的,在路由器内部自动完成。
由数据链路层的知识可知,局域网中的主机在发送数据是,数据先会逐跳到路由器,此时路由器就会将局域网地址转换为外网地址,再继续逐跳。同理数据返回到路由器时,路由器将外网地址转换为内网地址,再进行逐跳。
NAT技术的实现也是维护了一张NAT表,里面的数据是内网地址和外网地址的映射。虽然NAT减缓了IP地址的消耗,但是这种IP地址多级转换增加了互联网的复杂度。
ICMP Internet Control Message Protocol 网际控制报文协议
ICMP是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
IP数据报是存储在数据帧的帧数据中的,ICMP数据是存在IP数据报的数据中。ICMP由ICMP报文首部
和ICMP报文数据
两部分组成。
ICMP的报文类型有两种:差错报告报文
和询问报文
。
ICMP报文种类 | 类型(8位) | 报文类型 | 代码(8位) |
---|---|---|---|
3(终点不可达) | 网络不可达 | 0 | |
3 | 主机不可达 | 1 | |
差错报告报文 | 5(重定向) | 对网络重定向 | 0 |
5 | 对主机重定向 | 1 | |
11 | 传输超时 | - | |
12 | IP头损坏 | 0 | |
12 | 缺少其他必要参数 | 1 |
ICMP报文种类 | 类型(8位) | 报文类型 | 代码(8位) |
---|---|---|---|
询问报文 | 0或8 | 回送(Echo)请求或应答 | - |
13或14 | 时间戳(Timestamp)请求或应答 | - |
ICPM协议的应用
Ping命令
ping命令一般用于判断网络是否连通。
使用ping命令会发送一个ICMP的询问报文,接着将该报文封装成IP报文放到数据帧里,在数据链路层发送出去。
Traceroute
Traceroute可以探测IP数据报在网络中走过的路径。
由前文可知
IP数据报首部有占8位的生存时间TTL,表明IP数据报文 在网络中的寿命,每经过一个 设备,TTL减1,当TTL=0时, 网络设备必须丢弃该报文。
网络设备丢弃报文后,会发送ICMP终点不可达差错报文。
Traceroute主要是利用了TTL和ICMP终点不可达报文,从TTL=1开始,每次将TTL加1,直到到达目的设备。通过这样逐级收集信息,就获得了IP报文的传输路径。
网络层的路由
通过上面的内容可知,网络层维护了一张路由表,存放的是目的IP地址以及下一跳IP地址。
那么这个表示咋么来的呢?
要解决上面的问题,需要一个合适的算法。如下图所示,我们以每个顶点表示一个计算机/路由器/网络,以每条边表示一条网络路径。
经过这样抽象之后,可见路由算法实际上可以抽象成图论算法。但网络环境复杂,路由算法比图论算法要复杂一些。
自治系统
自治系统:autonomous system。在互联网中,一个自治系统(AS)是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。
这是个抽象概念,自治系统的范围可根据场景确定。例如一个路由器根与其相连的设备能组成AS,整个校园网也能组成AS。
AS内部的路由协议称为内部网关协议(RIP、OSPF)
AS外部的路由协议称为外部网关协议(BGP)
内部网关协议
RIP:Routing Information Protocol 路由信息协议
距离矢量(DV)算法
距离矢量算法其基本原理就是运用矢量叠加的方式获取和计算路由信息。
具体算法过程略,自行百度。
RIP协议的过程
RIP协议把网络的跳数(hop)作为DV算法的距离,它每隔30s交换一次路由信息。此外RIP协议约定跳数>15的路由则为不可达路由。
以下是RIP协议的简略工作过程,若需详细了解,请自行百度。
1. 路由器初始化路由信息
2. 对相邻路由器X发过来的信息,对信息的内容进行修改(下一跳地址设置为X,所有距离加1)
i. 检索本地路由,将信息中新的路由插入到路由表里面
ii. 检索本地路由,对于下一跳为X的,更新为修改后的信息
iii. 检索本地路由,对比相同目的的距离,如果新信息的距离更小,则更新本地路由表
3. 如果3分钟没有收到相邻的路由信息,则把相邻路由设置为不可达(16跳)
OSPF:Open Shortest Path First 开放式最短路径优先
OSPF的简单说就是两个相邻的路由器通过发报文的形式成为邻居关系,邻居再相互发送链路状态信息形成邻接关系,之后各自根据最短路径算法(Dijkstra算法
)算出路由,放在OSPF路由表,OSPF路由与其他路由比较后优的加入全局路由表。
RIP和OSPF对比
外部网关协议BGP
BGP(Border Gateway Protocol,边界网关协议,BGP用于在不同的自治系统(AS)之间交换路由信息。当两个AS需要交换路由信息时,每个AS都必须指定一个运行BGP的节点,来代表AS与其他的AS交换路由信息。这个节点可以是一个主机。但通常是路由器来执行BGP。两个AS中利用BGP交换信息的路由器也被称为边界网关(Border Gateway)或边界路由器(Border Router)。