【网络】TCP vs UDP详解( 含python代码实现)

news/2025/2/27 6:26:48

网络】TCP vs UDP详解

  • 1. 基本概念
  • 2. 主要特性对比
  • 3. 工作原理
    • TCP 的工作原理
    • UDP 的工作原理
  • 4. 优缺点对比
  • 5. 适用场景
  • 6. 代码示例
    • TCP 服务器
    • TCP 客户端
    • UDP 服务器
    • UDP 客户端
  • 7. 总结

TCP(传输控制协议)和 UDP(用户数据报协议)是两种最常用的传输层协议,用于在网络上传输数据。它们在设计目标、特性和适用场景上有显著差异。以下是 TCP 和 UDP 的详细对比:

1. 基本概念

TCP(Transmission Control Protocol)

  • TCP 是一种面向连接的、可靠的、基于字节流的传输层协议。
  • 它确保数据按顺序、无差错地从源端传输到目的端。
  • TCP 提供了流量控制、拥塞控制和错误恢复机制。

UDP(User Datagram Protocol)

  • UDP 是一种无连接的、不可靠的、基于数据报的传输层协议。
  • 它不保证数据的可靠性、顺序性或完整性。
  • UDP 简单高效,适合对实时性要求高的应用。

2. 主要特性对比

特性
TCP	UDP

连接方式 面向连接(需要三次握手建立连接) 无连接(直接发送数据)
可靠性 可靠传输(确保数据不丢失、不重复、有序) 不可靠传输(可能丢失、重复、乱序)
数据顺序 保证数据顺序 不保证数据顺序
流量控制 支持(通过滑动窗口机制) 不支持
拥塞控制 支持(通过慢启动、拥塞避免等算法) 不支持
错误检测与恢复 支持(通过校验和、重传机制) 仅支持错误检测(通过校验和)
数据格式 基于字节流 基于数据报(每个数据包独立)
头部开销 较大(至少 20 字节) 较小(仅 8 字节)
传输效率 较低(由于连接管理和可靠性机制) 较高(无连接管理和可靠性机制)
适用场景 对可靠性要求高的应用 对实时性要求高的应用

3. 工作原理

TCP 的工作原理

  • 建立连接(三次握手):
    客户端发送 SYN 报文给服务器。
    服务器回复 SYN-ACK 报文。
    客户端发送 ACK 报文,连接建立。

  • 数据传输:
    数据被分割成 TCP 段,每个段都有序列号和确认号。
    接收方确认收到的数据,发送方根据确认信息决定是否重传。

  • 流量控制:
    通过滑动窗口机制动态调整发送速率。

  • 拥塞控制:
    使用慢启动、拥塞避免、快速重传和快速恢复算法。

  • 断开连接(四次挥手):
    客户端发送 FIN 报文。
    服务器回复 ACK 报文。
    服务器发送 FIN 报文。
    客户端回复 ACK 报文,连接关闭。

UDP 的工作原理

  • 无连接通信:
    发送方直接将数据报发送到接收方,无需建立连接。

  • 数据传输:
    每个数据报独立传输,不保证顺序和可靠性。
    无流量控制和拥塞控制:
    发送方以固定速率发送数据,不考虑网络状况。

4. 优缺点对比

  • TCP 的优点
    可靠性高,适合传输重要数据。
    支持流量控制和拥塞控制,避免网络拥塞。
    保证数据顺序,适合文件传输、网页浏览等场景。

  • TCP 的缺点
    头部开销大,传输效率较低。
    连接管理复杂,延迟较高。
    不适合实时性要求高的应用。

  • UDP 的优点
    头部开销小,传输效率高。
    无连接管理,延迟低。
    适合实时性要求高的应用,如视频流、在线游戏。

  • UDP 的缺点
    不可靠传输,数据可能丢失、重复或乱序。
    无流量控制和拥塞控制,可能导致网络拥塞。

5. 适用场景

  • TCP 的适用场景
    文件传输(如 FTP、HTTP)
    电子邮件(如 SMTP、POP3)
    网页浏览(如 HTTPS)
    数据库访问
    远程登录(如 SSH)

  • UDP 的适用场景
    实时视频流(如视频会议、直播)
    在线游戏
    语音通信(如 VoIP)
    DNS 查询
    广播和多播应用

6. 代码示例

