`
daniel_tu
  • 浏览: 184466 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Socket TCP连接和断开过程

    博客分类:
  • Java
阅读更多

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示。

(1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。



                               图1 TCP三次握手建立连接

由 于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

TCP采用四次挥手关闭连接如图2所示。



                               图2  TCP四次挥手关闭连接

1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

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

2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

这 是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到 ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于 LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的 ACK报文

分享到:
评论

相关推荐

    Wireshark分析TCP连接断开过程分析与总结.docx

    Wireshark 分析 TCP 连接断开过程可以帮助我们更好地理解 TCP 连接断开过程,并且可以用于网络故障诊断和性能优化。Wireshark 是一个功能强大的网络协议分析工具,能够对 TCP 连接断开过程进行详细的分析和总结。

    Android socket实现Tcp长连接,断开自动重连

    手写简化版tcp长链接的socket实现,主要功能有断开重连,以及收发读取解码解析,适用于需要用到长链接的原生开发。

    Linux或Windows下判断socket连接状态

    本文将深入探讨在Linux和Windows环境下,如何通过编程来检测Socket连接是否已断开。 首先,理解Socket的基本概念是必要的。Socket是应用层与传输层之间的接口,它允许应用程序通过TCP/IP协议栈与其他计算机进行通信...

    c# socket 通信demo 亲测可用,断开连接事件

    Socket基于TCP/IP协议,可以提供可靠的、面向连接的通信服务。本示例着重介绍如何在C#中使用Socket进行通信,并处理断开连接的事件以及实现重连功能。 首先,我们需要导入`System.Net.Sockets`命名空间,这是C#中...

    Java实现Socket长连接和短连接

    - **Java Socket API**:Java提供了Socket和ServerSocket类来创建和管理TCP连接。通过ServerSocket监听特定端口,等待客户端连接;Socket类则用于客户端发起连接并进行数据传输。 - **多路复用**:Java的Selector和...

    QT TCP服务端如何判断客户端已断开连接 - 北冥有鱼的博客 - CSDN博客1

    总结来说,QT中检测TCP客户端断开连接主要依靠`QAbstractSocket`的`error`信号和`SocketError`枚举类型。当接收到`RemoteHostClosedError`时,表示客户端已经关闭了连接。通过适当地处理这个错误,可以及时发现...

    c#socket断开重连

    首先,我们需要创建一个Socket实例,指定其协议类型(如TCP或UDP)和地址族(如InterNetwork表示IPv4): ```csharp Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp...

    SOCKET断了后重连,TCP断了重连

    实现SOCKET TCP断开连接后,重新连接 比如TCP通信过程中,网断了或者拨了网线,如何在代码中自动重新连接TCP服务器.这是常见需求

    欧姆龙TCP UDP Socket网络通讯.zip

    - "FINS TCP案例"可能包含了使用FINS协议通过TCP Socket与欧姆龙PLC进行通信的具体示例代码或教程,涵盖了连接建立、数据交换和断开连接的过程。 - "FINS UDP案例"则展示了如何利用UDP Socket实现类似功能,但可能...

    Socket TCPUDP测试工具

    在TCP测试工具中,我们可以模拟客户端与服务器之间的连接,检查连接建立、数据传输和断开连接的过程,验证TCP的正确性。 UDP(用户数据报协议)则是无连接的协议,它不保证数据包的顺序、可靠性和完整性。UDP提供了...

    怎样及时检测出非正常断开的TCP连接.DOC

    在 Linux 和 Windows 2000 平台下,可以使用两种方法来检测非正常断开的 TCP 连接:1. 双方定时发送握手消息;2. 使用 TCP 协议栈中的 KeepAlive 探测。第二种方法简单可靠,只需对 TCP 连接的两个 Socket 设定 ...

    socket TCP 简单练习

    3. **关闭连接**:当通信结束时,双方都会执行四次挥手的断开连接过程,确保所有数据都已发送且接收完毕。 在我们的“socket TCP 简单练习”中,我们将创建一个简单的TCP客户端和服务器应用。客户端会向服务器发送...

    利用Keep-Alive处理Socket网络异常断开的方法

    通过使用TCP Keep-Alive机制,我们可以有效地检测并处理Socket网络异常断开的问题,这对于提高网络应用程序的稳定性和用户体验具有重要意义。然而需要注意的是,Keep-Alive机制也有其局限性,例如它不能解决所有的...

    SuperSocket-master_Socket基于TCP、UDP

    - SuperSocket为TCP应用提供了一套完整的事件驱动模型,如连接建立、数据接收、断开连接等,开发者只需关注这些事件的处理即可。 - 它提供了简单易用的API,如`Server.Start()`启动服务器,`Session.Send()`发送...

    tcp连接测试工具socket

    综上所述,"tcp连接测试工具socket"是指使用Delphi的Indy或Winsock组件来创建的工具,它可以帮助开发者测试TCP连接的可靠性、效率和稳定性。通过这个工具,可以模拟客户端和服务器之间的交互,验证网络通信功能是否...

    Socket TCP 调试助手 Modbus调试

    5. **异常处理和重试机制**:在调试过程中,可能会遇到超时、连接断开等问题,需要设计合理的异常处理和重试机制。 6. **日志记录**:为了便于分析和排查问题,工具应提供日志记录功能,记录每次交互的详细信息。 ...

    C# Socket TCP和UDP报文及端口测试工具的开发(提供源码)万能超好测试工具

    总的来说,这个C# Socket TCP和UDP报文及端口测试工具是一个实用的学习资源,它涵盖了网络编程的关键概念,包括连接管理、数据传输和错误处理。对于初学者和有经验的开发者来说,它都是一个有价值的实践平台,可以...

    易语言断开TCP连接

    以下是一个简单的易语言示例,展示了如何创建、连接、断开和重新连接到一个TCP服务器: ```易语言 .套接字 = 创建套接字() .连接结果 = 连接到(.套接字, "192.168.1.1", 80) 如果 .连接结果 ≠ 0 // 连接成功,...

    好用的Tcp Socket调试工具

    1. **实时监控**:这类工具能实时显示TCP连接的建立、数据传输以及断开的过程,帮助开发者了解整个通信流程。 2. **数据捕获**:它们可以捕获网络传输的数据包,并以易于理解的形式展示,如十六进制或字符串格式。 ...

    Socket服务器端断开后重新打开,客户端将自动完成链接

    综上所述,Socket服务器端在断开后重新打开时,客户端的自动重连机制主要依赖于心跳检测、异常处理、重试策略和超时设定。通过这些技术手段,可以确保在网络不稳定或服务器短暂离线的情况下,客户端仍能恢复与服务器...

Global site tag (gtag.js) - Google Analytics