三次握手四次挥手_三次握手和四次挥手?为什么握手比挥手要多一次 - CSDN
精华内容
参与话题
  • 通俗介绍TCP三次握手四次挥手

    万次阅读 多人点赞 2018-08-05 23:19:20
    一直都知道 TCP 建立连接时需要三次握手,释放连接时需要四次挥手,也大概能说出整个过程,但是一直对其中的设计思想理解不深,停留在“只可意会,不可言传”的阶段。这次写一篇博客尝试将其中的思想表达出来。 TCP...

    一直都知道 TCP 建立连接时需要三次握手,释放连接时需要四次挥手,也大概能说出整个过程,但是一直对其中的设计思想理解不深,停留在“只可意会,不可言传”的阶段。这次写一篇博客尝试将其中的思想表达出来。

    TCP 建连三次握手

    首先解释一下每个步骤的作用:
    1、a 时刻,A 准备就绪,发送 SYN 包给 B,尝试建立连接
    2、b 时刻,B 收到 A 发来的 SYN 包,知道 A 要请求建连,回 SYN ACK 包,告诉 A 自己收到了建连请求,可以建连了
    3、c 时刻,A 收到了 B 的回复,知道 B 准备好了,链路通畅,可以发送数据了。回  ACK 告知 B 收到了 B 的回复,下面要开始发送该数据了
    4、d 时刻,B 收到了 A 的回复,知道 A 接下来要发数据了。至此,AB 双方都确认整个链路已经可靠了,接下来可以发送数据了。

     

    为什么要多次确认呢?为什么不可以 A 上来就直接发送数据给 B 呢?
    这里首先要明确一点,TCP 是传输层的协议,是建立在物理层、数据链路层、网络层之上的协议,而底层的网络是不可靠的,可能路由出问题,可能网关出问题,可能网线出问题,A 没法保证自己发出来的消息 B 一定能收到,所以一定要反馈机制,即 ACK,这样才能在不可靠的网络层智商构建可靠的传输层。

     

    类比一下生活中的例子,可以帮助我们理解
    示例1,假设我们在火车上打电话,通话质量很差,我们的通话过程可能会是下面这样:

    AB 双方首先需要确认彼此都能挺到对方的声音,也就是保证电话通道是可靠的,之后才会开始说正事。如果一上来就直接说正事,可能 A 说完之后 B 根本就没有听到。
    实际打电话过程中,如果遇到了断线的情况,双方可能需要进行多次“握手”确认。

     

    示例2,假设我们给刚认识的人第一次打电话,通话过程可能是下面这样:

    AB 双方都要确认对方的身份,也就是保证通话是在跟自己人进行,确保电话通道是可靠的,不是跟骗子通话,然后才会开始说正事。如果一上来没有确认身份,不能保证通道是跟自己人进行的,那直接说出重要的事,很可能就泄漏了机密。

     

    总之,握手过程的最终目的就是保证双方都准备就绪,通路是可靠的,之后就可以放心的发送重要数据了。

     

    那为什么一定是三次呢,为什么不是两次或者四次呢?
    先来说一下为什么不能少。
    一次可以吗?不可以。设想一下,A 对 B 说:我要给你发数据。然后不等 B 的回复,接下来就开始发数据了。这时候根本不能保证 B 已经准备好了,那 A 发出来的数据就没法保证 B 一定能收到。联想生活中的场景,你隔着很远的距离向对方喊话:我要把苹果扔给你。然后不关心对方有没有听到,就直接扔了,那最终的结果通常就是对方接不到苹果,因为对方可能根本没有收到消息。
    两次可以吗?不可以。设想一下,A 对 B 说:我要给你发数据,然后 B 收到消息后给 A 回复:收到,A 在收到 B 的回复后开始发送数据。这时候 A 端是可以准备就绪的,但是 B 端不知道 A 端当前的状态。因为 B 在收到 A 的消息的时候,可能已经过去了很长时间,B 在回消息的时候,A 可能已经不在线了,此时 B 是不能直接发数据的。如果 A 再给 B 回一个 ACK,B 就可以确认当前链路状态了,这就变成了三次握手。

    接下来说一下为什么不是四次。既然三次已经可以保证建立可靠通信,就不需要额外的一次交互了。

     

    下面是几个生活中相关的示例:

    TCP 断链四次挥手

    1、a 时刻,A 向 B 发出 FIN 包,表示自己没有数据要发送了
    2、b 时刻,B 收到 FIN 包,回复 FIN ACK,表示收到了 A 的 FIN 包,不会再接收 A 的数据了
    3、B 在发完 FIN ACK 后,可能还有数据要发给 A,这个数据是不能停止发送的,有数据还是需要继续发送
    4、d 时刻,B 发完了数据,也发出 FIN 包,告诉 A 自己的数据发完了,不再发送数据了
    5、e 时刻,A 收到了 B 的 FIN 包,知道 B 也没有数据要发送了,回复 FIN ACK。此时,连接可以断开了

    建连只需要交互三次,断连却需要四次,这是为什么呢?其实断开连接和建立连接还是不一样的。建连的时候,只要双方都告知对方自己准备好了就可以,但是断连的时候,一方提出要断开连接,不再发数据,另一方不能立即断开,因为这一方可能还有数据要发送,直到数据全部发送完成后才能确认断开。

     

    下面是几个生活中相关的示例:

     

    以上是对于三次握手、四次挥手的简单介绍,里面没有更详细的状态介绍,之后的博客会介绍,这里先放两张图。

    TCP 三次握手

     

    TCP 四次挥手

     

    展开全文
  • 简述TCP的三次握手四次挥手过程

    万次阅读 多人点赞 2019-07-10 12:07:03
    ①TCP是一种精致的,可靠的字节流协议。 ②在TCP编程中,三路握手一般由客户端(Client)调用Connent函数发起。... 图 .TCP三次握手 (1)第一次握手:Client将标志位SYN置为1,随机产生一个值s...

     

    ①TCP是一种精致的,可靠的字节流协议。

    ②在TCP编程中,三路握手一般由客户端(Client)调用Connent函数发起。

    ③TCP3次握手后数据收发通道即打开(即建立了连接)。

    ④简述三路握手过程:

                                             图 .TCP三次握手

    (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
    (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
    (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
            
    ⑤SYN攻击:

      在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了。

    使用如下命令可以让之现行:#netstat -nap | grep SYN_RECV

    ⑥TCP连接的建立:SYN分节

           终止:FIN(finish)分节

    四次挥手

    所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

    由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
    (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态

    (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态
    (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

    (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1Server进入CLOSED状态,完成四次挥手。

    展开全文
  • TCP 和UDP是网络协议的传输层上的两种不同的协议。TCP的特点是面向连接的、可靠的字节流服务。客户端需要和服务器之间建立一个TCP连接,之后才能传输数据。数据到达之前对方就一直在等待,除非对方直接关闭连接,...

          TCP 和 UDP是网络协议的传输层上的两种不同的协议。TCP的特点是面向连接的、可靠的字节流服务。客户端需要和服务器之间建立一个TCP连接,之后才能传输数据。数据到达之前对方就一直在等待,除非对方直接关闭连接,数据有序,先发先到。UDP是一种无连接、不可靠的数据发送协议。发送方根据对方的ip地址发送数据包,但是不保证接收发接包的质量,数据无序还容易丢包。虽然UDP协议不稳定但是在即时通讯(QQ聊天、在线视频、网络语音电话)的场景下,可以允许偶尔的断续,但是这种协议速度快。

    TCP、UDP的报文结构   

    详细引用:https://blog.csdn.net/baidu_32045201/article/details/78021536                  

     

                              UDP的报文结构                                                                             TCP的报文结构

            这里写图片描述                       

     

    TCP协议三次握手、四次挥手、超时重传

    通过抓包观察TCP三次握手具体报文:https://blog.csdn.net/qq_39331713/article/details/81705890

         三次握手是指建立TCP连接协议时,需要在客户端和服务器之间发送三个包,握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

    第一次握手:客户端发送第一个包,其中SYN标志位为1, ACK=0,发送顺序号sequence=X(随机int)。客户端进入SYN发送状态,等待服务器确认。

    第二次握手:服务器收到这个包后发送第二个包,其中包SYN、ACK标志位为1,发送顺序号seq=Y(随机int),接收顺序号ACK=X+1,此时服务器进入SYN接收状态。

    第三次握手:客户端收到服务器传来的包后,向服务器发送第三个包,SYN=0, ACK=1,接收顺序号ACK = Y+1,发送顺序号seq=X+1。此包发送完毕,客户端和服务器进入ESTABLISHED建立成功状态,完成三次握手。

     

    四次握手是指终止TCP连接协议时,需要在客户端和服务器之间发送四个包

    1. 第一次挥手:主动关闭方发送第一个包,其中FIN标志位为1,发送顺序号seq为X。
    2. 第二次挥手:被动关闭方收到FIN包后发送第二个包,其中发送顺序号seq为Z,接收顺序号ack为X+1。
    3. 第三次挥手:被动关闭方再发送第三个包,其中FIN标志位为1,发送顺序号seq为Y,接收顺序号ack为X。
    4. 第四次挥手:主动关闭方发送第四个包,其中发送顺序号为X,接收顺序号为Y。至此,完成四次挥手。

    超时重传指的是,发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送。这个等待时间被称为RTO.  

     

    深入讨论:

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

          建立连接时,ACK和SYN可以放在一个报文里来发送。而关闭连接时,被动关闭方可能还需要发送一些数据后,再发送FIN报文表示同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

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

          两个存在的理由:1、无法保证最后发送的ACK报文会一定被对方收到,所以需要重发可能丢失的ACK报文。2、关闭链接一段时间后可能会在相同的IP地址和端口建立新的连接,为了防止旧连接的重复分组在新连接已经终止后再现。2MSL足以让分组最多存活msl秒被丢弃。

    3、为什么必须是三次握手,不能用两次握手进行连接?

           记住服务器的资源宝贵不能浪费!  如果在断开连接后,第一次握手请求连接的包才到会使服务器打开连接,占用资源而且容易被恶意攻击!防止攻击的方法,缩短服务器等待时间。两次握手容易死锁。如果服务器的应答分组在传输中丢失,将不知道S建立什么样的序列号,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

     

    TCP/IP五层模型和OSI网络七层协议

    1170656-df46648a7fadfa42.jpg

    TCP/IP五层模型
    应用层:  提供给客户端访问服务器网络服务的接口 。常用协议:HTTP、SMTP、FTP、ping、telnet、DNS、DHCP等

    HTTP协议(超文本传输协议)
    详见本篇博客:https://blog.csdn.net/sinat_41144773/article/details/89667597

    传输层:数据传输协议TCP 或 UDP

    网络层 : 负责对数据包进行路由选择和存储转发,负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段和用户数据报封装成分组(IP数据报)或包进行传送。

    IP协议:逐跳发送模式;根据数据包的目的地IP地址决定数据如何发送;如果数据包不能直接发送至目的地,IP协议负责寻找一个合适的下一跳路由器,并将数据包交付给该路由器转发

    ICMP协议:因特网控制报文协议,用于检测网络连接

    数据链路层: 负责分配MAC地址常用协议:地址解析协议(ARP)和反地址解析协议(RARP),实现IP地址与机器物理地址(MAC地址)之间的转换两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧,在两个相邻的链路上传送帧(frame)。每一帧包括数据和必要的控制信息。网卡接口的网络驱动程序,处理数据在物理媒介上的传输;不同的物理网络具有电气特性,网络驱动程序隐藏实现细节,为上层协议提供一致接口


    物理层:所传数据单位是比特(bit)。物理层要考虑用多大的电压代表1 或 0 ,以及接受方如何识别发送方所发送的比特。

    各网络层对应的工作设备:
    物理层:中继器、集线器
    数据链路层:网桥或交换机
    网络层中继系统:路由器
    网络层以上的中继系统:网关

     

    更多网络层协议扩展内容,转载此篇博客

    https://blog.csdn.net/weixin_39554266/article/details/80065785

     

     

    展开全文
  • 建立TCP需要三次握手才能建立,而断开连接则需要次握手。整个过程如下图所示:先来看看如何建立连接的。首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK...

    注:本文转载自https://www.cnblogs.com/thrillerz/p/6464203.html,感谢博主精彩讲解。

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:

    先来看看如何建立连接的。


    首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

    那如何断开连接呢?简单的过程如下:

    【注意】中断连接端可以是Client端,也可以是Server端。

    假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

    整个过程Client端所经历的状态如下:

     


    而Server端所经历的过程如下:转载请注明:blog.csdn.net/whuslei

    【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

    【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
    答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

    【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

    答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

    展开全文
  • TCP三次握手四次挥手详细过程

    千次阅读 2018-07-18 18:40:50
    这篇文章对TCP的三次握手四次挥手详细过程进行总结。 1. TCP连接的建立—三次握手: 先对相关的符号作一下说明: 确认号字段(ack):占四个字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。若...
  • tcp三次握手四次挥手(及原因)详解

    万次阅读 多人点赞 2016-04-13 21:20:22
    一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,只简单的 描述下这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送...
  • TCP三次握手四次挥手过程详解

    千次阅读 2016-02-01 18:41:11
    TCP头部: 其中 ACK SYN 序号 这个部分在以下会用到,它们的介绍也在下面。 暂时需要的信息有: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 SYN(SYNchronization) ...
  • TCP为什么是三次握手四次挥手

    万次阅读 多人点赞 2018-08-20 11:44:42
    为什么建立连接是三次握手断开连接是四次挥手三次握手的流程和四次挥手的流程是什么? 三次握手与四次回收分别对应TCP连接与断开过程 tcp报文格式 标志位含义 ACK:确认序号有效。 SYN:发起一个新连接。 ...
  • TCP协议中的三次握手四次挥手(图解)

    万次阅读 多人点赞 2017-01-04 21:51:52
    建立TCP需要三次握手才能建立,而断开连接则需要次握手。整个过程如下图所示: 先来看看如何建立连接的。 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收...
  • TCP的三次握手四次挥手理解及面试题(很全面)

    万次阅读 多人点赞 2019-10-10 15:23:04
    本文经过借鉴书籍资料、他人博客总结出的知识点,欢迎提问 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;...
  • TCP三次握手四次挥手的全过程

    千次阅读 2019-04-09 11:29:27
    三次握手: 第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,...
  • 两张动图-彻底明白TCP的三次握手四次挥手

    万次阅读 多人点赞 2020-04-06 14:22:03
    背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信。但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在...
  • Http协议三次握手四次挥手

    万次阅读 2017-07-30 18:42:24
    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset...
  • socket的TCP的三次握手&&四次挥手

    万次阅读 2014-10-05 18:18:58
    socket中的TCP_IP的三次握手四次挥手: (一)socket中TCP的三次握手建立连接: (1)tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下: 客户端向服务器发送一个SYN J 服务器向...
  • TCP三次握手四次挥手的全过程  TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有8种表示: SYN(synchronous建立联机) ACK(acknowledgement 确认) ...
  • TCP的三次握手四次挥手详解

    千次阅读 多人点赞 2019-05-22 14:11:42
    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接,与之相反的,采用四次挥手来断开连接: TCP标志位有6种标示,即:SYN(建立联机) 、 ACK(确认) 、 PSH(传送) 、 FIN(f结束) ...
  • 简述TCP三次握手四次挥手过程

    万次阅读 多人点赞 2018-03-06 09:32:03
    TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; SYN:同步序列编号(Synchronize ...
  • TCP‘三次握手’和‘四次挥手’(通俗易懂)

    万次阅读 多人点赞 2018-08-17 11:22:27
    那我们就不得不提 TCP 的三次握手四次挥手三次握手 下图为三次握手的流程图   下面通过我们 wireshark 抓包工具来分析三次握手   三次握手数据包 第一次握手 建立连接。客户端发送连接请求报文段...
  • 简明理解三次握手四次挥手

    万次阅读 多人点赞 2017-03-09 19:34:39
    注:三次握手四次挥手本身并不复杂,但却可以从很多角度理解这两个过程,本文仅取一个视点解读,如有其它看法欢迎留言交流。 三次握手四次挥手分别对应TCP连接建立过程与断开过程,先上TCP报文格式: 三次...
  • 简单描述 TCP三次握手四次挥手过程

    万次阅读 多人点赞 2018-06-03 10:30:32
    TCP三次握手四次挥手过程首先,客户端与服务器均处于未连接状态,并且是客户端主动向服务器请求建立连接:客户端将报文段中的SYN=1,并选择一个seq=x,(即该请求报文的序号为x) 将这个报文发送到服务器。...
1 2 3 4 5 ... 20
收藏数 37,251
精华内容 14,900
关键字:

三次握手四次挥手