TCP的状态变迁图
CLOSED:表示初始状态。对服务端和C客户端双方都一样。
LISTEN:表示监听状态。服务端调用了listen函数,可以开始accept连接了。
SYN_SENT:表示客户端已经发送了SYN报文。当客户端调用connect函数发起连接时,首先发SYN给服务端,然后自己进入SYN_SENT状态,并等待服务端发送ACK+SYN。
SYN_RCVD:表示服务端收到客户端发送SYN报文。服务端收到这个报文后,进入SYN_RCVD状态,然后发送ACK+SYN给客户端。
ESTABLISHED:表示连接已经建立成功了。服务端发送完ACK+SYN后进入该状态,客户端收到ACK后也进入该状态。
FIN_WAIT_1:表示主动关闭连接。无论哪方调用close函数发送FIN报文都会进入这个这个状态。
FIN_WAIT_2:表示被动关闭方同意关闭连接。主动关闭连接方收到被动关闭方返回的ACK后,会进入该状态。
TIME_WAIT:表示收到对方的FIN报文并发送了ACK报文,就等2MSL后即可回到CLOSED状态了。如果FIN_WAIT_1状态下,收到对方同时带FIN标志和ACK标志的报文时,可以直接进入TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING:表示双方同时关闭连接。如果双方几乎同时调用close函数,那么会出现双方同时发送FIN报文的情况,此时就会出现CLOSING状态,表示双方都在关闭连接。
CLOSE_WAIT:表示被动关闭方等待关闭。当收到对方调用close函数发送的FIN报文时,回应对方ACK报文,此时进入CLOSE_WAIT状态。
LAST_ACK:表示被动关闭方发送FIN报文后,等待对方的ACK报文状态,当收到ACK后进入CLOSED状态。 
 
我们用上图来显示在正常的 TCP 连接的建立与终止过程中,客户与服务器所经历的不同状态。
1、服务器端首先执行 LISTEN 原语进入被动打开状态( LISTEN ),等待客户端连接;
2、当客户端的一个应用程序发出 CONNECT 命令后,本地的 TCP 实体为其创建一个连接记录并标记为 SYN SENT 状态,然后给服务器发送一个 SYN 报文段;
3、服务器收到一个 SYN 报文段,其 TCP 实体给客户端发送确认 ACK 报文段同时发送一个 SYN 信号,进入 SYN RCVD 状态;
4、客户端收到 SYN + ACK 报文段,其 TCP 实体给服务器端发送出三次握手的最后一个 ACK 报文段,并转换为 ESTABLISHED 状态;
5、服务器端收到确认的 ACK 报文段,完成了三次握手,于是也进入 ESTABLISHED 状态。
 
在此状态下,双方可以自由传输数据。当一个应用程序完成数据传输任务后,它需要关闭 TCP 连接。假设仍由客户端发起主动关闭连接。
1、客户端执行 CLOSE 原语,本地的 TCP 实体发送一个 FIN 报文段并等待响应的确认(进入状态 FIN WAIT 1 );
2、服务器收到一个 FIN 报文段,它确认客户端的请求发回一个 ACK 报文段,进入 CLOSE WAIT 状态;
3、客户端收到确认 ACK 报文段,就转移到 FIN WAIT 2 状态,此时连接在一个方向上就断开了;
4、服务器端应用得到通告后,也执行 CLOSE 原语关闭另一个方向的连接,其本地 TCP 实体向客户端发送一个 FIN 报文段,并进入 LAST ACK 状态,等待最后一个 ACK 确认报文段;
5、客户端收到 FIN 报文段并确认,进入 TIMED WAIT 状态,此时双方连接均已经断开,但 TCP 要等待一个 2 倍报文段最大生存时间 MSL,确保该连接的所有分组全部消失,以防止出现确认丢失的情况。当定时器超时后, TCP 删除该连接记录,返回到初始状态( CLOSED )。
6、服务器收到最后一个确认 ACK 报文段,其 TCP 实体便释放该连接,并删除连接记录,返回到初始状态( CLOSED )。
 
TCP正常连接建立和终止所对应的状态
        
TCP 协议终止一个连接要经过 4 次挥手。这是因为 TCP 的半关闭( half-close )造成的。由于一个 TCP 连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。关闭的原则就是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向连接。当一端收到一个 FIN ,它必须通知应用层另一端已经终止了那个方向的数据传送。发送 FIN 通常是应用层进行关闭的结果。
 
TIME_WAIT状态
TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL。它是任何报文段被丢弃前在网络内的最长时间。RFC 793指出MSL为2分钟,现实中的常用值为30秒,1分钟或2分钟。
对一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可以让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。
这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用。这个连接只能在2MSL结束后才能被使用。
在连接处于2MSL等待时,任何迟到的报文段将被丢弃。
 
FIN_WAIT_2状态
在FIN_WAIT_2状态我们已经发出了FIN,并且另一端也已对它进行确认。除非我们在实行半关闭,否则将等待另一端的应用意识到它已经收到一个文件结束符说明,并向我们发一个FIN来关闭另一方向的连接。只有当另一端的进程完成这个关闭,我们这端才会从FIN_WAIT_2状态进入TIME_WAIT状态。
这意味着我们这端可能永远保持这个状态。另一端也将处于CLOSE_WAIT状态,并一直保持这个状态直到应用层决定进行关闭。

最新文章

  1. UIAutomator
  2. Socket 通信(基础原理、实时聊天系统雏形)
  3. 用Visual Studio Code 开发应用之 安装 Visual Studio Code
  4. POI 设置EXCEL单元格格式(日期数字文本等)
  5. CentOS 7 启动VNC失败问题
  6. 近期在调用 calendar.js 的时候出现中文乱码! 解决方式
  7. TCP长连接与短连接的原理及区别
  8. 201521123084 《Java程序设计》第9周学习总结
  9. SpringMVC源码情操陶冶-DispatcherServlet
  10. AngularJS进阶(三十四)Angular数据更新不及时问题探讨
  11. iOS NSInteger 的输出 %d %ld %zd %ld (long)
  12. Spring Cloud Zuul 中文文件上传乱码
  13. c#格林治时间实现
  14. Spring Boot 主类及目录结构介绍
  15. Oracle数据库里面查询字符串类型的字段不为空和为空的SQL语句:
  16. SQL调优(SQL TUNING)并行查询提示(Hints)之pq_distribute的使用
  17. ArcGIS案例学习笔记-点群密度统计
  18. c# 解析百度图片搜索结果json中objURL图片原始地址
  19. iOS 第三方框架-MBProgressHUD
  20. INNODB引擎概述

热门文章

  1. sencha touch 问题汇总
  2. Java初学者笔记一:元类、获取类型、枚举
  3. Linux数据链路层的包解析
  4. 配置项目使用weblogic的JNDI数据源
  5. Windows Phone 自定义一个启动画面
  6. jQuery --- 利用a标签的download属性下载文件!
  7. 双调欧几里得旅行商问题(TSPhdu2224)
  8. 最小树形图(hdu4009)
  9. Redis集群管理(二)
  10. 奇怪的Visual Studio 2013停止响应问题