简析TCP的三次握手与四次分手

TCP建立连接过程:

  1. 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
  2. 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
  3. 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

为什么要三次握手:

谢希仁的《计算机网络》中有过这段话,去解释为什么要有三次握手:“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。”

“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。

假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。

这样防止了服务器端以为建立了连接而一直被占用,浪费资源。

TCP释放连接过程:

  1. 第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
  2. 第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
  3. 第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
  4. 第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

为什么要四次分手:

那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。

TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。

  1. 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看到。(主动方)
  2. FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你(ACK信息),稍后再关闭连接。(主动方)
  3. CLOSE_WAIT:这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。(被动方)
  4. LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。(被动方)
  5. TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FINWAIT1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(主动方)
  6. CLOSED: 表示连接中断。

简析TCP的三次握手与四次分手原理相关推荐

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

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

  2. 简析TCP的三次握手与四次分手

    转载自http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深 ...

  3. 10004---简析TCP的三次握手与四次分手

    原文 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基 ...

  4. TCP的三次握手和四次分手过程详解

    TCP的三次握手和四次分手过程详解 我们知道TCP建立连接需要经过三次握手,而断开连接需要经过四次分手,那三次握手和四次分手分别做了什么和如何进行的呢?我们来分解一下: 三次握手 第一次握手:建立连接 ...

  5. 抓包分析TCP的三次握手和四次分手

    一:三次握手 三次的握手的过程是: 1.由发起方HostA向被叫方HostB发出请求报文段,此时首部中的同步位SYN=1,同时选择一个序列号seq=x.TCP规定,SYN报文(即SYN=1的报文段)不 ...

  6. TCP/IP三次握手和四次分手

    TCP/IP协议 一.说说TCP三次握手过程,如果两次握手会怎么样? A向B发送请求"建立请求" B向A发送请求"同意请求" A向B发送"确认收到你发 ...

  7. TCP的三次握手和四次分手

    参考链接: http://blog.csdn.net/whuslei/article/details/6667471 转载于:https://www.cnblogs.com/HuoAA/p/48263 ...

  8. Tcp三次握手、四次分手,Socket再看不懂,你砍我

    文章目录 Tcp连接 三次握手 为什么要三次 四次分手 光说不练,假把式 三次握手.四次分手抓包 三次握手到四次分手是不可被分割的最小粒度 Socket 文件描述符 获取输入输出流 socket套接字 ...

  9. 通俗大白话来理解TCP协议的三次握手和四次分手

    最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就把看过的一些比较好 ...

最新文章

  1. 查看Linux服务器网卡流量小脚本shell和Python各一例
  2. MySQL数据库:drop、truncate、delete的区别
  3. asp.net跨页面传值收集
  4. 面试-线程池的成长之路
  5. 记一次远程协助的排错案例
  6. PicoDet网络结构在YOLOv5-Lite上的复现
  7. python 和 的区别_Python中is和==的区别
  8. D. Bash and a Tough Math Puzzle
  9. 计算机系统操作权限,已过GSP认证文件计算机系统操作权限确认表.docx
  10. 【Axure原型分享】短视频APP原型模板
  11. Python3 百度图片 美女 下载 爬虫 多线程
  12. 【cmd】cmd怎么到达指定的文件夹
  13. 康考迪亚大学应用计算机科学,康考迪亚大学专业设置
  14. Hadoop:Browse Directory Couldn‘t upload the file
  15. Verilog状态机详述
  16. 心理测评系统软件使用问题二
  17. 全国行政分区明细表(省市区比较2010年左右)(第一部分)
  18. 余弦相似性:找出相似文章
  19. java long 变date_long类型转换成日期 LongToDate
  20. C11简洁之道:tupe元祖

热门文章

  1. 《围城》-- 钱钟书
  2. PyQt5的日期和时间
  3. 从Flask入门SSTI
  4. 开放大学计算机网络试题,国家开放大学电大本科《计算机网络》2024期末试题及答案(试卷号:1255).docx...
  5. 树莓派+GPS之调试测试记录篇
  6. 壁纸 - 精选热门高清图片和主题专辑
  7. countif是什么意思,如何运用?
  8. 回话风格重阳节主题班会PPT模板
  9. 爬虫程序简单部署到云服务器
  10. mmWave Demo Visualizer使用教程