TCP三次握手详解

目录

什么是TCP

TCP头格式组成

三次握手

第一次握手

第二次握手

第三次握手

三次握手的好处

为什么需要三次握手?


什么是TCP

传输控制协议(TCP)是Internet一个重要的传输层协议。TCP提供面向连接可靠有序字节流传输服务。

  • 面向连接: 应用程序在使用TCP之前,必须先建立TCP连接,而且是一对一的连接。
  • 可靠的:无论网络链路中出现了怎样的变化,TCP都可以保证一个豹纹一定能到达接收端。
  • 有序:TCP报文是有序的,当前一个TCP报文没有接收到的时候,即使接收到了后面的TCP报文,也不能人给应用层去处理。
  • 有序的字节流传输:用户消息通过TCP协议传输时,一条消息可能会被操作系统分组成多个TCP报文。

TCP是处于传输层的一个协议。

image.png

TCP头格式组成

image.png

  • 源端口号和目的端口号:代表连接发起方和连接接收方
  • 序号:在建立连接时,由计算机生产的随机数作为初始值,通过SYN包传给接收端主机,每发送一次数据,就累加一次该数据字节数的大小。用来解决网络包乱序问题。
  • 确认序号:指下一次期望收到的数据的序号,发送端收到这个确认应答以后,可以认为在这个序号以前的数据,都已经被正常接收。 用来解决网络丢包的问题
  • 标志位,如上图,一共6个
    • URG
    • ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1
    • PSH
    • RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
    • SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
    • FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。
  • 数据:连接需要发送的内容

三次握手

image.png

握手之前主动打开连接的客户端结束CLOSED阶段,被动打开的服务器端也结束CLOSED阶段,并进入LISTEN阶段。

随后开始“三次握手”:

第一次握手

  1. 客户端发起连接请求

image.png

  • 客户端想要与服务器建立连接时,会随机选择一个初始序列号(ISN, Initial Sequence Number)
  • 客户端通过发送一个SYN(Synchronize Sequence Numbers)标志位的TCP报文段(Segment)到服务器。 这个报文包含了客户端初始的ISN,也叫client_isn
  • 此时客户端的状态转变为SYN_SENT,表示发送请求,正在等待服务器的确认

第二次握手

  1. 服务器回应客户端请求,并同步序列号

