目录
1.认识TCP协议
2.TCP的三次握手
3.TCP的四次挥手
4.小结
1.挥手为什么需要四次?
2.2MSL等待状态
3.次挥手释放连接时,等待2MSL的意义
1.认识TCP协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义
- 面向连接:数据传输之前,客户端要和服务器进行连接。类似于打电话要先拨通号码进行接听
- 可靠的:据传输是有序的 要对数据进行校验
TCP的几个标志位:
- SYN: 表示建立连接
- FIN: 表示关闭连接
- ACK: 表示响应
- PSH: 表示有数据传输
- RST: 表示连接重置
2.TCP的三次握手
三次握手是一个形象的比喻,是TCP在进行连接的时候,客户端和服务器总共发的三次包,其主要目的就是确保客户端和服务器能进行正常的连接
握手前:
client的状态: CLOSE,server的状态:LISTEN
第一次握手:client将标志位SYN设置为1,随机产生一个值 seq = x,并将这个数据包发送给server,此时clien进入syn_sent状态,等待server确认
第二次握手:server收到数据包之后根据标志位SYN=1知道了client需要进行连接,此时server将SYN和ACK这两个标志位都设置为1,ack = x + 1,并且随机产生一个值 seq = y,并将这个数据包发送给client确认进行连接请求,此时server进入syn_rcvd状态
第三次握手:client收到确认后,检查ack = x + 1,ACK是否为1,如果正确就将标志位ACK设置为1,ack = y + 1,并将这个数据包发送给server,server检查ack是否为 y + 1,ACK是否为1,如果正确则连接建立成功,client进入established状态,完成三次握手,随后client和server之间便可以开始正常传输数据了
用一张图来描述这个过程就是:
3.TCP的四次挥手
建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力
注意:握手过程一定是客户端开始的,而挥手过程客户端和服务器均可!!!
第一次挥手:client发送一个 FIN,用来关闭client到server的数据传送,此时client进入fin_wait 状态
第二次挥手:server收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。这时候的TCP连接处于半关闭状态,此时客户端已经没有必要发送数据了,然而服务器如果要是发送数据,客户端还是得接受数据
第三次挥手:server发送一个 FIN ,用来关闭server到client的数据传输,此时server进入Last_ack状态
第四次挥手:client收到FIN后,client进入 Time_wait状态,接着发送一个ACK给server,确认序号为收到序号 +1,server进入closed状态,这时候就完成了四次挥手状态
用一张图来描述这个过程就是:
4.小结
1.挥手为什么需要四次?
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手
2.2MSL等待状态
TIME_WAIT状态也成为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段
3.次挥手释放连接时,等待2MSL的意义?
- 为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态
- 他还可以防止已失效的报文段。客户端在发送最后一个ACK之后,再经过经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器