计算机网络三次握手和四次挥手

Posted 久病成良医

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机网络三次握手和四次挥手相关的知识,希望对你有一定的参考价值。

三次握手


SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,

三次握手就是建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的主要作用就是为了确认双方的发送和接受能力是否正常、并指定自己的初始化序列号为后面的可靠性传输做准备。

初始状态:客户端处于close关闭状态,服务器处于listen监听状态。

第一次握手:客户端发送请求报文将同步序列号SYN=1和初始化序列号seq=x发送给服务器,发送完之后客户端处于SYN_SEND(发送等待)状态。

第二次握手:服务器收到客户端的SYN报文之后,会以自己的同步序列号SYN=1、初始化序列号seq=y和确认号ACK=1和确认序列号ack=x+1报文作为应答,然后服务器处于SYN_RECEIVE(确认接收)状态。(将客户端的初始化序列号+1作为ack值,表示自己已经接收到了客户端的SYN)
(在两次握手之后呢,从客户端的角度考虑,我的发送和接受都正常,服务器的发送和接受也都正常。但是从服务器的角度考虑,我的接受正常,但是我不清楚我的发送和客户端的接受是否正常,所以就需要第三次握手)

第三次握手:客户端接收到服务端的SYN+ACK之后,向服务器发送确认包ACK(ack=y+1),发送完毕之后客户端进入确认连接状态,服务器接收到ACK报文后,服务器也进入确认连接状态,此时,双方建立起了连接。

四次挥手


建立一个连接需要三次握手,而终止一个连接要经过四次挥手。这是由TCP的半关闭造成的。半关闭其实就是TCP提供了连接的一端在结束它的发送后还能接受来自另外一端数据的能力。

初始状态:客户端和服务器都处于Established连接状态。

第一次挥手:无论是客户端还是服务器都可以发起,因为TCP是全双工的。
客户端发送一个FIN报文,在报文中指定一个序列号。也就是告诉服务器,客户端的所有数据已经全发完了,服务器你可以关闭接收了。但是如果你们服务器有数据要发给客户端,那客户端是照样可以接收的。此时客户端处于FIN_WAIT1(终止等待)状态。

第二次挥手:服务器收到FIN之后,知道客户端没有数据要发给自己了,就会发送ACK报文,且把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务器处于CLOSE_WAIT(关闭等待)状态。

第三次挥手:如果服务器想断开连接了,和客户端的第一次挥手一样,发送FIN报文且指定一个序列号,告诉客户端,服务器的所有数据发送完毕,客户端你可以关闭接收了,此时服务器处于LAST_ACK状态,来等待确认客户端是否收到了自己的请求。
(没收到的话,服务器不知道客户端是不是挂掉了还是怎么回事,所以服务器不敢关闭自己的接受能力,于是第四次就来了)

第四次挥手:客户端收到FIN之后,一样会发一个ACK报文作为应答,此时客户端并没有进入到CLOSED状态,而是处于TIME_WAIT状态。在有一个2倍MSL的延迟等待以确保服务器收到了自己的ACK报文之后才会进入CLOSED状态。服务器收到ACK报文之后呢也处于CLOSED状态。此时,双方终止连接。

以上是关于计算机网络三次握手和四次挥手的主要内容,如果未能解决你的问题,请参考以下文章

网络 之 三次握手&四次挥手 介绍

TCP三次握手和四次挥手

三次握手和四次挥手

TCP三次握手与四次挥手

python网络编程三次握手和四次挥手

[转帖]脑残式网络编程入门:跟着动画来学TCP三次握手和四次挥手