TCP/IP 四层网络模型和OSI 七层网络模型(详解版)
TCP/IP 网络模型(网络协议栈)
大家好,我是小北。
我们几乎每天都会频繁地使用网络,观看视频、使用微信、浏览网页等等。
然而,计算机之间是怎样建立网络连接的,这些数据又是如何在复杂的网络中进行传输的呢?
别说是普通用户了,就算是咱们程序员,也不一定能完全说清楚。
但是,不懂底层的网络通信,不妨碍我们直接使用网络,也可以用 Socket 进行网络编程。
现在依然记得,大一学习 Java 的时候,用到了Socket 编程,那时候还没有学到计算机网络这门课,但是一点不耽误直接调 Java Socket API,进行 TCP/UDP 连接建立、收发包等操作。
这就是网络分层的作用,通过分层,我们可以只了解最上层,也能使用好整个网络。
OSI 七层网络模型
相信大家一定经常听说 七层负载均衡、四层负载均衡,以及三层路由器、三层交换机这些名字。
实际上这里这里所说的七层、三层、四层指的就是 OSI 网络模型。
所谓四层就是基于 IP + 端口的负载均衡,七层就是基于 URL 等应用层信息的负载均衡,同样的还有基于二层 MAC 地址,三层 IP 地址的负载均衡
而 OSI(Open System Interconnection,开放式通信互联) 是由 ISO(International Organization for Standardization,国际标准化组织) 制定的标准模型。
目的在于制定一种将世界各地的各种计算机互联的标准,这里网上有一张非常经典的图,几乎把我们见过的没见过的协议都包含了:

这张图就更加形象具体了,每一层都有对应的网络设备:

从上到下分别是:
- 应用层,就是指特定的应用层协议,比如 HTTP、远程文件协议 FTP、邮件协议POP3、远程登录协议 SSH 等
- 表示层,负责数据处理转换:包含数据格式、编码解码、加密解密等
- 会话层,负责建立和维护不同主机之间的通信连接
- 传输层,主机进程之间的数据传输服务,注意,这里的进程间实际就是指传输层需要端口号来识别进程
- 网络层, 主机端到端的路由和寻址(这一层寻址是依靠 IP 地址)
- 数据链路层,负责管理相邻节点之间的数据通信:包括 数据封装成帧、MAC 寻址、流量控制、差错控制
- 物理层,数据通信的光电物理特性、时钟同步、传输比特流等
老实说,上面的会话层和表示层,我是愣想不到实际哪里有用到,难道不是一起都在应用层做完了么?
正是因为 OSI 模型过于庞大、复杂,且部分层的功能重复、划分不清,导致最终并未成为广泛使用的标准模型,反倒是 TCP/IP 四层网络模型成为了事实上的标准网络模型。
下面详细介绍下四层模型:
TCP/IP 四层模型
TCP/IP 四层协议栈是一个包含多种网络通信协议的集合,主要包括两个核心协议:TCP(传输控制协议)和 IP(网际协议)。
由于 TCP 和 IP 协议是最核心的两个协议,也是 TCP/IP 最早通过的两个标准协议,因此采用被称为 TCP/IP 协议栈。
TCP/IP 将网络通信抽象为四个层次,每个层次实现不同的通信协议,根据功能的不同,这些协议被分配到这四个层次中,可以视为是简化的七层 OSI 模型。
TCP/IP 四层模型如下图:
虽然 TCP/IP 协议和 OSI 模型并不能完全对应,但我们可以在 OSI 模型中找到 TCP/IP 的大致位置。
OSI 七层模型和 TCP/IP 四层协议与层级的区别(OSI vs TCP/IP)
OSI七层模型 | TCP/IP四层模型 | 代表协议 | 核心功能 |
---|---|---|---|
应用层 | 应用层 | HTTP/HTTPS、DNS、FTP、SMTP、SSH | 面向用户交互,应用程序间通信 |
表示层 | 应用层 | SSL/TLS、JPEG、ASCII、加密算法 | 数据格式转换、加密解密、压缩解压 |
会话层 | 应用层 | RPC、NetBIOS、Socket API | 建立/管理/终止会话连接 |
传输层 | 传输层 | TCP、UDP、SCTP | 端到端连接管理、流量控制、可靠性传输 |
网络层 | 网络层 | IP、ICMP、ARP、OSPF、BGP | 逻辑寻址、路由选择、跨网络数据传输 |
数据链路层 | 网络接口层 | Ethernet、PPP、MAC、VLAN、STP | 物理寻址、帧传输、错误检测、局域网数据交换 |
物理层 | 网络接口层 | RS-232、RJ45、光纤、无线电磁波 | 比特流传输、物理介质规范、电气信号转换 |
画个图来更直观一些:
从上图可以看出,OSI 模型的最上面三层(应用层、表示层和会话层)在 TCP/IP 中归为一个应用层;而数据链路层和物理层被归类为 网络接口层(Network Interface)。
完全符合我们的直觉,因为我始终没搞懂 OSI 区分那么多表示层、会话层有啥用,会话、加解密那些不都是应用层就干了么,分那么清楚反而会给应用层限制太死!
而这两者一致的就是网络层和 传输层,这也是计网里面对我们应用开发最需要关注的 2 层。
虽然 TCP/IP 协议栈是事实的标准,但是正如前面提到的七层负载、四层负载,还是以 OSI 模型来描述(可能这就是割裂吧。。。)
网络协议封装和解包