image.png

  • 服务器收到客户端的SYN报文后,确认收到了连接请求
  • 服务器会为这个新的连接分配资源,并为自己也初始化一个序列号ISN,也叫server_isn 
  • 服务器回应客户端,它会返回一个SYN的报文段,并且把ACK(Acknowledgment)标志位也置位,同时在ACK字段填入client_isn + 1作为对客户端SYN的确认
  • 服务器发送的SYN报文中,也包含了自己的ISN(server_isn
  • 此时服务器状态转变为SYN_RECEIVED,表示已经接受了客户端的请求

第三次握手

  1. 客户端确认连接建立

image.png

  •  客户端接收到服务器发来的SYN+ACK报文段后,验证ACK字段中的序列号是否正确(即client_isn + 1
  • 客户端会再次发送一个ACK报文段给服务器,其ACK字段填写server_isn + 1,表示对服务器SYN的确认。
  • 此时客户端状态转变为ESTABLISHED
  • 当服务器收到客户端的ACK报文段后,确认连接建立成功,此时双方都可以开始发送数据。(只有到第三次握手,才能携带数据) 
  • 此时服务器的状态也转变为ESTABLISHED

三次握手的好处

通过这三次握手,双方不仅完成了对彼此接收和发送能力的确认,还同步了双方的初始序列号,这对于后续的数据传输来说至关重要,因为它可以确保数据的有序到达,并能检测到丢失或重复的数据包。同时,三次握手还能防止旧的连接请求被服务器误认为是新的连接请求,提高了连接的可靠性。

为什么需要三次握手?

1. 确认双方意愿与接收能力:

  • 第一次握手:客户端发送一个SYN(同步序列编号)包到服务器,请求建立连接。这个包中包含了客户端选择的一个随机序列号A。
  • 第二次握手:服务器收到SYN后,回复一个SYN+ACK(同步+确认)包,表示同意建立连接。该包中包含确认号(确认收到客户端的序列号A+1)以及服务器自己的随机序列号B。
  • 第三次握手:客户端收到服务器的SYN+ACK后,再发送一个ACK(确认)包,确认号为服务器的序列号B+1。至此,客户端和服务器都确认了对方的接收能力和建立连接的意愿。

2. 防止旧的连接请求报文段被服务端接收并建立连接:

假设采用两次握手,客户端发送SYN请求,服务器回应ACK确认。此时,如果客户端的SYN请求在网络中滞留,之后才到达服务器,而服务器依然会认为这是一个新的连接请求,并发送ACK确认。这样,即使客户端已经关闭了连接,服务器仍可能误以为连接已成功建立,造成资源浪费和数据混乱。三次握手则可以避免这个问题,因为只有当服务器收到客户端对SYN+ACK的确认(第三次握手)时,才会真正建立连接。

3. 同步双方初始序列号:

三次握手过程中的前两次交互完成了双方初始序列号(ISN)的交换。客户端通过SYN包告知服务器自己的ISN(序列号A),服务器通过SYN+ACK包告知客户端自己的ISN(序列号B)。客户端在第三次握手时确认收到服务器的ISN(序列号B+1),这样双方就达成了对初始序列号的共识,为后续数据传输的有序性和可靠性提供了基础。

综上所述,TCP握手之所以不能简化为两次,主要是因为它需要确保双方都具备连接意愿和接收能力、防止因旧连接请求报文段导致的错误连接,以及同步双方初始序列号以保证数据传输的有序性和可靠性。通过三次握手,TCP能够有效地建立起一个可靠、有序的数据传输通道,符合其作为面向连接、提供可靠服务的传输层协议的设计目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/2603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度糯米携手中山大学举办“开学流水宴”

热游圈消息: 百度糯米携手中山大学,于9月13日在“百团大战”游园会上举办了一场别开生面的“开学流水宴”,吸引了众多新生和百度糯米用户参与。这场长达20米的流水宴不仅为新生们带来了美味佳肴,更为他们提供了结交新朋友、增进同…

编写你的第一个java 程序

1.安装 jdk 网址: Java Downloads | Oracle 一般我们安装jdk 17 就行了 自己练习 自己学习 真正的开发中我们使用jdk 8 这个是最适合开发java 应用程序的 当然你也可以选择你的 系统 来安装这个java 在文件资源管理器打开JDK的安装目录的bin目录,会发…

pycharm远程连接server

1.工具–部署–配置 2.部署完成后,将现有的项目的解释器设置为ssh 解释器。实现在远端开发 解释器可以使用/usr/bin/python3

ROC和AUC

什么是ROC和AUC ROC曲线(Receiver Operating Characteristic curve)和AUC(Area Under the Curve)是用于评估二分类模型性能的重要工具。 ROC曲线以真正例率(True Positive Rate,也称为召回率或灵敏度&…

Scala的函数至简原则

对于scala语言来说,函数的至简原则是它的一大特色。下面让我们一起来看看分别有什么吧! 函数至简原则:能省则省! 初始函数 def test(name:String):String{return name }1、return可以省略,Scala会使用函数体的最后一…

【Ubuntu20.04+Noetic】UR5e+Gazebo+Moveit

环境准备 创建工作空间 mkdir -p ur5e_ws/src cd ur5e_ws/srcUR机械臂软件包 UR官方没更新最新的noetic的分支,因此安装melodic,并需要改动相关文件。 安装UR的模型配置包,包里面有UR模型文件,moveit配置等: cd ~/ur5e_ws/src git clone -b melodic-devel https://git…

探索未来的区块链DApp应用,畅享数字世界的无限可能

随着区块链技术的飞速发展,分布式应用(DApp)正成为数字经济中的一股强劲力量。DApp以其去中心化、透明公正的特点,为用户带来了全新的数字体验,开创了数字经济的新潮流。作为一家专业的区块链DApp应用开发公司&#xf…

3月黄油奶酪行业数据分析:安佳和妙可蓝多领军市场

近些年来,随着新消费主义盛行,老少皆宜的黄油和奶酪逐渐成为都市年轻人的烘培“新宠”。 今年3月份,黄油奶酪表现的中规中矩,处在稳定发展阶段。根据鲸参谋数据显示,3月份,在线上综合电商平台(…

凌恩病原微生物检测系统上线啦,助力环境病原微生物检测

病原微生物是指能够引起人类或动物疾病的微生物,包括病毒、细菌、真菌、衣原体和支原体等。病原微生物可以通过空气、体液等介质传播,危害人体健康,造成财产损失。因此,快速、准确地检测病原微生物对于疫情防控和保障人民生命健康…

VSCode通过跳板机免密连接远程服务器的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

pytorch-解决过拟合之regularization

目录 1.解决过拟合的方法2. regularization2. regularization分类3. pytorch L2 regularization4. 自实现L1 regularization5. 完整代码 1.解决过拟合的方法 更多的数据降低模型复杂度 regularizationDropout数据处理早停止 2. regularization 以二分类的cross entropy为例&…

上海亚商投顾:沪指缩量调整 有色、煤炭等周期股集体大跌

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日缩量调整,午后一度跌近1%,黄白二线走势分化,微盘股指数涨超3%。军…

[图解敏捷口号]普天之下皆我妈-01-新手一次走两步

0 00:00:00,830 --> 00:00:03,750 今天我们来看一句敏捷口号 1 00:00:04,030 --> 00:00:05,660 后面我们会 2 00:00:06,300 --> 00:00:09,570 列一些比较幼稚的口号 3 00:00:09,970 --> 00:00:11,145 一句一句 4 00:00:11,145 --> 00:00:12,790 我们来剖析一…

SpringBoot 启动控制台 --banner.txt实现打印炫酷控制台图案

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 分析源代码,banner.txt实现打印控制台 控制台图案生成网址:Ascii艺术字实现个性化Spring Boot启动banner图案,轻松修改更换banner.txt文件内容,收集了丰富…

SSL证书安装失败怎么办?

在互联网时代,SSL(Secure Sockets Layer)证书已成为保障网站数据传输安全、提升用户信任度的重要工具。然而,在实际操作过程中,SSL证书的安装并非总能一帆风顺,有时会遇到各种导致安装失败的问题。本文将详…

munge服务启动异常问题记录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、问题一:cannot canonicalize "/var/run/munge"二、问题二:Failed to create "/var/run/munge/munge.socket.2.lock": Perm…

美硕科技授权世强硬创代理,继电器具备控制功率小、电磁干扰小特点

受工业自动化、智能制造、物联网以及可再生能源等领域发展的推动,全球继电器市场在过去几年中持续增长,预计未来几年将继续保持这一趋势。 为满足日益增长的市场需求,世强先进(深圳)科技股份有限公司(下称…

jvm中的引用类型

Java中的引用类型 1.强引用 一个对象A被局部变量、静态变量引用了就产生了强引用。因为局部变量、静态变量都是被GC Root对象关联上的,所以被引用的对象A,就在GC Root的引用链上了。只要这一层关系存在,对象A就不会被垃圾回收器回收。所以只要…

Linux shell编程学习笔记47:lsof命令

0 前言 今天国产电脑提示磁盘空间已耗尽,使用用df命令检查文件系统情况,发现/dev/sda2已使用100%。 Linux shell编程学习笔记39:df命令https://blog.csdn.net/Purpleendurer/article/details/135577571于是开始清理磁盘空间。 第一步是查看…

第二篇、SD真人视频转卡通动画 学习笔记

接着第一篇 2K转4K 生成玩卡通视频后,如何转换成更高分辨率的视频 1、将第一篇生成的工作目录下的output目录改成output-old,新建一个output目录 2、进入0,1子目录,把EbSynth生成的Outputxxx都删掉,frames和keys下…