TCP 与 UCP 比较

今天我们来了解一下 TCP 与 UCP ,在详细展开之前,我们先来简单认识一下TCP/IP 协议栈。

TCP/IP协议栈是互联网的核心技术架构,采用分层设计实现跨网络通信。它将复杂的网络通信过程分解为五个层次,每层专注于特定功能,并通过清晰的接口与相邻层交互。这种设计既实现了功能解耦,又确保了系统的可扩展性。

协议栈的层级结构自下而上依次为:

  1. 物理层:负责物理介质上的原始比特流传输
  2. 数据链路层:实现相邻节点间的可靠帧传输
  3. 网络层:处理端到端的数据包路由和转发
  4. 传输层:提供端到端的可靠数据传输服务
  5. 应用层:直接面向用户提供各类网络服务

各层之间通过严格的封装/解封装机制协作,上层利用下层提供的服务,下层为上层屏蔽实现细节,共同构建起标准化的网络通信体系。

我们要讲的 TCP 和 UDP 就是传输层协议的两大核心实现。

1.TCP

1.1简介

TCP(传输控制协议,Transmission Control Protocol)是TCP/IP协议栈中传输层的核心协议。它在不可靠的网络层(IP协议)基础上,为应用层提供面向连接、可靠且有序的字节流传输服务 。具体而言,IP协议仅负责将数据包从源地址发送到目标地址,但不保证传输成功、顺序正确或数据完整。TCP通过一系列复杂机制弥补了IP协议的不足,使应用层无需关注网络传输的稳定性,就能获得如同在"可靠管道"中传输数据的效果。

1.2头部标志位

在解释工作之前,我们需认识头部标志位,它们用于控制 TCP 连接的建立、数据传输和释放过程,相当于通信中的 "控制信号",每个标识都有明确的语义。

标志位 全称(含义) 核心作用
SYN Synchronize(同步) 用于发起连接请求,告知对方 "我想建立连接,并同步我的初始序列号"
ACK Acknowledgment(确认) 用于确认收到对方的数据,告知对方 "我已收到你发送的某部分数据,接下来请发后续内容"。标志位 ACK=1 时,报文中的 "确认号(ack)" 字段才有效,确认号即 "期望接收的下一个序列号"。
FIN Finish(结束) 用于请求释放连接,告知对方 "我这边已没有数据要发送了,准备断开连接"。发送 FIN=1 的报文,代表主动关闭连接的一方已完成数据传输。
RST Reset(重置) 用于强制断开异常连接,告知对方 "当前连接有问题,必须重新建立连接"。通常在连接超时、端口未开放、数据错误等场景下发送,直接终止当前连接。
PSH Push(推送) 用于要求接收方立即将数据提交给应用层,而不是缓存起来。例如:即时通讯中发送紧急消息时,可能携带 PSH=1,确保对方立即显示。
URG Urgent(紧急) 用于标记报文中包含紧急数据,配合 "紧急指针" 字段指示紧急数据的位置。实际应用中较少使用,常见于远程登录(如 SSH)中的中断指令。
1.3工作过程

TCP(传输控制协议)的工作过程可分为连接建立数据传输连接释放三个核心阶段,每个阶段通过特定机制实现有序、无丢失的通信。我们用通俗的方式来了解这一过程。

1.3.1连接建立三次握手(类似 "拨通电话确认双方通信能力")

TCP 是一种面向连接的协议,通信双方需要通过三次握手建立逻辑连接,确保通信能力正常并同步初始状态:

1.第一次握手(SYN 报文)

客户端发送连接请求报文,其中:

  • SYN=1(标识为连接请求)
  • 包含客户端初始序列号(ISN,如x) 客户端随后进入SYN_SENT状态(相当于拨号方说"喂,能听到吗?")

2.第二次握手(SYN+ACK 报文)

服务器收到请求后返回确认报文,其中:

  • SYN=1(同意建立连接)
  • ACK=1(确认收到请求)
  • 包含服务器初始序列号(ISN,如y)
  • 确认号为x+1(表示期望接收客户端下一个序列号) 服务器进入SYN_RCVD状态(相当于接听方说"能听到,我也准备好了")

