TCP的三次握手过程

news/2024/10/13 9:47:15

TCP面向连接的、可靠的、基于字节流的传输层通信协议。

TCP是面向连接的协议,所以使用 TCP前必须先建立连接,而建立连接是通过三次握手来进行的。

TCP包头结构

在讲解三次握手的过程之前,我们先来看一下 TCP包的结构:
TCP包结构

TCP包头大小在大多数情况下是固定的,它通常是 20字节(不包括任何选项),但如果启用了选项,则最多可以达到 60字节。下面是 TCP包头的一般结构:

  • 源端口号(16位):表示发送方的端口号。
  • 目标端口号(16位):表示接收方的端口号。
  • 序列号(32位):用于对数据流中的字节进行编号,以便对方能够按顺序重新组装数据。
  • 确认号(32位):表示期望接收到的下一个序列号。
  • 数据偏移(4位):指示 TCP包头的长度,以 4字节为单位。因此,数据偏移的值乘以 4就是 TCP包头的总长度。这个字段也被称为 头部长度
  • 保留位(6位):保留供将来使用,目前全部为 0。
  • 标志位(6位):用于控制 TCP连接的状态,包括 SYNACKFINRSTPSHURG等。
  • 窗口大小(16位):表示发送方的接收窗口大小,用于流量控制。
  • 校验和(16位):用于验证 TCP报文的完整性。
  • 紧急指针(16位):当 URG标志被设置时,紧急指针表示紧急数据的末尾位置。
  • 选项(可选):可以包含各种选项,如最大报文段大小(MSS)、窗口缩放因子等,每个选项的大小不定。

在三次握手过程中,我们主要关注序列号确认号以及标志位中的SYNACK

三次握手过程

通常来说,服务器会开放监听端口,而客户端则主动连接这个端口,创建连接的时候,会进行三次握手,过程如下图所示:
TCP三次握手

  1. 客户端发送 SYN包到服务器,附上一个随机生成的序列号(ISN)。此时客户端处于 SYN_SEND状态。
  2. 服务器返回 SYN+ACK包到客户端,附上一个随机生成的序列号,确认号则是客户端上传的序列号+1。此时服务端处于SYN_RECV状态。
  3. 客户端返回 ACK到服务器,确认号是服务器下发的序列号+1。此时客户端处于ESTABLISHED状态,连接已建立,这个包可以顺带发一些数据。
  4. 服务端收到ACK后,也进入ESTABLISHED状态,可以收发数据。

三次握手的一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。同时也确保了服务端和客户端的收发都能正常进行。

使用 wireshark抓包工具,我们可以看到三次握手的数据:

wireshark

为什么是三次握手?不是两次、四次?

1. TCP 连接使用三次握手的首要原因,是为了防止旧的重复连接初始化造成混乱。

想像一个场景,客户端发了SYN之后宕机了,重启后又发了新的SYN。如果只有两次握手的话,当服务器收到旧的SYN之后,发送ACK给客户端,就直接进入ESTABLISHED状态,这时候就可以发数据了。

但是客户端期待的是新的SYN的序列号,发现服务端发的确认号不对应,会关闭这个连接,而服务器此时已经发了数据过来,这就造成了混乱。

而三次握手,客户端可以收到ACK之后,判断确认号,正确则返回ACK,错误则返回RST告诉服务器关闭这个连接。

使用三次握手和RST控制消息,将是否建立连接的最终控制权交给了客户端,因为只有客户端有足够的上下文来判断当前连接是否是错误的或者过期的,这也是TCP使用三次握手建立连接的最主要原因。

2. 三次握手的第二个原因,是为了交互双方的序列号。

TCP协议的通信双方,都必须维护一个序列号,用来保证数据包的有序,以及丢包时能够重发,所以这个初始化的序列号是很重要的。当客户端发SYN给服务器时,服务器需要返回ACK确认,而服务器发SYN给客户端时,客户端也需要发ACK确认,才能确保两边都有正确的序列号。服务器在发SYNACK时,可以合并成一条消息发送,所以是不需要四次握手的。

参考资料

  • 4.1 TCP 三次握手与四次挥手面试题 - 小林coding

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

用 Python 开发一个【GIF表情包制作神器】

用python成为了微信斗图届的高手然后,好多人表示:虽然存了很多表情包但似乎还不是很过瘾因为它不可以自己来定制我们可不可以根据一些表情素材然后自己制作专属表情包呢像这样本来小帅b想自己实现一个表情包制作器后来发现已经有人在 GitHub 分享了 主要功能就是 可以在原有的…

DRM

DRM是Linux目前主流的图形显示框架,相比FB架构,DRM更能适应当前日益更新的显示硬件。 比如FB原生不支持多层合成,不支持VSYNC,不支持DMA-BUF,不支持异步更新,不支持fence机制等等,而这些功能DRM原生都支持。 同时DRM可以统一管理GPU和Display驱动,使得软件架构更为统一…

Clock Switch,芯片时钟切换的毛刺是什么,如何消除

背景 芯片运行过程中需要时钟切换时,要考虑到是否会产生glitch,小小的glitch有可能导致电路运行的错误。所以时钟切换时需要特别的处理。 直接使用MUX进行时钟切换或者采用如下电路结构进行时钟切换:assign outclock = (clk1 & select) | (~select & clk0);或 assig…

【计算机网络】通过ensp实验分析二三层数据包转发过程

一、实验准备 需要提前安装好wireshark、virtalbox、WinPcap和模拟工具ensp,具体的安装过程可以自行百度~ 特别提醒一点就是virtalbox和ensp的兼容性问题,我安装的是ensp1.3.00.100版本,该版本不支持virtalbox官网的6和7版本,我这边退回到5版本才正常运行起来。二、网络拓扑…

Redis持久化、主从与哨兵架构详解

参考 图灵课堂 https://zhuanlan.zhihu.com/p/443951927 https://blog.csdn.net/weixin_37548768/article/details/124538778?spm=1001.2014.3001.5502 https://www.runoob.com/redis/redis-transactions.htmlredis支持持久化到磁盘,这样可用进一步保证数据的完整性。 redis持…

异或

这道题目的思路比较好 由于\(1\)到\(n\)的路径很多,我们猜想,任意选一条路径可以通过某种异或运算来得到最优解 证明:假设我们选出的路径不是最优路径,那么对于另一条最优路径,一定可以通过我们选出的路径异或上若干个简单环来达到。举个例子说明假设我们选出的是直线段\(…

rt1052点亮0.96寸spi屏

一,前言 目的是用rgb屏,但是rgb屏硬件还没准备好,所以要先学习下lvgl上位机,但是学习完要烧录到屏中看效果,所以我今天就先点亮spi屏。找了之前stm32时候点亮频的lcd驱动进行的移植,cs我不是gpio控制的,所以注释了2行,看起来无影响。 二,说明 0.96存spi驱动的LCD屏ST7…

【网络通信】Windows搭建RTMP视频流服务器(含推流/拉流详细教程)

RTMP(Real-Time Messaging Protocol)是一种用于实时流媒体传输的网络协议,主要用于传输音频、视频和数据。RTMP最初是由Adobe Systems公司开发的,用于其Flash平台和Adobe Media Server,但随着技术的发展和开源社区的推动,RTMP已经成为了一个广泛使用的流媒体传输协议。今…