【网络系列】图文并茂解释网络层-IP、ARP、ICMP、DNS协议

网络层功能

网络层主要负责地址管理以及路由选择。在网络中我们从一个ip到另一个ip有很多条路可以走,而网络层则是帮我们规划我们传输数据的最佳路线。

因为网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。

使用 IP 协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络。
在这里插入图片描述
与 IP 协议配套使用的还有三个协议:

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

ip协议

在这里插入图片描述

协议字段
  1、4位版本:当前的协议是IPV4还是IPV6,由socket创建时传入的地址域决定。
  2、4位首部长度:决定了头部有多长,以4个字节为单位。
  3、8位服务类型:3位优先权字段(已弃用),1位保留字段必须置0,4位TOS字段分别表示最小延时,最大吞吐量,最高可靠性,最小成本。这四者互相冲突,只能选择一个,根据场景选用合理的服务类型。
  4、16位总长度:是数据长度,传输层协议头和ip头的总长度,最大报文不超过64k,由此可见UDP报文数据的最大大小并没有64k-8,还应该减去ip头部大小(20)。对于UDP来说如果数据报文长度小于最大报文长度则可以进行传输,但是在传输时还有一个限制——MTU,最大传输单元,这个限制是链路层的限制,限制了传输时最大的数据帧大小,如果UDP报文大于MTU大小则无法通过链路层的传输,此时为了能够传输则会进行数据分片。
  5、16位标识:用于标识当前数据属于哪一个udp数据包。
  6、3位标志:第一位保留,第二位标识是否禁止分片,1表示禁止,第三位表示更多分片,即如果分片了的话,最后一个分片置为1,其它为0,类似于结束标记。
  7、13位片偏移:用于标识当前报文在原始udp数据包中的偏移量,单位为8个字节。
  在这里插入图片描述

8、8位生存时间:TTL,之前有讲过MSL,但是在网络中真正的报文生存时间是按照TTL和MSL共同计算的。TTL是所能经过的路由器跳数,8位最大255跳,发送出去之后开始计算,每经过一个主机则-1,当到0时则认为通信失败,丢弃数据。这个属性主要是为了防备路由环路的情况
  9、8位协议:标识上层协议类型,TCP/UDP等。
  10、16位首部校验和:用域校验数据一致性。因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。
  11、32位源ip地址:从哪个主机来。
  12、32位目的ip地址:到哪个主机去。
  13、40字节选项数据:不一定有。

MTU

对于TCP协议,三次握手会协商mss(最大数据段大小),往后通信时,都会从缓冲区中取出不大于mss大小的数据进行传输,mss=mtu - 最小ip头 -最小tcp头 =mtu - 40。因此我们说tcp在传输层会自动进行数据分层,因此tcp在网络层不会进行数据分片

对于udp协议,不会进行mss的协商,只要数据小于64k-28就可以进行传输,但是大于mtu的话就会在网络层进行数据分片,但是分片越多传输越危险,一个分片出问题,则原始报文数据重组失败,所有分片被丢弃,因此要可能减少分片几率,所以udp编程时,在应用层进行数据分包,传输的数据大小可以计算一下mss。

数据分片

当mtu < IP头+IP数据大小 < 64k则会在网络层进行数据分片,TCP协议不会进行数据分片,因为其在传输层会协商MSS。将一个大包分为多个小包,在应用层叫分包,在传输层叫分段,在网络层叫分片,数据分片主要针对UDP。
  ip协议在进行分片时会一次取出MTU-ip头大小的数据然后分别封装一个ip头,这样就会封装成多个ip报文然后分别进行发送。
  但是此时可能会有问题,分片后并不能保证按照顺序被对端接收,对端对分片进行重组的时候也无从知道重组的顺序,不过好在ip头信息中有几条信息来帮助我们确定其属于哪一个数据包以及分片顺序。
  标识字段帮助我们找到当前ip数据包原本属于哪个udp数据包,片偏移字段帮助我们找到当前ip数据包在原udp报文中的相对位置,并且其单位为8个字节,完全足够标识64k数据的偏移量,这也说明了ip对udp报文的每个分片必然都是8的整数倍。

地址管理

IP 地址的编址方式经历了三个历史阶段:

  • 分类
  • 子网划分
  • 无分类

ip地址的构成

ip地址由网络号 + 主机号组成。
  1、网络号:每一个路由器向自己子网中的主机分配地址的时候,这些地址中都应该包含这个网络的标记,这个标记用于区分每一个网络。每一个网络的网络号只要不一样则分配的ip地址就不会冲突。
  2、主机号:每一个主机的ip地址不但要具备网络的标识,还需要能够再局域网中唯一标识,这个唯一标识称之为主机号。

网段的划分
  ip地址就是一个拥有4个字节的无符号整形,不过我们经常用点分十进制进行标识,早期对网段根据网络号和主机号所占位数的不同划分为五类地址:
  在这里插入图片描述

A类:高8位中高一位:0,低7位是网络号;剩下的都是主机号。(0.0.0.0 ~ 127.255.255.255)
B类:高16位中高两位:10,低14位网络号;剩下主机号。(128.0.0.0 ~ 191.255.255.255)
C类:高24位中高三位:110,低21位网络号;剩下主机号。(192.0.0.0 ~ 223.255.255.255)
D类:高4位固定:1110(224.0.0.0 ~ 239.255.255.255)
E类:高5位固定:11110(240.0.0.0 ~ 247.255.255.255)

