介绍三次握手的时候,着重了解的是三次握手过程中,应用层和传输层做了哪些工作;下面在了解四次挥手的时候,主要了解的是四次挥手的状态变化。


目录

一、四次挥手

1、第一次挥手

2、第二次挥手

3、第三次挥手

4、第四次挥手

二、TIME_WAIT状态

1、为什么需要TIME_WAIT状态?

2、为什么TIME_WAIT的时间是2MSL?

3、bind error的原因以及如何解决

(1) 原因

(2) 如何解决

4、服务端处在TIME_WAIT的危害性

三、CLOSE_WAIT状态


一、四次挥手

一般是客户端主动断开连接,偶尔服务端也可以断开连接。假设这里是客户端先断开连接

1、第一次挥手

当Client 调用close函数的时候,就是Client发送断开连接请求的时候。发送的报文中携带FIN标志位。

客户端状态:FIN_WAIT_1(等待服务端的确认应答)

2、第二次挥手

服务端接收到断开连接的请求以后,服务端同意断开连接并发送确认应答ACK。发送完ACK以后,Server端变为CLOSE_WAIT状态,CLOSE_WAIT状态表明四次挥手没有完全走完,或者说连接还没有完全断开。

服务端状态:CLOSE_WAIT(连接还没有完全断开,等待服务端主动调用close函数断开连接)

客户端收到服务端返回的ACK,便认为自己已经断开连接了。状态变为 FIN_WAIT2,为什么不是CLOSED?因为此时只是客户端单方面的断开了连接,代表客户端不能给服务端发送数据,但是可以接收来自服务端的数据!因此,客户端在等待服务端主动断开连接。

客户端状态:FIN_WAIT2(等待服务端主动断开连接)

3、第三次挥手

第三次挥手的时候,就是服务端主动调用close函数的时候。当服务端发送断开连接的请求时,状态变为LAST_ACK ,发送的报文中携带FIN标记位。

服务端状态:LAST_ACK

4、第四次挥手

客户端终于等来了服务端的FIN请求,接收到请求以后发送确认应答ACK,此时客户端进入TIME_WAIT状态,为什么不是CLOSED? 因为此时在网络中存在服务端发给客户端的数据,客户端需要等待一段时间来把这些数据尽可能接收完。等待一定时间后,客户端就会进入CLOSED状态。

客户端状态:TIME_WAIT(等待一段时间后变为CLOSED状态)

服务端一旦接收到ACK,就会进入到CLOSED状态,此时服务端到客户端方向上的连接才算完全断开。

服务端状态:CLOSED

二、TIME_WAIT状态

TCP协议规定,主动断开连接的一方,需要进入TIME_WAIT状态。就像上面那样,客户端主动断开连接后,先是等待服务端断开连接,当接收到服务端的断开连接的请求以后,需要进入TIME_WAIT状态,等待的时长为2MSL。

1、为什么需要TIME_WAIT状态?

在客户端主动断开了一个方向上的连接以后,此时客户端只能接收来自服务端的数据;当服务端的业务处理完以后,主动调用close函数时,便会发送断开连接的请求,客户端接收到携带FIN标志位的报文并给予确认应答以后,便可以进入TIME_WAIT状态了。

此时尽管收到了服务端断开连接的请求,但是可能还有些数据还留在网络中尚未被接收,因此主动断开连接的一方要做的收尾工作就是尽可能接收还在网络中的数据。

2、为什么TIME_WAIT的时间是2MSL?

MSL是TCP报文的最大生存时间,这个相当于经过多次测试得到的结果,你可以理解为从TCP报文从一端传递到另一端的最长所需时间。至于为什么是2MSL,原因有两个。

第一,尽量保证接收到所有的数据。断开连接的时候,可能存在未被接收的数据滞留在网络中,可能有些才刚刚被发出,2MSL正好保证了 从服务端发送 到 服务端收到应答的时间,即一来一回。

第二,尽量保证最后一个ACK被对方收到。如果在TIME_WAIT期间收到对方的第二次FIN,说明上一个发送的ACK丢了,此时处在TIME_WAIT状态,会重新发送一次ACK。

补充:MSL在RFC1122中规定为两分钟,但是各操作系统的实现不同, 在Centos7上默认配置的值是60s

3、bind error的原因以及如何解决

(1) 原因

