【Linux】Tcp协议的通讯流程,浅谈三次握手四次挥手
发布人:shili8
发布时间:2025-02-25 18:14
阅读次数:0
**Linux下的TCP协议通信流程**
TCP(Transmission Control Protocol)是Internet上一种常用的传输控制协议,它提供可靠的连接式通信服务。下面我们将浅谈TCP协议的通讯流程,包括三次握手和四次挥手。
### 三次握手当客户端和服务器之间需要建立一个TCP连接时,就会进行三次握手(Three-Way Handshake)。这个过程保证了双方都同意并准备好通信。
#### 第一次握手(SYN)
1. **客户端**:发送一个 SYN包到服务器,包含自己的序列号(Sequence Number)和初始序列号(Initial Sequence Number, ISN)。
2. **服务器**:接收到 SYN包后,会回复一个 SYN-ACK包给客户端,包含自己的序列号和初始序列号。
c// 客户端代码示例int client_socket = socket(AF_INET, SOCK_STREAM,0); struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); sendto(client_socket, "SYN包内容", strlen("SYN包内容"),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
c//服务器代码示例int server_socket = socket(AF_INET, SOCK_STREAM,0); struct sockaddr_in client_addr; client_addr.sin_family = AF_INET; client_addr.sin_port = htons(8080); inet_pton(AF_INET, "127.0.0.1", &client_addr.sin_addr); recvfrom(server_socket, "SYN-ACK包内容", strlen("SYN-ACK包内容"),0, (struct sockaddr*)&client_addr, sizeof(client_addr));
#### 第二次握手(SYN-ACK)
3. **客户端**:接收到 SYN-ACK包后,会回复一个 ACK包给服务器,确认自己的序列号和初始序列号。
c// 客户端代码示例sendto(client_socket, "ACK包内容", strlen("ACK包内容"),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
#### 第三次握手(ACK)
4. **服务器**:接收到 ACK包后,会回复一个 ACK包给客户端,确认自己的序列号和初始序列号。
c//服务器代码示例sendto(server_socket, "ACK包内容", strlen("ACK包内容"),0, (struct sockaddr*)&client_addr, sizeof(client_addr));
### 四次挥手当通信完成后,需要进行四次挥手(Four-Way Handshake)来关闭TCP连接。
#### 第一次挥手(FIN)
1. **客户端**:发送一个 FIN包到服务器,表示自己准备好关闭连接。
2. **服务器**:接收到 FIN包后,会回复一个 ACK包给客户端,确认自己的序列号和初始序列号。
c// 客户端代码示例sendto(client_socket, "FIN包内容", strlen("FIN包内容"),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
#### 第二次挥手(ACK)
3. **客户端**:接收到 ACK包后,会回复一个 ACK包给服务器,确认自己的序列号和初始序列号。
c// 客户端代码示例sendto(client_socket, "ACK包内容", strlen("ACK包内容"),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
#### 第三次挥手(FIN)
4. **服务器**:接收到 ACK包后,会回复一个 FIN包给客户端,表示自己准备好关闭连接。
c//服务器代码示例sendto(server_socket, "FIN包内容", strlen("FIN包内容"),0, (struct sockaddr*)&client_addr, sizeof(client_addr));
#### 第四次挥手(ACK)
5. **客户端**:接收到 FIN包后,会回复一个 ACK包给服务器,确认自己的序列号和初始序列号。
c// 客户端代码示例sendto(client_socket, "ACK包内容", strlen("ACK包内容"),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
以上就是Linux下的TCP协议通信流程的浅谈,包括三次握手和四次挥手。