• -->简介
  • -->正文
  • -->测试一些状态

-----------------------------------------------------------------------------------------------------------------------

  • -->简介

  我们都知道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种状态分析和测试的更多相关文章

  1. Java IO读写大文件的几种方式及测试

    读取文件大小:1.45G 第一种,OldIO: public static void oldIOReadFile() throws IOException{ BufferedReader br = n ...

  2. 一种精准monkey测试的方法

    WeTest 导读 相信大家都知道移动端应用的monkey测试吧,不知你们有没有为monkey测试的太过于随机性的特性有过困扰,至少在我们这种界面控件较少且控件位置较偏的app的使用上其测试有效性大打 ...

  3. Seven Kinds of Testers - 七种类型的测试

    最近读了James大叔的一篇总结Tester类型的文章,获益良多.原文叫做Seven Kinds of Testers(链接:http://www.satisfice.com/blog/archive ...

  4. Python几种常用的测试框架

    一.测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的: 每个测试单元必须是完全独立的,必须能单独运行.这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作.通常通过 ...

  5. StringBuild,StringFormat," "+" " 三种方法速度测试

    测试方式: Stopwatch sw = new Stopwatch(); sw.Start(); string tmp = ""; StringBuilder sb = new ...

  6. python 几种常见的测试框架

    1. unittest 参考文档: https://docs.python.org/3/library/unittest.html The unittest unit testing framewor ...

  7. 关于hibernate中对象的三种状态分析

    一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load ...

  8. double在输出为字符串的几种方法效率测试

    测试结果: double->none 366msdouble->long 161msdouble->long2 188msdouble->format 564msdouble- ...

  9. 转: 将Eclipse代码导入到AndroidStudio的两种方式 ,测试了方法2,成功。

    蛋疼,不知道为什么我的eclipse的logcat总是莫名其妙的显示一堆黄色字体的字,看不懂的那种,如下图: 然后查了一下资料,说可能是adt版本太低,手机系统太高. 然后本来想升级adt,但是各种折 ...

随机推荐

  1. Sql解锁 数据库死锁检测

    USE [DataBaseName]GO/****** Object:  StoredProcedure [dbo].[sp_check_deadlock]    Script Date: 07/04 ...

  2. 【基础】Oracle 表空间和数据文件

    多个表空间的优势:1.能够将数据字典与用户数据分离出来,避免由于字典对象和用户对象保存在同一个数据文件中而产生的I/O冲突2.能够将回退数据与用户数据分离出来,避免由于硬盘损坏而导致永久性的数据丢失3 ...

  3. JavaScript Invalid Date Verify

    if ( Object.prototype.toString.call(d) === "[object Date]" ) { // it is a date if ( isNaN( ...

  4. [LeetCode OJ] Decode Ways

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  5. 将requirejs进行到底(2)

    前一篇:JS模块化工具requirejs教程(一):初识requirejs 我们以非常简单的方式引入了requirejs,这一篇将讲述一下requirejs中的一些基本知识,包括API使用方式等. 基 ...

  6. http请求的组成部分

    报文流 1.HTTP 报文是在HTTP 应用程序之间发送的数据块.这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分.这些 ...

  7. 《Velocity java开发指南》中文版(下)转载

    文章出自:http://sakyone.iteye.com/blog/524292 8.Application Attributes Application Attributes (应用程序属性)是和 ...

  8. 零售ERP开发(一)

    随着企业信息化不断提高,各种企业管理系统应用而生:怎么才能开发一套简洁.易用.功能健全的管理系统,尤其是能够帮助企业做出重大策略的系统,一致是我们追求的目标.近些年,接触的Erp系统主要包括国内比较知 ...

  9. Struts2常规配置

    默认配置文件名:struts.xml   WEB-INF/classes下(放到src下) Struts2的有效常量可以查看    org\apache\struts2 下的    default.p ...

  10. CentOS6.5 yum安装桌面环境

    安装原因 安装centos6.5时选择了minimal CentOS最小化安装方式 需要使用浏览器拨号连接内网 安装过程 通过yum grouplist查询在 group 软件包中,Desktop.D ...