TCP分组丢失时的状态变迁

标签: tcp 分组 状态 | 发表时间:2015-10-05 00:44 | 作者:春秋十二月
出处:http://www.cppblog.com/
   根据FC793协议规范和BSD 4.4的实现,本文总结了TCP分组丢失时的状态变迁,如下图所示:实线箭头表示客户端的状态变迁,虚线箭头表示服务端的状态变迁,红色文字表示分组丢失时的行为,黑色文字表示正常时的行为。

   这里假设重传时分组依然会丢失,当在不同状态(CLOSED除外)分组丢失后,最终会关闭套接字而回到CLOSED状态。下面逐个分析各状态时
的情景。

SYN_SENT
   连接阶段第1次握手,客户端发送SYN分组但丢失,因此超时收不到服务端的SYN+ACK而重传SYN,尝试几次后放弃,关闭套接字。

SYN_RCVD
   1)连接阶段第2次握手,服务端响应SYN+ACK分组但丢失,因此超时收不到客户端的ACK而重传SYN+ACK,尝试几次后放弃,发送RST并关闭套接字。
   2)连接阶段第3次握手,客户端发送ACK分组但丢失,因此服务端超时收不到ACK而重传SYN+ACK,尝试几次后放弃,发送RST并关闭套接字。

ESTABLISHED
   1)连接阶段第3次握手,客户端发送ACK分组后,虽然丢失但会进入该状态(因为ACK不需要确认),但此时服务端还处于SYN_RCVD状态,因为超时收不到客户端的ACK而重传SYN+ACK、尝试几次后放弃、发送RST并关闭套接字,而此时客户端收到RST。
   2)数据传输阶段,当超时没有收到数据的确认时,会重传数据,尝试几次后放弃,发送RST并关闭套接字。

FIN_WAIT_1
   1)关闭阶段第1次握手,客户端发送的FIN分组丢失,因此超时收不到服务端的ACK而重传FIN,尝试几次后放弃,发送RST并关闭套接字。
   2)关闭阶段第2次握手,客户端发送的FIN分组到达服务端,但服务端响应的ACK分组丢失,因此客户端超时收不到ACK而重传FIN,尝试几次后放弃,发送RST并关闭套接字。
 
FIN_WAIT_2
   关闭阶段第3次握手,服务端发送的FIN分组丢失,因此超时收不到客户端的ACK而重传FIN、尝试几次后放弃、发送RST并关闭套接字,而此时客户端收到RST。
 
CLOSING
   本端发送的ACK分组丢失,导致对端超时收不到ACK而重传FIN、尝试几次后放弃、发送RST并关闭套接字,而此时本端收到RST。

TIME_WAIT
   关闭阶段第4次握手,客户端发送的ACK分组丢失,导致服务端超时收不到ACK而重传FIN、尝试几次后放弃、发送RST并关闭套接字,而此时客户端收到RST。

CLOSE_WAIT
   服务端发送的ACK分组丢失,导致客户端超时收不到ACK而重传FIN、尝试几次后放弃、发送RST并关闭套接字,而此时服务端收到RST。

LAST_ACK
   服务端发送的FIN分组丢失,导致超时收不到客户端的ACK而重传FIN、尝试几次后放弃、发送RST并关闭套接字。

春秋十二月 2015-10-05 00:44 发表评论

相关 [tcp 分组 状态] 推荐:

TCP分组丢失时的状态变迁

- - C++博客-首页原创精华区
   根据FC793协议规范和BSD 4.4的实现,本文总结了TCP分组丢失时的状态变迁,如下图所示:实线箭头表示客户端的状态变迁,虚线箭头表示服务端的状态变迁,红色文字表示分组丢失时的行为,黑色文字表示正常时的行为.    这里假设重传时分组依然会丢失,当在不同状态(CLOSED除外)分组丢失后,最终会关闭套接字而回到CLOSED状态.

TCP 状态变化

- - 互联网 - ITeye博客
关闭socket分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况. 前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接. 将关闭部分的状态转移摘出来,就得到了下图:. 通过图上,我们来分析,什么情况下,连接处于CLOSE_WAIT状态呢.

TCP/IP中的TIME_WAIT状态

- - CSDN博客推荐文章
毫无疑问,TCP中有关网络编程最不容易理解的是它的TIME_WAIT状态,TIME_WAIT状态存在于主动关闭socket连接的一方. TIME_WAIT状态存在的理由:. TCP/IP协议就是这样设计的,是不可避免的. 1)可靠地实现TCP全双工连接的终止. TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK.

TCP的三次握手以及TCP状态转换图详解

- - CSDN博客系统运维推荐文章
今天来讨论一下TCP的三次握手以及TCP的状态转换图. 首先发一个三次握手的流程图如下:. 圖 2.4-3、三向交握之封包连接模式.   当用戶端想要对服务器端发起连接时,就必須要送出一個要求连线的封包,此时用戶端必须随机取用一個大于1024 以上的端口來做为程序通信的通道. 然后在 TCP 的表头当中,必须带有 SYN 的主动连线(SYN=1),並并且记下发送给服务器端的序列号(Sequence number = 10001).

TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题

- - 操作系统 - ITeye博客
大家对netstat -a命令很熟悉,但是,你有没有注意到STATE一栏呢,基本上显示着established,time_wait,close_wait等,这些到底是 什么意思呢,在这篇文章,我将会详细的阐述. 大家很明白TCP初始化连接三次握手吧:发SYN包,然后返回SYN/ACK包,再发ACK包,连接正式建立.

TCP连接状态异常记录

- - 非技术 - ITeye博客
参考:http://blueskykong.com/2018/07/26/tcp-close-wait/. 分布式事务Lottor在测试环境中运行一段时间之后,出现Lottor客户端连接不上Lottor Server的情况. 经过排查,发现根源问题是Lottor客户端获取不到Lottor Server的集群信息.

TCP的几个状态 (SYN, FIN, ACK, PSH, RST, URG)

- - 操作系统 - ITeye博客
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. PSH表示有 DATA数据传输,. 其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,.

查看Apache并发请求数及其TCP连接状态

- - 企业架构 - ITeye博客
这两天搭建了一组Apache服务器,每台服务器4G内存,采用的是prefork模式,一开始设置的连接数太少了,需要较长的时间去响应用户的请求,后来修改了一下Apache 2.0.59的配置文件httpd.conf:.   查看httpd进程数(即prefork模式下Apache能够处理的并发请求数):.

深度好文|TCP连接的状态详解以及故障排查

- - 编程学习网
我们通过了解TCP各个状态,可以排除和定位网络或系统故障时大有帮助. 了解TCP之前,先了解几个命令:. linux查看tcp的状态命令:. 1) netstat -nat #查看TCP各个状态的数量 2)lsof -i:port #可以检测到打开套接字的状况 3) sar -n SOCK #查看tcp创建的连接数 4) tcpdump -iany tcp port 9000 #对tcp端口为9000的进行抓包.

tcp/ip调优

- Lucseeker - 在路上
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;.