三次握手与四次挥手分别对应TCP连接建立过程与断开过程,先上TCP报文格式:


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

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

1、为何三次握手

三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收机能正常。

第一次握手:Client什么都不能确认;Server确认了对方发送正常
      第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接收正常,对方发送正常

第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收正常,对方发送接收正常

所以三次握手就能确认双发收发功能都正常,缺一不可。

2、为何要发送特定的数据包

三次握手的另外一个目的就是确认双方都支持TCP,告知对方用TCP传输。

第一次握手:Server 猜测Client可能要建立TCP请求,但不确定,因为也可能是Client乱发了一个数据包给自己
        第二次握手:通过ack=J+1,Client知道Server是支持TCP的,且理解了自己要建立TCP连接的意图
        第三次握手:通过ack=K+1,Server知道Client是支持TCP的,且确实是要建立TCP连接

SYN是标志位,SYN=1表示请求连接;

ACK其实就是ack后面加上的那个数,真正发送的时候不单独发ACK,只发ack,下面四次挥手的图同理

【注意】中断连接端可以是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连接就这样关闭了!

【注意】 在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的三次握手和四次断开相关推荐

  1. TCP连接——三次握手和四次断开

    1.面向连接 TCP是一个面向连接的协议,面向连接是指任何一方向对方发送数据前必须先建立通道,比如像打电话一样:必须要等到对方的手机响铃,并且对方接听电话时,才能与对方通信.而UDP则不是面向连接的协 ...

  2. TCP的三次握手与四次断开

    1.三次握手 物理层.数据链路层在物理层面上架设好了通信链路,网络层确定了通信双方的地址,那下一步就是传输层建立逻辑层面上的通信连接,将从应用层获得的报文数据从源端发送给接受端.TCP的三次握手就是在 ...

  3. TCP的三次握手,四次断开

    1.三次握手 1)服务器处于LISTEND,客户端发来请求syn=1.ack=0,  状态为:SYN_SEND 2)服务端收到请求,并返回syn=1.ack=1,  状态为SYN_RCVD 3)确立连 ...

  4. 一文搞懂TCP的三次握手和四次挥手

    目录 1.三次握手 2.四次挥手 3.11种状态名词解析 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开. 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所 ...

  5. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想 http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇 ...

  6. TCP三次握手与四次断开

    第一次握手:建立连接时,客户端发送Syn包(syn=j)到服务器,并进入syn_send状态,等待服务器确认 第二次握手:服务器收到Syn包,必须确认客户端的syn(ack=j+1),同时自己也发送一 ...

  7. 为什么有TCP 的三次握手 和 四次挥手

    由于我们的设备上的通信程序很直接,所以当时没有仔细想过TCP的三次握手和四次挥手这个问题,有的时候自己写的时候 会忘掉这个问题,就是为什么会有三次握手的过程和4次挥手的过程 简单来说就一句话 &quo ...

  8. TCP的三次握手和四次挥手的过程?

    TCP的三次握手和四次挥手的过程? 如下2幅图 如下2幅图

  9. c++TCP的三次握手和四次挥手

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105043395 T ...

最新文章

  1. 11家车企联手高通、大唐,加速V2X在华商用部署
  2. Flask-script
  3. 如何实现可以获取最小值的栈?
  4. html制作手机预览效果,新移动端Html5方式预览报表插件
  5. linux下卸载已安装的软件
  6. nginx 加路由时报错_Nginx自定义模块编写:根据post参数路由到不同服务器
  7. Windows修改注册表按键映射
  8. 财会专用计算机,一种财会专用计算机的制作方法
  9. [转载] 羽毛球——学打羽毛球 08 接发球 发球
  10. 全球首款光线追踪GPU
  11. apscheduler 任务管理
  12. linux配置部署nginx
  13. MLPNet的学习笔记
  14. 网站发布在中文操作系统,但ReportViewer的工具栏显示为英文的解决方法
  15. 实现基于Keepalived高可用集群网站架构的多种方法
  16. 部落战争COC免费获得绿宝石 内购农民攻略
  17. python函数图像绘制、函数不固定_Python中函数图像快速绘制的方法
  18. docker 启动服务 Up Less than a second ago
  19. 速卖通韩国下载量再次登顶,7500万投资换来回报
  20. Python super(钻石继承)

热门文章

  1. Java单链表递归逆置
  2. 【GAOPS045】PDH(E1/T1/J1)和SDH
  3. 使用PS快速保存多种尺寸的图标
  4. oracle中对于TableSpace理解
  5. win10计算机组共享的打印机,Win10系统局域网共享打印机设置 共享大地Win10打印机的方法...
  6. 火爆的AI绘画+红包封面+春联+节日头像+创作者入驻小程序源码
  7. RAFT共识算法学习
  8. 总结低代码海报平台编辑器难点
  9. C语言实践——双人五子棋(简易版)
  10. 【古墓射手】隐私政策