前面我们已经学习应用层,传输层
接下来重点讲解网络层和数据链路层,直接全部打通,最后附加梳理整个流程
目录
本节重点
- 理解网络层的作用, 深入理解IP协议的基本原理
- 理解数据链路层的作用, 了解ARP协议
- 对整个TCP/IP协议有系统的理解
- 对TCP/IP协议体系下的其他重要协议和技术有一定的了解
- 学会使用一些分析网络问题的工具和方法
网络层
本层的职责就是将数据从A跨网络送到B的能力
tcp是提供一个可靠的策略,它是端到端的可靠数据交付
ip是一个行动方案,解决跨网络的数据包传输问题,是把数据从哪发到哪的问题

路径选择中,目标ip非常重要,决定了我们的路径如何走
主机 : 配有 IP 地址 , 但是不进行路由控制的设备 ; 路由器 : 即配有 IP 地址 , 又能进行路由控制 ; 节点 : 主机和路由器的统称;ip=目标网络(北京)+目标主机(故宫)
IP协议格式

任何协议的学习
1.解包
2.分用
4位首部长度:0-15,实际x4,范围【0,60】,实际范围【20,60】16位总长度:报头+数据
这两个参数就可以进行报头和有效载荷的分离
8位协议 :标识传输层协议,告诉目标主机该 IP 数据包的数据部分交给哪个传输层协议处理
6是tcp,17是udp,1是icmp,解决了分用问题
**16位首部校验和:**发送端计算报头的校验和,接收端重新计算,若不一致则丢弃数据包(检测报头是否损坏),tcp后面会进行超时重传,所以ip没有保证可靠性,而是tcp
8位生存时间(TTL):
- 限制数据包的 "生存周期"(单位:跳数,即经过的路由器数量);
- 发送端设置初始值(如 64),每经过一个路由器减 1,TTL=0 时丢弃数据包(避免路由环路)。
32位源ip地址 可以会变,因为一直要路由,而32位目的ip不变
4位版本 :标识 IP 协议版本,IPv4 填 4,IPv6 填 6。
**8位服务类型:**就是给最优路径下一个定义,比如最少丢包啊,最少时间啊等等,让路由的时候有个策略
- 用于标识数据包的 "优先级" 和 "传输需求"(如低延迟、高吞吐量);
- 前 3 位是 "优先级"(已弃用),后 4 位是 "服务类型"(如
0000= 普通,1000= 最小延迟),最后 1 位保留。先学到这,后面会补充别的字段
网段划分

在一个学校当中,每个人的学号都是独一无二的,假设学号中标识自己的学院+编号,那当一个人丢失物品时,能够快速定位学院,甚至如果给班级编号,还能快速定位学院+班级,直接交给某个班级的班长即可
这里的ip=学号
所以网络也需要这样的划分,任意的一台主机必须隶属于某个子网,是为了方便定位这个主机,路由的时候效率高,查找(排除)效率高,直接看前面几个数字,就可以排除一大片
做法是通过子网划分 (手段),把网段划分(结果)
ip=目标网络+目标主机
我们的世界的互联网早就被设计过了,三大运营商就是底层的网络设计者,ip有32位,全球机构把某个网段分配给亚洲,亚洲又接着往下分给中国,中国由三大运营商接手,每个国家都不一样,但是ipv4只有32位,那总的就是2^32次方,设备这么多,怎么可能足够每个设备一个ip地址,所以才有了网段划分