特殊的ip地址

主机号全为0的地址–网络号。
主机号全为1–udp的局域网广播地址。
127.0.0.1–虚拟回环网卡,用于本机网络测试。
0.0.0.0–本机任意地址。

如今这种划分方式已经被淘汰,新的网段划分使用CIDR的方式进行划分,对网络的划分借助了一个字段叫子网掩码。

子网掩码

子网掩码是一个uint32_t类型的数据,由连续的二进制1组成。它如何帮助我们划分网络呢?
  
通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址。

IP 地址 ::= {< 网络号 >, < 子网号 >, < 主机号 >}

要使用子网,必须配置子网掩码。一个 B 类地址的默认子网掩码为 255.255.0.0,如果 B 类地址的子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0。

子网掩码取反可以得到局域网中的最大主机号。例如255.255.255.0 取反-> 0.0.0.255,则这个网段中的最大主机号为255。
注意,外部网络看不到子网的存在。

无分类

无分类编址 CIDR 消除了传统 A 类、B 类和 C 类地址以及划分子网的概念,使用网络前缀和主机号来对 IP 地址进行编码,网络前缀的长度可以根据需要变化。

IP 地址 ::= {< 网络前缀号 >, < 主机号 >}

CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。

CIDR 的地址掩码可以继续称为子网掩码,子网掩码首 1 长度为网络前缀的长度。

一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 构成超网

在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。

路由选择

每个路由器上都有一张路由表,记录当前路由器所相连的网络,当路由器接收一个数据,则取出目的ip地址,通过路由表判断当前数据的目的主机属于哪一个相邻的网络(使用相邻网络的地址与子网掩码进行相与,然后与目的网络的网络号进行比较)。若属于某个相邻的网络则使用相对应的网卡将数据发送出去,若路由表匹配失败,则将数据发送到下一层网络设备

在这里0.0插入图片描述
上图大概描述了一个运营商与各个独立用户之间搭建局域网进行通信的简易模型,但实际上原要比这复杂得多。
  路由选择并不困难,最为困难的是路由表生成算法。例如距离向量算法,LS算法等。关于路由选择有着很多的算法这里不再深入讨论。
  关于路由选择和网络搭建十分复杂,是一门独立的学科,还需要进一步研究讨论。

局域网组建规则

并不是所有网络号都能用于组建局域网,因为如果所有网络都能组件局域网则仍然有可能造成重复,因此规定能够组件私网的网络号只有以下几种:

10.*.*.* 
172.16.*.* ~ 172.31.*.*
192.168.*.*

局域网时相邻的网络不能使用相同的网络号,会造成地址分配冲突。这里的相邻网络指的是同一路由器不同网卡所属的网络,一台路由器可以身处多个网络中,记录在同一路由器的路由表上的网络都是相邻网络。

地址解析协议 ARP

网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。
ARP协议是介于网络层与链路层之间的协议,通过IP地址获取MAC地址。

每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。

如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。
在这里插入图片描述

网际控制报文协议 ICMP

ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。
在这里插入图片描述
ICMP 报文分为差错报告报文和询问报文。
在这里插入图片描述

Ping

Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。

Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。

Traceroute

Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。

Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。

  • 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文;
  • 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。
  • 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
  • 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。

DNS

DNS的诞生

DNSDomain Name System是域名系统。我们的服务器的IP地址往往是点分十进制的,十分难于记忆,于是便产生了域名,方便我们记忆查找服务器,例如www.baidu.com就是一个域名。当我们访问这个域名时,会首先将域名转换为对应的IP地址,那么要进行转换那就必须要有一个服务器存储映射关系帮助我们进行转换,这些服务器叫做域名服务器。
  
  首先产生的是跟域名服务器,根域名服务器是最高级域名服务器,但是为了分摊访问压力进行容灾处理全世界一共有13台根域名服务器,分布在世界各地。

DNS服务器的层级划分

就算全世界有13台根域名服务器这也远远不够用,因此根域名服务器为了再次分摊压力它只向下授权,授权世界权威组织可以继续建立域名服务器,便于域名解析。
  根域名服务器向下的一级授权是顶级域名服务器。例如.com/.org/.gov/.edu/.cn/.jp/.us。
  顶级域名服务器还可以继续向下授权,授权出二级域名服务器。例如.baidu.com/.qq.com。以此类推还有三级域名服务器.baike.baidu.com。

域名的解析流程

通过域名访问服务器需要进行域名解析,域名解析会经过以下步骤进行解析,会以此经过以下步骤查找映射。

浏览器 -> 浏览器缓存 -> 查看本机host文件 -> 本地域名服务器
本地域名服务器查找不到对应域名则会按照以下顺序依次请求上级域名服务器查询域名:
本地域名服务器 -> 根域名服务器 
本地域名服务器 -> 顶级域名服务器
本地域名服务器 -> 二级域名服务器

这种访问方式是迭代的请求方式,即当本地域名服务器查找不到对应域名则主动请求根域名服务器,如果根域名服务器找不到对应域名则返回顶级域名服务器地址让本地域名服务器自己去请求顶级域名服务器,同理顶级域名服务器找不到会返回二级域名服务器逐层往下。

还有一种递归的请求方式,当本地域名服务器向根域名服务器发出请求时如果根域名服务器无法找到域名则会自己主动去访问顶级域名服务器查找,如果找不到就继续向下级查找,如果找到则返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值