news 2026/5/30 15:58:38

【Linux网络基础】详解 TCP 面向连接 vs UDP 无连接

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux网络基础】详解 TCP 面向连接 vs UDP 无连接

详解 TCP 面向连接 vs UDP 无连接

本文详细解析计算机网络传输层两个最重要的协议:TCP (Transmission Control Protocol)UDP (User Datagram Protocol),重点阐述“面向连接”与“无连接”的核心区别、工作原理及应用场景。


1. 核心概念:什么是“连接”?

在计算机网络中,“连接”并不是一条物理的网线。
“连接”是一种逻辑状态,是通信双方为了保证数据可靠传输而维护的一组状态信息

  • 状态信息包括:Socket 四元组(源IP、源端口、目的IP、目的端口)、序列号 (Sequence Number)、窗口大小 (Window Size)、重传定时器等。
  • 面向连接:通信前必须建立连接(分配资源、初始化状态),通信结束必须释放连接。
  • 无连接:不需要预先建立逻辑通路,直接发送数据包。

2. TCP:面向连接 (Connection-Oriented)

TCP 是一个可靠的、面向流的传输协议。就像打电话,必须先拨通对方,对方接听后才能开始说话。

2.1 核心特点

  1. 三次握手 (Three-Way Handshake):在传输数据前,必须通过三次握手建立连接,同步双方的序列号 (ISN) 和窗口大小。
  2. 可靠性 (Reliability)
    • 确认机制 (ACK):接收方收到数据后必须回复确认。
    • 重传机制 (Retransmission):发送方如果在超时时间内未收到 ACK,会重传数据。
    • 排序 (Ordering):数据包乱序到达时,TCP 会根据序列号重新排序。
  3. 流式传输 (Byte Stream):TCP 把数据看作一连串无结构的字节流,没有边界。
  4. 流量控制与拥塞控制:防止接收方缓冲区溢出,防止网络拥塞。

2.2 工作流程图解

下图展示了 TCP 的连接建立与数据传输过程:

Mermaid 流程示意:

ClientServer建立连接 (三次握手)SYN (SEQ=x)SYN (SEQ=y), ACK (x+1)ACK (y+1)数据传输Data (SEQ=x+1)ACK (SEQ=x+1+len)ClientServer

3. UDP:无连接 (Connectionless)

UDP 是一个简单的、不可靠的、面向数据报的传输协议。就像寄信广播,写好地址直接扔进邮筒,不知道对方是否收到,也不保证顺序。

3.1 核心特点

  1. 无连接:不需要握手,想发就发。发送方不会维护连接状态。
  2. 不可靠 (Unreliable)
    • 没有 ACK 确认。
    • 没有重传机制(丢了就丢了)。
    • 不保证顺序(先发的可能后到)。
  3. 面向报文 (Datagram):UDP 保留应用层报文的边界,发多少接多少。
  4. 高效与实时:没有连接建立的时延,头部开销小(TCP 20字节,UDP 8字节),适合实时应用。

3.2 工作流程图解

下图展示了 UDP 的“发射即忘” (Fire and Forget) 模式:


4. 深度对比:TCP vs UDP

特性TCP (Transmission Control Protocol)UDP (User Datagram Protocol)
连接性面向连接(需要3次握手,4次挥手)无连接(直接发送)
可靠性可靠(保证不丢、不重、有序)不可靠(尽最大努力交付,可能丢包、乱序)
传输模式字节流(Stream,无边界)数据报(Datagram,有边界)
速度/效率较慢 (握手、ACK、重传消耗资源)(无控制开销)
头部开销20-60 字节8 字节
拥塞控制有 (慢启动、拥塞避免等)无 (网络拥堵时依然全速发送)
应用场景网页(HTTP), 邮件(SMTP), 文件(FTP)视频直播, 语音通话(VoIP), DNS, 游戏(FPS)

5. 代码层面的区别 (Socket API)

在编程实现上,两者的主要区别在于 Socket 的类型和发送/接收函数。

TCP Socket 伪代码

# Servers=socket(AF_INET,SOCK_STREAM)# SOCK_STREAM 代表 TCPs.bind((ip,port))s.listen()conn,addr=s.accept()# 阻塞等待连接data=conn.recv(1024)# 基于连接接收# Clients=socket(AF_INET,SOCK_STREAM)s.connect((ip,port))# 必须先建立连接s.send(data)# 基于连接发送

UDP Socket 伪代码

# Servers=socket(AF_INET,SOCK_DGRAM)# SOCK_DGRAM 代表 UDPs.bind((ip,port))data,addr=s.recvfrom(1024)# 接收数据,同时获取发送者地址# Clients=socket(AF_INET,SOCK_DGRAM)# 不需要 connects.sendto(data,(ip,port))# 发送时指定目标地址

6. 总结

  • TCP 是“管家”:细致入微,做事有条理,保证任务一定完成,但办事流程繁琐,速度慢。
  • UDP 是“邮差”:简单粗暴,只管送,不管丢没丢,但速度快,开销小。

选择建议

  • 如果你的应用不允许数据丢失(如转账、传文件),请用TCP
  • 如果你的应用追求速度,能容忍少量丢包(如视频聊天、实时竞技游戏),请用UDP

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 18:48:26

Langchain-Chatchat与主流大模型集成的最佳实践

Langchain-Chatchat与主流大模型集成的最佳实践 在企业智能化转型的浪潮中,一个日益突出的问题浮出水面:通用大语言模型虽然“博学”,却对企业内部制度、项目文档、合规流程等私有知识一无所知。更令人担忧的是,将敏感文件上传至云…

作者头像 李华
网站建设 2026/5/30 18:48:04

基于YOLOv8/YOLOv10/YOLOv11/YOLOv12与SpringBoot的前后端分离疲劳驾驶识别检测系统(DeepSeek智能分析+web交互界面)

一、 系统引言 随着社会经济的快速发展,汽车已成为不可或缺的交通工具,但随之而来的道路交通安全问题也日益严峻。其中,疲劳驾驶是导致重大交通事故的主要因素之一,对驾驶员和公众的生命财产安全构成了严重威胁。统计表明&#x…

作者头像 李华
网站建设 2026/5/30 18:47:00

Langchain-Chatchat在政务知识库建设中的应用前景

Langchain-Chatchat在政务知识库建设中的应用前景 在政务服务日益智能化的今天,公众对政策咨询的期待早已超越了“能查到”,而是要求“秒懂、精准、可信赖”。然而现实是,大量群众面对冗长的法规条文和复杂的办事指南时仍感到无从下手。某市医…

作者头像 李华
网站建设 2026/5/30 11:20:22

Meta的 Mango「芒果」模型:看来AI视频生成要变天了

📌 目录扎克伯格的「芒果」要炸场!Meta神秘AI视频模型Mango曝光:4K/60帧秒出片,好莱坞都要慌了一、Meta的野心:不止超越Sora,要把AI视频搬进专业片场(一)Mango vs 现有AI视频工具&am…

作者头像 李华
网站建设 2026/5/28 22:05:29

moodycamel::ConcurrentQueue 清空队列的方法论

方法1&#xff1a;循环弹出元素 #include <concurrentqueue.h>// 如果存储的是指针类型 moodycamel::ConcurrentQueue<int*> queue; int* item nullptr; while (queue.try_dequeue(item)) {if (item) {delete item; // 如果需要释放内存item nullptr;} }// 如果…

作者头像 李华