TCP三次握手:
第一次握手:
客户端将TCP报文标志位SYN置为1,随机生成序列号seq为J,发送给服务端,客户端进入SYN _SENT状态,等待服务端确认.
第二次握手:
服务端收到数据后,由SYN=1,知道这是建立连接的请求,服务端将TCP报文的标志位SYN,ACK都置为1,ack=J+1,随机生成序列号seq为K,发送报文给客户端确认连接请求,服务端进入SYN_RECV状态。
第三次握手:
客户端接收数据后,确认ACK是否为1,ack是否为J+1,确认完成将ACK置为1,ack置为K+1,服务端检查ACK是否为1,ack是否为K+1。如果正确则建立连接成功,双方都进入ESTABLISHDE状态,可以传输数据了。
TCP四次挥手
第一次挥手:
客户端将TCP报文标志位FIN置为1,序列号seq为M(M为前面传输的最后一个字节的序号加1),发送给服务端,客户端进入FIN_WAIT_1状态,此时表示客户端没有数据要发送了.
第二次挥手:
服务端收到数据后,由FIN=1,知道这是断开连接的请求,服务端将TCP报文的标志位ACK都置为1,ack=M+1,服务端处于CLOSE_WAIT状态。这个时候处于半关闭状态即客户端无数据发送,但是服务端有数据发送,客户端依然要接收。客户端收到服务端的确认请求后,处于FIN_WAIT_2状态,等待服务器发送断开连接报文.
第三次挥手:
服务端将TCP报文标志位FIN置为1,ack=M+1,序列号seq为K
,发送给客户端进行关闭连接,服务端进入LAST_ACK状态。
第四次挥手:
客户端收到TCP报文标志FIN=1时,向服务端发送TCP标志位ACK=1的确认报文,此时客户端进入TIME_WAIT状态,服务端收到客户端ACK确认消息之后立即进入CLOSED状态,而客户端此时TCP连接还未释放,需要等到2MSL后还未收到服务端消息则说明服务端已关闭,此时客户端才进入CLOSED状态.
术语说明:
SYN:连接建立时用于同步序号
FIN:用来释放一个连接
ACK:仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
seq:序列号,占4个字节,用来标记数据段的顺序
ack:确认号,占4个字节,期待收到对方下一个报文段的第一个数据字节的序号
MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间
常见问题:
1.为什么连接的时候是3次握手,断开的时候是4次挥手?
服务端收到关闭之后,可能还需要发送数据到客户端,所有先只能回复客户端的关闭确认,当服务端无数据传输的时候,再发送关闭报文到客户端,所以断开的时候比建立连接时多了一层交互.
2.为什么TIME_WAIT状态之后需要等待2MSL之后才转为CLOSED状态?
因为无法确认最后一个ACK是否丢失,TIME_WAIT状态用来重发丢失的ACK,为什么是等待2MSL,MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,客户端都没有再次收到服务端的重发,那么客户端推断ACK已经被成功接收,则结束TCP连接.