IP 地址分为两个部分 , 网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
不同的子网其实就是把网络号相同的主机放到一起.
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.
通过合理设置主机号和网络号 , 就可以保证在相互连接的网络中 , 每台主机的 IP 地址都不相同 .
那么问题来了 , 手动管理子网内的 IP, 是一个相当麻烦的事情 .
有一种技术叫做 DHCP , 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是应用层协议 ,基于 UDP 实现,核心作用是自动为局域网内的主机分配 IP 地址、子网掩码、网关、DNS 服务器等网络参数,替代手动配置(静态 IP),大幅简化网络管理。
比如我们平时不联网,不输入WiFi密码时,根本获取不到外界信息,只是一个单机主机,输入WiFi密码时,路由器分配一个ip地址给你的手机或者电脑,你就可以上网了
网段划分ipv4分类地址(旧方案):
A 类 0.0.0.0 到 127.255.255.255
B 类 128.0.0.0 到 191.255.255.255
C 类 192.0.0.0 到 223.255.255.255
D 类 224.0.0.0 到 239.255.255.255
E 类 240.0.0.0 到 247.255.255.255如果你申请A类的话,一个网络号允许1677万的主机,如果你申请一个B类的话,一个网络号允许6万多的主机,但是一个子网当中一般不会有这么多的设备,就会造成浪费
每个分类地址段都是独立的路由条目,大量小网络(如 C 类)会导致路由器的路由表条目暴增,增加路由查找的开销,降低网络转发效率。
本质是无法动态适配不同数量的设备,比如1000,申请b多余申请c不够,就需要申请多个c,划分细粒度不够
针对这种情况提出了新的划分方案 , 称为 CIDR(Classless Interdomain Routing):
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;
将IP地址和子网掩码进行 "按位与"操作, 得到的结果就是网络号;
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
可见, IP 地址与子网掩码做与运算可以得到网络号, 主机号从全 0 到全 1 就是子网的地址范围 ;
IP 地址和子网掩码还有一种更简洁的表示方法, 例如 140.252.20.68/24, 表示 IP 地址为 140.252.20.68, 子网掩码的高24位是 1, 也就是 255.255.255.0通过这个方案:可以划分更多更详细的,细粒度能更好的控制,多机器,那就子网掩码少1多0,如果是少机器那就少0多1;
特殊的ip地址
将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;(不能单独分配给某个主机)
将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
这张图是Linux(或类 UNIX 系统)中 "环回设备(loopback)+ 网络协议栈" 的数据包处理流程 ,核心展示了本地数据包(发往环回地址)和外部数据包(以太网)的处理逻辑
- 核心组件说明
- loopback 设备 :即 "环回接口"(对应 IP 地址
127.0.0.1),是系统内部的虚拟网络设备,用于 "本地进程间的网络通信"(无需走物理网卡);- IP 输出 / 输入函数:是 TCP/IP 协议栈的核心模块,负责 IP 数据包的封装(输出)和解析(输入);
- 环回驱动程序 / 以太网驱动程序:分别对应 "虚拟环回设备" 和 "物理以太网网卡" 的驱动,负责数据包的发送 / 接收。
- 流程拆解:数据包从 "输出" 到 "输入" 的路径
场景 1:本地进程发往环回地址(如
127.0.0.1)
- 进程调用网络接口(如
socket)发送数据,进入IP 输出函数;- IP 输出函数识别到目标 IP 是环回地址,将数据包交给环回驱动程序;
- 环回驱动程序直接把数据包 "放回" 到IP 输入队列;
- IP 输入函数从队列中取出数据包,交给本地目标进程。
→ 整个过程不经过物理网卡,是系统内部的 "数据包环回",用于本地通信(如本地服务调试)。
场景 2:进程发往外部 IP(如互联网地址)
- 数据进入IP 输出函数 后,先判断目标 IP:
- 若目标是广播 / 多播地址:直接放入 IP 输入队列(广播包需本地进程也接收)(图中简化了,实际也要给物理网卡发出去的);
- 若目标是单播地址:检查目标 IP 是否与本机网卡 IP 相同(即发往自己),若是则走环回流程;若不是则执行下一步;
- 调用ARP 协议:获取目标 IP 对应的以太网 MAC 地址(物理网卡的硬件地址);
- 将数据包交给以太网驱动程序,通过物理网卡发送到外部网络;
场景 3:物理网卡接收外部数据包
- 以太网驱动程序接收外部数据包后,先基于以太网帧类型分用(比如 "类型 0x0800" 对应 IP 数据包);
- 若分用结果是 IP 数据包,将其放入IP 输入队列;
- IP 输入函数解析数据包,交给本地目标进程。
总结:旧方案会导致在同一个子网里面浪费ip地址,新方案的提出让划分细粒度变得更小,想要多大就多大,但是还是没有解决ipv4地址不够用的情况,因为总的来说就42亿左右,并且网卡还可以多个ip地址,所以还需要新的解决方案
三种解决方案
1.动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;
2.NAT技术(后面会重点介绍);
3.IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;
私有ip地址和公网ip地址
如果一个组织内部组建局域网 ,IP 地址只用于局域网内的通信 , 而不直接连到 Internet 上。 理论上使用任意的 IP 地址都可以, 但是 RFC 1918 规定了用于组建局域网的私有 IP 地址
根据 RFC 1918,私有 IP 只有 3 个固定段:
10.0.0.0/8(10.0.0.1 ~ 10.255.255.254)172.16.0.0/12(172.16.0.1 ~ 172.31.255.254)192.168.0.0/16(192.168.0.1 ~ 192.168.255.254)前两个是企业级路由器分配的,第三个是家用级的
其余的就是公网ip
对于运营商,一旦我们入网,访问的不是跟自己同属于一个局域网内的设备时,数据包就会经过运营商的设备才会进行转发,所以如果我们的手机欠费了,那转发的数据包就会丢包,但是如果是紧急电话就可以转发,紧急电话(110/120/119)是独立于普通网络服务的优先级业务,运营商的设备对紧急呼叫做了 "无条件放行" 处理,你买的手机即使没有手机卡,他买的时候激活的时候就已经搜索附近的基站(没网不等于没信号),如果是紧急电话,是你的物理设备直接与基站建立联系,完全跳过了其他设备运营商如果发现你访问了一个非法的ip,就可以进行拦截,所谓的fq,就是运营商这道q
路由器

