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

【网络】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 取决于应用的具体需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux提权之docker提权(十三) 链接第八篇完整版

书接上回 实验环境一样的 第八篇 我们用ssh密钥登陆后 发现我们web1的权限 当我们拿到web1的权限时 我们无法提权(这里我用的继续十二的环境 大家也可以继续) 所以我们首先要提权(当然必须是一个完整的 tty shell 不会的 我们去看第二篇 当然我下边也给你表注明了) python3…

Docker启动ES容器打包本地镜像

文章目录 1、安装 Docker2、下载镜像3、查看已下载的镜像4、 保存和加载镜像5、.tar 文件与 Docker 镜像的关系6、如何从 .tar 文件加载 Docker 镜像7、为什么需要 .tar 文件?8、ES 8.x版本无法启动8.1 问题原因8.2 解决方案8.3 提交容器为新镜像 1、安装 Docker 如…

C#开发的Base64编码及解码完整源码及注意事项

在软件开发时,经常用Base64编码和解码功能。本文介绍一个简单易用的Base64 编码和解码工具,顾名思义,就是简单快捷地进行 Base64 代码的解码或编码操作。您的数据可以轻松地编码为 Base64 编码,也可以解码为可读的格式。传输数据时…

使用OpenCV实现帧间变化检测:基于轮廓的动态区域标注

在计算机视觉中,帧间差异检测(frame differencing)是一种常用的技术,用于检测视频流中的动态变化区域。这种方法尤其适用于监控、运动分析、目标追踪等场景。在这篇博客中,我们将通过分析一个基于OpenCV的简单帧间差异…

夜莺监控 - 边缘告警引擎架构详解

前言 夜莺类似 Grafana 可以接入多个数据源,查询数据源的数据做告警和展示。但是有些数据源所在的机房和中心机房之间网络链路不好,如果由 n9e 进程去周期性查询数据并判定告警,那在网络链路抖动或拥塞的时候,告警就不稳定了。所…

【QT 一 | 信号和槽】

Qt5基本模块 Qt Creator 中的快捷键 • 注释:ctrl / • 运⾏:ctrl R • 编译:ctrl B • 字体缩放:ctrl 鼠标滑轮 • 查找:ctrl F • 整行移动:ctrl shift ⬆/⬇ • 帮助⽂档:F1 • 自动…

Ubuntu本地使用AnythingLLM

1.介绍 AnythingLLM是一个全栈应用程序,由Mintplex Labs Inc.开发,旨在将任何文档、资源或内容片段转换为大语言模型(LLM)在聊天中可以利用的相关上下文。 2.在ubuntu本地安装 打开终端并运行: curl -fsSL https:/…

Rust学习总结之-枚举

枚举是一个很多语言都有的功能,不过不同语言中其功能各不相同但是要表达的意思是一致的,枚举就是对于一个事物可以穷举出所有可能得值。比如说人的性别就可以用枚举,男人和女人两种。下面我们来学习Rust中的枚举。 一:枚举定义 …

domain 网络安全 网络安全域

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 文章目录 1、域的概述 1.1、工作组与域1.2、域的特点1.3、域的组成1.4、域的部署概述1.5、活动目录1.6、组策略GPO 2、域的部署实验 2.1、建立局域网&#xf…

面试基础---深入解析 AQS

深入解析 AQS:从源码到实践,剖析 ReentrantLock 和 Semaphore 的实现 引言 在 Java 并发编程中,AbstractQueuedSynchronizer(AQS)是一个核心框架,它为构建锁和其他同步器提供了基础支持。ReentrantLock 和…

Harmony开发笔记(未完成)

一、感想 作为一名拥有11年经验的Android开发者,我亲历了Android从高速发展到如今面临“僧多粥少”的过程。技术的世界瞬息万变,没有一种技术能够让人依赖一辈子。去年初,我自学了鸿蒙系统,并顺利通过了鸿蒙官方的初级和高级认。…

计算机视觉(opencv-python)入门之常见图像处理基本操作(待补充)

图像预处理是计算机视觉任务中的关键步骤,它通过对原始图像进行处理,以提高后续图像分析、特征提取和识别的准确性。 示例图片 目录 常见图像预处理方法 灰度化处理 法一 法二 说明 切片截取部分图像数据 cv2.cvtColor() 颜色空间转换 cv2.spli…

设计模式Python版 备忘录模式

文章目录 前言一、备忘录模式二、备忘录模式示例1三、备忘录模式示例2 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a…

Linux红帽:RHCSA认证知识讲解(三)Linux基础指令与Vim编辑器的使用

Linux红帽:RHCSA认证知识讲解(三)Linux基础指令与Vim编辑器的使用 前言一、Linux基础指令二、Linux 文件系统层次结构概念三、通过路径指定文件四、使用命令行工具管理文件五、Vim 的安装方式六、Vim 的操作模式七、红帽建议掌握的 Vim 键和命…

auto.js例子之WebView多页面浏览器

"ui";ui.layout(<vertical><horizontal id"webs" layout_weight"1"></horizontal><button id"one" text"第一个" /><button id"two" text"第二个" /><button id"…

跨平台公式兼容性大模型提示词模板(飞书 + CSDN + Microsoft Word)

飞书云文档 CSDN MD编辑器 Microsoft Word 跨平台公式兼容方案&#xff1a; 一、背景痛点与解决方案 在技术文档创作中&#xff0c;数学公式的跨平台渲染一直存在三大痛点&#xff1a; 飞书云文档&#xff1a;原生KaTeX渲染与导出功能存在语法限制微软Word&#xff1a;Math…

HTTP 动态报错码的原因和解决方法

目录 1xx&#xff08;信息性状态码&#xff09; 2xx&#xff08;成功状态码&#xff09; 3xx&#xff08;重定向状态码&#xff09; 4xx&#xff08;客户端错误状态码&#xff09; 5xx&#xff08;服务器错误状态码&#xff09; 参考文章 以下是 HTTP 动态报错码的常见原…

Docker基础-常见命令

docker images -查看所有的本地镜像。 docker pull -把远端镜像拉取到本地。 docker rmi -删除镜像。 docker push -推到镜像仓库。 docker run -创建并运行容器&#xff08;自动化&#xff0c;如果发现镜像不存在会先去拉取&#xff0c; 拉取完了以后再去自动创建容器&am…

Spring MVC框架六:Ajax技术

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 简介 jQuery.ajax Ajax原理 结语 创作不易&#xff0c;希望能对大家给予帮助 想要获取更多资源? 点击链接获取

36. Spring Boot 2.1.3.RELEASE 中实现监控信息可视化并添加邮件报警功能

1. 创建 Spring Boot Admin Server 项目 1.1 添加依赖 在 pom.xml 中添加 Spring Boot Admin Server 和邮件相关依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-w…