关于TCP三次握手、四次挥手

TCP是提供面向连接的、可靠的通信传输,面向连接意味着使用TCP的两个应用(一般是客户端和服务端)在数据通信开始之前必须建立一个TCP连接。

一、TCP三次握手

TCP三次握手可以理解为建立一个TCP连接时需要客户端和服务端之间总共发送三个包来确立连接的建立。在socket编程中,这一过程是由客户端执行connect()来触发的。

关于TCP三次握手、四次挥手_第1张图片第一次握手
TCP客户端将标志位SYN置为1,随机产生一个seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。

第二次握手
TCP服务器端收到数据包后,由标志位SYN=1知道TCP客户端请求建立连接;服务器端将标志位SYN和ACK都置为1,ack=J + 1,随机产生一个seq=K,并将该数据包发送给Client端以确认连接请求,Server端进入SYN_RCVD状态。

第三次握手
Client端收到数据包后,首先检查ack是否等于J+1,ACK是否为1。如果正确则将标志位ACK置为1,ack=K + 1,并将该数据包发送给Server端,Server端检查ack为K+1,ACK为1后,则连接建立成功,客户端和服务器端都进入ESTABLISHED状态,即完成三次握手,随后客户端与服务器端之间就可以开始传输数据了。

二、TCP四次挥手

四次挥手意味着终止TCP连接,也就是说断开一个TCP连接时,客户端和服务段之间总共需要发送4个数据包以确认连接的断开。由于TCP连接是全双工的,所以,每一端都必须进行单独的关闭,这一原则是当一方发送完数据后,发送一个FIN来进行这一方向上的关闭,即终止这一方向的连接。收到一个FIN只代表着这一方向上没有数据流动了,不会再收到数据了,但在这个TCP连接上仍然能够发送数据,直到这一方也发送了FIN。中断连接端可以是任意一端,可以是客户端或者服务端。 在Socket编程中,这一过程是由客户端或服务端任一方执行close()来触发的。

中断连接端以客户端为例:
第一次挥手
客户端向服务器端发送一个FIN=M来终止客户端到服务器端这一方向上的数据传输,客户端进入FIN_WAIT_1状态。
这时候,客户端已经关闭向服务器端传送数据的通道,但是,如果服务器端还有数据没有传送完,还是可以继续传送。

第二次挥手

服务器端收到FIN后,向客户端发送ack=M + 1,表示告诉客户端:你发的请求我收到了,但我还没准备好,请你继续等待,我准备好再发送给你消息。服务器端进入CLOSE_WAIT状态。
这个时候,客户端进入FIN_WAIT2状态,继续等待服务器端发送的FIN报文。

第三次挥手

当服务器端确定数据传输已经完成,可以关闭连接的时候,向客户端发送FIN=N,告诉客户端:“我这边的数据传送完了,准备关闭连接了。”
这时候,服务器端进入LAST_ACK状态。

第四次挥手
客户端收到FIN=N报文后,就知道服务器端通知可以关闭连接了,但是他怕服务器端不知道要关闭,所以置ACK=1,ack=N + 1 发送给服务器端。当最后一个ACK包发出后,客户端进入TIME_WAIT 状态,如果服务器端没有收到ACK则可以重传;如果收到了,就知道可以断开连接了。客户端等待了2MSL(Maximum Segment Lifetime,中文译为“报文最大生存时间”)后,没有再收到服务器端发出的任何数据,就说明,服务器端已经正常关闭,进入CLOSED状态,这时候,客户端也关闭连接。

至此,完成四次挥手。

你可能感兴趣的:(计算机网络,socket,网络通信,tcpip)