当前位置: 首页 > news >正文

TCP协议中的三次握手

WHAT:什么是三次握手?

建立TCP需要三次握手才能建立,而断开连接则需要四次挥手。

TCP链接是全双工的, 因此每个方向上都必须要关闭

三次握手一定是B向S发起,但是四次挥手可以是B向S也可以是S向B发起的

比如:如果客户端长时间没有发出相应,服务器端也可能主动发起挥手

WHY:为什么需要进行三次握手?

理论上建立传输连接只需一个请求和一个响应。但是,实际网络通信可能导致请求或响应丢失,可采用超时重传解决此问题,即请求或响应的丢失会造成定时器超时溢出,客户端将被迫再次发起连接请求,通过重传连接请求来建立连接。但这又有可能导致重复连接的问题。为避免这些问题,确保传输的可靠性,在建立TCP连接时采用三次握手(Three-way Handshaking,又译三向握手)方法。该方法要求对所有报文段进行编号,每次建立连接时都产生一个新的初始序列号。

 

HOW:三次握手连接的过程

(1)客户端(作为源主机)通过向服务器(作为目的主机)发送TCP连接请求(又称SYN段),其中标志SYN=1, ACK=0;序列号为客户端初始序列号(简称ISN);目的端口号为所请求的服务对应的端口;还包括最大段长度(MSS)选项。这个SYN段不携带任何数据,但是它消耗一个序列号。这一步客户端执行主动打开(Active Open)。

(2)服务器在指定的端口等待连接,收到TCP连接请求后,将回应一个TCP连接应答(又称SYN/ACK段),其中标志SYN=1, ACK=1;序列号为服务器初始序列号;确认号为客户端初始序列号加1;目的端口号为客户端的源端口号。这个SYN/ACK段不携带数据,但消耗一个序列号。这一步服务器执行被动打开(Passive Open)。

(3)客户端再向服务器发送一个TCP连接确认报文(又称ACK段),其中标志SYN=0, ACK=1;序列号为客户端初始序列号加1;确认号为服务器的初始序列号加1。一般来说,这个ACK段不携带数据,因而不消耗序列号。某些实现中,该段可以携带客户端的第1个数据块,此时必须有一个新的序列号来表示数据中的第1个字节的编号。

经过上述3次握手后,TCP连接正式建立。双方都置ACK标志,交换并确认了对方的初始序列号,可以通过连接互相传输数据。

 

三次握手如何区分?

主要通过SYN和ACK区分,第一次只有SYN,第二次包含SYN和ACK,第三次只有ACK

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 新的创作 保护游戏真的是一场大逃杀
  • Swift中的可选类型:揭开Optional的神秘面纱
  • 007 SpringCloudAlibaba基础使用(nacos,gateway)
  • Linux基本命令练习习题
  • Unity与UE,哪种游戏引擎适合你?
  • Objective-C 中的系统调用术:NSTask 深度解析
  • wxml与标准的html的异同?
  • Spark-SparkSubmit详细过程
  • 数据驱动的社交网络:分析Facebook的算法与用户体验
  • 归并排序、计数排序及排序大总结
  • 论文翻译:Benchmarking Large Language Models in Retrieval-Augmented Generation
  • Python中常见数据结构
  • Python酷库之旅-第三方库Pandas(093)
  • 【iOS】——响应者链和事件传递链
  • Redis7基础篇(七)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • AHK 中 = 和 == 等比较运算符的用法
  • CSS3 变换
  • C语言笔记(第一章:C语言编程)
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ECMAScript入门(七)--Module语法
  • es6(二):字符串的扩展
  • github从入门到放弃(1)
  • java2019面试题北京
  • MySQL数据库运维之数据恢复
  • oldjun 检测网站的经验
  • 阿里云Kubernetes容器服务上体验Knative
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 规范化安全开发 KOA 手脚架
  • 树莓派 - 使用须知
  • 为什么要用IPython/Jupyter?
  • mysql面试题分组并合并列
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • $.ajax()方法详解
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (Java数据结构)ArrayList
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (ZT)一个美国文科博士的YardLife
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .“空心村”成因分析及解决对策122344
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET业务框架的构建
  • .net与java建立WebService再互相调用
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • [ 蓝桥杯Web真题 ]-布局切换
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [\u4e00-\u9fa5] //匹配中文字符
  • [000-01-018].第3节:Linux环境下ElasticSearch环境搭建
  • [001-03-007].第07节:Redis中的事务