上图显示了一个数据包经由发送方、网络交换机、路由器,最终抵达接收方的过程。
可以看出,在进行网络传输时,数据包会按照 TCP/IP 协议栈,对上一层发来的数据进行逐层处理;然后加上该层的协议头,再发送给下一层。
这个过程就叫做封装(encapsulation)
数据会在交换机和路由器的协议栈上上下下,然后向上到达接收方主机的协议栈。
我们常说的三层路由器、二层交换机,指的就是他们各自能识别到哪一层的协议(头部信息),工作在这一层,即根据协议头的IP、端口、MAC地址等进行相应的转发、广播。
值得一提的是,计算机/服务器实现了 TCP/IP 协议栈所有层,而中间的交换机、路由器只需要实现到网络层、链路层即可。
相当于整个网络的复杂性放在了网络边缘实现。
TCP/IP 数据包封装示意图:
上图中 46~1500 怎么来的?
早期以太网使用共享链路,为保证 CSMA/CD 机制,规定以太帧长度最小为 64 字节,最大为 1518 字节。最小 64 字节是为保证极端冲突能被检测到,最大不超过 1518 字节是为防止过长帧占用共享链路时间过长导致阻塞。
以太网最大数据帧为 1518 字节,刨去帧头和帧尾,承载上层 IP 报文的地方最大为 1500 字节,即以太网默认 MTU 值。最少为 64-18=46。
接下来我们以一个 HTTP 请求发送为例(省略很多细节),自上而下简单说一下各层都在干什么。
应用层(Application Layer)
应用层位于网络模型顶端,直接与用户交互,提供网络应用服务。
这一层包含了我们日常使用的各种协议,如用于网页浏览的HTTP、文件传输的FTP、邮件服务的SMTP、域名解析的DNS以及远程登录的Telnet和SSH等,以及支付宝、微信等各种 APP 自定义的私有协议都属于这一层。
应用层协议三巨头:
- HTTP/HTTPS:网页浏览的基石(80/443端口)
- DNS:互联网的“电话簿”(53端口)
- SMTP/POP3:电子邮件的发件箱和收件箱(25/110端口)
应用层的主要职责是格式化信息,比如HTTP协议的报文结构(请求头/响应头 + Body),并确保通过传输层把数据发送出去。
应用层就像每个地方的菜鸟驿站一样,帮大家把包裹(要传输的数据),按照约定的格式封装好,然后发给各大快递公司。
应用层的数据包我们一般叫做 报文(Message)。
传输层 (Transport Layer)
传输层负责端到端的通信控制,主要包括两种传输协议:面向连接的TCP(传输控制协议)和无连接的UDP(用户数据报协议)。
TCP 提供可靠的数据传输,通过建立连接、序列号、重传、拥塞控制等机制确保数据的完整性和正确顺序;
而 UDP 则提供更快但不保证可靠性的数据传输方式。(无序、无连接)
为应用层提供了关键的服务质量保证。
传输层会在应用程序数据前面增加了 TCP/UDP 头部(源端口,目的端口),以及其它控制信息。
传输层的数据包我们一般叫做 段(Segment)。
TCP 通信的双方,会在通信开始互相协商一个最大分段大小(Maximum Segment Size),即 MSS。
MSS值通常为 MTU(链路层限制的单个数据包最大传输字节) 减去 IP 和 TCP 头部空间(各20字节),标准MSS值约为 536 字节。
UDP 则不会对上层数据包进行分片。
两者对比图如下:
网络层( Internet Layer)
实际上传输层并不真的负责数据“传输”,真正负责数据传送的是网络层 IP 协议。
网络层处理数据包的路由和转发,确定数据从源到目的地的最佳路径。
其核心协议是IP(互联网协议),负责为传输层数据包添加源 IP 地址和目标 IP 地址信息。
IP 层的数据包叫做包(Packet)。
网络层就是依靠 IP 地址来进行路由的,简单理解 IP 地址就像是我们的收货地址(具备层级和可定位性)。
此外,还包括 ICMP(互联网控制消息协议)用于网络诊断,我们常见的 ping 就是使用 icmp。
以及ARP(地址解析协议)和RARP(反向地址解析协议)用于IP地址与物理 MAC 地址之间的转换。
当传输层的数据包,再加上网络层的头部超过 MTU 时,IP 层就会把一个传输层数据包分片,分成几个数据包进行传输。
每个数据包都会包含完整的 IP 头部信息和自己所携带的那部分TCP包,那么分片后,是如何在接收方组装的呢?
简单来说是分片标识:
- 发送方在进行IP分片时,会给所有来自同一原始IP数据包的分片分配相同的"标识(Identification)"值
每个分片还携带了以下关键信息:
- 分片偏移量(Fragment Offset):表示该分片在原始数据包中的位置
- 更多分片(More Fragments)标志:除了最后一个分片外,所有分片的MF标志都设为1
- 分片本身的数据长度
依靠这些信息,接收方就能按正确的顺序还原原始的传输层数据包了。
但是需要注意,分片之后,可能部分包会丢掉,IP 层不会对丢包做任何的重传和保证,仅仅是尽力而为的交付,丢失的分片需由更高层(如TCP)负责重传。
我们上面说过 TCP 会主动根据 MSS 大小分片,所以大部分 TCP 数据包是不需要 IP 层分片的,主要是 UDP 的数据包需要 IP 层进行分片。
简而言之,TCP 在传输层根据 MSS 分段,UDP 则依赖网络层根据 MTU 进行 IP 分片,两者处理方式不同但都确保数据能够在网络中正确传输。
网络接口层 (Network Interface Layer)
作为最底层,网络接口层负责实际的物理连接和数据传输。
它定义了如何通过物理介质(如以太网、Wi-Fi、PPP 或 FDDI 等)发送和接收数据帧。
这一层处理硬件相关的通信细节,如信号调制、比特流传输和物理寻址等。
然后又在 IP 数据包前后分别增加了以太网头部和尾部控制信息(源MAC 地址,目的 MAC 地址)。
MAC 地址是网络设备的唯一标识符,由网络设备厂商分配,全球唯一(排除虚拟 MAC 地址外)。
在局域网内,定位设备就靠 MAC 地址,而网络层是 IP 地址,在网络层和网络接口层之间,通过 ARP 协议来实现 IP 地址查找 MAC 地址,关于 IP 地址、MAC 地址、ARP 后面会单独写文章来进行详细说明的。
数据链路层配置的最大传输单元(MTU,Maximum Transmission Unit)规定了最大的 IP 包大小。
在我们最常用的以太网中,MTU 默认值是 1500 字节(这也是 Linux 的默认值)。
这个MTU是网络层协议非常关心的地方,正如前文所说,网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片,如果单个IP报文长度大于MTU,则会在发送出接口前被分片,被切割为小于或等于MTU长度的IP包。
显然,MTU 越大,需要的分包也就越少,自然,网络吞吐能力就越好。
END
当接收方主机接收到数据包时,会按照与封包相反的顺序,从协议栈自下而上逐步进行解包操作:
- 先从数据链路层将数据包组装起来,并提取出 IP 层的数据包;
- 接着去掉 IP 层的头部,获取传输层的数据包;
- 最后再从传输层的数据包中取出应用层的数据。
最后,再来看一下这张TCP/IP 数据包封装示意图: