TCP连接建立与释放(三次握手、四次挥手)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Qiana_/article/details/81939921

TCP协议的工作原理:TCP连接建立、报文传输、TCP连接释放。

1.TCP连接建立:三次握手

(1)最初客户端TCP进程是处于“CLOSE”(关闭)状态。当客户端准备发起一次TCP连接,进入“SYN-SEND”(准备发送)状态时,它会向处于“LISTEN”(收听)状态的服务器端TCP进程发送第一个控制位SYN=1的“连接建立请求报文”。

“连接建立请求报文”是不携带任何数据字段的,但是需要给报文一个序号。图中标为:SYN=1 , seq=x

注意:“连接建立请求报文”的序号seq的值x是随机产生的,且不能为0.

为什么 x 不能为0?

避免因TCP连接非正常断开而可能引起的混乱。如果在连接突然中断时,可能有一个或两个进程同时等待对方的确认应答,而这个时候有一个新连接的序号也是从0开始,那么接收进程有可能认为是对方重传的报文,这样就有可能造成连接过程的错误。

(2)服务器端在接收到“连接建立请求报文”后,如果同意建立连接,则向客户端发送第二个控制位 SYN=1, ACK=1的“连接建立请求确认报文”。确认号:ack=x+1,表示对第一个“连接建立请求报文”(seq=x)的确认。“连接建立请求确认报文”不携带任何数据字段,但需要给报文一个序号(seq=y)。这时,服务器进入“SYN-RCVD”(准备接收)状态。

图中标为:SYN=1,ACK=1,ack=x+1, seq=y

(3)在接收到“连接建立请求确认报文”之后,客户端发送第三个控制位ACK=1 的“连接建立请求确认报文”。

由于该报文是对“连接建立请求确认报文”(seq=y)的确认,因此确认号为:seq=y+1. 同样,“连接建立请求确认报文”不携带任何数据字段,需要给报文一个序号。而TCP协议规定,这个报文的序号依然为seq=x+1。这时,客户端进入“ESTABLISHED”(已建立连接)状态。服务器在接收到“ACK”报文之后也进入“ESTABLISHED”(已建立连接)状态。

图中标为:ACK=1, ack=y+1 , seq = x+1

经过“三次握手”之后,客户进程与服务器进程之间建立了TCP连接。

2. 报文传输

当客户进程与服务器进程之间的TCP传输连接建立之后,客户端的应用进程与服务器端的应用进程就可以使用这个连接,进行全双工的字节流传输。

为了保证TCP工作正常、有序的进行,TCP设置了保持计时器(keep timer),用来防止TCP连接处于长时间空闲。如果客户端建立到服务器端的连接,传输一些数据,然后停止传输,可能是这个客户端出故障。在这种情况下,这个连接将永远处于打开状态。为解决这个问题,在多数实现中都在服务器端设置保持计数器。当服务器端收到客户端的报文时,就将保持计数器复位。如果服务器端过了设定的时间没有收到客户端的消息,就将计数器复位。如果服务器端过了设定的时间没有收到客户端的消息,它就会发送探测报文。如果发送10个探测报文(每一个相隔75秒)还没有相应,就假设客户端出现故障,进而终止该连接。

3.TCP连接释放(四次挥手)

TCP传输连接的释放过程较复杂,客户与服务器都可以主动的提出连接释放请求。

以下以客户端主动提出连接释放请求为例,讲解过程:

(1)当客户端准备结束一次数据传输,主动提出释放TCP连接时,进入“FIN-WAIT-1”(释放等待-1)状态。它向服务器端发送第一个控制位 FIN=1 的“连接释放请求报文”,提出连接释放请求,停止发送数据。“连接释放请求报文”不携带任和的数据字段,需要给报文加 一个序号 seq=u,u等于客户端发送的最后一个字节的序号加1.

图中标为:FIN=1, seq=u

(2)服务器在接收到“连接释放请求报文”之后,需要向客户端发回“连接释放请求确认报文”ACK,确认号: ack=u+1,表示对第一连接释放请求报文的确认。这个报文的序号seq=v ,v等于服务器发送的最后一个字节序号加1.

图中标为:ACK=1, acku+1, seq=v

TCP服务器向高层应用进程通知客户请求释放TCP连接,此时客户到服务器的TCP连接断开,但服务器到客户的TCP连接还没有断开,如果服务器还有数据报文需要发送,它还可以继续发送直至完毕。这种状态称为“半关闭(helf-close)”。这个状态需要持续一段时间。客户在接收到服务器发送的“ACK”确认报文之后,进入“FIN-WAIT-2”(等待释放-2),服务器进入“CLOSE-WAIT”(关闭等待)。

(3)服务器的高层应用程序已经没有数据需要发送时,它会通知TCP可以释放连接,这时服务器向客户发送“连接释放请求报文”。这个“连接释放请求报文”的序号取决于在“半关闭”状态时,服务器是否发送过数据报文。可以假定序号为w。

图中标为:FIN=1, ACK=1, ack=u+1, seq=w.

此时服务器处于“LAST-ACK”(最终确认)状态。

(4)客户在收到"FIN"请求后,向服务器端 发送“连接释放请求确认报文”,表示对服务器“连接释放请求”的确认。

图中ACK报文记作:ACK=1, seq=u+1,ack=w+1

4.时间等待计时器的作用

为了保证TCP连接释放过程正常的记性,TCP设置了时间等待计时器(TIME-WAIT timer)。当TCP关闭一个连接时,它并不认为这个连接马上就真正地关闭。这时,客户端进入“TIME-WAIT”状态,需要再等两个最长报文寿命(MSL)时间之后,才能真正进入“CLOSE”状态。

总结:

客户端与服务器端建立连接需要三次握手,释放连接需要四次挥手。设计如此复杂的建立与释放,就是为了保证数据的可靠传输,使用确认机制检查数据是否安全和完整地到达。客户端与服务器端经过“四次挥手”之后,确认双方已经同意释放连接,客户端仍然需要采取延迟2MSL时间,确保服务器在最后阶段发送给客户端的数据,以及客户端发送给服务器的最后一个ACK报文都能正确地被接收,防止因个别报文传输错误导致连接释放失败。

猜你喜欢

转载自blog.csdn.net/Qiana_/article/details/81939921