📌 个人主页: 孙同学_
🔧 文章专栏: Liunx
💡 关注我,分享经验,助你少走弯路!
文章目录
网络层
在复杂的网络环境中确定一个合适的路径
IP 协议

IP协议: 提供一种能力,有较大概率,能把数据从A主机跨网络发送到B主机
TCP/IP协议: 把数据100%可靠的,从主机A跨网络发送到主机B
IP协议:解决的是主机对主机的问题
TCP协议:解决的是进程到进程之间通信的问题,有端口号
ip协议解决的是主机到主机的问题,但是网络中的主机太多了,因此就要表示网络的唯一性。
为了保证唯一性,每台主机就必须设置IP地址。
IP = 目标网络 + 目标主机
路由的本质理解:在路上传递的时候,本质是从一个子网,进入到另一个子网
基本概念
主机: 配有 IP 地址, 但是不进行路由控制的设备
路由器: 即配有 IP 地址, 又能进行路由控制
节点: 主机和路由器的统称
补充:
当代路由器,已经是一台小型计算机了,是可以工作在应用层的
IP协议头格式

8位协议字段: 表明有效载荷是UDP数据还是TCP数据
4位版本: IPV4
子网划分
为什么要子网划分?
未来在查找目标主机,先必须查找目标网络(本质就是可以淘汰其他网络,可以在全网中提高查找目标主机的效率)

可以保证每台主机的IP地址都不同
路由器至少有两个IP地址
我们自己电脑上面的IP地址是怎么来的?
当我们的电脑没有联网的时候,我们的电脑是没有IP地址的
我们的电脑不管是连接上wifi还是网线,都是由路由器给我们的电脑来分配IP地址的(内网)
这种由路由器给我们的电脑动态分配IP的做法叫做DHCP协议
所以路由器不仅有路由的功能,也有构建子网的功能
路由器是工作在应用层的设备
IP = 网络号 + 主机号
子网划分的本质: 把32位比特位进行划分,确定网络号有多少位.
分类划分法:

子网掩码存在的意义:可以把分类划分的网络IP资源得到充分的利用。

特殊的IP地址
- 将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网;
- 将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
- 127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1
内网IP是不会出现在公网上的
如果路由器的WAN口直接配的是公网IP,那么这个路由器就叫做公网的出入口路由器
内网IP可能重复,所以内网IP不能出现在公网上,就会导致发出去的消息回不来
家用路由器收到了我们的报文,把我们报文中的源IP地址,用家用路由器自己的WAN口IP进行替换,每经过一个内网路由器,就进行一次srcip的替换,替换成为当前路由器的WAN口IP,WAN口IP都是对外的。
我们把内网IP经过路由器WAN口IP替换的技术叫做NAT
在内网内,内网ip会重复,并且有NAT技术,不影响内网向外网通信,所以NAT可以解决IP地址不足的问题。
运营商可以控制我们的报文是否能发送到公网。
结论一: 公网路由器的路由表算法和内网的路由表算法是不同的
数据链路层,从上层接收下来的完整报文,大小不能超过MTU,最大传输单元1500字节
如果超过了,报文就要在网络层进行分片
结论二: IP报文可能要进行分片与组装
分片的坏处:
- 任何一个分片丢失,都表示该报文整体丢失
- 如果上层是TCP就会触发TCP丢包重传,如果是UDP就真的丢了
结论三: 网络分片的过程中,如果过多分片,就会导致丢包概率增大
实际中要尽可能的减少分片,减少分片的本质在传输层,让每次发送的报文长度不超过1500字节就不会发生分片了
1500字节减去IP层的标准字段20字节,减去传输层的标准字段20字节,就剩下1460字节,我们把这1460字节叫做MSS,最大段尺寸
3个标志位
16位标识符
每一个IP报文都有自己唯一的标识符,叫做16位标识,一个报文只有自己一个分片,标识就是自己,相同报文被分成了10片,标识相同
3位标志
第一位保留(保留的意思就是现在不同,但是现在还没想好,说不定以后会用)第二个位置为0,表示允许分片,为1,表示禁止分片,如果这时候的报文超过了MTU,IP模块就会将报文丢弃,第三位表示"更多分片",如果分片了话,最后一个分片为0,其他片为1,类似于c语言中的/0结尾。
13位片偏移
代表我当前的报文在原始报文的什么位置
如何分片和组装呢?
- 甄别出来特定报文是否被分片了?
a.查看3位标志中的更对分片标志位是否为1
b.更多分片虽然是0,但是片偏移大于0
条件a,b的反面是:更多分片是0 && 片偏移为0
- 怎么保证自己把分片拿全了?
a.16位标识,相同的标识分片,聚合在一起
b.如何保证收全了?
收不全的情况:
第一片丢失 -> 没有收到片偏移为0的报文
中间丢失 -> 把收到的所有分片,按照片偏移进行升序排序。片偏移 + 自身报文长度 = 下一个分片的起始偏移
结尾丢失 -> 没有更多分片是0的分片
- 组装分片
传输层解决的问题:解决传输相关的问题,比如可靠性
数据链路层解决的是:子网(局域网)通信的问题 -> B-F 为什么?
传输层解决的是:长距离传输,路径选择的问题 ->B-F 怎么办?
数据链路层
用于两个设备进行信息传递的问题
认识以太网
以太网帧格式

