目录
1.TCP通信包含那几步?
TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道
上图主要包括三部分:“ 建立连接、传输数据、断开连接。”
- 建立TCP连接,也就是通过三报文握手来建立TCP连接。
- 传输数据,也就是基于已建立的TCP连接进行可靠的数据传输。
- 断开连接,也就是在数据传输结束后,还要通过四报文挥手来断开TCP连接。
为了建立连接TCP连接,通信双方必须从对方了解如下信息:
- 对方报文发送的开始序号。
- 对方发送数据的缓冲区大小。
- 能被接收的最大报文段长度MSS。
- 被支持的TCP选项。
2.三次握手
- 主动发起TCP连接建立称为TCP客户(client)。
- 被动等待TCP连接建立的应用进程称为TCP服务器(server)。
我们可以将TCP建立连接的过程比喻为”握手“,“握手”需要在TCP客户端和服务器之间交换三个TCP报文段。
三次握手过程:
- 第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
- 第二次握手:服务器收到SYN包,必须确认客户端的SYN(ACK=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RCVD状态;ACK:确认字符(Acknowledge character)。
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED (TCP连接成功)状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
3.四次挥手断开连接
TCP连接的断开需要发送四个包,所以称为四次挥手。
对于一个已经建立的连接,TCP使用改进的四次挥手来释放连接(使用一个带有FIN附加标记的报文段)。
四次挥手过程:
- 第一次挥手:客户端发送一个FIN标记的包(seq=x+2),告诉服务器需要关闭连接,表示自己不用发送数据了,但是还可以接收数据。发送完成后,再发送ACK标记的确认包(ACK=y+1),客户端进入FIN_WAIT_1状态。
- 第二次挥手:服务端发送一个ACK的确认包(ACK=x+3),告诉客户端接收到关闭的请求,但是还没有准备好。发送完成后,服务端进入CLOSE_WAIT状态,客户端收到这个包后,进入FIN_WAIT_2,等待服务器关闭连接。
- 第三次挥手:服务端准备好关闭连接时,发送FIN标记的包(seq=y+1),告诉客户端准备关闭了。发送完成后,服务端进入LAST_ACK状态,等待客户端确认。
- 第四次挥手:客户端接收到服务端的关闭请求,再发送ACK标记的确认包(ACK=y+2),进入TIME_WAIT状态,等待服务端可能请求重传的ACK包。服务端接收到ACK包后,关闭连接,进入CLOSED状态。
TIME_WAIT状态
TCP协议规定,主动关闭连接的一方要处于TIME_ WAIT状态,等待两个MSL(最大报文生存周期)的时间后才能回到CLOSED状态。
TIME_WAIT持续存在2MSL的话,就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启,可能会收到来自上一个进程的迟到的数据,但是这种数据很可能是错误的)。
同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个 FIN。这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK。