TCP连接图示

通常情况下:一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;  2、数据传送;  3、TCP四次挥手;

3种信号

SYN:(同步序列编号,Synchronize Sequence Numbers) 该标志仅在三次握手建立TCP连接时有效,表示一个新的TCP连接请求。

ACK:(确认编号,Acknowledgement Number) 是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。

FIN:(结束标志,FINish) 用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。

11种状态

LISTEN:侦听来自远方的TCP端口的连接请求

SYN-SENT:在发送连接请求后等待匹配的连接请求(客户端)

SYN-RECEIVED:在收到和发送一个连接请求后等待对方对连接请求的确认(服务器)

ESTABLISHED:代表一个打开的连接

FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认

FIN-WAIT-2:从远程TCP等待连接中断请求

CLOSE-WAIT:等待从本地用户发来的连接中断请求

CLOSING:等待远程TCP对连接中断的确认

LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认

TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED:没有任何连接状态

状态变化

建立连接时的状态变迁

建立连接之前,服务器和客户端的状态都为CLOSED。

服务器创建socket后开始监听,变为LISTEN状态。

客户端请求建立连接,向服务器发送SYN报文,客户端的状态变为SYN_SENT。

服务器收到客户端的报文后向客户端发送ACK和SYN报文,此时服务器的状态变为SYN_RCVD。

客户端收到ACK、SYN,就向服务器发送ACK,客户端状态变为ESTABLISHED,服务器收到客户端的ACK后也变为ESTABLISHED。

此时,3次握手完成,连接建立!

断开连接时的状态变迁

由于tcp连接是全双工的,断开连接会比建立连接麻烦一点。

客户端先向服务器发送FIN报文,请求断开连接,其状态变为FIN_WAIT1。

服务器收到FIN后向客户端发生ACK,服务器状态变为CLOSE_WAIT。

客户端收到ACK后就进入FIN_WAIT2状态。

此时连接已经断开了一半了,如果服务器还有数据要发送给客户端,就会继续发送。

直到发完了,就发送FIN报文,此时服务器进入LAST_ACK状态。

客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态,再过了2MSL长的时间后进入CLOSED状态。

服务器收到客户端的ACK就进入CLOSED状态。

此时,4次挥手完成,连接断开!

图示

TIME_WAIT状态的形成只发生在主动关闭连接的一方。 

MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

建立连接为什么要三次握手

1.为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误。

这种情况是,client端发出的第一个连接请求并没有丢失,但是因为某些网络原因在某个网络节点上发生滞留,没有立即到达server端,而是在client端把连接释放以后的某个时间才到达server端。

本来这是一个早已失效的报文段,但是server收到此失效的报文之后,会误认为是client再次发出的一个新的连接请求,于是server就向client又发出确认报文,表示同意建立连接。

如果不采用“三次握手”,那么只要server端发出确认报文就会认为新的连接已经建立了,但是client端并没有发出建立连接的请求,因此不会去向server端发送数据,server端没有收到数据就会一直等待,这样server端就会白白浪费掉很多资源。

如果采用“三次握手”的话,server端在收到连接请求报文后会向client端发出确认,且需要client端再次向server端返回确认,这样如果是失效连接请求的话,client端就不会返回确认,server收不到确认,也就不会建立连接,避免浪费资源。

2.保证信道数据传输的可靠性

信道是不可靠的,但是我们要建立可靠的连接发送可靠的数据,也就是数据传输是需要可靠的。在这个时候三次握手是一个理论上的最小值,并不是说是tcp协议要求的,而是为了满足在不可靠的信道上传输可靠的数据所要求的。

经过了三次握手,双方确认了两边都是通的,可以相互通信了,已经可以建立一个可靠的连接,并且可以相互发送数据。如果再发送第四次确认消息的话,就浪费资源了。

断开连接为什么要四次挥手

保证通信双方数据都发送完毕。

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;

当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;

当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后主机1返回ACK报文,彼此就会愉快的中断这次TCP连接。

为什么要等待2MSL

1.保证A发送的最后一个ACK报文能够到达B,全双工连接能够可靠关闭。

A发送的最后一个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,如果A发送完ACK报文段后就立即释放连接接,就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常的步骤进入CLOSED状态。所以A需要等待一段时间,当再次收到FIN+ACK报文段的时候,能够保证对方收到ACK,以正常关闭连接。

2.保证本次连接所产生的所有报文段都从网络中消失。

如果A直接关闭的话,那A再次发起的新连接有可能和旧连接是同一个端口号,这样如果旧连接仍然有某些数据滞留在网络中的话,TCP协议会认为这些数据是属于新连接的,就会和真正的新连接的数据包发生混淆,所以TCP连接在关闭时会等待2MSL,以保证本次连接的所有数据都从网络中消失。

posted on 2020-12-15 17:21  流年似水zlw  阅读(718)  评论(0)    收藏  举报

导航