一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复(这样可以标识不同的主机),但是不同的子网内的主机的IP地址就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换 (替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
如果你的src:192.168.1.201,dst是到服务器,如果源ip一直不变,你可以发现是可以经过路由器数据能够到服务器,但是服务器构建响应回来的时候,由于公网当中有很多个相同的私有ip,或者换句话说公共是不能出现私有ip的,因为这么多相同的它根本不知道发给谁,所以解决办法就是每经过一个路由器src源ip必须要进行更换,换成WAN口ip,因为WAN口ip是接外部的
具体的回来过程后面说
如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.
总结所以一个路由器有两个ip,一个对内LAN口ip,一个对外WAN口ip,那只要保证一开始的公网ip不同,局部的私有ip不同,那不同公网的局部的私有ip相同也不影响,照样可以保证唯一性,这样就解决了ip不足的问题
路由器的三大功能(还有其他的)
1:DHCP,这个用来分配ip地址让你入网
2:NAT,网络地址转换
3:转发你的数据包
所以全世界的互联网都是这样分配的,每个州分配,每个国家分配一定数量的公网ip地址,然后每个省在分配,最后每个市县分配,最后分配到每个公网ip地址掌管一个互联网入口,然后下面就是一个子网,子网的下面又可能是子网,这样就能够解决ip地址不够用的情况,因为不同的公网下面的子网可能ip地址相同
生活中的现象
对于互联网公司,搭载千万级别的服务器,只有百分之1到5的服务器需要对外提高服务,对外的这些需要公网ip,因为需要别人来访问,而对内可以搭建自己的局域网,对于数据库这种可以搭建内网,这样能够降低风险,防止别人攻击
对于定位ip地址:比如抖音能够知道别人的ip地址,就是因为经过路由器的转发,只要知道别人的源ip,通过查表就知道在哪个省转发出来的数据了(因为知道分配给哪个省的公网ip是啥,你是那个转发过来的肯定存在那个省份)
路由

所谓 " 一跳 " 就是数据链路层中的一个区间 . 具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间 .
当IP数据包, 到达路由器时, 路由器会先查看目的IP;
路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
依次反复, 一直到达目标IP地址;
那么如何判定当前这个数据包该发送到哪里呢 ?
这个就依靠每个节点内部维护一个路由表 ;
路由表可以使用route命令查看,windows可以通过route PRINT
Genmask:是一个子网掩码
destination: 是目标网络 / 主机 :表示这条路由规则对应的 "目标 IP 地址段"。例:
default代表 "所有未匹配的 IP";172.17.0.0代表 "172.17.0.0/16 网段"。gateawy: 是下一跳网关 :数据包发往目标网络时,需要转发到的 "下一个网络设备 IP"。例:
_gateway是默认网关(通常是路由器 IP);0.0.0.0表示 "目标网络与本机直连,无需网关"。Flags :路由标志 :用字母表示路由的属性,常见值:-
U:路由 "可用"(Up);-G:路由需要经过 "网关"(Gateway);-UG:路由可用且需要网关(如default规则)。Metric:路由优先级 :数值越小,优先级越高(当有多个路由匹配同一目标时,选 Metric 小的)。例:
100是默认优先级,0优先级更高。Ref :路由引用计数:内核引用这条路由的次数(通常为 0,仅作统计)。
Iface:出接口 :数据包发往目标网络时,使用的 "本机网卡接口"。例:
eth0是物理网卡;docker0是 Docker 的虚拟网卡;br-xxx是 Docker 的虚拟网桥。1.来一个目的ip,我就查路由表
2.拿目的ip&genmast子网掩码,确认要去的目标网段
3.对比destination,如果一样说明是一个网段,那就去gateway,如果不一样,最后会对比到default,也就是对比全错,最后只能去default的,交给默认网关
4.通过iface接口发出报文
如果目的IP命中了路由表, 就直接转发即可;
路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。总结两种可能
一如果是同一网段,说明此时他们在同一子网内,直接转发即可无需经过网关
二如果不是同一网段,说明不在同一子网,那就需要对比后去到默认网关,默认的在转发出去
路由表可以由网络管理员手动维护 ( 静态路由 ), 也可以通过一些算法自动生成 ( 动态路由 ).
请自己调研一些相关的生成算法 , 例如距离向量算法 , LS 算法 , Dijkstra 算法等 .
重谈IP报头
在路由器之间跑的是ip报文,但在网线上跑的是数据帧(MAC帧)属于数据链路层
对于MAC帧有效载荷不能超过1500字节,这个是MTU是可以修改的,后面讲
传输控制协议,对于mac要求的1500字节压根就不是ip决定的,也不是tcp决定的,但是tcp决定要发多少字节,还有之前学的拥塞控制和发送窗口的最小值,我都知道最大能发送多少了,为什么不一次性发,还要分多次发?根本原因就在于数据链路层要求,tcp中有个字段叫MSS,这个字段就是表明tcp最大发送多少,尽量适配下层(下层限制上层,上层适配下层)
异常情况:tcp硬要发3000字节,ip就像一个中层,上级要求你做个qq出来,ip中层给底层程序员做,底层压根做不出来,ip夹在中间,所以ip有了16位标识,3位标志,13位片偏移,这是用来支持分片和组装的,分片与组装不是主流问题,上层tcp在发的时候尽量都是按照规定字节内来的,这是特殊情况

如何分片???如何组装???
对于分片和组装,发端:分,收端:组,而且这不是tcp&&MAC关心的,这是ip必须要处理,别的层感知不到ip的分片和封装
16位标识:唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.
13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片,在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为0(标识这个是最后一个), 其它是1(标识后面还有分片). 类似于一个结束标记.
分片组装问题:
1、怎么知道一个报文被分片了???
如果更多分片中被置为1了,如果更多分片中被置为0&&分片偏移!=0,则表示被分片了2、同一个报文的分片如何识别???
通过16位标识3、哪一个是第一个,哪一个是最后一个,有没有收全???
更多分片被置为1&&片偏移=0则为第一个,如果是分片被置为0&&片偏移>0则为最后一个
用当前的起始位置+自身长度=下一个报文中填充的片偏移即为收全4、哪一个在前哪一个在后???
只需要按照片偏移中排个升序即可
5、怎么保证合起来的报文是正确的???
tcp/ip有校验和流程:
把同一标识的分片,按 "片偏移" 从小到大排序;
检查 MF 标志:直到收到 MF=0 的分片,才认为所有分片都到齐;
把所有分片的数据部分拼接起来,去掉每个分片的 IP 头,还原成原始 IP 包,再交给上层协议(TCP/UDP)。
通过这里我们很强烈的感受到分片不是很好,他会增加丢包,你分了多个片之后一旦有个包丢失了就丢包了,所以最好不要分片,但ip不能没有这个功能,所以tcp尽量发的数据小于MTU,这个前面可以通过MSS协商完成的
数据链路层
用于两个设备 ( 同一种数据链路节点 ) 之间进行传递 .
以太网
以太网是 当前全球应用最广泛的局域网技术标准 ,它不是一个具体的网络,而是一套 定义了 "设备如何在局域内通信" 的技术规范 ,同时覆盖了 物理层和数据链路层的核心规则。
简单说,以太网就是给局域网里的设备(电脑、路由器、交换机)定了一套 "通信规矩"------ 比如 "怎么连网线""怎么发数据""怎么避免冲突",让不同品牌的设备能互相通信。
物理层:数据怎么连,信号怎么传
数据链路层:数据怎么封装,怎么发送(以太网帧)
怎么避免冲突

这就好比在同一间教室,老师喊了张三,那就只有张三站起来,因为张三是唯一的标识符,此时不需要局域网转发,因为你在同一个网段,且你的MAC地址是唯一的,可以用这个做标识符


源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
帧协议类型字段有三种值,分别对应0x0800IP、0x0806ARP、0x8035RARP;
帧末尾是FCS校验码:是对 "目的 MAC + 源 MAC + 类型 + 数据" 的 CRC 校验值,接收方通过校验判断帧是否损坏(损坏则丢弃)。
如何分离???如何分用???
使用定长的,对于一个报文,直接取下前24字节,后面四字节,剩下的就是有效载荷,然后根据类型向上分用即可
此时注意我们仅仅知道源地址,因为源地址就是自己主机当中网卡中的MAC地址,全球唯一但是目的地址不知道,那如何获取目的MAC地址呢???
此时只需要发一个ARP包:该包的作用是让目的ip地址的主机填写自己的MAC地址,局域网当中的都会收到,此时数据链路层进行检查,但因为ip地址在同一个子网是唯一的,所以只有目的ip地址的机器会回复,填写目的MAC地址即可,然后返回,此时你的主机有一个APR临时缓存表,存进去即可,下一次就不需要再发APR包进行询问了。
通过指令ifconfig就可以看到自己的网卡配置,其中的ether就是mac地址,然后右上角mtu1500
但是发ARP包的时候处于同一局域网内的都可以收到,但是不是发给我的,我会丢弃,但是网卡有一种模式,叫混杂模式,处于这个模式下无论是不是发给自己的数据包都会向上交付,这就是抓包,所以http不安全的原因就是因为没有加密,导致途径这么多结点,这么多局域网,只要其中有混杂模式就会被抓包
交换机

网络就是一种临界资源,是大家所共享的,如果所有人同时发送数据,那网络就会阻塞就会碰撞,一个局域网就是一个碰撞域,所以有人提出了令牌环
令牌环就相当于锁,轮流拥有令牌,拥有才可以发消息,这样就避免了碰撞,但是效率低,成本高,不如以太网,但是如何检测碰撞和碰撞避免算法呢???
局域网当中的主机不是越多越好,越多你发的信息可能就会增加碰撞
此时就提出了交换机的概念,交换机是作用在局域网当中划分碰撞域的,比如m1是发给m6,此时左边能收到,右边就收不到了,所以划分了左右两边
在交换机当中会维护一个MAC地址表,如果你指定发给某个MAC地址,那别的就收不到,如果是广播,那所有的都会收到
交换机:工作在数据链路层 ,基于 MAC 地址转发,负责局域网内的设备通信,无法跨网段;这样能够有效的减少冲突

所以你学习的时候是否有个疑惑?为什么MTU是1500,明明我可以发送更大的数据,为什么偏偏要被下层要求发送1500以内呢???
这的本质就是长了也不好,容易增加碰撞概率,所以MAC帧才有规定自己的有效载荷的大小,这个叫mtu,一般是1500,还有个最小传送单元,46字节,所以范围就是46-1500(这是以太网规定的)
注意: 每个设备都会有个MTU,所以都可能会分片,并不是只有源主机会进行分片,对于分片有个禁止分片标识位,也就是如果你不想分片了可以置为1,这样在路上经过那些mtu比较小的结点时就会进行丢弃,然后触发超时重传,下次选择路径的时候就会选择mtu比较大的,这样叫选择吞吐量大的路线,小的吞吐量的路线可能响应更快,因为它字节少
对比网络层和数据链路层
IP地址描述的是路途总体的 起点 和 终点;
MAC地址描述的是路途上的每一个区间的起点和终点;
主机发数据给下一跳的正确步骤是:
- 网络层(IP 层)对 IP 包做路由决策:确定 "下一跳的 IP 地址";
- 网络层通过 ARP 协议,把 "下一跳的 IP 地址" 转换成 "下一跳的 MAC 地址";
- 链路层把 IP 包封装成数据帧,用 "下一跳的 MAC 地址" 作为目的 MAC;
- 链路层把数据帧发送到下一跳。
简单来说就是网络层规划总体路径,你应该往哪,数据链路层去执行,等到后面梳理整个数据包的传输过程你会有更清晰的理解
历史遗留问题

问题:明明滑动窗口都是根据网络情况和接收端的接收缓冲区的大小的最小值设定的,为什么不直接发送滑动窗口的大小的数据段呢???
核心原因:
对于tcp协议中,有一个字段MSS(选项),MSS的作用就是限制IP发过大的报文,因为要适配下层MTU的1500(默认),为什么要1500?因为发多了碰撞概率增大
MSS(Maximum Segment Size,最大分段大小)是 TCP(传输控制协议)中的一个关键参数,用于定义 TCP 数据段中**应用层数据的最大长度**(不包含 TCP 头部和选项字段)。它的作用是避免 TCP 数据段在传输过程中因超过底层网络的 MTU(最大传输单元)而被分片,从而提高传输效率
那这个MSS是如何填充的???
TCP在建立连接的过程中, 通信双方会进行MSS协商.核心是让通信双方明确 "对方一次能接收的最大 TCP 数据载荷",避免后续传输触发 IP 分片。
最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
MSS的值就是在TCP首部的40字节变长选项中(类型(kind)=2,长度=4,值=1460)注意:为什么要协商???为什么不是只保证自己发出去的不被分片就行???
原因在于如果发超过对方的MTU可能会丢包,MTU的大小是物理设备决定的,一旦你超过了,网卡无法处理, 链路层的硬件、介质、协议共同决定了它 "收不了", 所以尽量发小于
详讲ARP协议
ARP(Address Resolution Protocol,地址解析协议)的核心作用,就是在同一个局域网内,根据目标设备的 IP 地址获取其对应的 MAC 地址
ARP 的本质都是 "网络层与数据链路层的桥梁协议",它不承载上层数据,唯一作用就是建立 IP 地址和 MAC 地址的映射关系,保障局域网内的 IP 通信能落地到链路层的帧传输。
协议格式:

注意如果目的以太网地址不知道,全填写FFFFFFFF就是广播,并且本地有个ARP缓存表,缓存表有个老化时间(过期时间),超过后系统会自动删除目的ip:目的mac映射关系
关键前提 :只有当目标 IP 与本机在同一局域网 时,才会触发 ARP 解析;如果目标 IP 是外网地址,本机不会直接解析它的 MAC,而是解析网关的 MAC(把数据发给网关,由网关转发)。
封装ip,接着往下封装数据链路层的时候,去查本地ARP缓存表,如果缓存表中有目的ip:目的mac对应关系,填写即可
如果发现没有,则触发ARP解析流程,构造ARP报文,目的 MAC:FF:FF:FF:FF:FF:FF(广播地址);
局域网当中所有的主机都会收到,然后解包分用交给ARP协议,先看op字段,如果op是1表示请求,op是2表示响应,发现op=1,然后去解析目的ip地址,其他发现不是自己的,丢弃
B发现是自己的,则把A发来的ip和mac存入B的ARP缓存表,然后B构造ARP响应,op=2,然后填写别的字段,告诉A自己的MAC地址(此时是单播,因为知道A的目的MAC,其他收到的时候数据链路层检查目的MAC的时候发现不是自己的,在数据链路层就丢弃了,所以是单播)
本机A收到时,发现op=2,那就是响应,直接去找目的mac地址,然后更新ARP缓存表,至此双方可以通信
后面如果过期了,系统删除缓存表,还需要发起ARP解析流程
还有一种情况:就是我们可能只知道对方的mac地址,不知道ip地址,这种情况出现的概率极其小,但可以通过rarp协议 来获取,RARP(Reverse Address Resolution Protocol,反向地址解析协议 )的核心作用是:已知设备的 MAC 地址,反向获取对应的 IP 地址。
这里就不详细介绍了,自行了解,并且这个协议估计要被取代(功能不好)
ARP欺骗
ARP 欺骗(ARP Spoofing)是一种利用 ARP 协议无认证机制的局域网攻击手段,攻击者通过伪造 ARP 响应报文,篡改目标设备的 ARP 缓存表,让目标设备把本应发给正确对象的流量,转发到攻击者的设备上。
ARP 协议的设计存在一个致命缺陷:接收方收到 ARP 响应报文时,不会验证报文的真实性,会直接更新本地 ARP 缓存表------ 无论这个响应是不是自己请求的。
1、中间人攻击(MITM)
这是 ARP 欺骗最常见的用途,攻击者夹在两台通信设备之间,实现流量监听、篡改甚至劫持。流程以 "主机 A ↔ 网关" 为例:
- 攻击者向主机 A 发送伪造 ARP 响应:
网关IP 192.168.1.1 ↔ 攻击者MAC;- 攻击者向网关 发送伪造 ARP 响应:
主机A IP 192.168.1.10 ↔ 攻击者MAC;- 主机 A 发往网关的流量会先到攻击者,网关发往主机 A 的流量也会先到攻击者;
- 攻击者开启流量转发功能,就能在不被察觉的情况下,监听甚至篡改 A 和网关之间的所有数据(比如截获 HTTP 明文密码)。
所以上层直接使用https就好了,这样即使被抓到也没事
- 拒绝服务攻击(DoS)
攻击者向目标主机发送大量伪造 ARP 响应,把网关 IP 映射到一个不存在的 MAC 地址,导致目标主机无法找到网关,从而无法访问外网,实现断网攻击。
防范措施:直接固定绑定网关:mac,还有安装杀毒软件去检测
DNS

DNS(Domain Name System,域名系统 )是互联网的核心基础设施之一,核心作用是 将人类易记的域名(如 www.baidu.com)翻译成机器能识别的 IP 地址(如 180.101.50.188),相当于互联网的 "地址簿"。
没有 DNS,你访问网站就必须手动输入一串枯燥的 IP 地址,而不是简单的域名。
CP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序 . 但是 IP 地址不方便记忆 .
于是人们发明了一种叫主机名的东西 , 是一个字符串 , 并且使用 hosts 文件来描述主机名和 IP 地址的关系 .
最初 , 通过互连网信息中心 (SRI-NIC) 来管理这个 hosts 文件的 .
如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.
其他计算机也需要定期下载更新新版本的hosts文件才能正确上网.
这样就太麻烦了 , 于是产生了 DNS系统.
一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系.
如果新计算机接入网络, 将这个信息注册到数据库中;
用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
至今 , 我们的计算机上仍然保留了 hosts 文件 . 在域名解析的过程中仍然会优先查找 hosts 文件的内容 .
cat /etc/hosts
DNS的查询本质就是一个网络服务,一般浏览器也会缓存最近访问的,你的主机没有才会向外访问,这就是网络服务了,通过udp来构建报文去请求,别人响应回来之后你就知道ip地址了
域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称 .
域名使用.连接
com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.
baidu: 二级域名, 公司名.
www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/++www.xxx.xxx++这样的格式, 来表示主机支持的协议.
www:提供网页浏览服务
ftp:提供文件传输服务
api:提供接口服务
mail:提供邮件服务
使用dig工具分析DNS过程
ICMP协议
ICMP(Internet Control Message Protocol,互联网控制报文协议 )是 TCP/IP 协议簇中网络层 的核心协议之一,不承载用户数据 ,专门用于在 IP 网络中传递控制信息、错误报告和诊断报文,保障 IP 协议的正常运行。
一个新搭建好的网络 , 往往需要先进行一个简单的测试 , 来验证网络是否畅通 ; 但是 IP 协议并不提供可靠传输 . 如果丢包了, IP 协议并不能通知传输层是否丢包以及丢包的原因 .
ICMP 正是提供这种功能的协议 ; ICMP 主要功能包括
确认IP包是否成功到达目标地址.
通知在发送过程中IP包被丢弃的原因.
ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
协议格式

ICMP 大概分为两类报文
一类是通知出错原因
一类是用于诊断查询

注意, 此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址.
ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期).
但这个是ipv6的,是往返消耗多少时间,
ipv4和这个不一样哈,这里自行查资料对比一下
ping命令会先发送一个 ICMP Echo Request给对端;
对端接收到之后, 会返回一个ICMP Echo Reply;
注意:telnet是23端口,ssh是22端口,但是icmp没有端口,因为工作在网络层,传输层才填写端口
traceroute命令
这个命令是基于icmp的,能够打印出可执行程序主机, 一直到目标主机之前经历多少路由器.sudo
yum install traceroute -y//安装

