tcp-TCP断开连接为什么需要4次握手?3次不行吗?

问题描述

TCP断开连接为什么需要4次握手?3次不行吗?

在CSDN博客里找到一个普遍的解释:“这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。”
既然是多数情况下都是分开发送,那是否存在一起发送的情况呢?也就是说:第1次握手,Client->Server(FIN),第2次握手:Server->Client(FIN+ACK),第3次握手:Client->Server(ACK)

解决方案

解释原因:

TCP建立连接要进行3次握手,而断开连接要进行4次,这是由于TCP的半关闭造成的,因为TCP连接是全双工的(
即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭.
关闭的方法是一方完成它的数据传输后,就发送一个FIN来向另一方通告将要终止这个方向的连接.当一端收到一个FIN,它必须
通知应用层TCP连接已终止了这个方向的数据传送,发送FIN通常是应用层进行关闭的结果.

另一种解释:

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

时间: 2024-09-15 15:03:50

tcp-TCP断开连接为什么需要4次握手?3次不行吗?的相关文章

TCP断开连接过程详解

上次我们讲了TCP三次握手建立连接的过程,今天我们结合双方状态的改变来讲讲TCP断开连接的过程:TCP四次挥手. 数据传输结束后,通信的双方都可释放连接.现在A和B都处于ESTABLISHED状态.A的应用程序先向TCP发出连接释放报文段,主动关闭TCP连接.A把连接释放报文段的首部FIN置为1,序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1.这时A进入FIN-WAIT-1状态,等待B的确认. B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v

gprs-SIM808的GPRS在使用TCP通讯时,调用AT+CIPCLOSE无法使服务器断开连接

问题描述 SIM808的GPRS在使用TCP通讯时,调用AT+CIPCLOSE无法使服务器断开连接 目前在使用SIM808模块与云端服务器进行通信,服务器是HTTP Server,使用TCP 进行通信,如果使用移动4G卡,不会出现有时模块调用AT+CIPCLOSE指令后,服务器那边显示TCP仍处于连接状态的情况.而如果使用联通物联网卡,或者普通卡,就会 出现不时的出现模块调用AT+CIPCLOSE之后,服务器那边显示TCP仍处于连接状态 的情况. 各位大神,你们遇到过这种情况吗?这种情况怎么解决

TCP的长连接和短连接

TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应用层有FTP.HTTP.TELNET.SMTP.DNS等协议. 长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持.  短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此

libjingle源码解析(3)-【PseudoTcp】建立UDP之上的TCP(1):连接和关闭

PseudoTcp - 建立UDP之上的TCP(1):连接和关闭 mail:lihe21327 [at] gmail [dot] com 最近阅读了Libjingle的PseudoTcp.LibJingle很是下功夫做P2P了,在UDP之上做了可靠的传输协议PseudoTcp. 了解PseudoTcp之前,我们需要了解一些TCP的特性. 根据<TCP/IP详解>卷1,可以总结如下: 1.TCP是面相连接的,他需要3次握手和4次终止过程. 2.TCP支持Nangle算法和经受时延的确认来控制报文

socket选项自带的TCP异常断开检测

TCP异常断开是指在突然断电,直接拔网线等等情况下,如果通信双方没有进行数据发送通信等处理的时候,无法获知连接已经断开的情况.   在通常的情况下,为了使得socket通信不受操作系统的限制,需要自己在应用层实现心跳包机制,来检查异常断开的情况,一般的方式就是服务器在一段时间没有收到客户端数据包时,定时发包,然后客户端回应,如果已经出现异常断开则服务器接收会返回错误,而客户端在指定时间内没有收到数据包,则主动向服务器发包,得到错误就说明断开.诸如此类的方式就是自己实现的心跳包机制.   但操作系

tcp-求网络大牛解决疑难杂症,为何断开连接后,不出现time_wait状态

问题描述 求网络大牛解决疑难杂症,为何断开连接后,不出现time_wait状态 我们都知道,tcp/ip协议断开连接是4次挥手,主动断开的一方,最后会进入time_wait状态,等待2MSL后变成CLOSED,但是我在本地做了一个php网页,代码逻辑就是先sleep,3秒钟然后输出几个字符,但是查看网络状态时,压根找不到time_wait的状态: 以下是通过natstat命令,查看到机器上的状态 1.在服务器sleep的时候,建立连接的双方都是ESTABLISHED 2.网页输出之后,大约过3秒

WebSocket(伍) 断开连接

原文链接 https://www.web-tinker.com/article/20310.html WebSocket是很民主的,啥都要协商!建立连接时需要握手协议,连断开连接都需要双方共同完成!其实断开连接直接断开TCP连接就可以了,但是这有点暴力.文明点的方法是发个请求,让对方自己断开.客户端要主动断开就必须向服务器发送8这个操作码. 首先是服务器主导断开的情况,最简单的方法是直接把TCP连接断开,这里就不演示了.由于这对客户端来说是个意外断开,WebSocket对象采取应急措施也触发cl

[求助] socket通信.客户端怎样主动断开连接.

问题描述 如题,客户端怎样主动强制和服务器断开,调用socket.close()后服务器inputstream.read()无限循环得到空字符串服务器部分代码:privatevoidsocket(){ServerSocketss;try{ss=newServerSocket(9988);//等待连接客户端System.out.println("正在侦听");Sockets=ss.accept();System.out.println("-----------连接成功-----

TCP连接建立过程中为什么需要“三次握手”(转)

传输控制协议(Transmission Control Protocol, TCP)是一种面向连接的.可靠的.基于字节流的运输层(Transport layer)通信协议.是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的.互联网络与单个网络不同,因为互联网络的不同部分可能有着截然不同的拓扑.带宽.延迟.分组大小和其他参数.TCP的设计目标是能够动态的适应互联网络的这些特性,而且当面对多种失败的时候仍然能够健壮. 每一次TCP连接都需要三个阶段:连接建立.数据传送和连接释放."三次