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

2023-11-13

简析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: 表示连接中断。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简析TCP的三次握手与四次分手原理 的相关文章

  • ChatGPT学习相关资料整理

    ChatGPT学习相关资料整理 关于ChatGPT的相关咨询和新闻 ChatGPT能力起源 https mp weixin qq com s 4l0ADjdsCxSVvBeVKxSqWA ChatGPT的发展历程 https zhuanla

随机推荐

  • 生产数据采集MDC的总体思路

    一 数控机床通过网口连到局域网 MDC服务器与数控机床通讯 定时取得所需数据 将数据写入数据库 二 MES对数据库中的数据进行分析 展示到大屏上 我这里是机械制造型企业 以上步骤已经完成 有相同需求的朋友 欢迎一起交流细节
  • SQL INSERT INTO 语句

    INSERT INTO 语句用于向表中插入新记录 语法 指定列插入数据 INSERT INTO table name colnum1 colnum2 column3 VLAUES value1 value2 value3 不指定列插入数据
  • java - JVM CPU100%,问题排查

    前段时间我们新上了一个新的应用 因为流量一直不大 集群QPS大概只有5左右 写接口的rt在30ms左右 因为最近接入了新的业务 业务方给出的数据是日常QPS可以达到2000 大促峰值QPS可能会达到1万 所以 为了评估水位 我们进行了一次压
  • FormData实现文件上传

    应用场景 FormData Ajax技术实现文件上传 1 FormData使用 FormData是一个构造函数 首先new FormData 得到一个FormData对象 可以直接使用 直接console会是一个空白的对象 有append方
  • 未解决-联想拯救者r7000 CTRL+C复制键无法使用

    情况描述 突然不能使用 不知道是什么操作导致不能使用 也不知道什么操作解决了问题 发生次数 四次以上 判断过程 鼠标右键复制可以使用 外接键盘复制可以使用 无QQ 微信等热键冲突 网页 记事本都无法使用 ctrlA ctrlX ctrlV可
  • 手把手教你画活动图,再无难搞的流程分析

    上次介绍了 用例图这样画 3步让你做需求分析有理有据 这次聊聊活动图 也许你对活动图并不了解 不过 说起流程图 想必你不会陌生 你可以暂且把活动图 看成 UML 中的流程图 都知道 做产品要分析流程 可怎么把流程理清楚呢 当然不能凭空想象
  • ANN神经网络入门——分类问题(MATLAB)

    写在前面 本篇博客的鸢尾花分类程序来源于博客http www cnblogs com heaad archive 2011 03 07 1976443 html 在上述博客中 作者主要介绍了以下三部分内容 1 神经网络基本原理 2 AFor
  • Angular和RxJS:添加REST API后端

    本文是SitePoint Angular 2 教程的第3部分 该教程有关如何使用Angular CLI创建CRUD应用程序 在本文中 我们将更新我们的应用程序以与REST API后端进行通信 更喜欢使用分步视频课程学习Angular 退房
  • 上传本地新项目到SVN服务器

    1 在一个已有检出的项目文件夹 如下的文件夹 1 就是我从svn检出的项目 中 在空白处 右键 gt TortoiseSVN gt Repo browser 这样就到了svn服务器的目录了 打开远程地址目录 2 创建一个文件夹给即将上传的项
  • 一文拿下弱网测试:3大弱网模拟工具的配置、场景弱网原因分析、面试题目……

    软件质量不是口头说说 要实际做起来 正文开始 如果app没有对各种网络异常进行兼容处理 那么用户可能在日常生活中遇到APP闪退 ANR 数据丢失等问题 因此 app网络测试 特别是弱网测试尤为重要 本文梳理了app网络测试要点和弱网测试常用
  • 2023年1月16日--2023年1月22日(osg+glsl+socket+ue, 本周20小时,合计1879小时,剩余8121小时)

    目前 ue视频教程进行到了zccs 预1 mysql 7 1 tf1 4 11 o s s 12 2 蓝图反射 1 9 moba 1 5 webapp 2 4 mmoarpg 00A 04 socket 2 57 Opengl 5 9 GL
  • 十三、传智书城项目设计

    项目源代码及sql脚本 一 项目概述 近年来 随着Internet的迅速崛起 互联网已成为收集信息的最佳渠道并逐步进入传统的流通领域 于是电子商务开始流行起来 越来越多的商家在网上建起在线商店 向消费者展示出一种新颖的购物理念 网上购物系统
  • yolo中iou_thres的含义及作用

    yolo中iou thres的含义及作用 iou thres 参数用于控制非极大值抑制 NMS 中的边界框合并阈值 较大的 iou thres 值会导致更多的边界框被合并 从而减少最终输出的边界框数量 是否将 iou thres 设置得更大
  • 图论进阶指南-银河(差分约束/DAG/tarjan)

    测评地址 题目大意 第一行给出两个整数N和M 之后M行 每行三个整数T A B 表示一对恒星 A B 之间的亮度关系 恒星的编号从1开始 如果T 1 说明A和B亮度相等 如果T 2 说明A的亮度小于B的亮度 如果T 3 说明A的亮度不小于B
  • 【STM32】串口初步使用

    本文只作为学习笔记 对串口进行一个简单的介绍 正确的使用方式还需要进行实际的调试 通信的类型 同步 异步 单工 双工 串行 并行 STM32的串口通信 配置片上外设的控制寄存器 通信双方进行相同的配置 约定共同的起始位 停止位 校验位 使得
  • Postman接口测试 —— 设置全局变量、参数传递、断言

    在能熟练使用postman运行接口请求后 会遇到一些问题 例如 我们的web网站一共有几十个接口 测试的时候如果要切换环境 这个时候要每个接口都要修改url的根路径 一个一个的改也太麻烦了 还有时候我们经常需要用到上一个接口的返回值 来作为
  • jQuery隔行变色

  • vant d的地址组件中文操作手册

    vant d的 学习手册 中文操作文档 开发指南 快速上手 基础组件 Empty 空状态 业务组件 地址列表 地址编辑 Area 省市区选择 Card 卡片 Contact 联系人 Coupon 优惠券选择器 GoodsAction 商品导
  • Oracle性能调整的误区

    共享服务器模式 MTS 集群技术 Clustering RAC 分区 并行处理 主要是并行查询 Oracle提供的这些特性确实是用来进行性能改善的 但我们往往忽略了对自身应用特性的分析 它们是否适合于我们 最近 通过对这方面知识的深入了解
  • 简析TCP的三次握手与四次分手原理

    简析TCP的三次握手与四次分手 TCP建立连接过程 第一次握手 建立连接 客户端发送连接请求报文段 将SYN位置为1 Sequence Number为x 然后 客户端进入SYN SEND状态 等待服务器的确认 第二次握手 服务器收到SYN报