NAT技术
技术背景
之前我们讨论了 , IPv4 协议中 , IP 地址数量不充足的问题
NAT 技术当前解决 IP 地址不够用的主要手段 , 是路由器的一个重要功能 ;
NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;
转换IP的过程

NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;
在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;
映射 "内网 IP ↔ 公网 IP"(无端口)
那么问题来了 , 如果局域网内 , 有多个主机都访问同一个外网服务器 , 那么对于服务器返回的数据中 , 目的 IP 都是相同的.(都是同一个202.244.174.37) 那么 NAT 路由器如何判定将这个数据包转发给哪个局域网的主机 ?
这时候 NAPT 来解决这个问题了 . 使用 IP+PORT 来建立这个关联关系
对于转换表,不同的协议有不同的删除策略,比如tcp就是四次挥手后删除,udp就是设置过期时间
但这个技术有缺陷:
无法从NAT外部向内部服务器建立连接;破环了端到端通信的原始设计
装换表的生成和销毁都需要额外开销;
限制了网络的扩展性
通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
自行学习:NAT穿越
你是否有个问题?只要我不访问外网的主机,那就不会生成转换表,那外网的主机压根访问不了内网的主机???那大家的服务器都是放在内网防止攻击啊???"只要内网主机不主动访问外网,NAT 设备就不会生成对应的地址转换表项,此时外网主机确实无法主动发起对该内网主机的访问 ------ 这是 NAT'被动隔离'的安全价值。
不过,实际业务中很少有完全不对外提供服务的场景:企业通常会将对外服务(如 Web 服务器)部署在'外网边界区' ,而核心服务(如数据库)部署在内网 ,通过 NAT 的端口映射 / 静态映射实现'外网服务→内网核心服务'的通信(仅开放必要的端口,比如 Web 服务器访问数据库的 3306 端口)。
这种架构的防护逻辑是:核心服务不直接暴露在公网,外网攻击者无法直接扫描到内网核心服务的 IP / 端口;但需注意 ------ 若'外网边界区的服务器'被攻破,攻击者可能以其为跳板,通过内网渗透技术(如横向移动)访问内网核心服务。
因此,企业的完整防护方案是:
- 用 NAT / 防火墙隔离'外网边界区'与'内网核心区',仅开放必要的通信端口;
- 对'外网边界区'的服务器做高强度加固(如漏洞修复、入侵检测);
- 内网核心区启用 VLAN 分段、访问控制策略,限制跨网段通信,降低横向渗透风险。"
代理服务器
正向代理和反向代理
花王尿不湿是一个很经典的尿不湿品牌 , 产自日本 .
我自己去日本买尿不湿比较不方便 , 但是可以让我在日本工作的表姐去超市买了快递给我 . 此时超市看到的买家是我表姐, 我的表姐就是 " 正向代理 ";
后来找我表姐买尿不湿的人太多了 , 我表姐觉得天天去超市太麻烦 , 干脆去超市买了一大批尿不湿屯在家里 , 如果有人来找她代购, 就直接把屯在家里的货发出去 , 而不必再去超市 . 此时我表姐就是 " 反向代理"

