TCP四次挥手原理

TCP四次挥手原理TCP协议\TCP四次挥手

大家好,又见面了,我是你们的朋友全栈君。

我们对TCP三次握手耳熟能详,那么你知道TCP四次挥手过程吗?

一、前言

唐代诗人李商隐在《无题》诗中写到:“相见时难别亦难,东风无力百花残”,表达了自己与心爱之人相见之难、离别之苦。如果把这句诗用在形容TCP连接的建立与释放过程,也很贴切。我们知道TCP建立连接时需要三次握手,而TCP连接释放则需要四次挥手,是不是很像诗中描述的意境——见面很难,分开更难。
如果你还不清楚相见之难TCP三次握手过程,可以看我的上篇博文TCP三次握手原理,这样便于你更好理解TCP四次挥手释放连接的过程。

二、TCP四次挥手过程

TCP四次挥手指的是TCP连接释放过程, 不同于TCP连接建立时的三次握手过程,TCP连接释放过程更加复杂。在进入正题前,我们先回忆下TCP协议的两个重要特点:

  • TCP协议面向连接:应用在使用TCP协议通讯时,必须要先建立TCP连接。
  • TCP连接是双向通信:通信的两端是对等的,既能发送数据,也能接收数据,就向我们打电话时一样,既能说也能听。

这两个重要特点决定了TCP连接的释放过程。下面我们一起来看下TCP四次挥手的过程都发生了什么。为了更好的理解,简单的画了下TCP四次挥手示意图如下:
TCP四次挥手过程TCP连接数据传输结束后,通信的双方client与server都可以选择释放当前TCP连接,此时client与server都处于ESTABLISHED(连接确立)状态,TCP连接释放从此状态开始,我们假设是client的应用进程主动发起TCP连接释放:

  • 第一次挥手:client向server主动发送连接释放报文FIN=1,seq=u),报文的首部控制位FIN=1,代表自己的数据已经发送完毕,并且要求释放TCP连接。序号seq=u,u的值为client前面已传送数据的最后一个字节序号加1,client发送完后进入FIN-WAIT-1(终止等待1)状态。
  • 第二次挥手:server收到client的连接释放报文后即给出确认报文ACK=1,ack=u+1,seq=v),序号seq=v,值为server前面已传送数据的最后一个字节序号加1,然后server进入CLOSE-WAIT(关闭等待)状态。这时候client到server这个方向连接就释放了,TCP连接处于 半关闭(half-close)状态,client不再发送数据,但是server仍然可以发送数据给client。
    client收到server确认后进入FIN-WAIT-2(终止等待2)状态,然后等待server发出连接释放报文
  • 第三次挥手:处于CLOSE-WAIT状态的server发送完所有数据后,主动释放连接,server发送的连接释放报文FIN=1,ACK=1,seq=W,ack=u+1),因为半关闭状态,server可能又发送了一些数据,所以序号的值为W,同时保持确认号ack=U+1与上次一致,发送完毕后,server进入LAST-ACK(最后确认)状态,等待client确认。
  • 第四次挥手:client收到server连接释放报文后,给出确认报文(ACK=1,ack=w+1,seq=u+1),此时连接还没释放掉,client要时间等待计时器设置的2MSL的时间,才最终进入CLOSED状态。时间MSL是最长报文寿命时长,RFC793建议为2分钟,但是现在网络中,这个时间设置更小。也就是说client要等待4分钟才能进入CLOSED状态,开始下一个连接。

上面就是TCP连接的释放过程,如果你觉得比较复杂可以简单理解为这样:

client server 数据传输完毕,请求释放连接! 收到,可以释放连接,等我会儿 我还有数据需要发 送,完毕后通知你 我的数据也发送完毕,可以释放连接 收到,释放连接!bye client server

三、小细节

1.为什么client在TIME-WAIT状态必须等待2MSL的时间?
  • 为了保证client的最后发送的ACK报文能到达server。因为这个ACK报文可能丢失,导致处于LAST-ACK状态的server收不到对自己释放连接报文的确认。若是server超时重传了这个报文,client就能在2MSL时间内收到,并且重新一次确认,并重启2MSL计时器。
  • 防止出现“已失效的连接请求报文段”出现,2MSL时间,可以使本连接持续时间内的报文段都从网络中消失。建立下一个TCP连接时就不会出现上次旧连接请求报文段
2.如果一方突然出故障了怎么办?

在TCP连接建立后,client与server传输过程中,假设client突然出故障了,server显然无法再收到client数据了,但是server不能白白等下去。这时TCP的保活计时器(keepalive timer)就登场了。server每收到一次client的数据,就重新设置一下计时器,时间通常是2小时,若2小时内没有再收到client数据,server就会发送一次探测报文段,以后每隔75分钟发送一次,若一连发送10次,client都没有任何响应,server会认为client故障了,直接关闭连接。
保活计时器

四、总结

为了更清晰看到TCP各种连接之间关系,最后附上一张TCP有限状态机图:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137336.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • R语言画图时常见问题

    各位朋友,我已开通微信公共号:小程在线我会把文章及时的更新到公共号上,欢迎大家的关注。1如何在同一画面画出多张图?修改绘图参数,如par(mfrow=c(2,2))或par(mfcol=c(2,2));par():mar设置图离四个边缘的距离;bg设置背景颜色;xaxt和yaxt设置坐标轴标签的类型(=”n”表示不画轴标签);xlim和ylim设置坐标轴的范围…

    2022年4月7日
    30
  • 数据库的事务隔离级别总结[通俗易懂]

    数据库的事务隔离级别总结[通俗易懂]学习数据库的时候常常会接触到事务,ACID等概念,那么到底什么是数据库的事务,数据库事务又具有哪些特点,和ACID有怎样的关系,事务的隔离级别又是做什么的呢?。事务及其四大特性?事务(Transaction):访问并可能更新数据库中各种数据项的一个程序执行单元(unit),它通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起。当在数据库中更改数据成功时…

    2022年5月13日
    55
  • win10键盘灯怎么开启_windows10怎么开键盘灯光

    win10键盘灯怎么开启_windows10怎么开键盘灯光win10系统,联想拯救者,有时我们需要在昏暗的条件下开灯。快捷键Fn+空格(space)fn:functionn大家可以试一试。

    2025年12月1日
    6
  • idea19.3.4激活码【2021.7最新】

    (idea19.3.4激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWN…

    2022年3月20日
    125
  • pytest运行_python压测

    pytest运行_python压测前言pytest运行完用例之后会生成一个.pytest_cache的缓存文件夹,用于记录用例的ids和上一次失败的用例。方便我们在运行用例的时候加上–lf和–ff参数,快速运行上一

    2022年7月29日
    6
  • VMware Ubuntu安装详细过程(详细图解)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!一.下载Ubuntu镜像文件下载地址:http://mirrors.aliyun.com/ubuntu-releases/16.04/进入下载页面,如下图选择版本点击即可下载二.下载及安装VMware下载地址:https://pan.baidu.com/s/1aEEI-DRa4oKeViddxW2CPA…

    2022年4月7日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号