`
daniel_tu
  • 浏览: 178750 次
  • 性别: 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报文

分享到:
评论

相关推荐

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

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

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

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

    c#socket断开重连

    c#socket断开重新连接,以及循环接收数据,c#socket断开重新连接,以及循环接收数据,

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

    本文链接:https://blog.csdn.net/tt1995cc/article/details/70770042在用QT写服务端时想要知道客户端是否断开

    基于java socket使用tcp udp进行简易控制台命令与文件传输

    2) 基于Java Socket TCP和UDP实现一个简易的网络文件服务程序,包含服务器端FileServer和客户端FileClient; 3) 服务器端启动时需传递root目录参数,并校验该目录是否有效; 4) 服务器启动后,开启TCP:2021端口,...

    C# SOCKET 客户端 主机断开自动重连

    文档内有客户端和服务端socket,实际项目中只用到了客户端,会比较详细,支持断开重连

    Socket TCP通信.zip

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

    Socket TCP协议的服务类(20110304修正)

    引入连接会话超时概念,使用事件机制抛出服务产生的异常和接收到的数据。 /// 主要2个类: /// TcpServer 服务类,要负责监听连接,并为每一个连接创建Session后放置在Session列表中。 /// SocketSession 客户端...

    TCP链接与断开

    TCP 的链接与断开,没有多余的代码,简单明了,只要输入相应的ip端口号,就能实现TCP的链接与断开,特别适合初学者使用

    socket实现了tcp的服务器断和客户端

    下下来即可使用 非常好 一个客户端 一个服务器段

    Socket TCP协议的服务类(BUG修正)

    引入连接会话超时概念,使用事件机制抛出服务产生的异常和接收到的数据。 /// 主要2个类: /// TcpServer 服务类,要负责监听连接,并为每一个连接创建Session后放置在Session列表中。 /// SocketSession 客户端...

    C++使用SOCKET实现TCP-IP协议的通讯最好的DEMO源码

    在上面这张图中,你可以理解为程序A和程序B是2个SOCKET程序,服务器端程序A设置端口为81,已接受到3个客户端的连接,计算机C开了2个程序,分别连接到E和D,而他的端口是计算机自动分配的,连接到E的端口为789,连接...

    基于Socket套接字消息推送系统

    本人是做Android开发的,所以demo重点介绍客户端的一些代码,包括Socket的TCP长连接及发消息,Service如何不被轻易杀死,通过aidl实现界面实时与Service的通信,可以在界面上控制Socket的连接与断开以及发消息,并...

    易语言Hp-Socket5.4.1高性能TCP/UDP通信组件

    3、httpserver发送大文件增加和HPThreadPool结合,能判断断开。可以自行添加其它扩展协议(如:断点续传)。> 升级说明:。1、HP-Socket v5.4.1 完全兼容 HP-Socket v5.3.2 版本,可以直接替换升级。资源作者:。@来源...

    如何在C语言中判断socket是否已经断开

    下面来介绍判断非阻塞SOCKET是否已经断开的几种方法: 注意要区分不同操作系统分别进行测试, 包括WINDOWS, LINUX和UNIX会各有不同。 在WINDOWS下比较简单,可以使用FD_CLOSE事件判断SOCKET是否已经断开 view ...

    接口连接断开demo

    基于TCP协议的socket移动端连接,发送数据,单线程的激发和结束

    qt中使用QTcpSocket时,如果断线了,如何重新连接

    qt中使用QTcpSocket时,如果断线了,如何重连 在qt编程中,经常使用tcp socket(QTcpSocket),但是如果断网了,怎么快速重新连接呢?

    Android基于socket的TCP通信

    基于socket套接字的TCP通信,定时发送心跳包以保持长连接,使用守护线程来守护心跳线程,保证心跳线程持续工作。如果断开连接,启动重连接机制,随着重连接次数增加,连接时间拉长,如果重连接次数达到10次,认为...

    java socket客户端断线重连

    java socket client 断线重连的简单实现 有什么意见可以提哦

    基于TCP用于模拟UDP广播的Socket服务端程序

    该Demo基于TCP用于模拟UDP广播的Socket服务端程序,能够实时监听基于TCP协议的socket客户端的连接和断开,可以用于简单的实现服务端向多客户端发送信息,进行交互

Global site tag (gtag.js) - Google Analytics