关闭机制的工作流程是:应用程序通过调用套接字的close方法或shutdownOutput方法表明数据已经发送完毕。此刻,底层的TCP实现首先将留存在SendQ队列中的数据传输出去(还要依赖于另一端RecvQ队列的剩余空间),然后向另一端发送一个关闭TCP连接的握手信息。该关闭握手消息可以看作是流终止标志:它告诉接收到TCP不会再有新的数据传入RecvQ队列了。(注意,关闭握手消息本身并没有传递给接收到应用程序,而是通过read方法返回-1来指示其在字节流中的位置。)正在关闭的TCP将等待其关闭握手信息的确认信息,该确认信息表明在连接上传输的所有数据已经完全地传输到了RecvQ中。只要收到了确认消息,该连接就变成“半关闭(Half closed)”状态。直到连接的另一个方向中收到了对称的握手信息后,连接才完全关闭--也就是说,连接的两端都表明它们在没有数据要发送了。
TCP连接的关闭事件序列可能以两种方式发生:一种方式是先由一个应用程序调用close()方法(或shutdownOutput()方法),并在另一端调用close()方法之前完成其关闭握手消息;另一种方式是两端同时调用close()方法,它们的关闭握手消息在网络上交叉传输。
下图展示了以第一种方式关闭连接时,底层实现中的事件序列:
关闭握手消息已经发送,套接字数据结构的状态也已经设置为“Closing”(FIN_WAIT_1),然后,close()调用返回。完成这些工作后,将禁止在该Socket上的任何读写操作(会抛出异常)。当收到关闭握手确认消息后,套接字数据结构的状态则改变为“半关闭”(FIN_WAIT_2),这种状态将一直持续,直到接收到另一端的关闭握手消息。
注意:如果连接处于半关闭状态时,远程终端已经离开,那么本地底层数据结构则将无限期地保持在该状态。当另一端的关闭握手消息到达后,则发回一条确认消息并将状态改变成“Time-Wait”。虽然应用程序中相应的Socket实例可能早已消失,与之关联的底层数据结构还将在底层实现中继续存留几分钟。
下图展示了没有首先发起关闭的终端上的事件序列:
关闭消息到达后,它立即发回一个确认消息,并将连接状态改变为“Close-Wait”。
此时,只需要等待应用程序调用Socket的close()方法。调用该方法后,将发起最终的关闭握手消息,并释放底层套接字数据结构,虽然对原始Socket实力的引用仍然留存在Java 程序中。
注意:close()方法和shutdownOutput()方法都没有等待关闭握手的完成,而是调用后立即返回。
Socket.setSoLinger()用于控制close()方法在返回前是否等待关闭握手的完成。setSoLinger()方法没有为当前实现的引用程序提供任何额外担保。
由于消息在网络中传输时看你延迟,TCP规范要求在终止连接时,两端的关闭握手都完成后,至少要有一个套接字在Time-Wait状态保持一段时间。如果在连接两端都完成了关闭握手后,它们都移除了其底层数据结构,而此时在同样一对套接字地址之间又立即建立了新的连接,那么前一个连接在网络上传输时延迟的消息就可能在新连接建立后到达。由于其包含了相同的源地址和目的地址,旧消息就会被错误地认为是属于新连接的,其包含的数据就可能被错误地分配到应用程序中。
Time-Wait状态用于保证每个TCP连接都在一段平静时间内结束,这期间不会有数据发送。平静时间的长度应该等于分组报文在网络上留存的最长时间的两倍。
Time-Wait状态最重要的作用是,只要底层套接字数据结构还存在,就不允许在相同的本地端口上关联其他套接字。尤其是试图使用该端口创建新的Socket实例时,将抛出IOException异常。
第一种情况的时序图:
第二种情况的时序图:
- 大小: 16.2 KB
- 大小: 21.4 KB
- 大小: 27.6 KB
- 大小: 16 KB
分享到:
相关推荐
tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接tcp关闭连接...
杀掉TCP的连接,以便于关闭需要关闭的通信
通信双方以客户-服务器方式建立TCP连接,用于双方信息的相互提交。当信道上没有数据传输时,通信双方应每隔时间C发送链路检测包以维持此连接,当链路检测包发出超过时间T后未收到响应,应立即再发送链路检测包,再...
tcp_killer用于在Linux或macOS上关闭一个TCP连接
TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接。TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手。
典型TCP/IP 通讯源码 实时连接状态查询 支持连接断开后自动重新连接
进行tcp连接监控,定位tcp连接的各种问题,可通过wireshark加载分析,找出连接关闭等各种连接问题的原因。
在TCP协议中RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。 其实...
365TcpView(网络连接查看器),可以为您...2、显示本地和原程地址、端口以及TCP连接状态 。 3、支持自动刷新和手动刷新 。 4、可以显示进程详细信息。 5、可以结束进程,关闭连接。 365TcpView(网络连接查看器)截图
TCPView 是一个 Windows 程序,它将显示系统上所有 TCP 和 UDP 终结点的详细列表,包括 tcp 连接的本地和远程地址和状态。...你) (可以通过选择 " 文件" | “文件” | "关闭连接,或右键单击连接,然后从生成的上下文菜
VC++ socket TCP多连接,长时间不连接自动关闭,服务器代码程序
1. Source Port/Destination Port:表示本机/目的端口号 2. Sequence Number:标识序号 3. Acknowledg
本文链接:https://blog.csdn.net/tt1995cc/article/details/70770042在用QT写服务端时想要知道客户端是否断开
TCP View 查看本机TCP连接IP及端口软件,还可以强制关闭
两个TCP应用同时相互发出同步SYN请求,然后同时发出关闭FIN连接请求。内附抓包数据
电脑网络连接查看器是一款可以为您显示系统中的所有TCP 和UDP 端点的详细...2、显示本地和原程地址、端口以及TCP连接状态 。 3、支持自动刷新和手动刷新 。 4、可以显示进程详细信息。 5、可以结束进程,关闭连接
实现SOCKET TCP断开连接后,重新连接 比如TCP通信过程中,网断了或者拨了网线,如何在代码中自动重新连接TCP服务器.这是常见需求
之后随时控制tcp连接数(vista限制tcp连接数是为了安全)。我们建议大家在下载大文件的时候才把连接数改大,然后退出。等下载完之后打开把它改为默认(点击恢复)。这样就不会影响下载速度的情况下获得更多的系统...