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,但是各种折 ...
随机推荐
- 深入探讨C#中Socket一次性搞定消息发送
转载自:http://tech.chinaunix.net/a2010/0909/1101/000001101396.shtml [IT168 技术文档]最近浏览了几篇有关Socket发送消息 ...
- Servie学习总结
一.什么是Service Service是一个应用程序组件,它是安卓实现程序后台运行的一个解决方案. 二.分类 服务有两种类别started.bound.但是一个服务类所要继承的类是一样的,都是Ser ...
- Android占位符
<xliff:g>标签介绍: 属性id可以随便命名 属性值举例说明%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格 %n$md:代表输出的是整数,n代表 ...
- 如何获得Windows 8中已记住的WIFI的明文密码
网上很流行的一种查看WIFI密码明文的方法,如下: 今天遇到了一种状况,就是如果不连WIFI的情况我能抓到这个密码吗?(实在不想开口问同事密码多少,只能苦逼的自己想办法了o(︶︿︶)o ) 答案当然是 ...
- (转)iOS被开发者遗忘在角落的NSException-其实它很强大
转载自 http://www.jianshu.com/p/05aad21e319e iOS被开发者遗忘在角落的NSException-其实它很强大 字数597 阅读968 评论4 喜欢28 NSExc ...
- 2014年11月17号------html起始
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 网络编程(学习整理)---3--(Udp)FeiQ实现广播消息群发
1.广播群发消息: 这里使用的任然是UDP协议,使用方法还是比较简单的! 我就记录一下需要注意的一些地方(笔记): (1)这里是在局域网内,借用FeiQ聊天软件,编写一段程序,实现对局域网内的每一个登 ...
- C++线程类的封装
简单的C++线程操作的封装,使用了智能指针管理对象的释放. 可运行对象基类 class SimpleRunable:public RefCountedBase { public: SimpleRuna ...
- [Machine Learning] 梯度下降(BGD)、随机梯度下降(SGD)、Mini-batch Gradient Descent、带Mini-batch的SGD
一.回归函数及目标函数 以均方误差作为目标函数(损失函数),目的是使其值最小化,用于优化上式. 二.优化方式(Gradient Descent) 1.最速梯度下降法 也叫批量梯度下降法Batch Gr ...
- js获取天气
我们经常看到有的网站显示天气信息,它是怎么做出来的呢?今天就来分享一些关于js调用天气API的几种做法. 网上也能找到很多种方法,但是一般都是免费的不好用,好用的不免费. 以前用过新浪的天气api,查 ...