`
szh_java
  • 浏览: 79480 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

TCP连接和断开的握手

 
阅读更多

       众所周知TCP连接需要3次握手,断开需要4次握手。一直不是很清楚怎么回事,最近有仔细的研究了一番,下面把我的理解和网上大虾们的博文总结如下:

       直奔主题,3次握手确认建立连接

     

       第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

       第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

       第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

       4次握手断开连接

     第一次: 客户端A发送一个FIN,用来告诉服务器B,客户A关闭数据传送。

     第二次: 服务端B收到这个FIN后,回发一个ACK,序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

     第三次: 服务器B发送一个FIN给客户端A。表示服务器B关闭与客户端A的数据传送。

     第四次: 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

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

   

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

 

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

   
下面集中连接状态的解释会更好的帮助你理解这几次握手 

   LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。

     SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本 上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态 时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。

     SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

     ESTABLISHED:这个容易理解了,表示连接已经建立了。

     FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别 是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到,以为对方不一定立马给你发送FIN报文。

    FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求关闭连接,另外一方也知道对方要关闭连接,这个状态处于断开连接的第二次和第三次之间。

    TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

    CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

    

    

     

 

 

分享到:
评论

相关推荐

    wireshark抓取TCP连接及断开实验

    本实验旨在利用Wireshark这一强大的网络协议分析工具,深入探索TCP连接建立(三次握手)和连接释放(四次挥手)的过程,并通过实际操作加深对TCP协议的理解。 #### 实验原理 TCP协议是一种面向连接的、可靠的、...

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

    Wireshark 是一个功能强大的网络协议分析工具,能够对 TCP 连接断开过程进行详细的分析和总结。下面我们将对 Wireshark 分析 TCP 连接断开过程进行详细的分析和总结。 一、四次握手过程分析 在 TCP 连接断开过程中...

    TCP-UDP连接断开程序.zip

    本程序“TCP-UDP连接断开程序”专注于帮助用户查看并管理本地的TCP和UDP连接,以便进行网络状态的测试和调试。 TCP是一种面向连接的、可靠的传输协议,它保证了数据包的顺序和完整性。当两台设备建立TCP连接时,...

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

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

    Window下杀掉TCP连接

    9. **TCP/IP配置**:了解TCP/IP协议的工作原理,例如熟知的三次握手和四次挥手过程,有助于理解为何有时候需要手动关闭TCP连接。 掌握这些方法和知识,有助于你在遇到需要强制结束TCP连接的情况时,能够迅速有效地...

    TCP三次握手,四次断开

    ### TCP三次握手详解 #### 第一次握手:客户端发送同步序列号(SYN) - **动作描述**:在TCP连接建立过程中,客户端首先发起连接请求,它通过向服务器发送一个带有`SYN`标志位的数据包来实现。这个数据包包含了...

    tcp协议三次握手过程

    TCP 协议的三次握手过程是为了确保连接的可靠性和正确性。通过三次握手,客户端和服务器可以确认彼此的身份,建立可靠的连接,确保数据传输的正确性。 在 TCP/IP 协议中,TCP 协议提供了可靠的连接服务,采用三次...

    精制版tcp断开连接4步握手示意图

    精制版tcp断开连接4步握手示意图,释义清晰,深入浅出。

    TCP链接与断开

    在TCP中,建立连接和断开连接都有严格的步骤,通常被称为三次握手和四次挥手。 **三次握手:** 1. **SYN (Synchronize Sequence Numbers) 请求**:客户端发送一个带有SYN标志的TCP报文段到服务器,请求建立连接。...

    TCP链接异常断开检测程序

    TCP(Transmission Control Protocol)是一种基于连接的传输层协议,它保证了数据的可靠传输,通过三次握手建立连接,四次挥手断开连接。然而,在实际网络环境中,由于各种原因,如网络故障、主机崩溃等,可能导致...

    案例测试TCP的三次握手和四次挥手过程

    在实际应用中,如本案例所示,可以通过编写C语言的服务器端程序和C#的客户端程序来模拟TCP的连接和断开过程,同时使用Wireshark这样的网络抓包工具,可以直观地观察到三次握手和四次挥手的网络交互细节,这对于理解...

    tcp通讯协议握手分析.zip_Linux tcp通讯详细介绍_tcp 握手 源码_tcp 通讯_握手_通讯握手协议

    四、TCP挥手断开连接 与三次握手类似,TCP关闭连接采用四次挥手(FIN-ACK-FIN-ACK)的机制。这个过程涉及到TCP套接字状态的多次变迁,例如从FIN_WAIT1到TIME_WAIT,再到CLOSED。 五、安全性与优化 在实际应用中,...

    TCP三次握手与四次挥手.pdf

    TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。...通过三次握手和四次挥手的过程,TCP能够提供稳定、可靠的端到端连接,确保数据在复杂多变的网络环境中能够安全、准确地传输。

    tcp三次握手

    TCP通过三次握手建立连接的方式确保了数据传输的可靠性,适合于那些对数据完整性和顺序性有严格要求的应用场景。长连接和短连接的选择取决于具体的应用需求:如果应用需要频繁的操作且数据量大,则更适合使用长连接...

    TCP长短连接简单Demo

    TCP连接分为长连接和短连接,这两种连接方式各有其特点和适用场景。本Demo是用C++语言在VS2017环境下编写的,旨在帮助开发者理解TCP长连接和短连接的实现。 首先,我们要理解TCP连接的基本概念。TCP是一种面向连接...

    TCPIP建立与断开连接详细过程

    在TCP/IP中,TCP协议通过三次握手建立连接,四次挥手来断开连接。 首先,我们来看TCP连接的建立,这个过程被称为三次握手: 1. **第一次握手**:客户端想要与服务器建立连接时,会发送一个带有SYN标志的数据包...

    Wireshark抓包分析TCP“三次握手,四次挥手”.doc

    在本文中,我们将通过 Wireshark 来抓包和分析 TCP“三次握手,四次挥手”过程。 是什么是抓包? 网络传输信息是通过层层打包,最终到达客户端物理层,经过网线等设备传输到服务器端后,再进行层层拆包,最后获取...

    TCPView查看TCP连接

    在学习TCPView的过程中,你需要了解TCP连接的基本概念,包括三次握手、四次挥手、连接状态机等,同时还需要对操作系统中的进程管理和网络服务有一定的认识。结合TCPView提供的信息,可以有效地提升你的网络管理和...

    TCP中长连接短连接

    TCP的三次握手建立连接后,双方可以在连接保持期间反复发送数据,减少了频繁建立和关闭连接的开销。在长连接中,通常会使用滑动窗口流量控制机制来管理发送和接收的数据量,避免拥塞。例如,描述中提到的窗口大小...

    TCP三次握手 四次断开1

    总结来说,TCP的三次握手和四次挥手是为了确保连接的可靠性,三次握手确保双方都有能力接收和发送数据,四次挥手则确保双方都能安全地关闭连接,避免数据丢失或连接混乱。TIME_WAIT状态的存在进一步增强了这种可靠性...

Global site tag (gtag.js) - Google Analytics