【计算机网络考研】P41: 传输层概述——端到端的通信服务
目录
博主智算菩萨,专注于人工智能、Python编程、音视频处理及UI窗体程序设计等方向。致力于以通俗易懂的方式拆解前沿技术,从零基础入门到高阶实战,陪伴开发者共同成长。目前已开设五大技术专栏,累计发布多篇原创技术文章,深受读者好评。
📌 专栏导航
- 人工智能前沿知识(已更191篇):深度剖析Transformer架构、生成式AI、强化学习、具身智能、神经符号系统、大模型及智能体(Agent)技术,系统性解析AI核心技术体系与前沿趋势。
- Python基础小白编程(已更232篇):从零开始,以保姆式教程讲解变量、数据类型、流程控制、函数等核心语法,配有大量实战代码与避坑指南,真正做到学以致用。
- 机器学习与深度学习(125篇):系统化拆解线性模型、决策树、随机森林、梯度提升树、神经网络等算法原理与工程实践,覆盖从公式推导到代码实现的全链路内容。
- 音频、图像与视频处理理论与实战(81篇):涵盖FFmpeg多媒体处理、audio_shop开源工具、ComfyUI-WanVideoWrapper视频生成等实用技术,从基础操作到高级应用一应俱全。
- UI窗体程序设计实战(78篇):深入讲解UI设计、动态窗体生成、游戏UI框架设计等实战技巧,提供从配置到编码的完整解决方案。
智算菩萨,以代码为经,以算法为纬,在人工智能的星辰大海中,做你前行路上最可靠的导航者。本人最常用AI工具为AIGCBAR。
考研导言:传输层是计算机网络体系结构中最为关键的层次之一,它是面向通信部分的最高层,同时也是用户功能中的最低层。如果说网络层负责的是"主机到主机"(Host-to-Host)的通信,那么传输层则负责"进程到进程"(Process-to-Process)的通信。在408考研中,传输层是历年大题和选择题的必考重点,尤其是TCP的可靠传输、流量控制和拥塞控制机制,几乎每年必考。本P将为你揭开传输层的神秘面纱,建立扎实的理论基础。
1. 传输层在OSI模型中的位置与使命
1.1 为什么需要传输层
想象你正在使用一台电脑同时做几件事:一边用微信和朋友聊天,一边用浏览器看网页,一边还在下载文件。这些应用程序都在同一时间通过网络收发数据。但是,当网络层把一个IP数据报送到你的电脑时,它只知道"这是给这台主机的",却不知道"这是给哪个应用程序的"。
传输层的使命就是解决这个问题:它负责将网络层交付的数据准确地送达到正确的应用程序进程,同时为应用进程提供可靠的通信服务。
用一个生动的比喻来说:网络层就像邮政系统,负责把包裹从一个城市运到另一个城市;而传输层就像小区里的快递员,负责把包裹送到具体的住户家门口。没有传输层,所有应用程序的数据就会"一团乱麻",根本无法区分。
1.2 传输层的核心地位
传输层位于OSI参考模型的第四层,处于网络层之上、会话层之下。它的特殊地位体现在:
| 层次 | 核心功能 | 通信范围 |
|---|---|---|
| 应用层 | 为用户应用程序提供服务 | 应用程序之间 |
| 传输层 | 端到端的可靠通信 | 进程之间 |
| 网络层 | 主机到主机的分组转发 | 主机之间 |
| 数据链路层 | 相邻节点间的帧传输 | 节点之间 |
| 物理层 | 比特流的透明传输 | 物理介质上 |
传输层是网络体系结构中的"分水岭":
- 向下:它利用网络层提供的"尽力而为"(Best-Effort)服务
- 向上:它为应用层提供"可靠"或"高效"的增强服务
考研重点:传输层是通信子网(下三层)和资源子网(上三层)的接口与桥梁。通信子网由运营商提供,资源子网由用户主机实现。传输层协议完全运行在端系统中,网络核心设备(路由器)只工作到网络层。
1.3 端到端通信的含义
端到端(End-to-End) 是传输层最核心的概念。它强调的是:
- 通信的真正端点是主机中的进程,而不是主机本身
- 传输层协议只在端系统(主机)上运行,不在中间路由器上运行
- 中间网络设备对传输层协议是透明的
图1:端到端通信示意图——传输层仅在端系统中运行
2. 传输层的四大核心功能
传输层为应用层提供两种截然不同的服务模式:面向连接的可靠服务(TCP)和无连接的不可靠服务(UDP)。但无论哪种模式,传输层都需要完成以下核心功能。
2.1 复用与分用:多应用共享网络连接
复用(Multiplexing) 和 分用(Demultiplexing) 是传输层最基本也是最重要的功能。
2.1.1 复用——多个应用共享一条通道
发送端的复用:主机上有多个应用进程(浏览器、微信、邮件客户端等),它们都需要发送数据。传输层收集所有这些应用进程的数据,分别加上端口号等首部信息,然后统一交给网络层发送出去。
类比:复用就像城市的污水处理厂,千家万户的污水(不同应用的数据)都汇集到一处,通过同一套管道系统(网络连接)输送出去。
2.1.2 分用——准确送达正确的应用
接收端的分用:当传输层从网络层收到数据时,它需要根据数据中的端口号,将数据准确地交付给对应的应用进程。
类比:分用就像快递分拣中心,所有到达的包裹(数据报)都贴有收件人地址和门牌号(IP地址+端口号),分拣员根据门牌号把包裹送到具体的住户(进程)手中。
2.1.3 分用的工作原理
传输层实现分用的关键在于端口号(Port Number)。每个传输层协议数据单元(TCP报文段或UDP数据报)中都包含源端口和目的端口字段。接收端传输层检查目的端口号,就能确定应该将数据交付给哪个应用进程。
图2:传输层复用与分用原理图
分用的两种类型:
| 分用类型 | 条件 | 特点 |
|---|---|---|
| 无连接分用(UDP) | 仅根据目的端口号 | 一个UDP套接字可被多个源访问 |
| 面向连接分用(TCP) | 根据四元组(源IP、源端口、目的IP、目的端口) | 每个连接有唯一的TCP套接字 |
考研易错点:TCP的分用是基于四元组的,而不仅仅是目的端口号!这意味着同一个目的端口可以服务于多个不同的TCP连接(来自不同源IP或源端口)。
2.2 差错检测:确保数据完整性
传输层通过校验和(Checksum) 机制来检测传输过程中的差错。无论是TCP还是UDP,都会在首部中包含一个校验和字段。
差错检测的范围:
- 对首部 + 数据进行校验
- UDP的校验和还包括一个伪首部(包含IP地址信息),以防止IP地址被篡改
- 如果校验失败,UDP直接丢弃该数据报;TCP也会丢弃,但发送方会因超时未收到确认而重传
校验和的工作原理:
- 发送方将校验和字段置为0
- 将首部和数据按16位字进行反码求和
- 将求和结果取反码,存入校验和字段
- 接收方用同样的方法计算校验和,若结果为全1(反码求和结果),则无差错
考研提示:传输层的差错检测是必须的(对UDP是可选的,但大多数实现都启用),它能检测出传输过程中的比特翻转等错误。但要注意,校验和不能纠错,只能检错。
2.3 可靠传输:TCP的核心承诺
网络层提供的IP服务是"尽力而为"的,不保证数据报一定到达、不保证按序到达、不保证不重复。TCP通过一系列机制在传输层之上构建了可靠传输服务:
| 可靠性问题 | TCP解决方案 | 机制说明 |
|---|---|---|
| 数据丢失 | 超时重传 | 发送方启动定时器,超时未收到确认则重发 |
| 数据乱序 | 按序交付 | 使用序号对报文段排序,缓存乱序到达的报文 |
| 数据重复 | 去重处理 | 通过序号识别重复的报文段 |
| 数据出错 | 差错检测+丢弃 | 校验和检错后丢弃,触发发送方重传 |
| 确认丢失 | 重传+冗余确认 | ACK本身也可能丢失,发送方会重传 |
可靠传输的具体实现机制(如滑动窗口、累积确认、选择确认等)将在后续P中详细讲解。
2.4 流量控制与拥塞控制
流量控制(Flow Control) 和 拥塞控制(Congestion Control) 是TCP的两大控制机制,也是考研的重中之重。
2.4.1 流量控制
目的:防止发送方发送速率过快,超出接收方的处理能力。
原理:接收方在TCP首部的"窗口"字段中告知自己的接收缓存大小。发送方根据这个窗口值来调整发送速率,确保不会因为"发太快"而导致接收方缓存溢出、数据丢失。
类比:流量控制就像两个人之间的对话,你说"慢点说,我跟不上了",对方就放慢语速。TCP中这个"我跟不上了"的信息就是通过窗口字段传递的。
2.4.2 拥塞控制
目的:防止过多数据注入网络,导致网络性能下降甚至崩溃。
原理:TCP通过检测网络的拥塞状况(丢包、时延增加等),动态调整发送窗口大小。当网络拥塞时减小发送速率,网络畅通时逐步增大。
类比:拥塞控制就像城市交通的流量管控。当某条路堵车了(网络拥塞),交警就会限制进入该路段的车辆数量(减小发送窗口);等道路畅通后,再逐步放开限制。
| 对比维度 | 流量控制 | 拥塞控制 |
|---|---|---|
| 控制目标 | 端到端的速率匹配 | 全局网络负载控制 |
| 控制依据 | 接收方的接收能力(缓存大小) | 网络的承载能力(丢包、时延) |
| 反馈来源 | 接收方通过ACK的窗口字段告知 | 发送方根据网络状况自行推断 |
| 控制手段 | 接收窗口(rwnd) | 拥塞窗口(cwnd) |
| 关系 | 发送窗口 = min(rwnd, cwnd) | 发送窗口 = min(rwnd, cwnd) |
考研绝对重点:TCP的发送窗口同时受流量控制和拥塞控制约束,实际发送窗口取两者的较小值。这个关系几乎每年必考!
3. 端口号——进程的"门牌号"
3.1 为什么需要端口号
在单台主机上,往往同时运行着多个网络应用程序。例如,你的电脑可能同时开着网页浏览器、QQ、邮件客户端、在线游戏等。所有这些应用都需要通过网络收发数据。
当操作系统从网络层收到一个数据报时,它如何知道这个数据应该交给哪个应用进程?答案就是端口号——一个16位的无符号整数,用于标识主机上的特定进程或服务。
端口号机制使得传输层能够精确地将数据分发给正确的应用进程,实现了"进程到进程"的通信。
3.2 端口号的分类
IANA(Internet Assigned Numbers Authority)将端口号划分为三个范围:
3.2.1 熟知端口(Well-Known Ports):0-1023
熟知端口由IANA统一分配,用于标识广泛使用的标准网络服务。这些端口号是所有操作系统和网络设备都熟知的,例如:
| 端口号 | 协议 | 服务名称 | 功能描述 |
|---|---|---|---|
| 20 | TCP | FTP-Data | 文件传输协议(数据连接) |
| 21 | TCP | FTP-Control | 文件传输协议(控制连接) |
| 22 | TCP | SSH | 安全外壳协议,加密远程登录 |
| 23 | TCP | Telnet | 远程终端协议(明文,不安全) |
| 25 | TCP | SMTP | 简单邮件传输协议,发送邮件 |
| 53 | UDP/TCP | DNS | 域名系统,域名解析服务 |
| 67 | UDP | DHCP-Server | 动态主机配置协议(服务器端) |
| 68 | UDP | DHCP-Client | 动态主机配置协议(客户端) |
| 69 | UDP | TFTP | 简单文件传输协议 |
| 80 | TCP | HTTP | 超文本传输协议,Web服务 |
| 110 | TCP | POP3 | 邮局协议第3版,接收邮件 |
| 143 | TCP | IMAP | 互联网邮件访问协议 |
| 161 | UDP | SNMP | 简单网络管理协议 |
| 443 | TCP | HTTPS | HTTP over SSL/TLS,安全Web |
| 3306 | TCP | MySQL | MySQL数据库服务 |
| 3389 | TCP | RDP | 远程桌面协议 |
| 5432 | TCP | PostgreSQL | PostgreSQL数据库 |
| 8080 | TCP | HTTP-Alt | HTTP替代端口(代理常用) |
| 8443 | TCP | HTTPS-Alt | HTTPS替代端口 |
| 1521 | TCP | Oracle | Oracle数据库服务 |
3.2.2 登记端口(Registered Ports):1024-49151
登记端口不分配给固定的标准服务,但需要在IANA登记注册,以避免重复使用。这些端口通常被软件厂商用于其商业应用程序。例如:
- 1080:SOCKS代理协议
- 3306:MySQL数据库(也常作为熟知端口使用)
- 5432:PostgreSQL数据库
- 6379:Redis缓存服务
- 8080:HTTP备用端口,常用于Web代理和开发服务器
3.2.3 动态/私有端口(Dynamic/Private Ports):49152-65535
动态端口也称为短暂端口(Ephemeral Ports)或私有端口。它们由客户端程序临时使用,用于在一次通信会话中标识客户端进程。
特点:
- 不固定分配给任何服务
- 客户端发起连接时由操作系统动态分配
- 通信结束后释放,可重复使用
- 一台主机上多个客户端连接分别使用不同的动态端口
图3:端口号的三大分类
3.3 端口号的总结对比
| 特征 | 熟知端口 | 登记端口 | 动态端口 |
|---|---|---|---|
| 范围 | 0-1023 | 1024-49151 | 49152-65535 |
| 分配机构 | IANA统一分配 | IANA登记注册 | 操作系统动态分配 |
| 用途 | 标准公共服务 | 厂商商业应用 | 客户端临时使用 |
| 是否需要root权限 | 是(类Unix系统) | 否 | 否 |
| 稳定性 | 固定不变 | 相对稳定 | 每次通信可能不同 |
| 典型例子 | HTTP:80, DNS:53 | MySQL:3306, Redis:6379 | 浏览器访问网站时随机分配 |
考研真题回顾:某年的408真题考查了端口号范围的划分,问哪个范围内的端口是"熟知端口"。答案就是0-1023。还有真题考查了熟知端口和登记端口的区别。
4. 套接字Socket——网络通信的端点
4.1 Socket的概念
套接字(Socket) 是网络通信中端点的抽象表示,它唯一标识了网络中的一个通信端点。一个套接字由两个要素组成:
Socket = ( IP地址 , 端口号 ) \text{Socket} = (\text{IP地址}, \text{端口号}) Socket=(IP地址,端口号)
这个二元组唯一标识了互联网上的一台主机的特定进程。两台主机之间的通信,实际上就是各自的一个套接字之间的通信。
4.1.1 为什么需要IP地址+端口号
- IP地址标识了网络中的主机(在网络层完成寻址)
- 端口号标识了主机上的进程(在传输层完成寻址)
- 两者结合才能唯一确定通信的一个端点
类比:IP地址就像城市名(“北京市”),端口号就像具体的门牌号(“海淀区中关村大街1号”)。光有城市名找不到具体的人,光门牌号没有城市名也不知道去哪里找。两者结合才能精确送达。
4.2 TCP连接与Socket
对于TCP(面向连接)的通信,一个连接由四元组唯一标识:
TCP连接 = ( 源IP , 源端口 , 目的IP , 目的端口 ) \text{TCP连接} = (\text{源IP}, \text{源端口}, \text{目的IP}, \text{目的端口}) TCP连接=(源IP,源端口,目的IP,目的端口)
这意味着:同一台主机上的同一个端口,可以同时与多个不同的主机建立多个TCP连接。例如,Web服务器监听80端口,可以同时服务成百上千个客户端,每个连接由四元组唯一区分。
图4:TCP Socket与连接示意图——服务器的80端口可同时服务多个客户端
4.3 UDP通信与Socket
UDP是无连接的,因此UDP的通信端点也使用Socket标识,但不需要建立连接。一个UDP套接字可以接收来自任意源的数据报。
4.4 Socket的编程意义
在Socket编程中(如Python的socket模块),创建Socket的步骤通常包括:
- 创建Socket对象:指定地址族(如AF_INET表示IPv4)和协议类型(SOCK_STREAM表示TCP,SOCK_DGRAM表示UDP)
- 绑定(Bind):将Socket绑定到一个特定的IP地址和端口号(服务器端必需)
- 监听/连接:TCP服务器监听连接请求,TCP客户端发起连接
- 收发数据:通过Socket读写数据
- 关闭Socket:通信结束,释放资源
import socket
# 创建一个TCP Socket(IPv4 + TCP协议)
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建一个UDP Socket(IPv4 + UDP协议)
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定到本地IP和端口
tcp_socket.bind(('127.0.0.1', 8080))
# TCP服务器监听连接
tcp_socket.listen(5)
# TCP客户端连接服务器
tcp_socket.connect(('www.example.com', 80))
# 发送数据
tcp_socket.send(b'Hello, Server!')
# 接收数据
data = tcp_socket.recv(1024)
# 关闭Socket
tcp_socket.close()
5. 无连接服务 vs 面向连接服务
传输层提供两种服务模式:UDP(无连接)和TCP(面向连接)。理解它们的区别是掌握传输层的关键。
5.1 两种服务的核心对比
| 对比维度 | UDP(无连接) | TCP(面向连接) |
|---|---|---|
| 连接建立 | 不需要 | 需要三次握手 |
| 连接释放 | 不需要 | 需要四次挥手 |
| 可靠性 | 不可靠,不保证交付 | 可靠,保证按序交付 |
| 确认机制 | 无 | 有(ACK确认) |
| 重传机制 | 无 | 有(超时重传) |
| 数据单位 | 数据报(保留报文边界) | 字节流(不保留边界) |
| 首部开销 | 8字节 | 20字节(最小) |
| 通信方式 | 一对一、一对多、多对一、多对多 | 仅一对一 |
| 流量控制 | 无 | 有(滑动窗口) |
| 拥塞控制 | 无 | 有(慢启动、拥塞避免等) |
| 延迟特性 | 低延迟 | 延迟较大(握手开销) |
| 适用场景 | 视频流、DNS、游戏、VoIP | 文件传输、网页浏览、邮件 |
5.2 UDP:简单高效的"快递小哥"
UDP就像一位不负责任但速度极快的快递小哥:
- 他拿到包裹就立即出发,不问收件人是否在家
- 他不保证包裹一定能送到
- 他不做签收确认,也不追踪包裹
- 但他速度极快,没有繁琐的流程
UDP的优势在于简单和高效:
- 没有连接建立和释放的开销,适合短消息传输
- 没有重传等待,适合对实时性要求高的应用
- 首部仅8字节,额外开销极小
- 支持多播和广播,一个数据报可发送给多个接收者
5.3 TCP:严谨可靠的"邮政系统"
TCP就像一个严谨可靠的邮政系统:
- 寄件前先确认收件人地址有效(三次握手)
- 每封信都要求收件人签字确认(ACK确认)
- 如果信没送到就重新寄送(超时重传)
- 信件按编号排序,确保按顺序阅读(按序交付)
- 寄信速度根据收件人处理能力调整(流量控制)
- 根据邮路拥堵情况调整寄信量(拥塞控制)
TCP的优势在于可靠性:
- 数据不会丢失、不会重复、按序到达
- 自动适应接收方的处理能力和网络状况
- 为应用提供可靠的字节流服务,应用无需关心传输细节
图5:UDP与TCP通信流程对比时序图
5.4 如何选择UDP还是TCP
在实际应用中,选择UDP还是TCP取决于具体需求:
选择TCP的场景:
- 数据完整性至关重要(文件传输、电子邮件)
- 需要按顺序交付数据(HTTP网页加载)
- 传输时间较长,连接建立的开销可接受
选择UDP的场景:
- 实时性要求高于可靠性(在线视频、语音通话)
- 短消息交互,连接开销占比大(DNS查询)
- 需要广播或多播(网络发现协议)
- 应用层自己实现了可靠性机制(某些在线游戏)
考研经典考题:问"DNS为什么使用UDP而不是TCP?"答案是:DNS查询通常很短小(一个UDP数据报就能装下),使用UDP避免了TCP三次握手的开销,响应更快。如果DNS响应太大(超过512字节),DNS也会回退到TCP。
6. 考研真题解析与易错点
6.1 经典例题1
【题目】 下列关于传输层功能的描述中,错误的是( )
A. 传输层提供进程之间的逻辑通信
B. 传输层的复用是指发送方不同的应用进程使用同一个传输层协议发送数据
C. 传输层的分用是指接收方传输层根据端口号将数据交付给正确的应用进程
D. UDP提供可靠的数据传输服务
【答案】 D
【解析】 UDP提供的是无连接的不可靠服务,不保证数据一定到达。TCP才提供可靠的数据传输服务。A、B、C三个选项的描述都是正确的。
6.2 经典例题2
【题目】 主机A向主机B发送数据,主机B的IP地址为192.168.1.1,使用的应用层协议是HTTP。则主机B上接收此数据的进程由( )标识。
A. IP地址 192.168.1.1
B. 端口号 80
C. IP地址 192.168.1.1 + 端口号 80
D. MAC地址
【答案】 C
【解析】 单独使用IP地址只能标识主机,不能标识主机上的进程;单独使用端口号不能确定是哪台主机。只有IP地址+端口号的组合(即Socket)才能唯一标识网络通信中的一个端点。HTTP默认使用80端口,所以答案是IP地址加上端口号80。
6.3 易错点总结
| 易错点 | 正确理解 |
|---|---|
| 端口号是传输层概念 | 网络层(IP)看不到端口号,端口号只在传输层及以上存在 |
| 熟知端口上限是1023 | 0-1023是熟知端口,共1024个,不是1024个端口号 |
| TCP分用基于四元组 | 不只是目的端口,而是(源IP,源端口,目的IP,目的端口) |
| 路由器不涉及传输层 | 路由器只处理到网络层,不查看TCP/UDP首部 |
| UDP校验和是可选的 | UDP首部中的校验和字段可以是全0(表示不计算),但TCP校验和是必须的 |
7. 本节总结
传输层是计算机网络中最关键、最复杂的层次之一,也是408考研的核心考点。本节我们学习了:
- 传输层的位置与功能:端到端的进程通信,四大核心功能(复用分用、差错检测、可靠传输、流量/拥塞控制)
- 端口号:16位标识符,分为熟知端口(0-1023)、登记端口(1024-49151)、动态端口(49152-65535)
- Socket:IP地址+端口号的组合,唯一标识网络通信端点
- UDP vs TCP:无连接不可靠 vs 面向连接可靠,各有适用场景
下一P预告:我们将深入UDP协议,解析UDP数据报的每个字段,手写UDP校验和计算代码,并通过Python实战掌握UDP通信的全过程。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)