3.第三次握手(ACK 报文)

客户端发送最终确认报文,其中:

  • ACK=1
  • 确认号为y+1(表示期望接收服务器下一个序列号) 双方随后进入ESTABLISHED状态(相当于拨号方说"好的,开始聊吧"),连接正式建立。
1.3.2数据传输:可靠传输机制(类似 "边说话边确认,没听清就重说")

TCP 通过以下机制确保可靠传输:

1.序列号与确认应答

  • 每个数据字节分配唯一序列号(从 ISN 开始递增)
  • 接收方返回 ACK 报文,确认号为"最后接收字节序号+1"(类似"已收到1-10句,请继续第11句")

2.重传机制

  • 发送方在超时未收到ACK或收到3次重复ACK时重传数据(类似"未收到回应则重复刚才的话")

3.流量控制(滑动窗口)

  • 接收方通过"窗口大小"字段告知可用缓冲区空间
  • 发送方据此调整发送量(类似"接收方提示'说慢点,我跟不上了'")

4.拥塞控制

  • 根据网络状况动态调整发送速率
  • 避免网络过载(类似"信号差时自动放慢语速")
1.3.3连接释放:四次挥手(类似 "说完话确认双方都结束,再挂电话")

1.第一次挥手(FIN 报文) :主动关闭方(如客户端)发送连接释放请求,包含FIN=1(标记为释放连接)和当前序列号(如 u),进入FIN_WAIT_1状态(类似 "说的人说'我说完了'")。

2.第二次挥手(ACK 报文) :被动关闭方(如服务器)回复确认,包含ACK=1和确认号(u+1),进入CLOSE_WAIT状态(此时仍可发送剩余数据)(类似 "听的人说'知道了,我再看看有没有遗漏'")。

3.第三次挥手(FIN 报文) :被动关闭方发送最终释放请求,包含FIN=1和当前序列号(如 v),进入LAST_ACK状态(类似 "听的人说'我也说完了'")。

4.第四次挥手(ACK 报文) :主动关闭方回复确认,包含ACK=1和确认号(v+1),进入TIME_WAIT状态(等待 2MSL 确保对方收到确认),最终双方进入CLOSED状态(类似 "说的人说'好的,挂了'"),连接彻底释放。

1.4应用场景

TCP 适用于对可靠性要求高于实时性的场景,例如:

  • 网页浏览(HTTP/HTTPS):需确保网页内容、图片、脚本等数据完整传输;
  • 文件传输(FTP、SFTP):避免文件传输过程中丢失或损坏;
  • 邮件发送(SMTP)、即时通讯(微信文字消息):确保消息不丢失、按序展示;
  • 数据库访问(MySQL、PostgreSQL):确保 SQL 指令和查询结果可靠传输。

2.UDP

2.1简介

UDP(用户数据报协议,User Datagram Protocol),主打无连接、不可靠、低延迟、轻量级的数据传输,核心设计理念是 "效率优先"------ 舍弃 TCP 复杂的可靠性保障机制,以最小的协议开销实现数据快速投递,适用于实时性要求远高于数据完整性的场景。

2.2工作过程
2.2.1数据封装:给应用数据 "贴标签"(类似 "给快递包写地址")

应用层(如游戏、直播软件)将数据传递给 UDP 协议栈后,UDP 仅做最基础的封装:

  1. 添加上层协议标签:明确数据对应的应用层进程(通过 "源端口" 和 "目的端口",比如 DNS 用 53 端口、游戏用特定端口,类似 "快递包上写收发地址和联系方式");

  2. 计算校验和:对 UDP 头部和数据部分做简单校验(可选,类似 "快递包表面检查是否破损");

  3. 形成 UDP 数据报:封装后的数据包固定格式,头部仅 8 字节(远少于 TCP),整体体积小、封装速度快(类似 "快速打包,不额外加防护")。

2.2.2数据传输:直接投递,不等待、不确认(类似 "快递直接投递,不打电话确认")

