socket中的TIME_WAIT状态
来源:互联网 发布:蓝月传奇英雄翅膀数据 编辑:程序博客网 时间:2024/04/30 12:23
通过正确的状态机,我们知道双方的关闭过程如下:
假设最后一个ACK丢失了,服务器会重发它发送的最后一个FIN,所以客户端必须维持一个状态信息,以便能够重发ACK;如果不维持这种状态,客户端在接收到FIN后将会响应一个RST,服务器端接收到RST后会认为这是一个错误。如果TCP协议能够正常完成必要的操作而终止双方的数据流传输,就必须完全正确的传输四次握手的四个节,不能有任何的丢失。这就是为什么socket在关闭后,仍然处于 TIME_WAIT状态,因为他要等待以便重发ACK。
如果目前连接的通信双方都已经调用了close(),假定双方都到达CLOSED状态,而没有TIME_WAIT状态时,就会出现如下的情况。现在有一个新的连接被建立起来,使用的IP地址与端口与先前的完全相同,后建立的连接又称作是原先连接的一个化身。还假定原先的连接中有数据报残存于网络之中,这样新的连接收到的数据报中有可能是先前连接的数据报。为了防止这一点,TCP不允许从处于TIME_WAIT状态的socket建立一个连接。处于TIME_WAIT状态的socket在等待两倍的MSL时间以后(之所以是两倍的MSL,是由于MSL是一个数据报在网络中单向发出到认定丢失的时间,一个数据报有可能在发送图中或是其响应过程中成为残余数据报,确认一个数据报及其响应的丢弃的需要两倍的MSL),将会转变为CLOSED状态。这就意味着,一个成功建立的连接,必然使得先前网络中残余的数据报都丢失了。
由于TIME_WAIT状态所带来的相关问题,我们可以通过设置SO_LINGER标志来避免socket进入TIME_WAIT状态,这可以通过发送RST而取代正常的TCP四次握手的终止方式。但这并不是一个很好的主意,TIME_WAIT对于我们来说往往是有利的。
- Socket中的TIME_WAIT状态
- Socket中的TIME_WAIT状态
- Socket中的TIME_WAIT状态
- Socket中的TIME_WAIT状态
- socket中的TIME_WAIT状态
- Socket中的TIME_WAIT状态
- 【转】Socket中的TIME_WAIT状态
- Socket中的TIME_WAIT状态(转)
- c#中的socket中的time_wait状态处理方法
- 如何解决TIME_WAIT过多的解决办法(附Socket中的TIME_WAIT状态详解)
- 如何解决TIME_WAIT过多的解决办法(附Socket中的TIME_WAIT状态详解)
- 如何解决TIME_WAIT过多的解决办法(附Socket中的TIME_WAIT状态详解)
- 如何解决TIME_WAIT过多的解决办法(附Socket中的TIME_WAIT状态详解)
- 如何解决TIME_WAIT过多的解决办法(附Socket中的TIME_WAIT状态详解)
- socket状态中time_wait介绍
- socket 状态中time_wait 介绍
- 关闭socket链接过程中的TCP状态:TIME_WAIT状态(开启地址重用),CLOSE_WAIT状态
- socket:close_wait状态和time_wait状态问题
- JVM常用的调优参数
- 简单易学的机器学习算法——分类回归树CART
- 49_leetcode_Longest Valid Parentheses
- 向量相似度度量(一):EMD (Earth Mover's Distance)
- 笔记
- socket中的TIME_WAIT状态
- makefile 的ifeq和ifdef的区别
- 人机交互命令 expect
- Windows下安装Hadoop
- Mac OS X上搭建本地SVN服务器
- 调试OMAPL138的GEL文件简析
- Codility2 FrogJump
- linux压缩和解压缩命令大全
- Java反射