正向代理就是把你的请求进行转发
反向代理就是请求的时候先经过反向代理,然后又它去帮你请求服务器(Nginx就是这样的)
就比如表姐,她就成了卖尿不湿的人,大家都来这里买,你实际上请求的服务在你看来就是反向代理的那台服务器,实际它还要把你的请求进行转发
正向代理:代理**客户端**的请求,帮助客户端访问其无法直接访问的服务器。客户端明确知道自己在使用代理,且服务器不知道真实的客户端是谁。
反向代理:代理**服务器端**的请求,客户端不知道代理的存在,以为直接访问的是目标服务器,而实际请求被代理服务器接收并转发给后端的真实服务器。
正向代理用于请求的转发 ( 例如借助代理绕过反爬虫 ).
反向代理往往作为一个缓存 .

一般来说fq会给报文进行加密,然后发送给代理服务器,再由代理服务器转发出去,这期间运营商即使抓包了,但也发现不了你访问的是谷歌这样的外网,因为你加密了,它不知道报文是啥,但是他可以通过监控等各种手段,比如IP黑名单,对于一些境外违规代理,他发现你访问代理IP,直接丢包,还有其他很多手段,比如流量特征分析等等
比如校园网,有些学校需要交钱才可以使用校园网,这就是正向代理
部署一些web服务,比如学校你交了网费我才帮你转发出去