UDP 数据报封装完成后,直接交给网络层(IP 协议),后续传输过程无任何额外控制:

  1. 无连接建立:发送方无需像 TCP 那样 "三次握手",拿到数据就发,不管接收方是否准备好(类似 "不用提前跟收件人确认,直接寄快递");

  2. 无确认应答:发送方发送后不等待接收方回复,也不知道数据是否到达、是否完整(类似 "寄完快递不跟踪物流,不管对方收没收到");

  3. 无速率控制:发送方按自身速率持续发送,不管网络是否拥堵、接收方是否处理得过来(类似 "不管快递站忙不忙,一直往那边寄");

  4. 数据报独立传输:每个 UDP 数据报都是独立的,发送顺序和接收顺序可能不一致,丢失了也不会重传(类似 "多个快递分开寄,可能有的先到、有的丢了,不会补寄")。

2.2.3数据接收:直接解封装,交给应用层(类似 "收件人直接拿快递,不签收")

接收方的 UDP 协议栈收到网络层传递的 UDP 数据报后:

  1. 解封装:剥离 UDP 头部,提取源端口、目的端口和数据(类似 "拆快递包,拿出里面的东西");

  2. 简单校验:若开启校验和,验证数据是否破损,破损则直接丢弃(类似 "看快递包破损严重就直接扔掉");

  3. 交付应用层:将完整数据按端口号交给对应应用进程,不做排序、不做缓存(类似 "把完好的快递直接交给收件人,不管收到的顺序是否和寄出顺序一致")。

2.3应用场景

高效实时 的特性,UDP 广泛用于能容忍少量数据丢失的场景:

  • 实时音视频:视频通话、语音聊天(VoIP)、直播(画面卡顿可容忍,需低延迟);
  • 网络游戏:玩家移动、技能释放等指令(偶尔丢包不影响游戏体验,卡顿会严重影响操作);
  • 短平快请求:DNS 查询(数据量小,追求快速响应,一次请求一次回复);
  • 广播 / 多播:局域网设备发现、视频会议广播(一对多传输,无需逐一建立连接)。

3.TCP 与 UCP 对比

TCP 是一种面向连接的可靠字节流协议。在通信前需要通过"三次握手"建立连接,传输过程中采用序列号、确认应答、重传机制、滑动窗口流量控制和拥塞控制等技术,确保数据无丢失、无重复且按序到达。它支持全双工通信,但由于额外的控制机制会产生较高延迟和开销,适用于对可靠性要求较高的场景,如 HTTP/HTTPS、FTP 文件传输、SMTP 邮件发送以及 SSH 远程登录等。

UDP 则是一种无连接的不可靠数据报协议。通信前无需建立连接,直接将数据封装成数据报发送。它不保证送达顺序、不会重传丢失数据、也没有流量和拥塞控制,仅提供端口寻址和基本差错校验。因此具有延迟低、开销小、传输效率高 的特点,适用于实时性优先于可靠性的场景,如视频通话、VoIP 语音聊天、直播、游戏数据传输和 DNS 查询等,也常用于广播/多播通信。

简而言之,TCP 以**"可靠有序"** 为核心,牺牲效率换取稳定性;UDP 以**"高效实时"**为核心,牺牲可靠性换取速度。实际应用中需根据业务需求选择。

相关推荐
人工智能训练1 小时前
Docker中Dify镜像由Windows系统迁移到Linux系统的方法
linux·运维·服务器·人工智能·windows·docker·dify
aodunsoft1 小时前
安全月报 | 傲盾DDoS攻击防御2025年11月简报
网络·安全·ddos
new_daimond1 小时前
DNS(Domain Name System)详解
运维·网络
tfjy19971 小时前
网络基础学习
网络·学习
云边云科技5341 小时前
智能联接,驱动未来:云边云科技SD-WAN如何重塑企业全球化数字动脉
网络·架构·it·量子计算·sdwan
广东大榕树信息科技有限公司1 小时前
国产化动环监控系统在数据中心安全中的作用
网络·物联网·国产动环监控系统·动环监控系统
Mr.H01271 小时前
深入理解高级IO:从模型到实战,实现高性能并发服务器
linux·服务器·网络·tcp/ip·php
zhouyunjian1 小时前
10-ScheduledThreadPool应用与源码分析
运维·服务器·数据库
小兔薯了2 小时前
10.VSFTPD 服务器
运维·服务器