TCP/IP 协议是什么?四层模型、OSI 对照与各层协议
TCP/IP 协议不是一个协议,而是互联网通信所用的一整套协议,因其中最核心的 TCP 和 IP 而得名。它把通信分成链路层、网络层、传输层、应用层四层,每层只管一件事:链路层在同一网段内送帧,网络层按 IP 地址跨网段选路,传输层按端口把数据交给程序,应用层规定 HTTP、DNS 这类具体业务的格式。
TCP/IP 协议是互联网以及几乎所有企业网、机房网络使用的协议簇(也叫协议族、协议套件),名字取自其中最核心的两个协议:负责寻址和选路的 IP(Internet Protocol,网际协议),以及负责可靠传输的 TCP(Transmission Control Protocol,传输控制协议)。除了这两个,它还包括 UDP、ICMP、ARP、DNS、HTTP 等大量协议。RFC 1122 把它们按功能分成四层:链路层、网络层(也叫网际层)、传输层、应用层。操作系统内核里实现这套协议的部分,就是常说的 TCP/IP 协议栈。弄清分层的实际用处在于排障:每一层只依赖它下面那一层,故障落在哪一层,就用那一层的工具去查。
TCP/IP 四层模型:每层负责什么
| 层 | 负责什么 | 数据单位 | 用什么寻址 | 典型协议 |
|---|---|---|---|---|
| 应用层 | 规定具体业务的数据格式和交互规则 | 消息(报文) | 域名、URL | HTTP、DNS、SSH、SMTP、SNMP |
| 传输层 | 在两台主机的程序之间传数据,区分交给哪个程序 | 段(TCP)、数据报(UDP) | 端口号 | TCP、UDP |
| 网络层 | 跨网段把包从源主机送到目的主机,逐跳选路 | 包(分组) | IP 地址 | IPv4、IPv6、ICMP |
| 链路层 | 在同一个物理网段或 VLAN 内,把帧送到下一跳设备 | 帧 | MAC 地址 | 以太网、ARP、802.1Q VLAN |
四层的分工可以这样理解:
- 链路层只管“一跳”。一个以太网帧从服务器发出,只能送到同一网段里的下一个设备:要么是同网段的目标主机,要么是默认网关。跨网段时,每经过一台路由器,帧都会被拆掉再重新封装,源 MAC 和目的 MAC 每一跳都在变。
- 网络层管“端到端”。IP 包头里的源、目的地址从发出到收到一般保持不变(经过 NAT 时除外)。路由器根据目的地址查路由表决定下一跳,每转发一次把 TTL 减 1,减到 0 就丢弃,以免包在环路里无限打转。
- 传输层管“交给哪个程序”。IP 只负责把包送到主机,主机上同时跑着 Web、SSH、数据库等程序,要靠目的端口区分。TCP 在这一层提供连接、确认、重传和按序交付;UDP 只做端口区分和校验,其余交给应用。
- 应用层管“说什么”。HTTP 规定请求行和头部怎么写,DNS 规定查询和应答的格式。它们把可靠传输交给下层,只关心业务本身。
TCP/IP 四层和 OSI 七层怎么对应
OSI 七层模型是国际标准化组织(ISO)制定的参考模型,概念划分细致,但它配套的协议没有普及;TCP/IP 则是实际运行的协议簇。两者的对应关系如下,教材里常见的五层模型也一并列出:
| OSI 七层 | 编号 | TCP/IP 四层 | 五层教学模型 |
|---|---|---|---|
| 应用层 | 7 | 应用层 | 应用层 |
| 表示层 | 6 | 应用层 | 应用层 |
| 会话层 | 5 | 应用层 | 应用层 |
| 传输层 | 4 | 传输层 | 传输层 |
| 网络层 | 3 | 网络层 | 网络层 |
| 数据链路层 | 2 | 链路层 | 数据链路层 |
| 物理层 | 1 | 链路层 | 物理层 |
机房里有一个常让新人困惑的地方:协议按 TCP/IP 分组,口头说法却用 OSI 的编号。“二层交换机”“二层不通”说的是数据链路层;“三层交换机”“三层接口”说的是网络层;“四层负载均衡”按 IP 和端口转发,“七层负载均衡”能识别 HTTP 的域名和 URL;“七层攻击”就是应用层攻击。OSI 的第 5、6 层在 TCP/IP 里没有对应的独立协议,会话保持、编码和加密由应用自己或 TLS 完成。
各层常见协议对照表
| 层 | 协议 | 下层靠什么识别它 | 说明 |
|---|---|---|---|
| 应用层 | HTTP / HTTPS | TCP 80 / 443 | HTTP/3 改走 UDP 443 上的 QUIC |
| 应用层 | DNS | UDP 53、TCP 53 | 域名解析 |
| 应用层 | SSH | TCP 22 | 远程登录、SFTP |
| 应用层 | DHCP | UDP 67 / 68 | 自动分配地址、网关和 DNS |
| 应用层 | SNMP | UDP 161 / 162 | 设备监控与告警 |
| 应用层 | BGP | TCP 179 | 虽然是路由协议,但跑在 TCP 之上,按封装位置算应用层 |
| 传输层 | TCP | IP 协议号 6 | 面向连接、可靠、按序 |
| 传输层 | UDP | IP 协议号 17 | 无连接、开销小 |
| 网络层 | IPv4 / IPv6 | 以太网类型 0x0800 / 0x86DD | 寻址和逐跳转发 |
| 网络层 | ICMP / ICMPv6 | IP 协议号 1 / 58 | ping、traceroute 和差错报告;ICMPv6 还承担邻居发现 |
| 网络层 | OSPF | IP 协议号 89 | 直接封装在 IP 里,不经过 TCP 或 UDP |
| 网络层 | IPsec(ESP / AH) | IP 协议号 50 / 51 | VPN 加密与认证 |
| 链路层 | ARP | 以太网类型 0x0806 | 由 IP 地址查 MAC 地址;也有教材把它划到网络层 |
| 链路层 | 以太网(IEEE 802.3) | — | 帧格式与 MAC 地址 |
| 链路层 | 802.1Q VLAN | 以太网类型 0x8100 | 在帧里插入 4 字节的 VLAN 标签 |
| 链路层 | LACP | 以太网类型 0x8809 | 链路聚合协商 |
“下层靠什么识别它”这一列,正是协议栈把数据一层层往上交的依据:网卡收到帧,看以太网类型字段,0x0800 交给 IPv4,0x0806 交给 ARP;IP 层看协议号,6 交给 TCP,17 交给 UDP,1 交给 ICMP;TCP 和 UDP 再看目的端口,交给监听该端口的进程。防火墙规则里的 -p tcp --dport 443、交换机 ACL 里的 permit tcp ... eq 443,匹配的就是这几个字段。
网线、交换机、路由器、防火墙各工作在哪层
说一台设备“工作在第几层”,意思是它最多解析到第几层的包头,并据此做转发决定。
| 设备 | OSI 层 | 依据什么转发或处理 | 机房里常见的问题 |
|---|---|---|---|
| 网线、光纤、光模块、配线架 | 1 物理层 | 只传比特,不看内容 | 线缆损坏、光功率不足、速率或双工协商异常 |
| 网卡 | 1–2 | 收发帧,过滤掉目的 MAC 不是自己的帧 | 驱动、协商速率、bond 配置 |
| 二层交换机 | 2 数据链路层 | MAC 地址表和 VLAN | VLAN 配错、环路、MAC 漂移 |
| 三层交换机 | 2–3 | 同 VLAN 内按 MAC 转发,VLAN 之间按路由表转发 | 网关接口未启用、缺路由 |
| 路由器 | 3 网络层 | 路由表、NAT | 回程路由缺失、NAT 规则写错 |
| 状态检测防火墙、ACL | 3–4 | IP 地址、协议号、端口、连接状态 | 漏放回程、会话表打满 |
| 四层负载均衡(如 LVS) | 4 | IP 加端口 | 后端健康检查、会话保持 |
| 七层负载均衡、WAF、反向代理 | 7 | HTTP 的域名、URL、头部 | 证书、超时、正常请求被误拦 |
| 服务器操作系统 | 1–7 | 完整协议栈 | 任一层都可能出问题 |
分清设备的层次,能少走很多弯路。二层交换机不看 IP:同一 VLAN 里两台服务器配了不同网段的地址,交换机照样转发它们之间的帧,但两台主机的协议栈都会认为对方不在本网段,把包发给网关去绕路。路由器转发时只看目的 IP,不看端口:某个端口被拦了,要去防火墙、ACL 或服务器上查,查路由表找不到原因。
一次 HTTP 请求的封装过程
假设一台服务器 198.51.100.23(网关 198.51.100.1)执行 curl http://www.example.com/,从发出到对端收到要经过下面几步:
- 应用层:解析域名,生成请求。curl 先调用系统解析器查询
www.example.com,这次 DNS 查询本身也是一次完整的逐层封装(走 UDP 53)。拿到地址 203.0.113.10 后生成 HTTP 请求,内容大约 78 字节:
GET / HTTP/1.1
Host: www.example.com
User-Agent: curl/8.5.0
Accept: */*
- 传输层:建立 TCP 连接,加 TCP 头。先完成三次握手(SYN、SYN-ACK、ACK),再把这 78 字节作为数据装进 TCP 段。源端口由系统从临时端口范围里挑一个,例如 51324;目的端口是 80;此外还有序号、确认号、窗口等字段。TCP 头最少 20 字节;Linux 默认启用时间戳选项,对端也支持时,数据段的 TCP 头是 32 字节。
- 网络层:加 IP 头。源地址 198.51.100.23,目的地址 203.0.113.10,协议号 6 表示里面是 TCP,TTL 的初始值 Linux 默认是 64。IPv4 头 20 字节。
- 链路层:查路由、做 ARP、加以太网头。系统查路由表,发现 203.0.113.10 不在本网段,下一跳是默认网关 198.51.100.1;到 ARP 表里找网关的 MAC,找不到就先广播一次 ARP 请求。然后加上 14 字节的以太网头和 4 字节的帧校验序列(FCS)。注意这里的目的 MAC 是网关的,不是 Web 服务器的。
- 物理层:转成电信号或光信号发出。
每一层加了多少字节:
| 层 | 加上的部分 | 字节 | 累计 |
|---|---|---|---|
| 应用层 | HTTP 请求 | 78 | 78 |
| 传输层 | TCP 头(含时间戳选项) | 32 | 110 |
| 网络层 | IPv4 头 | 20 | 130 |
| 链路层 | 以太网头 14 + FCS 4 | 18 | 148 |
路上的每台路由器收到帧后,校验 FCS、剥掉以太网头,读 IP 头查路由表,把 TTL 减 1,再按出接口的链路类型重新加上新的帧头交给下一跳。全程 IP 地址不变,MAC 地址每跳都换。Web 服务器收到后反向拆包:以太网类型 0x0800 交给 IPv4,协议号 6 交给 TCP,目的端口 80 交给 Nginx 这样的 Web 进程。
抓包能直接看到这几层。-e 显示链路层头部,-nn 不把地址和端口翻译成名字:
tcpdump -i eth0 -e -nn host 203.0.113.10 and tcp port 80
建立连接的第一个包大致如下:
10:15:02.183412 52:54:00:aa:bb:01 > 00:1a:2b:3c:4d:5e, ethertype IPv4 (0x0800), length 74: 198.51.100.23.51324 > 203.0.113.10.80: Flags [S], seq 1938204312, win 64240, options [mss 1460,sackOK,TS val 3012 ecr 0,nop,wscale 7], length 0
从左往右读:两个 MAC 和 ethertype IPv4 属于链路层;两个 IP 地址属于网络层;.51324、.80 和 Flags [S] 属于传输层;末尾的 length 0 表示这个 SYN 包还没有携带应用层数据。前面的 length 74 是整帧长度(不含 FCS):14 字节以太网头、20 字节 IP 头和 40 字节 TCP 头,握手包带着 MSS、窗口缩放等选项,所以 TCP 头比数据包更长。
用分层思路定位故障:从下往上查
排障时从下往上,每层用一条命令得出“通”或“不通”的结论再往上走。反过来也成立:上层已经正常,下面各层一定没问题,例如能 ping 通外网的某个 IP,就可以直接从传输层查起。
| 层 | 典型现象 | 检查命令 | 怎么判断 |
|---|---|---|---|
| 物理层 | 网口灯不亮,或速率只有 100 Mb/s | ethtool eth0 |
Link detected: no 表示没有链路;Speed 低于端口速率是协商问题;ethtool -S eth0 里 CRC 类错误持续增长,多为线缆或光模块故障 |
| 链路层 | 同网段的网关 ping 不通 | ip neigh show |
网关那一行是 FAILED 或 INCOMPLETE,说明 ARP 没有应答:VLAN 配错、交换机端口被关闭或做了 MAC 绑定 |
| 网络层 | 网关能通,外网 IP 不通 | ip route、traceroute -n 203.0.113.10、mtr -n 203.0.113.10 |
没有默认路由,或者从某一跳开始往后全是 * * *(中间个别跳不回应是正常的) |
| 传输层 | ping 得通,端口连不上 | 客户端 nc -zv 203.0.113.10 443,服务器 ss -tlnp |
立即报 refused 多是没有程序监听,或防火墙设置了拒绝;一直等到超时多是防火墙丢弃 |
| 应用层 | 端口能通,页面报错或域名打不开 | curl -v http://www.example.com/、dig www.example.com |
看 HTTP 状态码、证书报错和域名解析结果 |
链路层的问题,交换机一侧也要对着查:华为、新华三用 display mac-address 和 display arp,思科用 show mac address-table 和 show ip arp,确认服务器的 MAC 是否出现在预期的端口和 VLAN 里。
有些故障跨在两层之间,单看一层会误判:
- 小包通、大包不通。ping 正常、SSH 能登录,但传大文件或打开内容多的页面时卡住。常见原因是路径上某段 MTU 变小(隧道封装、VLAN 嵌套),而通知发送方减小包长的 ICMP 消息又被防火墙过滤。症状出现在应用层,根因在网络层和链路层之间。
- IP 地址冲突。两台机器配了同一个 IP,网关 ARP 表里这个 IP 对应的 MAC 来回变化,表现为时通时断。在网关上连续查看 ARP 表,或者看设备日志里的 MAC 变更告警,就能找到冲突的那台。
- 单向通。去程路由正常、回程路由缺失,或者回程走了另一个出口被状态防火墙丢弃。表现是对端抓包能看到请求,本机却收不到应答,要在两端分别抓包对比。
在管理系统里怎么落地
按层排障时,敲命令往往不费时间,费时间的是找信息:这台服务器接在哪台交换机的哪个端口、在哪个 VLAN、IP 和网关是多少。Toplink DCIM 的交换机管理里,服务器列表里就能看到每台机器的上联交换机、端口号、端口速率与所属 VLAN;二层问题可以在网页上开关端口、修改 VLAN,也可以打开浏览器里的交换机终端执行 display、show 命令。IP 地址管理按段登记地址、网关和所在 VLAN,配合交换机侧的 ARP 绑定和源地址校验,把 IP 与服务器网卡 MAC、交换机端口锁定,减少地址冲突和盗用这类二三层交界处的故障。
常见问题
TCP/IP 四层模型和五层模型有什么区别?
五层模型是教材为了讲解方便,把四层模型的链路层拆成了物理层和数据链路层,其余三层不变。RFC 1122 定义的是四层;机房里口头说“二层”“三层”,用的则是 OSI 七层的编号。
三层交换机和路由器都工作在网络层,有什么区别?
三层交换机以以太网口为主,用硬件按路由表高速转发,适合在机房内部做 VLAN 之间的路由;路由器接口类型更多,NAT、VPN、策略路由等功能更完整,通常放在出口。具体能力以设备型号为准。
HTTPS 里的 TLS 属于哪一层?
TLS 运行在 TCP 之上、HTTP 之下。按 TCP/IP 四层模型归入应用层;对照 OSI 时,有的资料放在会话层,有的放在表示层,并无统一说法。理解封装时只要记住顺序:HTTP 数据先经 TLS 加密,再交给 TCP。