有的时候,我们因为某种原因主动关闭服务端(比如Ctrl+C发送终止进程的信号),短时间内再次运行服务端,会遇到bind error的情况。服务端主动断开的连接,此时会进入TIME_WAIT状态,端口会被一直占用。一个端口号不能绑定多个进程,若我们再次运行,就会出现绑定失败的情况。

注意:这里是服务端主动断开连接,不是客户端!客户端的端口号一般是OS随机分配的,不会出现重复占用的情况;但是服务端的端口号是固定的,如果关闭服务端又立即重启,就会出现bind error。

(2) 如何解决

这就需要用到一个系统调用接口函数setsockopt,我们可以设置成地址复用,这样的话,服务端进入TIME_WAIT,那就让上一个进程继续等吧,端口号就先被下一个进程使用。

我们只需要在建立连接的之前调用 setsocket函数即可。使用方式如下:

int listenfd = socket(AF_INET,SOCK_STREAM,0);    //创建套接字//设置地址复用
int opt = 1;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

第一个参数是设置哪个套接字绑定的端口复用;

第二个参数设置成SOL_SOCKET;

第三个参数是SO_REUSEADDR,即地址复用

第四个参数类似于一个布尔值,确认要进行地址复用

4、服务端处在TIME_WAIT的危害性

一般来说,服务端是不会主动断开连接,但不排除服务端因为连接过多挂掉的情况,若此时服务器建立了多个连接,那么这种情况下的危害无法想象。就好比双十一的时候,淘宝服务器崩溃了,此时会进入TIME_WAIT状态,短时间内无法重新启动,假设TIME_WAIT要持续两分钟,这两分钟的交易额就是一笔大损失。

三、CLOSE_WAIT状态

1、CLOSE_WAIT 验证

当你看到CLOSE_WAIT状态时,说明此时只是断开了一个方向上的连接,四次挥手并没有完成。下面可以做一个实验,我们让客户端主动断开连接,服务端处在一个死循环中或者服务端不调用close函数。

假设现在客户端和服务端建立好连接,服务端一旦建立连接服务端到客户端方向上的连接,就会处于ESTABLISHED状态。

假设现在客户端断开连接,服务端处于死循环中。

如果我们重启客户端,然后再关闭。我们会发现,又一个进程处在CLOSE_WAIT状态,这都是四次挥手没有完成的表现,这些进程会一直占用资源,所以服务端结束服务以后一定要调用close函数,否则会发生内存泄漏。

2、原因分析

发生CLOSE_WAIT 的原因,大致有两点猜想:

  • 没有处理 read 返回值为  0 的情况。一般read 返回值为0 ,认为对端连接断开;read 返回值小于0,说明读取出错。
  • 主要原因可能还是客户端关闭了连接,然而此时服务端忙于处理其他 IO ,没有关闭连接。

3、解决方案

针对上述第二点,如果服务端因为忙于处理其他事务而忘记关闭连接,此时只能借助 “ 心跳检测机制 ”,即服务端每隔一定时间(默认是2小时)发送报文,判断对端是否会应答;一次不应答,等待一定时间(默认是75 s)后重新发送探测报文;重新探测一定次数(默认是 9 次)后,依然无应答,判断为离线,断开连接。

  • 修改 /proc/sys/net/ipv4/tcp_keepalive_time:缩短心跳检测间隔(默认是 2 小时,即7200 s)
  • 修改 /proc/sys/net/ipv4/tcp_keepalive_intvl:缩短重新探测时的等待时间(默认是 75 s)
  • 修改 /proc/sys/net/ipv4/tcp_keepalive_probes:缩短探测次数(默认是 9 次)

