TCP11种状态分析和测试
- -->简介
- -->正文
- -->测试一些状态
-----------------------------------------------------------------------------------------------------------------------
- -->简介
我们都知道TCP有11种状态,那么TCP的这11种状态是在什么情况下产生的呢?我觉得作为学习TCP/IP的我们来说,是一个值得考虑的问题。
本文主要是基于之前完成的一个C/S的点对点的聊天的程序(需要代码的,可以点击下载),对它进行测试,查看他产生的状态。
11种状态:
1、客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。
2、服务端独有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。
3、共有的:(1)CLOSED (2)ESTABLISHED 。
- -->正文
我在网上看到了一张图,这张图被很多人引用过,看上去有点复杂,但是仔细看,确实都介绍清楚了。

三次握手流程:
1、TCP原先的状态是CLOSED,它发送一个SYN包到服务端申请主动打开。 此时,客户端的状态将变为SYN_SENT。
2、服务端通过建立套接字以及调用bind、listen函数,进入了监听状态,此时服务端的TCP状态为LISTEN,它通过被动打开,等待客服端的消息。
3、服务器收到SYN包,必须确认客户的SYN(ACK=J+1),同时,自己也发送一个SYN包,SYN=K,则此时服务端状态为SYN_RECV。
4、客户端接收到消息后,此时客户端给服务端发送一个ACK,则客户端和服务端状态也转为ESTABLISHED,通过了三次握手,建立了连接。
四次挥手流程:
1、FIN_WAIT1产生状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT1状态。对方CLOSE一个SOCKET后发送FIN报文给自己,系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。
2、如果等到了对方的ACK应答,则客户端的状态变为FIN_WAIT2。当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT1状态一般是比较难见到的,而FIN_WAIT2状态还有时常常可以用netstat看到。也表示半连接,通俗的说就是对方先告诉你,你先别关闭,我还有点东西要发给你。
3、接收方收到了对方的FIN报文,并发送了ACK报文,等2MSL后即可回到CLOSED状态。此时的状态为TIME_WAIT状态。
4、被动关闭的一方收到FIN报文后,等待对方的ACK报文。在等待过程中,TCP状态为LAST_ACK,如果收到了ACK报文,则转为CLOSED。
5、另外,关于CLOSING状态,百度百科的介绍比较通俗易懂:
这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也就会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
- -->测试一些状态

三次握手建立连接后,客户端和服务端都建立连接,此时的状态为ESTABLEISHED。

CTRL+C关闭一方后,则刚方进入了TIME_WAIT状态。经过2MSL时间,TIME_WAIT状态消失。

启动客户端echo程序,当主动放关闭时(CTRL+C),另一方并没有关闭,则主动方变为FIN_WAIT2,因为另一放没有发送FIN过来,所以不会变为TIME_WAIT状态。但是测试的时候,再次netstat -at的时候,FIN_WAIT2出现了一会儿就消失了。说明这个进程结束了。
而客户端产生的CLOSE_WAIT状态的原因是:CLOSE_WAIT产生的状态的原因是,当我们主动关闭的那方发送了FIN过去以后,对端主动的回了一个ACK。因为产生了CLOSE_WAIT。而我客户端 并没有发送FIN过去。因此,服务端是不会进入LAST_ACK 。
另外:我考虑了一下,FIN_WAIT1这个状态,可以用SHUTDOWN来做,发送FIN的时候,另一方关闭读即可产生FIN_WAIT1状态。其他的一些状态比较难捕捉到。我还没有想到很好的方法。如果想到了,再补上吧。有错误的地方,也希望网友指正。
TCP11种状态分析和测试的更多相关文章
- Java IO读写大文件的几种方式及测试
读取文件大小:1.45G 第一种,OldIO: public static void oldIOReadFile() throws IOException{ BufferedReader br = n ...
- 一种精准monkey测试的方法
WeTest 导读 相信大家都知道移动端应用的monkey测试吧,不知你们有没有为monkey测试的太过于随机性的特性有过困扰,至少在我们这种界面控件较少且控件位置较偏的app的使用上其测试有效性大打 ...
- Seven Kinds of Testers - 七种类型的测试
最近读了James大叔的一篇总结Tester类型的文章,获益良多.原文叫做Seven Kinds of Testers(链接:http://www.satisfice.com/blog/archive ...
- Python几种常用的测试框架
一.测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的: 每个测试单元必须是完全独立的,必须能单独运行.这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作.通常通过 ...
- StringBuild,StringFormat," "+" " 三种方法速度测试
测试方式: Stopwatch sw = new Stopwatch(); sw.Start(); string tmp = ""; StringBuilder sb = new ...
- python 几种常见的测试框架
1. unittest 参考文档: https://docs.python.org/3/library/unittest.html The unittest unit testing framewor ...
- 关于hibernate中对象的三种状态分析
一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load ...
- double在输出为字符串的几种方法效率测试
测试结果: double->none 366msdouble->long 161msdouble->long2 188msdouble->format 564msdouble- ...
- 转: 将Eclipse代码导入到AndroidStudio的两种方式 ,测试了方法2,成功。
蛋疼,不知道为什么我的eclipse的logcat总是莫名其妙的显示一堆黄色字体的字,看不懂的那种,如下图: 然后查了一下资料,说可能是adt版本太低,手机系统太高. 然后本来想升级adt,但是各种折 ...
随机推荐
- [Excel] C#DataToExcel帮助类 (转载)
点击下载 DataToExcel.rar 看下面代码吧 /// <summary> /// 类说明:DataToExcel /// 编 码 人:苏飞 /// 联系方式:361983679 ...
- adb shell dumpsys package 查看versionCode
adb shell dumpsys package +包名 输出可以查看包名 aapt dump xmltree xxx.apk AndroidManifest.xml 查看AndroidManife ...
- asp IIS部署An error occurred on the server when processing the URL错误提示解决
An error occurred on the server when processing the URL. Please contact the system administrator.If ...
- hibernate中一对多Set的排序问题
因为set是无序的,一旦涉及set排序,就需要配置hibernate的配置文件,参考如下博文 http://ykyfendou.iteye.com/blog/2094325
- 浏览器兼容问题----Firefox不兼容event的解决方法
一.event.srcElement:当前事件的源: 在IE下,event对象有srcElement属性,但是没有target属性;Firefox下,event对象有target属性,但是没有srcE ...
- 使用正则表达式统计vs项目代码总行数[转]
怎么统计VS2008中工程的总共代码行数?怎么统计VS2008中工程的总共代码行数?在一个大工程中有很多的源文件和头文件,我如何快速统计总行数? ------解决方案----------------- ...
- highcharts时间图
这篇文章适合对highcharts已经有一定了解的猿友. 前两天想用highcharts做一个时间图,但是时间轴(x轴)的时间坐标并不是等间隔的,之前一直采用的方法是把时间做成等间隔的,然后没有数据的 ...
- 使用enable_shared_from_this示例
/*测试enable_shared_from_this*/ #include <iostream> #include <boost/smart_ptr/shared_ptr.hpp& ...
- Windows phone 之Xml操作
最近在做天气预报应用,这个应用中需要用到Xml来存储关注的城市列表,保存一下代码,方便以后使用,也给博友们一个参考: 其中:添加关注城市的操作代码是: 其实就是, (1)先把数据从CareCityCo ...
- 转载C#泛型集合—Dictionary<K,V>使用技巧
1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib) 2.描述 1).从一组键(Key)到一组值(Value) ...