LOADING
2535 words
13 minutes
传输层:TCP/UDP与端到端通信(一)

传输层

一、理解传输层的核心功能

传输层是 OSI 七层模型(或 TCP/IP 四层模型)中**“端到端(进程到进程)通信”的核心保障**——网络层(IP)仅能把数据送到“目标主机”,而传输层要精准送到“主机上的某一个应用程序”,并保障传输的可靠性、效率。

可以类比为“快递员的精细投递服务”:网络层是“把包裹送到小区门口(目标主机)”,传输层是“把包裹精准送到家门口(目标应用,如浏览器、QQ)”,还要负责“包裹是否完整”“送货速度是否匹配”等问题。

传输层核心功能可结合“快递”类比拆解为 4 点:

  1. 精准投递(端口寻址) 不同应用(如浏览器用 HTTP、QQ 用自定义协议)需同时传输数据,传输层通过端口号(16 位数字,范围 0 - 65535)区分应用,类似“家门口的门牌号”。

    • 例子:用浏览器访问网页,数据发往服务器的 80 端口(HTTP 默认)443 端口(HTTPS 默认);QQ 聊天时,数据指向 QQ 服务器的特定端口(如早期 QQ 常用 8000、4000 等端口)。
  2. 质检与重发(可靠性保障) 网络传输易因干扰、拥塞丢失或损坏数据,传输层通过“确认机制”“重传机制”保障数据可靠到达,类比“快递员等收件人签字确认,丢件则重发”。

  3. 流量控制(防包裹堆积) 若发送方速度远快于接收方,接收方“缓冲区”会因数据堆积而溢出(类似家门口堆太多包裹没地方放),传输层通过“流量控制”调整发送速度,匹配双方处理能力。 类比“快递站根据你家‘收货能力’(如只有 1 个快递柜),控制送货频率”。

  4. 多路复用(合并发货) 发送方多个应用(如同时开浏览器、微信、下载工具)的数据,可通过**同一个网络层连接(IP 通道)**传输,传输层给每个应用的数据打“端口标记”,接收方再拆分给对应应用。 类比“同时在淘宝、京东买东西,快递员把多个快递合并成大包裹运输,到你家后再拆分”。

二、如果没有传输层?

想象以下混乱场景:

  • 所有应用的数据混在一起发往目标主机,主机无法区分“哪些数据属于浏览器、哪些属于 QQ”,导致应用“抢数据”或“收错数据”;
  • 数据丢失后无人重传,网页经常“图片加载一半卡住”“文字缺失”;
  • 发送方疯狂发数据,接收方因缓冲区爆满直接卡死;
  • 每个应用都要单独建“网络层通道”,浪费大量网络资源(如开 10 个应用就要 10 条独立 IP 连接)。

三、传输层关键协议:TCP / UDP

传输层有两个核心协议,分别应对“可靠性”和“高效性”需求:

1. TCP(传输控制协议)

可靠的“快递柜”

TCP 是面向连接、可靠、有序、支持流量控制与拥塞控制的协议,适合“数据完整性要求高”的场景(如网页浏览、文件下载、邮件)。

核心特点 + 例子

  • 面向连接:通信前必须“三次握手”建立连接(类似快递员送货前打电话确认你在家)。 例子:浏览器访问 www.baidu.com 时,会先与百度服务器三次握手,建立 TCP 连接后再传输网页数据。
  • 可靠传输:通过“序号、确认应答、重传机制”保障数据不丢不错。 例子:用 TCP 协议下载电影时,若某段数据丢失,TCP 会自动重传该段,确保收到完整文件。
  • 流量控制:通过“滑动窗口”调整发送速度,匹配接收方的“接收能力”。 例子:手机(接收方)性能弱时,服务器(发送方)会自动减慢数据发送速度,避免手机卡死。
  • 拥塞控制:网络拥堵时,TCP 主动降低发送速率,避免网络瘫痪。 例子:“晚高峰网络拥堵”时,TCP 会暂时减少数据发送量,等网络顺畅后恢复。

三次握手:建立可靠连接的“三把锁”

TCP三次握手是客户端与服务器建立可靠连接的核心流程,通过“三次交互”确保双方同步序列号、确认通信能力,类比“两人远程确认对方身份并约定沟通规则”。

1. 三次握手的详细步骤(结合序列号与确认号)

以“浏览器访问百度服务器”为例,拆解每一步的核心动作:

