TCP三次握手详解

embedded/2024/11/25 18:47:41/

目录

什么是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.ppmy.cn/embedded/12768.html

相关文章

Excel 冻结前几行

Excel中有冻结首航和冻结首列的选项,但是如果想冻结前几行该怎么操作? 冻结首行或冻结首列 视图 -> 冻结窗格 -> 冻结首行或冻结首列 冻结前几行或前几列 视图 -> 冻结窗格 -> 冻结拆分窗格 具体冻结几行和几列取决于当前选中的单元格。…

基于Qt的二维码生成与识别

基于Qt的二维码生成与识别 一、获取QZxing开源库 1.通过封装的QZxing开源库生成和识别二维码,下载地址:GitCode - 开发者的代码家园https://gitcode.com/mirrors/ftylitak/qzxing/tree/master。 2.下载解压后,使用Qt Creator xx&#xff0…

Qt Android 动态加载动态库失败

问题描述 经过了七七四十九个劫难后程序终于稳定运行起来了,正当我以为完美时,问题又找上门了,QML 里面的二维码图片加载不起来了,这个图片还不是本地图片,是实时生成的。 开始的时候并没有下面日志输出,…

WPF Dispatcher使用invoke造成死锁

在WPF中,使用Dispatcher.Invoke()方法同步调用可以导致死锁,尤其是在不正确处理UI线程和其他线程间的同步时。这里有一个示例来说明这种情况: 假设你有一个WPF应用程序,其中主UI线程需要等待另一个工作线程完成某个任务。而工作线…

如何选择适用于Mac的iPhone数据恢复软件?

以下是全球无数 Mac 用户每天遇到的场景: 用户丢失了重要文件。用户在搜索中输入术语“iPhone数据恢复软件”。出现了数百个可能合适的软件应用程序,使用户很难决定其中哪一个是最好的。 这并不好,因为iOS数据恢复是一个时间敏感的过程&…

Linux 内核调试环境搭建

目录 QEMU Linux 0.11 源码 ​编辑 gdb 调试 学习Linux内核,我们可以看书,实际我们最好可以有一个可以调试的环境,本文就简单介绍一下使用Qemu 和gdb 来调试和查看Linux kernel 。在ubantu 20.04 的PC 上面编译内核源码,通过QE…

Qt实现XYModem协议(五)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

社交媒体数据恢复:YY语音

YY语音数据恢复指南 在我们的日常生活中,数据丢失是一种常见的现象。有时候,我们可能会不小心删除了重要的文件,或者因为硬件故障而导致数据丢失。在这种情况下,数据恢复软件可以帮助我们找回丢失的数据。本文将重点介绍如何使用Y…