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

详解TCP的三次握手

TCP(三次握手)是指在建立一个可靠的传输控制协议 (TCP) 连接时,客户端和服务器之间的三步交互过程。这个过程的主要目的是确保连接是可靠的、双方的发送与接收能力是正常的,并且可以开始数据传输。下面是对每个步骤的详细解释:

1. 第一次握手:客户端发送 SYN

过程:客户端(A)向服务器(B)发送一个同步报文段(SYN,Synchronize Sequence Number),表示它想要与服务器建立连接。
目的:通知服务器客户端打算建立连接,同时告诉服务器一个初始的序列号(Sequence Number,简写为 Seq),用于后续的数据传输中排序数据包。
报文结构:在这个报文中,SYN 标志位置为 1,Seq 设置为一个随机生成的初始序列号,称为 `Seq = x`。注意,此时客户端进入 `SYN-SENT` 状态,等待服务器响应。

2. 第二次握手:服务器响应 SYN-ACK

-过程:服务器(B)接收到客户端的 SYN 报文后,知道客户端请求建立连接。它会发送一个确认报文(SYN + ACK)给客户端,用来确认已收到客户端的 SYN 请求。
目的:
  1. 通过 SYN 确认双方可以进行通信,服务器也生成一个自己的初始序列号,准备建立连接。
  2. ACK 用来确认已经收到客户端的初始序列号,并告知客户端服务器可以正常通信。
报文结构:
  SYN 标志位也设置为 1,因为服务器也需要同步自己的初始序列号给客户端。
  ACK 标志位设置为 1,表示服务器确认了客户端的 SYN 报文。
  服务器的报文会包含 `Seq = y`(服务器自己的初始序列号)和 `ACK = x + 1`(客户端的序列号加 1,表示已经收到了客户端的 SYN)。
状态:服务器进入 `SYN-RECEIVED` 状态,等待客户端的最终确认。

 3. 第三次握手:客户端确认 ACK

过程:客户端接收到服务器的 SYN + ACK 报文后,确认服务器的响应有效,接下来客户端会发送一个纯 ACK(确认)报文给服务器,表示握手成功。
目的:客户端通过 ACK 确认了服务器的序列号,同时通知服务器连接建立完成,双方可以进行数据传输了。
报文结构:
  ACK 标志位设置为 1,表示确认已经收到了服务器的 SYN。
  报文中的序列号为 `Seq = x + 1`(客户端自己的序列号),`ACK = y + 1`(确认服务器的序列号加 1)。
状态:
  客户端在发送完这个 ACK 报文后,进入 `ESTABLISHED` 状态,连接正式建立,接下来可以进行数据传输。
 服务器接收到 ACK 报文后,也进入 `ESTABLISHED` 状态,连接建立完成。

三次握手的作用
1. 确认双方的接收和发送能力**:三次握手的每次消息传递都确保了双方都能接收和发送数据。
2. 防止旧连接请求的干扰**:三次握手可以防止旧的重复连接请求重新建立连接,从而保证了连接的唯一性和正确性。

为什么需要三次握手,而不是两次?
两次握手不能保证双方的接收能力。例如,假设只有两次握手:
客户端发送一个 SYN 报文,服务器响应 SYN + ACK,客户端就认为连接建立了。但服务器可能由于网络原因没有收到客户端的 ACK,导致服务器无法确定客户端是否准备好接收数据。

三次握手中的第三步(客户端确认 ACK),确保了服务器能收到客户端的确认消息,使得双方都明确了连接状态,避免潜在的问题。

总结

第一次握手**:客户端发送 SYN,表示想建立连接,并发送自己的序列号。
第二次握手**:服务器发送 SYN + ACK,确认收到客户端请求,并发送自己的序列号和对客户端的确认号。
第三次握手**:客户端发送 ACK,确认收到服务器的序列号,并对连接的建立做最终确认。

这样,通过三次握手,TCP 连接才能可靠地建立,接下来才能进行数据传输。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • git 合并分支并解决冲突
  • Kubernetes 常用命令、资源配置整理
  • IHostedLifecycleService是如何管理后台任务的
  • 学生请假管理系统
  • 执行机构是怎么运作的
  • 超详细!!!electron-vite-vue开发桌面应用之应用更新版本提示(十三)
  • 软件测试学习笔记丨Docker 安装、管理、搭建服务
  • ASP.net core 8.0网站发布
  • Linux软件包循环依赖解决 彻底删除i386架构 更新软件源
  • uniapp uni-table合并单元格
  • unity3d入门教程四
  • Nginx怎么重新编译添加模块
  • 深入理解 Milvus:新一代向量数据库的基础技术与实战指南
  • 北斗卫星系统信号介绍
  • NVM (Node Version Manager) 使用教程
  • DOM的那些事
  • Fabric架构演变之路
  • javascript从右向左截取指定位数字符的3种方法
  • js递归,无限分级树形折叠菜单
  • Just for fun——迅速写完快速排序
  • mysql 数据库四种事务隔离级别
  • Python实现BT种子转化为磁力链接【实战】
  • vue.js框架原理浅析
  • yii2中session跨域名的问题
  • 第2章 网络文档
  • 对超线程几个不同角度的解释
  • 前端相关框架总和
  • 日剧·日综资源集合(建议收藏)
  • 我的业余项目总结
  • 写代码的正确姿势
  • 智能合约开发环境搭建及Hello World合约
  • AI算硅基生命吗,为什么?
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #每日一题合集#牛客JZ23-JZ33
  • (12)Hive调优——count distinct去重优化
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (南京观海微电子)——示波器使用介绍
  • (强烈推荐)移动端音视频从零到上手(上)
  • (强烈推荐)移动端音视频从零到上手(下)
  • (转)IOS中获取各种文件的目录路径的方法
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ./configure,make,make install的作用
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .net生成的类,跨工程调用显示注释
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • [1204 寻找子串位置] 解题报告