步骤发起方核心动作关键标志位与字段状态变化
第一次握手(SYN)客户端(浏览器)向服务器发送“连接请求”,请求建立TCP连接。- SYN=1(表示这是连接请求)
- seq=x(客户端生成的随机初始序列号,如x=100
- ACK=0(尚未确认任何数据)
客户端 → SYN-SENT(等待服务器确认)
第二次握手(SYN-ACK)服务器(百度)收到客户端请求后,回复“确认+连接请求”,表示同意建立连接。- SYN=1(服务器也发起连接请求)
- ACK=1(确认位,表示已收到客户端的seq=x
- ack=x+1(期望客户端下一次发x+1
- seq=y(服务器生成的随机初始序列号,如y=200
服务器 → SYN-RCVD(等待客户端最终确认)
第三次握手(ACK)客户端(浏览器)向服务器发送“最终确认”,表示双方连接已建立,可开始传输数据。- ACK=1(确认位,已收到服务器的seq=y
- ack=y+1(期望服务器下一次发y+1
- seq=x+1(客户端序列号递增)
- SYN=0(不再发起新连接)
客户端 → ESTABLISHED(连接已建立)
服务器 → ESTABLISHED(收到确认后进入)

76075929487

2. 为什么需要三次握手?(核心是“可靠性”)
  • 防止“失效的连接请求”干扰: 假设网络延迟导致客户端的第一个SYN包“迟到”,客户端超时后重发SYN,正常建立连接并关闭。若此时“迟到的SYN”突然到达服务器,三次握手能让服务器验证客户端是否真的要建立新连接(客户端会在第三次握手时拒绝无效请求)。 (如果是两次握手,服务器收到迟到的SYN后会直接建立连接,浪费资源)。

  • 同步双方的初始序列号(ISN): TCP是“面向字节流”的协议,数据需通过**序列号(seq)**保证顺序和完整性。三次握手让客户端和服务器交换各自的初始序列号(如客户端seq=x、服务器seq=y),后续数据传输时,双方通过seqack确认数据是否丢失或乱序。

三次握手:通过“请求→确认+请求→最终确认”三步,确保客户端和服务器同步序列号、验证通信意图,为可靠传输打下基础。

2. UDP(用户数据报协议)

快速的“明信片”

UDP 是无连接、不可靠、轻量的协议,适合“实时性要求高但偶尔丢数据可容忍”的场景(如视频通话、在线游戏、直播)。

核心特点 + 例子

  • 无连接:通信前无需建立连接,直接发数据(类似寄明信片,不用等对方确认)。 例子:视频通话时,每帧音视频数据被封装成 UDP 包直接发送,无需“握手确认”,延迟更低。
  • 不可靠:不保证数据到达、不保证顺序,丢了也不重传。 例子:在线游戏中,角色移动数据用 UDP 传输,若某一帧“移动位置”丢失,游戏会直接用后续新位置数据(实时性比“100%准确”更重要,玩家几乎无感知)。
  • 轻量高效:头部开销极小(仅 8 字节,TCP 头部至少 20 字节),处理速度快。 例子:直播平台用 UDP 传输视频流,每秒需传几十帧数据,UDP 低开销能让数据更快到达观众端,保证直播流畅。

传输层

四、端口与套接字(Socket)

  • 端口(Port):传输层“区分应用”的标识,每个应用进程绑定一个端口。 常见知名端口:HTTP(80)、HTTPS(443)、FTP(21)、SSH(22)、DNS(53)等。

  • 套接字(Socket):是**“IP 地址 + 端口号”的组合**,用于唯一标识“网络中某台主机上的某个应用进程”。 格式:Socket = (IP 地址, 端口号) 例子:用浏览器访问百度时,你的电脑可能是 (192.168.1.2, 随机端口如 54321),百度服务器是 (110.242.68.66, 80),这一对 Socket 就建立了端到端的通信通道。

五、实践技能目标

掌握传输层实践能力,通常包括:

  1. 抓包分析协议:用 Wireshark、Fiddler 等工具捕获 TCP/UDP 报文,分析“三次握手”“UDP 包结构”“端口号分配”等细节。 例子:用 Wireshark 抓浏览器访问网页的包,可看到 TCP 三次握手过程及带端口号的 HTTP 数据传输。

  2. 查看端口占用:通过 netstat(Windows/Linux 命令),查看本机当前所有 Socket 连接和端口占用情况。 例子:命令行输入 netstat -an,可查看哪些程序占用了 80、443 等端口,判断是否有程序异常占用。

  3. 编程实践传输层:用 Python socket 模块编写基于 TCP 或 UDP 的简单通信程序(如客户端 - 服务器聊天程序),直观感受传输层工作。 例子:写 TCP 服务器监听 8888 端口,客户端连接后发“Hello”,服务器回复“Hi”,体会“端口寻址”与“可靠传输”。

传输层:TCP/UDP与端到端通信(一)
/posts/2026-7-7/1-传输层/
Author
Atopos
Published at
2026-07-07
License
CC BY-NC-SA 4.0

Some information may be outdated