初步认识TCP协议——TCP状态转换图

初步认识TCP协议——TCP状态转换图_第1张图片

状态转换图如上,CLOSED状态是假想的,不是真正的状态。建立ESTABLISHED状态后即可发送报文,当SYN_RCVD是由LISTEN状态转变过来时,从SYN_RCVD才能回退到LISTEN状态,为什么呢?以下是我的理解:

LISTEN状态是被动打开的状态(属于服务器的状态),若SYN_RCVD状态是从SYN_SENT转换而来,意味着双方的应用程序都是主动打开的,都是客户端,而客户端是不存在LISTEN状态的。

主动关闭的TIME_WAIT时长为2MSL,MSL是指最大报文生存时间(是任何报文可在网络上存活的最长时间,超过这个时间,即使到达目的地也会被丢弃),设置这个阶段的目的是防止最后发送的ACK丢失,同时,处在这个状态的socket(由IP地址和端口号组成)不能被重用以建立新的连接。

若TCP是同时开放的(即双方都是主动开放),则要求双方的端口号都被另一方知道,最终的结果是只建立一条连接


为什么要将TIME_WAIT设置为2MSL?

以下均为个人理解:

这个数值非常的保守,极端来想,这个数值表示至少可以发送两次ACK,第一次发送ACK后进入TIME_WAIT,假设ACK丢失,经过MSL时间后ACK消失在网络中,此时被动关闭方重传FIN,此时在等待MSL时间,以确保能收到FIN(毕竟FIN的最长存活时间为MSL),然后发送ACK,此后主动关闭方就不管了(若被动关闭方一直没有收到ACK,则被动关闭方在FIN重传次数达到一定时会自动释放连接),直接释放连接。之所以说这个值很保守是因为TCP的重传计时器的值远小于MSL,在一个MSL时间里可能会重传多个FIN。

处于TIME_WAIT状态的端口并不是说不能建立连接,而是不能建立与之前相同的连接,即双方IP地址、双方端口号、协议号都都一致的连接,只要上述几个值有一个不一样,就可以建立连接

为什么要将TIME_WAIT设置在主动关闭方?

我们来比较下:

将TIME_WAIT设置在被动关闭方,主动关闭方发送完ACK,释放连接,若该ACK丢失,被动关闭方将会重复发送FIN报文(而且会一直发送直到reset),占用被动关闭方的资源,若将TIME_WAIT设置在主动关闭方,由于可以多次发送ACK,所以可以提早释放被动关闭方的资源。而未接到FIN,主动关闭方也不会重复发送ACK,不会占用主动关闭方的资源。

你可能感兴趣的:(TCP协议)