客户端状态的变化:

客户端创建套接字之后会connect服务器,这时客户端会发送一个SYN到服务器,状态转换到SYN_SENT并等待服务器的回复,收到服务端的回复SYN+ACK(同一个报文)之后​​​客户端会回复ACK此时状态转换到ESTABLISHED,正常数据交互完成之后客户端会close套接字此时发送一个FIN报文,状态转换到FIN_WAIT_1,同时等待服务端的回复,此时有三种情况:

(1)收到服务端的ACK但此时服务端没有关闭套接字。状态转换到了FIN_WAIT_2,然后再等待服务端关闭套接字发出的FIN,如果收到则回复ACK,状态转换到TIME_WAIT状态,等待2MSL超时之后自动转换为CLOSED状态。

​(2)服务端同时也在关闭套接字,此时客户端会收到SYN并发出ACK,状态转换到CLOSING,之后等待服务端回复ACK,若收到ACK则转到TIME_WAIT状态。

(3)服务器在收到客户端FIN之后立马关闭套接字,此时客户端会收到一个ACK和FIN并发出ACK,状态​转换到TIME_WAIT状态。

服务器状态的变化:

服务端​创建套接字之后调用listen函数将套接字有一个未连接的主动套接字转换为被动套接字,指示内核应接受指向该套接字的连接请求,套接字状态由CLOSE转换为LISTEN,等待客户端连接。所以服务端是被动接收连接的,服务端会先收到SYN,收到之后会立马发送一个SYN+ACK(同一个报文),此时状态转换到SYN_RCVD并等待客户端回复ACK,此时套接字处于未完成连接队列中,如果收到ACK状态会转换到ESTABLISHED,套接字处于已完成连接队列中,注意的是未完成连接队列和已完成连接队列之和不能超过listen设置的最大连接个数。这时服务端和客户端可以进行数据交互,客户端接收完数据之后主动close套接字,此时服务端会收到FIN并回复ACK,状态转换到LOSE_WAIT,当服务端的应用层也close套接字时服务端会发生一个FIN状态转换到LAST_ACK然后会收到客户端回复的ACK,状态转换到CLOSED。

为什么释放连接需要TIME_WAIT?

回忆一下我们最终的那个FIN与ACK,被动关闭方发送FIN,并等待主动关闭方返回的ACK。我们假设最终的ACK丢失,被动关闭方将需要重新发送它的最终那个FIN,主动关闭方必须维护状态信息(TIME_WAIT),以允许它重发最终的那个ACK。如果没有了这个状态,当他第二次收到FIN时,会响应一个RST(也是一种类型的TCP分节),会被服务器解释成一个错误。

目的:为了TCP打算执行必要的工作以彻底终止某个连接两个方向上的数据流(即全双工关闭),那么他必须要正确处理连接终止四个分节中任何一个分节丢失的情况

处于TIME_WAIT这个状态时,此套接字上的绑定了资源,将在2MSL(最大报文生存时间)内不可再使用。选择2MSL这个时间是为了避免出现上一次连接中被动关闭端重复发送的数据包。

我们假设ip1:port1和ip2:port2 之间有一个TCP连接。我们关闭了这个链接,过一段时间后在相同IP和端口之间建立了另一个连接。TCP必须防止来自之前那个连接的老的重复分组在新连接上出现。为了做到这一点,TCP将不复用处于TIME_WAIT状态的连接。2MSL的时间足以让某个方向上的分组存活MSL秒后被丢弃,另一个方向上的应答也最多存活MSL秒后被丢弃。

状态转换图:

转载于:https://www.cnblogs.com/single-dont/p/11386241.html

TCP连接(client、server)状态转换相关推荐

  1. 一个解除TCP连接的TIME_WAIT状态限制的简便方法

    近日无意间发现了一个小窍门:当TCP连接所对应socket的接收队列中仍有未读数据时,将此socket强行close后,将使此socket连接不会进入TIME_WAIT状态,用"netsta ...

  2. c# 使用TCP连接(server)

    效果图 代码实现 用的变量: 1 Thread threadWatch = null; //负责监听客户端的线程 2 Socket socketWatch = null; //负责监听客户端的套接字 ...

  3. TCP连接大量CLOSE_WAIT状态问题排查

    CLOSE_WAIT产生原因 close_wait是被动关闭连接是形成的,根据TCP状态机,服务器端收到客户端发送的FIN,TCP协议栈会自动发送ACK,链接进入close_wait状态.但如果服务器 ...

  4. 网络基础4(TCP三次握手,四次握手,TCP流量控制,TCP状态转换 , TCP异常断开,设置TCP属性,端口复用)

    TCP协议 TCP通信时序 下图是一次TCP通讯的时序图.TCP连接建立断开.包含大家熟知的三次握手和四次握手. TCP通讯时序 在这个例子中,首先客户端主动发起连接.发送请求,然后服务器端响应请求, ...

  5. 【Linux网络编程】TCP状态转换、半关闭、2MSL时长

    ------------->[Linux系统编程/网络编程](学习目录汇总) <-------------- 目录 1. 三次握手.四次挥手过程中的状态变化 2. TCP状态转换图 3. ...

  6. 面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 几个方面: 问题描述:什么现象?什么影响? 问题分析 解决 ...

  7. 大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | ningg.top/computer-basi ...

  8. 将串口转换成TCP连接

    将串口转换成TCP连接 在Linux环境下,可以使用socat命令将串口转换成TCP连接,也可以转换成其它形式的Socket连接.理论上讲,在Windows上通过Cygwin也可以完成同样的功能. h ...

  9. 客户端拔掉网线后,会直接影响 TCP 连接状态吗?

    大家好,我是小林. 今天,聊一个有趣的问题:拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗? 可能有的同学会说,网线都被拔掉了,那说明物理层被断开了,那在上层的传输层理应也会断开,所以原本的 T ...

  10. linux查看tcp连接状态

    netstat -an |grep tcp   查看所有tcp连接包括LISTEN状态 netstat -an |grep ESTABLISHED   查看所有正在连接中的tcp连接 如果需要统计tc ...

最新文章

  1. 解决list-style-type属性失效
  2. [AX]AX2012 纪录缓存
  3. vs2008 中MessageBox()报错——CString与Char* 的转化
  4. 2018.12.5 区块链论文翻译
  5. SQL 中的游标实例
  6. WebSocket教程
  7. linux 信号处理函数详解
  8. 程序员在想些什么?拒绝盲猜,CSDN帮你精准洞察 Ta 们的心
  9. qq如何用其他进制登录
  10. iOS 中关于 skip install
  11. tuxedo连接mysql,tuxedo详细安装的步骤.doc
  12. 12平键标准尺寸规格表_郑州花纹板加工规格尺寸表
  13. 从技术角度,设备过保就坏,是怎么实现的
  14. 用python代码制作视频
  15. 基于51单片机八音盒电子琴音乐播放器设计(毕设课设)
  16. [词汇] 十四、动词
  17. Python 字符串格式化
  18. 批量删除html网页,ie浏览器收藏夹网页批量删除方法
  19. xctf攻防世界 MISC高手进阶区 互相伤害
  20. macM1芯片通过第三方安装php

热门文章

  1. mysql 只读账号_MySql主从复制,从原理到实践!
  2. 3.4 svm人脸识别
  3. Ajax结合json在web中的应用
  4. sklearn预处理转化流水线
  5. 在Eclipse中运行Nutch2.3
  6. java中的数组、队列、堆栈
  7. ES2017 异步函数async/await
  8. slf4j+log4j2的整合配置
  9. 一步一步理解GB、GBDT、xgboost
  10. 1091 N-自守数