TCP通信流程
TCP和UDP的区别
TCP(传输控制协议)
- 面向连接的:在数据传输之前,TCP 需要三次握手来建立连接。
- 可靠的传输:通过序列号、确认响应、重传机制、流量控制和拥塞控制来保证数据正确传输。
- 基于字节流:TCP 把应用层的消息视为一连串无结构的字节流。
- 支持单播传输:数据只能在单一的发送者和接收者之间传输。
- 首部开销较大:TCP 头部至少20个字节,包含了许多控制信息,如序列号、确认号、数据偏移、控制位、窗口、校验和等。
- 适用场景:适合要求高可靠性的应用,如文件传输、电子邮件、网页浏览等。
UDP(用户数据报协议)
- 面向无连接:发送数据之前不需要建立连接,减少了延时。
- 不可靠的传输:不提供数据到达确认,没有重传机制,也不进行数据顺序处理或重组。
- 面向数据报:每个UDP数据包都是独立传输的,包含完整的地址信息。
- 多种传输方式:支持单播、多播和广播传输。
- 首部开销较小:UDP头部只有8个字节,包括源端口、目的端口、长度和校验和。
- 适用场景:适合对传输速度要求高,但对数据完整性要求相对较低的应用,如视频会议、实时游戏、语音传输等。
比较
下表简单总结了TCP和UDP的主要区别:
| 特性 | TCP | UDP | 
|---|---|---|
| 是否创建连接 | 面向连接的 | 无连接 | 
| 是否可靠 | 可靠的 | 不可靠 | 
| 连接的对象个数 | 支持一对一 | 一对一、一对多、多对一、多对多 | 
| 传输的方式 | 面向字节流 | 面向数据报 | 
| 首部开销 | 最少20个字节 | 8个字节 | 
| 适用场景 | 可靠性高的应用(文件传输) | 实时应用(视频会议,直播) | 
通过这些特性的对比,可以根据具体的网络应用需求选择适合的传输协议。
 
 
TCP的服务端通信流程
-  创建一个用于监听的套接字 - 套接字是一个端点,用于进行网络通信。在服务器端,首先需要创建一个套接字来监听客户端的连接请求。(套接字其实就是一个文件描述符)
 
-  将监听套接字与本地的 IP 地址和端口绑定 - 服务器的 IP 地址和端口号定义了其在网络上的地址。绑定是将套接字与特定的 IP 地址和端口号关联的过程。
 
-  设置监听 - 设置套接字为监听模式,监听的fd开始工作, 准备接收来自客户端的连接请求。
 
-  阻塞等待客户端连接 - 服务器调用 accept函数,该函数会阻塞服务器直到一个客户端连接到达。当连接建立时,accept会返回一个新的套接字文件描述符,用于与该客户端进行通信。
 
- 服务器调用 
-  通信 - 使用得到的文件描述符进行数据的接收和发送。服务器可以根据需要读取客户端发送的数据,并发送响应。
 
-  通信结束,断开连接 - 通信完成后,服务器关闭连接套接字。
 
你的描述准确地概述了 TCP 客户端的基本通信流程。这里我会扩展你的说明,提供一个详细的解释,并给出如何在 C 语言中实现一个简单的 TCP 客户端的示例代码。
TCP 客户端通信流程
-  创建一个用于通信的套接字 - 客户端首先需要创建一个套接字,用于和服务器建立连接及后续的数据交换。(不需要绑定IP和端口号,端口号是随机的)
 
-  连接服务器 - 使用指定的服务器 IP 地址和端口号,客户端通过其套接字发起到服务器的连接请求。
 
-  通信 - 连接建立成功后,客户端可以通过套接字发送数据到服务器,并接收服务器回传的数据。
 
-  通信结束,断开连接 - 完成数据交换后,客户端应关闭套接字,结束与服务器的连接。
 
套接字函数
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> // 包含了这个头文件,上面两个就可以省略
-  int socket(int domain, int type, int protocol)- 功能:创建一个套接字。
- 参数: - domain:协议族,如- AF_INET(IPv4),- AF_INET6(IPv6),- AF_UNIX或- AF_LOCAL(本地套接字通信)。
- type:通信类型,如- SOCK_STREAM(流式协议,TCP),- SOCK_DGRAM(数据报协议,UDP)。
- protocol:具体协议,一般写- 0以选择默认协议。比如流式协议不止一种
 
- 返回值:成功返回文件描述符,失败返回 -1。
 
-  int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)- 功能:将文件描述符绑定到本地 IP 和端口。
- 参数: - sockfd:由- socket函数返回的文件描述符。
- addr:需要绑定的地址,包含 IP 和端口信息。
- addrlen:地址结构的大小。
 
- 返回值:成功返回 0,失败返回-1。
 
-  int listen(int sockfd, int backlog)- 功能:监听套接字上的连接。
- 参数: - sockfd:用于监听的文件描述符。
- backlog:未连接和已连接队列和 的最大长度。
 
- 返回值:成功返回 0,失败返回-1。
 
-  int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)- 功能:接收客户端连接。
- 参数: - sockfd:监听的文件描述符。
- addr:存储客户端地址信息。
- addrlen:地址结构的大小。
 
- 返回值:成功返回新的文件描述符,失败返回 -1。
 
-  int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)- 功能:客户端连接到服务器。
- 参数: - sockfd:用于通信的文件描述符。
- addr:服务器的地址信息。
- addrlen:地址结构的大小。
 
- 返回值:成功返回 0,失败返回-1。
 
-  write(int fd, const void *buf, size_t count)- 功能:向文件描述符写数据。
- 参数: - fd:文件描述符。
- buf:要写的数据缓冲区。
- count:要写的字节数。
 
- 返回值:成功返回写入的字节数,失败返回 -1。
 
-  read(int fd, void *buf, size_t count)- 功能:从文件描述符读数据。
- 参数: - fd:文件描述符。
- buf:存储读数据的缓冲区。
- count:要读取的字节数。
 
- 返回值:成功返回读取的字节数,失败返回 -1。