TCP 连接管理机制(二)——TCP四次挥手的TIME_WAIT、CLOSE_WAIT状态相关推荐

  1. TCP连接三次握手和四次挥手

    摘要: 本文主要介绍TCP连接三次握手和四次挥手的机制. 1.三次握手 (1)三次握手的详述 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Clie ...

  2. TCP连接的三次握手四次挥手——类比异地恋情侣开始交往和分手(通俗易懂)

    首先,要详细解释的,先看下面两篇文章.这篇文章只是一个类比,可以辅助理解和记忆. 计算机网络--TCP三次握手详解为什么两次不行 计算机网络--TCP四次挥手过程详解 三次握手(开始交往) 男:(写一 ...

  3. java tcp ack_TCP三次握手和四次挥手以及11种状态

    Java面试笔试面经.Java技术每天学习一点 作者:IT_外卖小哥 来源:https://blog.51cto.com/jinlong 1.三次握手 置位概念:根据TCP的包头字段,存在3个重要的标 ...

  4. 【Java 网络编程】TCP 连接 断开 机制 ( 三次握手 | 四次挥手 )

    文章目录 I TCP 连接建立流程 ( 三次握手 ) II SYN 和 ACK 中的随机值 III TCP 连接建关闭流程 ( 四次挥手 ) IV TCP 连接断开的保证 V 四次挥手的必要性 I T ...

  5. 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

    TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...

  6. TCP协议-TCP连接管理

    一.TCP概述 TCP协议是 TCP/IP 协议族中一个非常重要的协议.它是一种面向连接.提供可靠服务.面向字节流的传输层通信协议. TCP(Transmission Control Protocol ...

  7. 网络——TCP连接管理

    TCP连接管理 一.TCP连接建立 二.TCP的连接释放 真题嗅探 一.TCP连接建立 TCP是面向连接的协议,它基于运输连接来传送TCP报文段. TCP运输连接的建立和释放是每一次面向连接的通信中必 ...

  8. 网络原理 | TCP/IP中的连接管理机制 重要协议与核心机制

    应用层.传输层.网络层.数据链路层.物理层 一.应用层协议 应用层 是程序猿最最经常打交道的一层 其他四层,都是操作系统.驱动.硬件,实现好了的,咱们不需要管 (除非你是系统工程师,驱动开发工程师-- ...

  9. 【计算机网络】传输层 : TCP 连接管理 ( TCP 连接建立 | 三次握手 | TCP 连接释放 | 四次挥手 )

    文章目录 一.TCP 连接管理 二.TCP 连接建立 三.TCP 连接建立 相关报文段 字段 四.SYN 洪泛攻击 五.TCP 连接释放 一.TCP 连接管理 TCP 传输数据过程 : 建立连接 -& ...

最新文章

  1. 最新版ffmpeg 提取视频关键帧
  2. 租赁mt4虚拟服务器,mt4服务器出租
  3. git clone server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile
  4. bitnami下mysql配置-包含phpMyAdmin配置
  5. 【语音去噪】基于matlab最小二乘法(LMS)自适应滤波器【含Matlab源码 481期】
  6. 大一c语言书课后题答案,C语言课后习题答案
  7. MPC5744p时钟模块
  8. 美通企业周刊 | 世界最长海底公路隧道在青海开工;乐高华南首家品牌旗舰店开业;洲际加速布局粤港澳大湾区...
  9. 谷哥学术2022年2月资源分享下载列表 16/20
  10. Android SeekBar 自定义 背景图片 和 滑块图片
  11. 使用cocoapods导入第三方后 报错_OBJC_CLASS_$_XXX
  12. sencha touch ajax params,sencha touch《实现ajax跨域请求》
  13. 一次kubenetes的rook-ceph创建pv失败的故障排查
  14. 关于DBA或SA这个职业的讨论
  15. php js 对象追加元素,JS添加元素新节点
  16. 图----无向图、有向图
  17. ARCGIS中按照某字段属性批量导出shp ,即将一个shp图层分割成单个的shp
  18. Mysql报表统计常用sql
  19. 利用手机实现计算机无线上网的设置过程,win10系统使用点对点无线网络实现手机共享上网的具体方案...
  20. 模型预测控制(MPC)算法原理

热门文章

  1. 如何输入罗马数字I,II,III
  2. 开源社媒体组招募 | 找暑期实习的小伙伴看过来
  3. UE4 如何设置屏幕尺寸和画质
  4. 【ESP8266之Arduino开发】二、实战YeeLink平台远程控制小灯
  5. 求大神解答:msxml3.dll 错误 '80090326' 接收到的消息异常,或格式不正确。 /admin/admin_jijizy.asp,行 611:
  6. 【githubshare】国外工程师 Neil 在 GitHub 上开源了任天堂 64 模拟器
  7. 发送ZPL指令到斑马打印机,并监控打印成功或者失败的状态信息
  8. 使用git进行超大仓库(2.5T,2500 GB数据)的实践
  9. 进程和进程调度器的关系
  10. 雄迈H.265+编码技术, 独领安防视频编码技术风潮