UDP(用户数据报协议)和 TCP(传输控制协议)

2024-08-23 19:12

本文主要是介绍UDP(用户数据报协议)和 TCP(传输控制协议),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UDP(用户数据报协议)和 TCP(传输控制协议)是两种常用的传输层协议,各自适用于不同的应用场景。以下是对这两种协议及其常用函数和知识点的总结。

一、UDP(用户数据报协议)
UDP 是一种无连接、不可靠的传输协议,适用于需要快速传输且对可靠性要求不高的应用,如视频流、游戏等。

1. UDP 的特点:
- 无连接:UDP 发送数据时不需要建立连接。
- 不可靠传输:不保证数据到达和顺序,不提供重传机制。
- 面向消息:发送的消息是一个独立的包,不拆分也不合并。

 2. 常用函数:
- `socket()`:创建 UDP 套接字。
  
  int socket(int domain, int type, int protocol);
  
  - `domain`:协议族(如 AF_INET)。
  - `type`:套接字类型(UDP 使用 SOCK_DGRAM)。
  - `protocol`:通常为 0,系统自动选择协议。

- `bind()`:绑定套接字到本地地址和端口。
  
  int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  
  - `sockfd`:套接字描述符。
  - `addr`:本地地址结构。
  - `addrlen`:地址结构的长度。

- `sendto()`:发送数据到指定的地址。
  
  ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
  
  - `sockfd`:套接字描述符。
  - `buf`:要发送的数据。
  - `len`:数据长度。
  - `dest_addr`:目标地址结构。

- `recvfrom()`:从套接字接收数据。
  
  ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
  
  - `buf`:存放接收到的数据。
  - `src_addr`:发送方地址结构。

3. 使用 UDP 的流程:
1. 创建套接字 (`socket`)。
2. 对于服务器,绑定套接字到指定的地址和端口 (`bind`)。
3. 使用 `sendto` 发送数据或 `recvfrom` 接收数据。
4. 关闭套接字 (`close`)。

二、TCP(传输控制协议)
TCP 是一种面向连接、可靠的传输协议,适用于对数据传输可靠性要求较高的场景,如网页浏览、文件传输等。

1. TCP 的特点:
- 面向连接:通信前需要建立连接(三次握手)。
- 可靠传输:保证数据到达、顺序和完整性,提供重传机制。
- 流控和拥塞控制:确保网络的稳定性和高效性。

2. 常用函数:
- `socket()`:创建 TCP 套接字。

  int socket(int domain, int type, int protocol);

  - 与 UDP 类似,只是 `type` 使用 `SOCK_STREAM`。

- `bind()`:绑定套接字到本地地址和端口。
  - 与 UDP 中的 `bind` 相同。

- `listen()`:将套接字设置为被动监听模式,等待连接。
  
  int listen(int sockfd, int backlog);
  
  - `backlog`:未完成连接的队列大小。

- `accept()`:接受连接请求,创建新的套接字。
  
  int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  
  - `addr`:存放客户端地址。
  - `addrlen`:地址结构的长度。

- `connect()`:客户端发起连接请求。
  
  int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  
  - `addr`:服务器地址。

- `send()`:向已连接的套接字发送数据。
  
  ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  

- `recv()`:从已连接的套接字接收数据。
  
  ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  

3. 使用 TCP 的流程:
服务器端:
1. 创建套接字 (`socket`)。
2. 绑定套接字到指定的地址和端口 (`bind`)。
3. 设置套接字为监听模式 (`listen`)。
4. 接受客户端连接 (`accept`)。
5. 使用 `send` 和 `recv` 进行数据通信。
6. 关闭连接 (`close`)。

客户端:
1. 创建套接字 (`socket`)。
2. 连接到服务器 (`connect`)。
3. 使用 `send` 和 `recv` 进行数据通信。
4. 关闭连接 (`close`)。

三、UDP 与 TCP 的对比
- 连接:UDP 是无连接的,TCP 是面向连接的。
- 可靠性:UDP 不保证数据到达和顺序,TCP 保证数据的完整性和顺序。
- 速度:UDP 速度快,适合实时应用;TCP 较慢,但提供可靠的传输。
- 数据传输:UDP 是面向消息的,不拆分和重组;TCP 是面向字节流的,会根据需要进行拆分和重组。

这篇关于UDP(用户数据报协议)和 TCP(传输控制协议)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100252

相关文章

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模