当前位置:实例文章 » 其他实例» [文章]【Linux】Tcp协议的通讯流程,浅谈三次握手四次挥手

【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协议通信流程的浅谈,包括三次握手和四次挥手。

其他信息

其他资源

Top