TCP 服务器

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket.AF_INET:指定地址族为 IPv4。
# socket.SOCK_STREAM:指定套接字类型为 TCP(流式套接字)。
# 这行代码创建了一个 TCP 套接字对象 server。
server.bind(('0.0.0.0', 8888))
# bind() 方法将套接字绑定到指定的 IP 地址和端口。
# '0.0.0.0':表示绑定到所有可用的网络接口(即服务器上的所有 IP 地址)。
# 8888:指定监听的端口号。
# 绑定后,服务器可以通过该 IP 和端口接收客户端的连接请求
server.listen(5)
# listen() 方法将套接字设置为监听状态,等待客户端的连接请求。参数 5 表示最大挂起连接数(即允许同时等待处理的连接数)。

print("TCP 服务器已启动...")
while True:
    client, addr = server.accept()
    print(f"来自 {addr} 的连接")
    client.send(b"Hello, TCP Client!")
    #send() 方法向客户端发送数据。b"Hello, TCP Client!":发送的字节数据(b 前缀表示字节字符串)。
    data = client.recv(1024)
    # recv() 方法从客户端接收数据。参数 1024 表示每次最多接收 1024 字节的数据。

接收到的数据存储在变量 data 中。
    print(f"收到数据: {data.decode()}")
    client.close()

TCP 客户端

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8888))
data = client.recv(1024)
print(f"收到数据: {data.decode()}")
client.send(b"Hello, TCP Server!")
client.close()

UDP 服务器

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))

print("UDP 服务器已启动...")
while True:
    data, addr = server.recvfrom(1024)
    print(f"来自 {addr} 的数据: {data.decode()}")
    server.sendto(b"Hello, UDP Client!", addr)

UDP 客户端

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b"Hello, UDP Server!", ('127.0.0.1', 8888))
data, addr = client.recvfrom(1024)
print(f"收到数据: {data.decode()}")
client.close()

7. 总结

TCP 适合对可靠性要求高的场景,如文件传输、网页浏览。

UDP 适合对实时性要求高的场景,如视频流、在线游戏。

选择 TCP 还是 UDP 取决于应用的具体需求。


http://www.niftyadmin.cn/n/5869645.html

相关文章

ALM研发管理:全新甘特图,让项目管理更高效

在软件开发领域,甘特图一直是项目管理的重要工具。通过可视化的任务时间线,清晰地展示项目的进度和关键时间节点,帮助团队成员快速理解项目状态,协调工作进度,从而有效提升项目管理的效率。无论是需求分析、设计、开发…

自然语言处理:初识自然语言处理

介绍 大家好,博主又来给大家分享知识了。从这次开始,博主给大家分享自然语言处理这个领域的内容。这也是博主非常感兴趣的研究领域。 最开始,博主计划在自然语言处理系列的第一篇博文中,和大家聊聊文本规范化这个话题。毕竟在自…

AI大模型-提示工程学习笔记20-多模态思维链提示

目录 1. 多模态思维链提示的核心思想 (1) 单模态 CoT 的局限性 (2) Multimodal CoT 的解决方案 2. Multimodal CoT 的工作流程 (1) 多模态输入 (2) 特征提取 (3) 多模态融合 (4) 思维链生成 (5) 答案生成 3. Multimodal CoT 的关键组件 (1) 大语言模型 (LLM) (2) 多…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter24-网络请求与远程资源

二十四、网络请求与远程资源 网络请求与远程资源 2005 年,Jesse James Garrett 撰写了一篇文章,“Ajax—A New Approach to Web Applications”。这篇文章中描绘了一个被他称作 Ajax(Asynchronous JavaScriptXML,即异步 JavaScrip…

计算机毕业设计SpringBoot+Vue.js汽车销售网站(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

如何最小化Spark中的Shuffle开销

在Spark中,Shuffle是指数据在不同节点之间重新分配的过程,这个过程通常会涉及大量的数据传输和磁盘读写,消耗大量的计算和网络资源,因此是Spark作业中的一个性能瓶颈。为了最小化Spark中的Shuffle开销,可以采取以下策略…

信息系统的安全防护

文章目录 引言**1. 物理安全****2. 网络安全****3. 数据安全****4. 身份认证与访问控制****5. 应用安全****6. 日志与监控****7. 人员与管理制度****8. 其他安全措施****9. 安全防护框架**引言 从技术、管理和人员三个方面综合考虑,构建多层次、多维度的安全防护体系。 信息…

svg实现上下波浪效果

效果图&#xff1a; 源码&#xff1a; <svg class"elementor-shape-- Y" xmlns"http://www.w3.org/2000/svg" viewBox"0 0 1000 100" preserveAspectRatio"none"><path class"elementor-shape-fill--" opacity&qu…