当前位置:实例文章 » 其他实例» [文章]计算机网络 三次握手 四次挥手(面试必问!!!)

计算机网络 三次握手 四次挥手(面试必问!!!)

发布人:shili8 发布时间:2024-12-24 08:25 阅读次数:0

**计算机网络:三次握手与四次挥手**

在计算机网络中,连接建立和断开是两个非常重要的过程。TCP(传输控制协议)是一种面向连接的协议,它需要在客户端和服务器之间建立一个可靠的连接,以便数据可以安全地传输。在这个过程中,三次握手和四次挥手是两个关键步骤。

**三次握手**

三次握手是TCP连接建立的过程。它确保了双方都同意使用某种特定的协议来传输数据。下面是三次握手的详细过程:

1. **第一次握手**:客户端发送一个 SYN(同步序列号)包到服务器,包含一个随机生成的序列号(seq_num)。这个包的目的地是服务器的IP地址和端口号。

c// 客户端代码示例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);

int sockfd = socket(AF_INET, SOCK_STREAM,0);
send(sockfd, "SYN", strlen("SYN"),0, (struct sockaddr*)&server_addr);


2. **第二次握手**:服务器接收到客户端的 SYN 包后,会回复一个 SYN-ACK(同步确认)包给客户端。这个包中包含了一个随机生成的序列号(ack_num),以及一个确认码(seq_num)。

c//服务器代码示例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);

int sockfd = socket(AF_INET, SOCK_STREAM,0);
recv(sockfd, "SYN", strlen("SYN"),0, (struct sockaddr*)&client_addr);

send(sockfd, "SYN-ACK", strlen("SYN-ACK"),0, (struct sockaddr*)&client_addr);


3. **第三次握手**:客户端接收到服务器的 SYN-ACK 包后,会回复一个 ACK(确认)包给服务器。这个包中包含了一个确认码(ack_num),以及一个随机生成的序列号(seq_num)。

c// 客户端代码示例recv(sockfd, "SYN-ACK", strlen("SYN-ACK"),0, (struct sockaddr*)&server_addr);

send(sockfd, "ACK", strlen("ACK"),0, (struct sockaddr*)&server_addr);


**四次挥手**

四次挥手是TCP连接断开的过程。它确保了双方都同意关闭连接,并释放资源。在这个过程中,客户端和服务器会交换四个包来完成断开。

1. **第一次挥手**:客户端发送一个 FIN(结束)包到服务器,表示自己要关闭连接。

c// 客户端代码示例send(sockfd, "FIN", strlen("FIN"),0, (struct sockaddr*)&server_addr);


2. **第二次挥手**:服务器接收到客户端的 FIN 包后,会回复一个 ACK(确认)包给客户端。

c//服务器代码示例recv(sockfd, "FIN", strlen("FIN"),0, (struct sockaddr*)&client_addr);

send(sockfd, "ACK", strlen("ACK"),0, (struct sockaddr*)&client_addr);


3. **第三次挥手**:服务器发送一个 FIN(结束)包到客户端,表示自己要关闭连接。

c//服务器代码示例send(sockfd, "FIN", strlen("FIN"),0, (struct sockaddr*)&client_addr);


4. **第四次挥手**:客户端接收到服务器的 FIN 包后,会回复一个 ACK(确认)包给服务器。

c// 客户端代码示例recv(sockfd, "FIN", strlen("FIN"),0, (struct sockaddr*)&server_addr);

send(sockfd, "ACK", strlen("ACK"),0, (struct sockaddr*)&server_addr);


以上就是三次握手和四次挥手的详细过程。通过这些步骤,客户端和服务器可以建立一个可靠的连接,并在需要时关闭连接。

其他信息

其他资源

Top