TCP连接状态
TCP 连接状态
按 TCP 协议的标准表示法, TCP 可具有如下几种状态,为讨论方便,如下讨论中区分服务端和客户端,实际软件处理上对二者一视同仁。
CLOSED
关闭状态。在两个通信端使用“三路握手”机制建立连接之前即处于该状态。
LISTEN
监听状态。此状态是对服务器端而言的。处于此状态的套接字正在等待客户端的连接请求。
SYN-SENT
客户端发送一个 SYN 报文请求建立与服务器端的连接后,设置为该状态。注意处于此状态的套接字仅仅表示发送了 SYN 请求报文,但尚未得到对方应答。如果已得到对方应答,则就会进入 ESTABLISHED 状态。
SYN-RECV
一般服务端在接收到客户端发送的 SYN 报文后,会发送一个附带 ACK 的 SYN 报文进行与对方的同步,之后将其状态设置为 SYN-RECV。
ESTABLISHED
客户端接收到其之前发送的 SYN 报文的 ACK 后,设置为此状态。并且紧接着发送一个 ACK报文给服务端从而建立正式连接。而此时处于 SYN-RECV 状态的服务端在接收到此 ACK后也会将自己的状态设置为 ESTABLISHED。到此为止,连接完全建立,之后二者既可进行数据的传输。以下状态将无法区分服务端和客户端,主要视哪端首先发起关闭操作。我们将首先发起关闭操作的一端视为客户端,对应的另一端视为服务端。
FIN-WAIT-1
客户端发起关闭操作,此时客户端将发送一个 FIN 报文给对方,并将其状态设置为FIN-WAIT-1。
FIN-WAIT-2
处于 FIN-WAIT-1 状态的客户端在接收到之前发送的 FIN 的 ACK 报文后,将其状态设置为FIN-WAIT-2,然后一直处于该状态,直到接收到对方发送 FIN 报文。注意在接收到 FIN 报文之前,本端仍然可以继续接收对方发送的数据。因为发送 FIN 报文给对方仅仅表示本地不再有数据发送给对方,并不表示本地不再接收对方的数据。这是两回事。处于此状态的套
接字接收到对方发送 FIN 时,将进入 TIME-WAIT 状态。
CLOSE-WAIT
服务端在接收到对方的 FIN 报文时,将本地状态设置为 CLOSE-WAIT,并即刻发送 ACK 报文给对方。此后本地依然可以发送尚未发送的数据直到数据发送完。
CLOSING
当连接双方同时发送 FIN 时,会进入此状态。在前面的讨论中,如果本地发送关闭操作,则会发送一个 FIN 报文给对方,并将自己状态设置为 FIN-WAIT-1,正常情况下,
紧接着应该接收到对方响应的 ACK 报文这样本地就可以进入 FIN-WAIT-2 状态,然后一直等待对方的 FIN 报文。而如果在等待 ACK 报文时,接收到对方的 FIN 报文,则
表示对方同时发起了关闭操作,此时本地并不再进入 FIN-WAIT-2,而是发送一个对此 FIN 的 ACK 报文,并且
进入 CLOSING 状态,如果之后接收到对本地之前发送的 FIN 的 ACK 报文,则直接进入TIME-WAIT 状态。
LAST-ACK
此状态从 CLOSE-WAIT 状态变化而来。承接上文中对 CLOSE-WAIT 状态的讨论,当服务端发送完用户数据后,进行关闭操作,此时便可发送一个 FIN 报文完成通信通道的完
全关闭。在服务端发送这个 FIN 报文后,有两个方面状态的改变,对于服务端,则将状态设置为LAST-ACK,即接下来就等待最后一个客户端响应的 ACK 报文了,一旦接收
到该 ACK 报
文,则连接便完全关闭,服务端将状态设置为 CLOSED。而对于客户端而言,当接收到服务端发送的 FIN 时,其首先发送一个 ACK 报文给服务端,之后将状态从 FIN-WAIT-2 设置
为 TIME-WAIT,表示等待 2MSL 时间(此称为静等待时间)。
TIME-WAIT
静等待状态。这是对于首先发送关闭操作的一端(一般即客户端)所最后经历的状态。应该说在接收到服务端发送的 FIN 后,本地既可设置状态为 CLOSED。之所以需要等待一段时
间(通常为 2MSL: Maximum Segment Timelife)一方面是因为避免对服务端 ACK 信号的丢失,这样当服务端重传 FIN 时,客户端可以再响应一个 ACK。这个原因是次要的,因为一
般对于 FIN 数据包的超时,会直接将状态设置为 CLOSED,这样处理不会造成任何有效的影响。另一个方面的主要原因是防止之后重新建立的“化生”套接字接收到老的套接字在网
络中延迟的数据包。所谓“化生”套接字是指通信双方是之前的同一个信道:即具有相同的源端,目的端 IP 地址和端口号。如果之前的套接字有数据包延迟在网络中,有可能这个新
建立的套接字会接收到该数据包从而造成数据误传。等待时间 2MSL 称为报文最大生存时
TCP连接状态的更多相关文章
- 查看 Apache并发请求数及其TCP连接状态
查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ...
- 查看 并发请求数及其TCP连接状态【转】
服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...
- Linux下查看Web服务器当前的并发连接数和TCP连接状态
对于web服务器(Nginx.Apache等)来说,并发连接数是一个比较重要的参数,下面就通过netstat命令和awk来查看web服务器的并发连接数以及TCP连接状态. $ netstat -n | ...
- 查看 并发请求数及其TCP连接状态
服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...
- 查看 Apache并发请求数及其TCP连接状态【转】
查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80& ...
- TCP三次握手及TCP连接状态 TCP报文首部格式
建立TCP连接时的TCP三次握手和断开TCP连接时的4次挥手整体过程如下图: 开个玩笑 ACK: TCP协议规定,只有ACK=1时有效,连接建立后所有发送的报文ACK必须为1 SYN(SYNchron ...
- zabbix监控 linux/windows 主机tcp连接状态
更新内容:1).增加了对windows主机的tcp连接状态的监控2).修改linux主机的监控配置,使linux与windwos主机能够使用相同的模板tcp的连接状态对于监控服务器,尤其是Web服务器 ...
- Zabbix设置自定义监控项之——监控tcp连接状态
目录 一.用户自定义参数 二.配置 监控 TCP 连接状态 在实际监控中,除了官方自带的一些监控项,我们很多时候有一些定制化监控,比如特定的服务.TCP 连接状态等等,这时候就需要自定义监控项.自定义 ...
- Java网络编程系列之TCP连接状态
1.TCP连接状态 LISTEN:Server端打开一个socket进行监听,状态置为LISTEN SYN_SENT:Client端发送SYN请求给Server端,状态由CLOSED变为SYN_SEN ...
随机推荐
- webBrower控件实现winform和webpage交互
添加WebBrowser控件 private WebBrowser webBrowser1; 引用页面的document对象 HtmlDocument doc = webBrowser1.Docume ...
- 【应用篇】Activiti显示器(抽象)简单的应用程序和服务的颗粒结合(两)
Activiti简单的应用程序,业务颗粒与工作流程结合.让流程带动业务颗粒运行的过程.此次的监听我们应用抽象的监听来实现,也就是说全部的普通业务类均应用此抽象监听,而不须要每个类一个监听的来操作. 新 ...
- UBuntu经常使用的操作(网络资源)
http://docs.google.com/Doc? id=dqsbw4c_46d89djccr 版权声明:本文博主原创文章.博客,未经同意不得转载.
- 从电商秒杀与抢购谈Web系统大规模并发
从电商秒杀与抢购谈Web系统大规模并发 http://www.iamlintao.com/4242.html 一.大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程 ...
- JSP简单练习-站点计数器
<%@ page contentType="text/html;charset=gb2312" %> <%@ page import="javax.se ...
- redis和redis php扩展安装(转)
redis是一个内存数据库,比memcache支持更丰富的value类型,新浪微博就使用redis来做缓存. redis的源码安装 wget http://download.redis.io/redi ...
- 解析grant connect, resource to user语句
今天同事问了一个问题:"创建用户分配的权限是:grant connect,resource to user;,可是建立view的时候失败了,错误是权限不够,后来我给这个用户分配了创建view ...
- oracle中execute immediate的使用(select/insert/update/delete)(转)
execute immediate的语法如下: execute immediate 'sql'; execute immediate 'sql_select' into var_1, var_2; e ...
- Matlab中调用第三方Java代码
搞了一天,才算搞定. 第一步:定位Matlab中Java环境的ext目录 新建一个M script文件,或者直接在Matlab的交互式命令行中输入: disp(java.lang.System.get ...
- JavaEE(7) - JMS消息事务和异常
1. 使用事务性Session为消息增加事务(NetBeans创建java project: TxSession) MessageSender.java package lee; import jav ...