一般来说,反向代理服务器配置高,因为要承载大量的流量,高并发,第一关接收流量,然后转发给后台服务器,转发有多种算法,比如按照顺序,1-2-3,或者生成随机算法,就是让后台服务器承受比较均匀,如果都是一台服务器可能就崩掉了
反向代理1.可以进行缓存,比如用户a请求了外网的某种资源,这个资源可以进行缓存到代理服务器上,下次用户b访问时,代理服务器发现访问的是同一个目的ip,就可以直接在缓存中返回资源
2.一些非法访问可以拒绝
路由器往往都具备 NAT 设备的功能 , 通过 NAT 设备进行中转 , 完成子网设备和其他子网设备的通信过程 .
代理服务器看起来和 NAT 设备有一点像 . 客户端像代理服务器发送请求 , 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后 , 代理服务器又把结果回传给客户端 .
那么 NAT 和代理服务器的区别有哪些呢 ?
从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行fq, 另外像迅游这样的加速器, 也是使用代理服务器.
从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
(NAT,主机和主机之间感知不到NAT的转换,认为就是端到端的通信,他工作在网络层次(IP地址转换)传输层(端口转换),但是代理是应用层的,他本质就是访问代理服务器必须指明代理服务器的地址,代理服务器给你进行转发给内网服务器)
从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.最核心的区别
反向代理工作在 应用层 ,可以根据 URL 路径、请求头、Cookie 等内容分发请求(比如
/api转发到后端 API 服务器,/static转发到静态资源服务器)。NAT 工作在 网络层,只能根据 IP: 端口 转发,无法识别应用层的路径信息。
反向代理的后端服务可以完全隐藏在内网,无需公网 IP;而 NAT 的端口映射虽然也能暴露内网服务,但无法实现复杂的请求分发。
至此,所有的网络层次都一键打通,下一节,我们将通过一个例子去分析一个请求数据究竟是如何通过网络到达目的主机的,目的主机又如何构建响应通过网络回应你的










