`
xitong
  • 浏览: 6187749 次
文章分类
社区版块
存档分类
最新评论

tcp关闭连接时的四次挥手

 
阅读更多

众所周知,tcp要3次握手来建立连接,而断开连接却需要4次挥手,为何需要4次挥手,同时需要那么多的wait状态,比如wait1和wait2状态,那是因为在建立连接的时候,收发双方都是“纯净”的,客户端发送syn的时候,服务器并没有什么数据要发送,而只是需要发送一个synack即可,因此连接开始的握手所传输的都是控制数据。反观连接结束的握手则不然,由于tcp是全双工的,且连接结束必须由一方发起,因此当一方发起连接结束的握手时,另一方可能正有数据要发给发起结束握手的一方,而fin的ack则可以由这个数据捎带过去,或者以别的方式发出ack。接收fin的进程可能根本就没有在receive或者send中,那么此时接收端的ack肯定是协议栈发送的,但是对方关闭了tcp这个消息必须想办法让应用程序知道后再由应用程序决定如何做,因此不能指望fin的ack一定有另一个fin,以socket的实现为例,建立连接的时候,如果客户端connect,那么服务器端一定有一个处于listen状态的socket在等待接收客户端的syn报文,但是对于结束连接,客户端和服务器端完全就对等了,不能指望另一端一定在等待接收fin,因此每一端都要显式发送fin。
针对是主动发送fin还是被动接收fin后再发送fin,tcp连接关闭时两端的状态机转换并不同,主动发送fin的一端在发出fin后进入wait1状态,然后在收到对端的ack后进入wait2状态,在wait2中如果收到了对端的fin,那么就会进入time-wait状态,之所以有一个wait2和time-wait,是因为对端在收到fin和关闭连接之间有一个时间差并且可能最后的一个ack会丢失从而对端重发fin,在些情况下,可能对端的发送缓冲区中的数据还没有发出,也可能对端会重发fin,总之tcp的可靠性在此时已经不能发挥作用了,因此就只有让时间来冲淡一切了。当然time-wait状态以及waitX状态都可以设置超时时间,超时时间一旦过去,连接将被切断,资源将被回收。
最后举一例来说明连接的断开阶段的问题:client主动断开后经过了一系列阶段后最终进入了time-wait,而server发送给client的一个序列号为s数据d被中间路由器暂存了,client的time-wait超时,此时client又发起了一个对相同server的连接(地址/端口相同),三次握手过后,被暂存的数据d终于被路由器发送到了client,此时client正要接收序列号为s的数据,那么岂不混乱了?如果恰好这个被暂存的数据是前一次server由于没有收到client最后的ack而重新发送的fin分组,那么client就会认为是server断开了连接...因此time-wait是必要的,并且这也解释了为何在client发起连接的时候,序列号要随机生成。

分享到:
评论

相关推荐

    TCP三次握手四次挥手详解

    通过图解,简单明了的介绍了tcp三次握手/四次挥手的全过程,解释为什么建立连接协议是三次握手,而关闭连接却是四次握手

    tcp三次握手四次挥手.md

    TCP(传输控制协议)的三次握手和四次挥手是用于建立连接和释放连接的重要过程。 三次握手的过程如下: 1. 客户端向服务器发送SYN包(同步序列编号),请求建立连接,并包含自身的数据序列号。 2. 服务器收到SYN包...

    TCP三次握手与四次挥手

    在TCP/IP协议中,建立连接协议是三次握手,关闭连接是四次握手。

    抓包分析TCP的三次握手(建立连接)和四次挥手(关闭连接)

    抓包分析TCP的三次握手(建立连接)和四次挥手(关闭连接)

    TCP三次握手和四次挥手

    而需要四次挥手,是TCP的半关闭状态造成的挥手过程中会造成两个重要的状态。 TCP三次握手是一个经典的面试题,它指的是TCP在传递数据之前需要进行三次交互才能正式建立连接,并进行数据传递。(客户端主动发起的)**...

    tcp的三次握手和四次挥手抓包-.pcapng

    用wireshark抓取的tcp的三次握手和四次挥手的包,适用于初学者了解tcp连接建立和断开的流程

    五、TCP四次挥手1

    五、TCP四次挥TCP四次挥过程和状态变迁TCP 断开连接是通过四次挥式双都可以主动断开连接,断开连接后主机中的「资源」将被释放客户端打算关闭连接,此时会发送个

    我终于搞懂了TCP的三次握手和四次挥手(图片案例详解)

    TCP三次握手和四次挥手不管是在开发还是面试中都是一个非常重要的知识点,它是我们优化web程序性能的基础。欢迎学习,一起进步 文章目录一.TCP简介二.TCP数据报结构三.TCP的三次握手四.TCP的四次挥手 一.TCP简介 TCP...

    heavylgf#liugf.java#010_1、一道经典的面试题:我再追问你一下TCP断开连接四次挥手的过程1

    1、面试题 2、面试官心里分析 3、面试题剖析

    TCP IP 三次握手及状态变迁图

    介绍TCP IP连接时的三次握手和断开时的四次挥手

    TCP,UDP抓包分析

    通过抓包分析TCP三次握手及四次挥手的过程 首先由Client发出请求连接即 SYN=1 ACK=0 (请看头字段的介绍), TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x 然后 Server 进行回复确认,即 ...

    客户端 tcp

    TCP是面向连接的通信,所以在通信之前,客户端与服务器端必须通过三次握手建立连接,然后在通信完毕,还要通过四次挥手断开连接

    服务器 tcp

    TCP是面向连接的通信,所以在通信之前,客户端与服务器端必须通过三次握手建立连接,然后在通信完毕,还要通过四次挥手断开连接

    C# Socket的TCP通讯的实例代码

    (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。 (3)当完成通信后,服务器关闭与客户端的Socket连接。 客户端的步骤如下。 (1)建立客户端的Socket,确定要...

    FTP服务搭建以协议抓包分析实验*(markdown版)

    4.1FTP链接的建立与断开(TCP一次握手/四次挥手) Q:为什么不是四次挥手? 4.2数据包分析 4.3.FTP常见响应码&应答码 5.FTP的主动模式与被动模式 5.1主动模式(PORT) 5.2被动模式(PASV) 5.3 两种模式的...

    Socket TCP通信.zip

    C++多线程Socket TCP通信源码附带说明文档,编译环境为VS2013,可以实现服务器端和客户端的任意收发,同时能够完成四次挥手的过程,双发均可以主动断开连接。

    基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip

    * `断开`通信的TCP四次挥手 > 如果客户端和服务端`频繁`进行类似操纵,影响整个`开发效率` ## 数据库连接池 > 为了`提高`数据库(关系型数据库)的访问`瓶颈`,除在服务器端添加缓存服务器缓存常用的数据,还可添加...

    _Socket_服务端向指定的客户端发送消息_包含服务器

    TCP是面向连接的通信,所以在通信之前,客户端与服务器端必须通过三次握手建立连接,然后在通信完毕,还要通过四次挥手断开连接

    workerman写mysql连接池的实例代码

    1、减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间 2、减少数据库的并发连接数,即解决应用服务器过多导致的数据库 too many connections ...

    基于javatcpsocket通信的拆包和装包源码-Common-Java-Interview-Questions:秋招总结了一些常见的面试问

    TCP三次握手四次挥手 三次握手: 第一次握手:客户端的应用进程主动打开,并向服务端发出请求报文段。其首部中:SYN=1,seq=x。 第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中...

Global site tag (gtag.js) - Google Analytics