学网络最大的障碍是概念太多、层次不清。其实 TCP/IP 协议栈的设计初衷很朴素:把「把数据从 A 进程送到 B 进程」这件复杂的事,拆成四层,每层只解决一个问题。本文跟着一个 HTTP 请求走完全程,看每层都做了什么。
四层各管一件事
| 层 | 解决的问题 | 关键概念 | 常见协议 |
|---|---|---|---|
| 应用层 | 数据的内容是什么 | 请求/响应、域名 | HTTP、DNS、SSH |
| 传输层 | 交给本机哪个进程、要不要可靠 | 端口、连接 | TCP、UDP |
| 网际层 | 送到哪台主机 | IP 地址、路由 | IP、ICMP |
| 网络接口层 | 怎么在物理链路上传 | MAC 地址、帧 | Ethernet、Wi-Fi |
类比寄快递:你写的信是应用层内容;信封上写「某公司前台转张三」相当于传输层指定接收人(端口);收件地址的城市街道是网际层负责的跨网络寻址;而快递车在高速上一站站转运,是网络接口层的事。
一次发送的封装过程
假设浏览器访问 http://192.168.1.20:8080/hello:
- 应用层生成报文:
GET /hello HTTP/1.1\r\nHost: ...。 - 传输层在前面加上 TCP 首部:源端口 50000(系统随机分配)、目标端口 8080、序号等。这段数据叫 TCP 段(segment)。
- 网际层再加 IP 首部:源 IP 192.168.1.10、目标 IP 192.168.1.20。这叫 IP 数据报(packet)。
- 网络接口层加以太网首部和尾部:源 MAC、下一跳的 MAC。这叫帧(frame),最终变成电信号/无线电波发出去。
每层都把上一层的整体当作「数据」原样打包,自己只关心自己加的首部——这就是封装。
途中的两台设备,两种视野
数据包从你的电脑到服务器,会经过交换机和路由器:
- 交换机(二层)只看以太网首部的 MAC 地址,决定从哪个端口转发,不关心 IP。
- 路由器(三层)剥掉旧的以太网首部,看 IP 首部里的目标地址,查路由表选择下一跳,再套上新的以太网首部转发。
所以 MAC 地址每过一台路由器就换一次(只负责「本段链路内的下一跳」),而 IP 地址全程不变(负责「最终目的地」)。这正回答了「有了 IP 为什么还要 MAC」:IP 是端到端的全局寻址,MAC 是逐跳的局部交付。
到达之后的解封装
服务器网卡收到帧,逐级向上:
- 以太网层校验帧完整,剥掉首尾,上交给 IP 层;
- IP 层检查目标 IP 是自己,剥掉 IP 首部,按协议号(6=TCP)交给传输层;
- TCP 层按目标端口找到监听 8080 的进程,把数据放进它的接收缓冲区;
- 应用(比如 Nginx)读出 HTTP 报文,解析并生成响应,再沿相反方向封装回去。
发送方的「封装」和接收方的「解封装」完全对称。同层之间仿佛在直接对话——TCP 不知道自己经过了几个路由器,HTTP 也不知道下面是 TCP 还是别的什么,这正是分层带来的解耦。
三种「地址」不要再混淆
| 地址 | 长度 | 作用范围 | 类比 |
|---|---|---|---|
| MAC | 48 bit | 同一段链路/局域网 | 快递员手上这一站的交接对象 |
| IP | 32 bit(v4)/128 bit(v6) | 跨网络端到端 | 快递单上的收件地址 |
| 端口 | 16 bit | 主机内部区分进程 | 收件地址里的「转交某部门」 |
完整标识一条连接的是五元组:协议 + 源 IP + 源端口 + 目标 IP + 目标端口。这就是为什么同一台服务器能同时承载成千上万个 TCP 连接而不混乱。
为什么值得学分层
分层模型不是考试知识点,而是排障的决策树:能 ping 通但打不开网页,说明三层以下通、问题在四层以上;curl 返回 403,说明 TCP 都正常,问题在应用层。后续文章讲的抓包、DNS 排查,都是把这一模型落到具体工具上。
延伸阅读
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
最后更新于 ,距今已过 36 天
部分内容可能已过时