TCP状态,close_time与wait_time

之前看了多次TCP建立连接与断开连接的整体流程,对于状态也是看了很多遍,但是记住几天就又忘记了,感觉做个类比进行记忆是比较好的方法,便有了下面的图示类比,个人理解记忆,有问题请评论。

对于完整的记忆一般是这样的,能记住的话也是可以的,毕竟也是图形化的东西。

TCP状态,close_time与wait_time_第1张图片

个人理解及抽象出来的是这样的

TCP状态,close_time与wait_time_第2张图片

一段感情的开始是美好的,分开总是不舍的,(哈哈哈哈。。。不接受反驳)

1、为什么TIME_WAIT 状态 停留2MSL(max segment lifetime)时间?

主要是来两方面的原因:

1)为了防止上次连接的报文数据影响到下次的连接,有充分的的时间处理上次连接的报文信息。

2)客户端最后发的ACK可能会丢失,此时服务器端会重新发送FIN,若此时客户端处于closed,会响应rst (rst段标识复位,用来异常的关闭连接) 而不是ACK。因此客户端是TIME_WAIT状态,不是closed。

常用的三个状态是:ESTABLISHED表示正在通信 、TIME_WAIT表示主动关闭、CLOSE_WAIT表示被动关闭。


通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态。但是在一些特殊情况下,就会出现连接长时间处于CLOSE_WAIT状态的情况。
出现大量close_wait的现象主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。
大量TIME_WAIT造成的影响:
      在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。
来解释下这个场景。主动正常关闭TCP连接,都会出现TIMEWAIT。

你可能感兴趣的:(Java基础重要知识点总结)