如何分离?
固定长度的协议
如何分用?
帧类型
认识 MAC 地址
- MAC 地址用来识别数据链路层中相连的节点;
- 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).
对比mac地址和IP地址
- IP地址描述的是路途总体 的 起点 和 终点
- MAC地址描述的是路途上的每一个区间的起点和终点
认识MTU
MTU相当于发快递时,对快递包裹大小的限制,这个限制是不同的数据链路对应的物理层的限制。
- 以太网中数据规定最小为46字节,最大1500字节,ARP数据包的长度不够46字节,就要后面补填充位。
- 最大传输1500字节称为以太网的最大传输单元,不同的网络类型有不同的MTU
- 如果一个数据包从以太网路由到拨号链路上,数据包大于数据链路的MTU,就要对数据包进行分片。
- 不同的数据链路层标准的MTU是不同的。
MTU对IP协议的影响
由于数据链路层MTU的限制,较大的IP的数据包要进行分片
- 对于较大的IP数据报,要进行分片,每一片都打上对应的标签
- 对于同一块的IP报文的每块小片的16位标志位是相同的。
- 每个小片的IP协议头中的3位标志字段中,第二个位置为0表示允许分片,为1表示不允许分片。第三位用来表示结束标记(当前是否是最后一片,是的话为0,不是的话为1)。
- 当到达对端时,会将这些小片进行重组,拼装在一起,返回给传输层
- 一旦这些小片中的任意一片丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据,最终由传输层来负责重传。
MTU对UDP的影响
- 一旦UDP携带的报文超过了1472(1500 - 20(IP首部)- 8 (UDP)首部),那么就会在网络层分成多个IP数据报
- 这多个数据报有任意一个丢失,都会引起接收端网络重组失败,那么这就意味着,如果UDP数据报在网络层被分片,整个数据丢失的概率就大大增加了。
MTU对TCP的影响
- TCP数据报的报文也不能无限的大,还是受限于MTU,TCP的单个数据报的消息的最大长度,称为MSS
- TCP双方在建立连接的时候,双方会进行MSS的协商
- 最理想的情况下,MSS的值正好是IP不会被分片处理的最大长度(这个长度是仍然受限于数据链路层的MTU的)
- 双方在SYN的时候,会在自己的TCP头部写入自己能支持的MSS值
- 然后上方得知对方的MSS值后,选择较小的一个作为最终的MSS
- MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind=2)
MTU和MSS的关系

局域网本身就是一个碰撞域,一个时刻,只能发送一个数据帧。
问题:主机A要把数据发送给主机B,主机A就要封装MAC帧,主机A怎么知道和它处在同一个局域网中的主机B的MAC地址呢?
所以就需要一种局域网协议,把IP地址转化成为对应的mac地址 --- ARP协议!地址解析协议
真正在网络层流动的数据 --- 其实是数据帧
ARP协议
ARP不是一个单纯的数据链路层协议,而是介于数据链路层和网络层之间。
ARP协议的作用
ARP协议建立了主机IP和MAC地址之间的映射关系
在网络通信中,源主机的应用程序知道目的主机的IP和端口号,却不知道目的主机的硬件地址。
数据包首先是被网卡接收到的,然后再去处理上层协议,如果接收到的数据报的硬件地址与本机不匹配,则直接丢弃。
因此在通信之前,必须获取到目的主机的硬件地址。
ARP的简易过程:
1.拿着目标主机的IP在群里广播
2.目标主机收到,然后进行应答 ,MAC地址一对一
在局域网中,任何主机可能收到ARP请求,也可能收到ARP应答
ARP的具体过程:
发送ARP的时候,其他主机收到ARP请求时,是在ARP层丢弃请求报文的;
应答ARP的时候,其他主机收到ARP应答时,是在MAC帧层丢弃应答报文的;
处理任何ARP(请求/应答),最先看的是OP字段
细节一:主机都会在一段时间内,记录下来局域网中,各个IP对应的MAC地址的映射关系!
为什么只在一段时间内记录下来,永久记录下来不好吗?
答案是:没必要,换笔记本或者改变网卡都会更新MAC地址。
ARP的数据帧格式

- 硬件类型指的是以太网类型,1为以太网
- 协议类型指要转化的地址类型,0x0800为IP地址
- 硬件地址长度对于以太网地址为6字节
- 协议地址长度为4字节
- OP字段为1表示ARP请求,为2表示ARP应答
👍 如果对你有帮助,欢迎:
- 点赞 ⭐️
- 收藏 📌
- 关注 🔔
