OSI七层

实战场景
我们可以沿着一条数据包从你的电脑出发,到访问一个网站,再返回的完整路径,来拆解每一步涉及的实战原理。
第一站:你的电脑和本地网络(链路层与交换机)
实战场景:你打开浏览器,输入网址。数据包首先在你的局域网里传输。
核心原理:交换机的工作原理与MAC地址表
- 原理是什么 :交换机内部有一张MAC地址表,记录了哪个MAC地址(网卡的物理地址)连接在哪个端口上。它通过"学习"数据包的源MAC地址来建立这张表。当收到一个数据包时,它会查看目的MAC地址,然后从对应的端口精准转发出去,而不是像集线器那样广播给所有人。
- 实战应用 :
- **为什么网线插上交换机就能上网?** 因为交换机学习了你电脑的MAC地址,并把它和端口绑定。
- **网络环路是如何发生的?** 如果两台交换机之间不小心用两根网线连起来了,由于交换机对广播包会向所有端口转发,这个广播包就会在两台交换机之间无限循环,瞬间产生"广播风暴",耗尽所有带宽,导致整个网络瘫痪。这就是为什么稍微正规一点的交换机都必须开启STP(生成树协议)来自动阻塞冗余链路,防止环路。
- 如何排查:如果公司网络突然奇慢无比,交换机指示灯像疯了一样狂闪,这大概率就是二层环路。你需要立刻检查物理线路。
第二站:跨出家门,走向互联网(网络层与路由器)
实战场景:数据包要访问的网站服务器不在你家,在公网上。数据包需要被送到你家的"网络大门"------路由器。
核心原理:IP地址、子网掩码、网关与ARP协议
- 原理是什么 :
- IP地址与子网掩码:用来判断目标IP和自己是否在同一个"网段"。就像判断对方是不是在同一个小区。
- 网关:如果目标不在同一个网段,数据包就会被交给"默认网关",也就是路由器,由它负责向外转发。网关就是你家小区的大门。
- ARP协议:在同一个网段内通信,最终需要对方的MAC地址。ARP协议的作用就是通过IP地址去广播询问:"谁是192.168.1.1?告诉我你的MAC地址。"
- 实战应用 :
- **为什么电脑IP设为"自动获取"就能上网?** 因为电脑通过DHCP协议,自动从路由器那里拿到了IP地址、子网掩码、网关和DNS这些"通关文牒"。
- 为什么有时能上QQ但打不开网页? 这极大概率是DNS故障。QQ很多是基于IP直连的,而网页需要域名解析。DNS服务器就是"翻译官",负责把域名翻译成IP地址。如果DNS服务器地址配错或它本身挂了,翻译失败,自然就打不开网页。
- 如何排查 :
ping 网关IP不通,说明你连自家大门都找不到,问题在网线、网卡或路由器。ping 8.8.8.8(一个公网DNS IP)通,但ping www.baidu.com不通,那基本就是DNS的问题。
第三站:数据在互联网上的"快递"服务(传输层与TCP/UDP)
实战场景:数据包终于出了你家路由器,开始在广阔的互联网上传输。但网络是不稳定的,数据包可能会丢失、乱序。
核心原理:TCP与UDP的区别
- 原理是什么 :
- TCP:可靠的、面向连接的协议。就像打电话,先拨号建立连接(三次握手),通话中确保对方听清了(确认重传),最后挂断(四次挥手)。代价是效率低一些。
- UDP:不可靠的、无连接的协议。就像发短信或对讲机,直接喊话,不管对方收没收到。优点是效率高,延迟低。
- 实战应用 :
- **为什么网页、文件下载必须用TCP?** 因为一个字节都不能错。TCP通过序列号、确认应答、超时重传等机制,保证数据完整、有序地到达。
- **为什么视频通话、直播、游戏多用UDP?** 因为实时性最重要。视频偶尔花一下、游戏偶尔卡一下,比为了等一个丢失的数据包而整个画面卡住不动要好得多。丢了就丢了,继续传后面的。
- **"三次握手"为什么是安全检测的重点?** 很多攻击,如SYN Flood攻击,就是利用TCP三次握手的原理,只发第一步SYN请求,却不回应最后的ACK,让服务器傻等,耗尽服务器资源。
第四站:应用层的"翻译官"与"守门人"(应用层)
实战场景:数据包终于到达了目标服务器,服务器上的应用需要理解你的请求,并返回你需要的内容。
**核心原理:HTTP协议与NAT(网络地址转换)**
- 原理是什么 :
- HTTP协议 :规定了浏览器和服务器之间通信的格式。比如,你输入
https://www.example.com,浏览器会构造一个HTTP GET请求报文,里面包含了请求的网址、浏览器类型等信息。 - NAT技术:这是你家里多台设备能共享一个公网IP上网的根本原因。你家的路由器(NAT设备)会把你们所有内网设备的私有IP,在出口时统一转换成路由器的公网IP。回来的数据包,路由器再根据记录,准确地转发回发起请求的那台内网设备。
- HTTP协议 :规定了浏览器和服务器之间通信的格式。比如,你输入
- 实战应用 :
- **为什么在浏览器按F12打开"开发者工具"的Network标签,能看到每个请求的详细耗时、状态码(404、500等)?** 这就是在直接查看和分析HTTP协议。200表示成功,404表示资源未找到,500表示服务器内部错误。
- 为什么在公司内网搭建的VPN服务器,外部直接访问不了? 因为你的VPN服务器只有内网IP(如192.168.x.x),公网不认识。你需要在你公司的**出口防火墙或路由器上做"端口映射"**,将公网IP的某个端口(如1194)的流量,映射到内网这台VPN服务器的相应端口上。这就是NAT技术的一个典型应用。
总结:你的实战学习路径
- 先学抓包 :下载Wireshark,在你电脑上抓包。然后做一次
ping,过滤查看ICMP协议;访问一个网页,过滤查看HTTP和TCP的交互过程。亲眼看到数据包的结构,比看一百遍理论都管用。 - 在虚拟机里搭网络 :用VirtualBox或VMware建两台虚拟机,配置它们在不同网段,然后通过配置一台虚拟机的路由转发功能,让它们能互相
ping通。这能让你彻底搞懂IP、子网、网关、路由表。 - 用模拟器做实验:使用Cisco Packet Tracer或华为eNSP,拖拽几台交换机和路由器,配置VLAN、配置静态路由、观察STP如何防环。这是网络工程师的入门必修课,也是理解网络原理最直观的方式。
实战场景2
我们再深入几个能立刻动手验证、能解释日常网络问题的实战原理。这些原理是网络工程师和安全工程师排查故障、优化性能的"听诊器"。
1. ARP 协议与"中间人攻击"原理
实战场景:你在咖啡厅连上公共Wi-Fi,理论上你的所有网络通信都可能被同一网络内的其他人窃听。这背后的核心就是ARP协议的工作方式。
原理是什么:
- **ARP(地址解析协议)** 的作用是在局域网内,通过已知的IP地址,去查询对方设备的MAC地址(物理地址)。就像你知道一个人的名字(IP),但最终要找到他本人(MAC)才能对话。
- 工作流程是:你的电脑会向局域网广播一个ARP请求,问"谁是192.168.1.1?告诉我你的MAC地址"。真正的网关(路由器)会回应,但任何一台设备都可以抢先或伪造这个回应。
实战应用:
- ARP欺骗/中间人攻击:攻击者会不停地向你的电脑发送伪造的ARP应答包,告诉你"我是192.168.1.1(网关),我的MAC地址是攻击者的MAC地址"。同时,它也欺骗网关,说"我是你的电脑,我的MAC地址是攻击者的MAC地址"。这样一来,你和网关之间的所有流量都会经过攻击者的电脑,它就可以轻松地窃听、篡改你的数据。
- 如何验证 :在你的Windows或Linux电脑上,打开命令行,输入
arp -a命令,你就能看到本机的ARP缓存表。如果发现网关IP对应的MAC地址,和另一个无关IP的MAC地址相同,那很可能就存在ARP欺骗。
2. TCP的"粘包"与"拆包"问题
实战场景:你正在用Java或Python写一个网络聊天程序,你连续发送了"你好"和"世界"两条消息,但对方却可能一次性收到"你好世界",或者先收到"你好世",再收到"界"。这就是TCP最经典的"粘包"问题。
原理是什么:
- TCP是流式协议:TCP不关心你上层应用的消息边界,它只负责把数据看作一股连续的字节流,可靠地传输。为了效率,它会把多个小的数据包合并成一个大的数据段发送(粘包),也可能把一个大的数据包拆分成多个小段发送(拆包)。
- 根本原因:发送端和接收端的缓冲区机制,以及TCP的流量控制(滑动窗口)策略,导致了数据边界在传输层消失。
实战应用:
- **为什么UDP不会粘包?** 因为UDP是面向数据报的,每个UDP包都有明确的边界,一个包就是一个完整的消息,要么完整收到,要么整个丢掉。
- 如何解决 :应用层必须自己定义消息边界。常见方法有三种:
- 固定长度:每个消息都是100字节,不够就补空格。
- 特殊分隔符 :每个消息末尾加上一个特殊符号,如换行符
\n。 - 消息头+消息体:在消息最前面加一个固定长度的头部,用来指明后面消息体的长度。这是最通用的做法,HTTP协议就是这么干的。
3. ICMP协议与网络诊断工具(Ping/Traceroute)
实战场景:你访问一个网站发现特别慢,或者根本打不开。你第一反应是"ping一下",这个操作背后就是ICMP协议在工作。
原理是什么:
- **ICMP(互联网控制报文协议)** 是IP协议的"助手",用来传递网络诊断和控制信息,比如错误报告、拥塞通知等。它不是一个用来传输用户数据的协议。
- Ping的工作原理:向目标主机发送一个ICMP"回显请求"报文,目标主机收到后,必须回复一个ICMP"回显应答"报文。通过计算往返时间(RTT),就能判断网络连通性和延迟。
- Traceroute的工作原理 :它巧妙地利用了IP包头的**TTL(生存时间)** 字段。它先发送一个TTL=1的数据包,经过第一个路由器时,TTL减为0,路由器会丢弃这个包并返回一个ICMP"超时"错误报文,这样你就知道了第一个路由器的IP。接着发送TTL=2的包,以此类推,就能逐跳追踪出到达目标主机所经过的所有路由器。
实战应用:
- **Ping不通就是网络不通吗?** 不一定。很多服务器或防火墙为了安全,会禁止响应ICMP回显请求,所以你Ping不通,但可能能正常访问它的网页(HTTP服务)。Ping不通只能说明ICMP协议不通,不代表网络完全断开。
- 如何看懂Traceroute :如果你看到某一跳的延迟突然急剧增大,或者出现
* * *请求超时,那么这一跳的路由器很可能就是网络瓶颈或故障点。
4. DNS的"隐秘"工作与劫持
实战场景 :你明明输入的是 www.baidu.com,但打开的却是一个满是广告的网页,甚至提示你"网站有风险"。这很可能是DNS被劫持了。
原理是什么:
- DNS(域名系统) 是互联网的"电话簿",负责把人类容易记忆的域名(如
www.example.com)翻译成计算机能理解的IP地址(如93.184.216.34)。 - 查询过程是分级递归的:你的电脑先问本地DNS服务器,如果它不知道,就替你去问根DNS服务器,然后一级级向下查询,直到找到最终的IP地址。
实战应用:
- DNS劫持:攻击者通过篡改你电脑的DNS服务器地址,或者直接攻击DNS服务器,让你在查询某个域名时,返回一个错误的、被攻击者控制的钓鱼网站IP。这样你虽然输入了正确的网址,却神不知鬼不觉地进入了假网站。
- 如何排查 :你可以用
nslookup命令手动指定一个公认可靠的DNS服务器(如nslookup www.baidu.com 8.8.8.8)去查询,如果返回的IP和你当前电脑自动获取的DNS返回的IP不一样,那基本可以断定你的DNS被劫持了。
这些原理,每一个都直接对应一个你未来可能遇到的网络故障或安全漏洞。最好的学习方式,就是像你之前做的那样,在虚拟机里搭建环境,用Wireshark抓包,亲眼看看ARP请求的广播、TCP三次握手的过程、ICMP的报文结构,这样你对网络的理解就会从"知道"变成"精通"。
ICMP的定义
ICMP 协议的数据本身并不传输用户的实际内容(比如网页或文件),它传递的是控制信息和网络诊断数据。你可以把它想象成网络世界里的"运维小纸条"。
ICMP 报文被封装在 IP 数据包里面,它本身的结构分为头部 和数据体两部分,但所有 ICMP 报文的前 4 个字节都是固定的:
**1. 通用头部结构(所有报文都有)**
- **类型(Type)**:占 8 位,决定这是什么类型的纸条(比如是询问还是报错)。
- **代码(Code)**:占 8 位,对类型的进一步细化。
- **校验和(Checksum)**:占 16 位,用来检查数据在传输中是否出错。
**2. 剩下的部分(根据类型不同,长相不同)**
接下来的 4 个字节以及后面的数据,会根据"类型"和"代码"发生变化。最常见的两种长相是:
长相一:查询报文(以 Ping 为例)
当你使用 ping 命令时,数据长这样:
- 类型 :
8(表示请求) 或0(表示应答) - 代码 :
0 - **标识符(Identifier)**:占 16 位,通常是你电脑上 Ping 程序的进程 ID,用来区分是哪个窗口发出的请求。
- **序列号(Sequence Number)**:占 16 位,每发一个包就加 1,用来判断有没有丢包。
- **可选数据(Data)**:跟在最后面。这部分就是 Ping 命令里常看到的"填充数据"。它通常包含发送时的时间戳,以及一串用来凑够长度的任意字符(比如一串连续的字母)。
长相二:差错报文(以"目标不可达"为例)
当路由器告诉你"这个地址不通"时,数据长这样:
- 类型 :
3 - 代码 :变化很大,用来告诉你具体原因(比如
0是网络不通,1是主机不通,3是端口没开)。 - 未使用:接下来的 4 个字节全是 0。
- 数据体 :这部分非常关键,它包含了导致错误的那份原始 IP 数据包的头部,以及原始数据包内容的前 8 个字节。这样你的电脑收到后,就能知道是哪个程序发的请求出了问题。
**总结一下它的"长相"特点:**
- 没有端口号:它不像 TCP 或 UDP 那样有端口,它直接通过 IP 地址通信,靠"标识符"来区分不同的程序。
- 简短精悍:它的目的就是快速传递状态,所以结构很紧凑。
- 内核处理:大部分 ICMP 报文都是操作系统内核自动生成和回复的,不需要你手动开启一个服务去监听。
ICMP的生成
ICMP 报文确实是在网络层生成的。
具体来说,生成它的主体不是某个独立的应用程序,而是操作系统内核中的 IP 协议栈。当需要发送控制消息时,内核会直接在网络层构造一个 ICMP 报文,然后把它封装在一个 IP 数据报里,再向下传递给数据链路层和物理层发送出去。
ICMP 报文分为两大类,生成方式也略有不同:
-
查询报文 :由主机或路由器主动生成。比如你执行
ping命令时,操作系统内核会在网络层构造一个"回显请求"报文,发给目标主机。目标主机的内核收到后,同样在网络层生成一个"回显应答"报文返回。 -
差错报告报文:由路由器或目标主机的内核被动生成。当 IP 数据报在传输过程中遇到问题(比如 TTL 减到 0、端口不可达、需要分片但 DF 标志置位等),发现问题的设备会丢弃原数据报,然后在网络层生成一个 ICMP 差错报文,把原数据报的首部和前 8 个字节数据附在后面,发回给源主机。
所以,ICMP 的生成、封装和解析,全程都在网络层完成,它不经过传输层,也不依赖 TCP 或 UDP。
PING内网IP的过程
这个过程可以看作你的电脑在局域网里,通过"IP 地址"找到另一台电脑"物理地址"的过程。它并非"跳过"了网络层,而是网络层和数据链路层精密协作的结果。
整个过程大致分为以下几个步骤:
第一步:网络层判断,是否在同一网段
当你输入 ping 192.168.1.5 并回车后,你的电脑做的第一件事,是在网络层 用自身的 IP 地址和子网掩码进行计算,判断目标 IP 192.168.1.5 是否和自己处于同一个子网。
- 如果判断为同一网段:电脑就知道,目标就在本地局域网内,不需要把数据包发给默认网关(路由器)去转发,可以直接在本地寻找。
- 如果判断为不同网段:电脑就会把数据包发给路由器处理,那就不属于我们这次讨论的"Ping 内网"了。
第二步:ARP 协议登场,寻找 MAC 地址
确认目标在同一网段后,通信需要知道对方的物理地址(MAC 地址),但电脑目前只知道对方的 IP 地址。这时,ARP 协议就开始工作了。
- 检查 ARP 缓存表 :电脑会先在自己的 ARP 缓存表里查找,看有没有
192.168.1.5对应的 MAC 地址记录。如果有,就直接用,跳过后续的广播步骤。 - 发送 ARP 请求(广播) :如果缓存里没有,电脑就会在局域网内发送一个 ARP 请求报文。这个报文是以广播形式发出的,意思是局域网内所有设备都会收到。它的大致内容是:"我的 IP 是 X.X.X.X,MAC 地址是 A。谁是 192.168.1.5?请告诉我你的 MAC 地址。"
- 目标主机回应(单播) :局域网内所有设备都会收到这个广播请求,但只有 IP 地址为
192.168.1.5的那台设备会处理并回应。它会单播一个 ARP 响应报文 给源主机,内容是:"我就是 192.168.1.5,我的 MAC 地址是 B。" - 更新 ARP 缓存 :你的电脑收到这个响应后,会把
192.168.1.5和 MAC 地址B的对应关系记在自己的 ARP 缓存表里,下次通信就不用再问了。
第三步:ICMP 报文封装与发送
现在,你的电脑已经知道了目标主机的 MAC 地址,就可以正式构造 Ping 的探测报文了。
- 构造 ICMP 回显请求 :Ping 程序会创建一个 ICMP Echo Request(类型 8)报文,这是网络层的控制消息。
- 层层封装 :
- 网络层封装 :这个 ICMP 报文会被封装在一个 IP 数据包里,源 IP 是你自己,目的 IP 是
192.168.1.5。 - 数据链路层封装 :这个 IP 数据包再被封装成一个数据帧。在这个帧的头部,源 MAC 地址是你电脑的,目的 MAC 地址就是刚刚通过 ARP 获取到的
B。
- 网络层封装 :这个 ICMP 报文会被封装在一个 IP 数据包里,源 IP 是你自己,目的 IP 是
- 物理层发送:这个封装好的数据帧最终通过网卡,以比特流的形式发送到网线上。
第四步:交换机精准转发
数据帧到达交换机后,交换机在数据链路层工作。它会检查数据帧头部的"目的 MAC 地址",然后在自己的 MAC 地址表里查找这个地址对应哪个端口。找到后,就把数据帧从连接着目标主机的那个端口精准地转发出去,而不是像集线器那样对所有端口广播。
第五步:目标主机接收与回复
- 解封装与确认:目标主机收到数据帧后,会从数据链路层开始,一层层解封装,发现目的 MAC 和目的 IP 都是自己,并且内部是一个 ICMP 回显请求。
- 构造并发送 ICMP 回显应答 :目标主机会立即构造一个 ICMP Echo Reply(类型 0)报文,并按照同样的封装流程,将应答报文发回给源主机。因为之前源主机请求过它的 MAC 地址,所以目标主机的 ARP 缓存里通常已经有了源主机的 MAC 地址,可以直接发送,无需再次 ARP 广播。
第六步:源主机收到应答,计算延迟
你的电脑收到这个 ICMP 回显应答后,Ping 程序会记录下当前时间,并与发送请求时记录的时间进行对比,计算出往返时间(RTT),也就是我们看到的延迟。如果在规定时间内没收到应答,就会显示"请求超时"。
**总结一下这个协作过程:**
- **网络层(IP/ICMP)**:负责逻辑寻址和判断,创建和解析控制报文,确保数据包能定位到正确的网络和主机。
- **数据链路层(ARP/交换机)**:负责物理寻址,将网络层的 IP 地址解析为网卡能识别的 MAC 地址,并在局域网内实现精准的帧转发。
所以,Ping 内网 IP 的过程,是网络层与数据链路层一次完美的接力,缺一不可。
Ping的过程
物理层是最底层去发送的是吗?所以ping是在物理层去ping的是吗
物理层确实是最底层,但它只负责"发送",不负责"Ping"。
你的问题可以拆成两部分来看,这样会更清晰:
1. 物理层是最底层去发送的吗?
是的,完全正确。物理层是OSI七层模型的最底层,它负责将数据转换成电信号、光信号等比特流,在网线、光纤这些物理介质上进行传输。它不关心数据内容,只负责把0和1送出去。
2. Ping是在物理层去Ping的吗?
不是的。Ping是一个完整的网络诊断过程,它从高层发起,最终由物理层发送,但物理层本身并不知道自己在"Ping"。
打个比方,就像你寄一封信:
- Ping程序 是你,决定写信并检查对方是否收到。
- 网络层/ICMP协议 是信的内容和格式,规定了这是一封"问候信"还是"回执"。
- 物理层 是邮局的卡车和飞机,只负责把信运走,完全不看信里写了什么。
所以,Ping的过程是应用层发起,网络层构造,数据链路层封装,最终由物理层发送。物理层是执行的最后一环,但Ping这个动作的"大脑"和"灵魂"都在上面的网络层。
ping外网
如果是ping外网,是先经过路由器到达后,在通过链路层的交换机到具体的某个地址吗
你的理解方向是对的,但顺序上需要稍微调整一下。Ping 外网时,数据包在局域网内是先经过交换机,然后才到达路由器,再由路由器转发出去。
整个过程可以这样理解:
第一步:判断目标不在同一网段
你的电脑在发出 Ping 请求前,会先在网络层用自己的子网掩码和目的 IP 做一次计算,发现目标 IP(比如 8.8.8.8)和自己不在同一个网段。这时它就知道,这个数据包不能直接在局域网里靠 MAC 地址找到,必须交给默认网关(也就是路由器)去处理。
第二步:通过交换机找到路由器
虽然目标是外网 IP,但数据包在局域网内的第一站,必须是路由器。你的电脑会查看自己的 ARP 缓存表,找默认网关 IP 对应的 MAC 地址。如果找不到,就发一个 ARP 广播请求,问"网关的 MAC 地址是什么?"。路由器收到后,会单播回复自己的 MAC 地址。拿到网关 MAC 地址后,你的电脑就把数据包封装成数据帧,目的 MAC 填路由器的 MAC,然后通过交换机转发给路由器。这一步,交换机在数据链路层根据 MAC 地址表,把数据帧从连接路由器的那个端口精准地送出去。
第三步:路由器转发到外网
路由器收到数据帧后,会拆掉数据链路层的帧头帧尾,看到里面的 IP 数据包,发现目的 IP 是外网地址。于是它就在自己的路由表里查找,决定从哪个接口转发出去,发给下一跳路由器。这个过程中,数据包的源 IP 和目的 IP 始终不变,但每经过一跳路由器,数据帧的源 MAC 和目的 MAC 都会被重新封装。
第四步:外网主机回复
当数据包最终到达目标服务器后,对方会生成一个 ICMP 回显应答报文,按照原路返回。回来的路径同样是一跳一跳地经过多个路由器,最终回到你的路由器,再由路由器通过交换机送到你的电脑。
所以,总结一下顺序:你的电脑 → 交换机 → 路由器 → 外网。交换机在局域网内负责把数据包送到路由器,路由器则负责把数据包送出局域网,跨越多个网络到达最终目的地。
ARP 协议是哪层
关于 ARP 协议到底属于哪一层,其实一直存在两种说法,这取决于你参考的是哪个网络模型。
**在 OSI 七层模型中,ARP 通常被归为数据链路层。**
因为 ARP 的工作内容------广播请求、获取 MAC 地址、维护 MAC 地址表------这些操作都发生在本地链路上,处理的是数据链路层的物理地址。它不关心 IP 数据包如何跨越多个网络,只解决同一个网络内部的"最后一跳"问题。从实际操作层面看,它属于第二层。
**在 TCP/IP 四层模型中,ARP 通常被归为网络层(也称网际层或互联层)。**
因为在这个模型里,ARP 协议存在的唯一目的,就是为 IP 协议服务,负责把 IP 地址解析成 MAC 地址。没有它,IP 数据包就无法在本地链路上完成最后的封装和发送。所以,从功能定位和逻辑关系上看,它被看作是网络层的一个辅助协议,和 IP、ICMP 等协议放在一起。
**总结一下:**
- 说它是数据链路层 ,是看它在哪儿工作、干的是什么活(在本地链路,处理 MAC 地址)。
- 说它是网络层 ,是看它为谁服务(为 IP 协议服务)。
这两种说法都没有错,只是视角不同。在学习和考试中,关键要看题目是基于哪个模型来提问的。