TCP三次握手、四次挥手

    科技2022-08-14  108

    三次握手

    过程 1、客户端发送SYN包到服务器请求建立连接; 2、服务器接收到这个请求,如果有足够的资源,就允许连接,并发一个SYN+ACK包给客户端,告诉客户端允许建立连接; 3、客户端接收到服务器的SYN+ACK包后,发送一个ACK包给服务器,告诉服务器说我知道你允许建立连接了,这时才真正建立起连接。

    思考问题 1、为什么得三次握手,而不是一次、两次呢?

    假如只有一次握手,服务器不知道客户端是否可以正常接收数据,客户端也不知道服务器能否正常接收数据,有可能造成服务器资源的浪费。假如只有两次握手,只能确认服务器的接收和发送是正常的,但是服务器不知道客户端是否能够正常接收数据。假如只有两次握手,客户端第一次连接请求由于网络阻塞问题,滞后了,于是发起第二次请求并成功建立连接,数据传输完后断开连接,但是此时第一次连接又发送到了服务端,服务端发送确认请求包给客户端,客户端是不会应答的,所以会造成服务端开启一个没用的连接,浪费资源。

    四次挥手

    过程 1、当客户端数据传输已经完成时(也可以是服务器),就主动发送一个FIN包请求断开连接,进入FIN_WAIT状态 (终止等待) 。 2、服务器接收到客户端的FIN请求,就发送一个ACK包给客户端,同意断开连接,进入CLOSE_WAIT状态 (关闭等待) 。由于TCP是全双工的,所以服务器可能还有数据要传输给客户端。 3、当服务器数据传输完成时,发送一个FIN+ACK包给客户端,请求断开连接,进入LAST_ACK状态 (最后确认) 。 4、客户端接收到服务器的FIN+ACK包,发回ACK包给服务器,并进入等待状态 (TIME_WAIT) 。过了2MSL才真正关闭。

    思考问题 1、为什么是四次挥手?

    由于TCP连接是全双工的,客户端请求关闭,服务器同意关闭,但是服务器可能还有数据需要传输给客户端,所以只发送同意关闭请求;等到传输数据完成后,再发送关闭请求给客户端;服务器不知道客户端是否接收到了这个关闭请求,所以客户端得发送一个ACK请求给服务器,这才可以断开连接。

    2、为什么四次挥手需要等待2MSL?

    MSL概念:TCP报文在网络中最长存活时间等待发生在第四次挥手,客户端发送ACK给服务器时,就进入等待状态。如果客户端第四次挥手后发送的ACK包超时(即服务端不断发送FIN+ACK包给客户端),等到1个MSL过去了,也就是发送的ACK包失效了,就重新发送ACK包。服务器发送FIN+ACK包给客户端,这时最长也需要1MSL时间。2MSL指的就是一次发送和一次回复需要的最长时间。只要客户端在这2MSL内收到FIN+ACK包,就会重置计时器,继续等待2MSL。直到没有收到FIN+ACK包为止。由于MSL是报文在网络上最长存活时间,如果没有等待2MSL,关闭连接后又立马建立连接,使用的端口号是相同的,那么可能会导致新连接和旧连接传输的数据混淆,所以2MSL保证了这条连接上的所有数据都失效,保证了数据传输的正确性。

    3、如果已经建立了连接,但是客户端突然出现故障了怎么办?

    TCP连接会有一个保活计时器,服务端每收到一次客户端的数据包,就会重置这个计时器,如果超过计时器的时间,服务端还没收到客户端的数据包,就会发送探测报文段,75秒发送一次,连续发送10之后还没收到客户端的反应,则认为客户端故障并断开连接。

    发生重传的情况(ARQ协议)

    停止等待ARQ协议

    发送丢失或者报文出错

    当A第一次发送报文给B时,如果丢失了,或者B检测到报文有错误后丢弃,B都不会发送确认M1报文给A,这都会导致A重传M1。

    需要注意的是

    1、每一段报文都有一个超时计时器,只要在规定的时间内没有收到确认报文,就认为发送的报文被丢弃了,就会重新发送报文。 2、发送一个报文时,本地应该保存这段报文的副本,以便发生错误后重传报文。 3、发送报文和确认报文必须编号,以便知道哪个确认报文对应哪个发送报文。

    确认报文丢失 当确认M1报文丢失时,发送方也会重新发送报文,接收方接收到相同报文后,把新接收的报文丢弃,然后重发确认M1报文。

    确认报文接收超时

    由于网络阻塞,B发送的确认报文超时了,A就会重新发送M1报文给B,B接收到新的M1时即丢弃,然后重发确认报文给A。

    连续ARQ协议

    这个协议支持连续发送多个TCP数据包,再等待这些数据包的ACK包。它通常结合滑动窗口协议使用。

    接收方采用 累积确认 的方式进行应答,比如发送了 1、2、3个包,只需要发给客户端3的确认包,就认为1、2、3包都接收到了。

    缺点 实际上,1、2、3包可能中间丢失了2,所以服务端只能对1进行确认,后面的2、3包需要重新客户端重传,这就叫回退N机制。

    Processed: 0.009, SQL: 8