一文带你读懂:TCP连接的三次握手和四次挥手(上篇)

news/2024/12/2 17:33:48/

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

天下没有不散的宴席,对于 TCP 连接也是这样, TCP 断开连接是通过四次挥手方式。

下面我们通过实操,来彻底理解三次握手和四次挥手。

winter

必须先提及几个基础概念:TCP四元组、TCP协议簇、TCP协议报文。

TCP协议簇

df33389611d870bcb045304f5355d01a.png

TCP四元组

0b6300b7ce46823877bc067c20975cad.png

TCP协议报文 = TCP首部 + TCP荷载。

ee86f75530b7a67670d39773bf65caf8.png

我们通过 curl 112.47.52.137 的抓包记录来分析一下这个TCP报文。

完整报文如下:

5aa168173713f51034935d4894644b1f.png

下面挑选一些跟三次握手和四次挥手,紧密相关的组成字段来解析:

TCP序列号(Sequence Number)

定义:TCP会话的每一端都包含一个32位(bit)的序列号(可能是0和4,294,967,295之间的任意值),该序列号被用来跟踪该端发送的数据量,每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收。

作用:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。

TCP确认号(Acknowledgment Number)

指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。

TCP控制位

TCP在其协议头中使用大量的标志位或者说1位(bit)布尔域来控制连接状态,一个包中有可以设置多个标志位。

TCP控制位即TCP标志位,有6种标示:

  • SYN(synchronous建立联机)

  • ACK(acknowledgement 确认)

  • PSH(push传送)

  • FIN(finish结束)

  • RST(reset重置)

  • URG(urgent紧急)

上面6个控制位里,最常见的是四个标志位:

  • ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。

  • RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。

  • SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。

  • FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。

6adc0c1b88b53300f4f41c1887aef18e.png

864ac61a1c243da78a8c9d4760b6efdd.png

TCP三次连接

3次握手是指发送了3个报文段,TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接。红圈范围内就是3次握手的抓包记录,TCP三次握手完成之后,客户端才向服务端发起一次HTTP请求。

6918c591461a05b435d3189dd52ab1bd.png

62fafbb826f5a54a9a9a908623b39b70.png

三次握手图例

e527b5d56bd1ffb3916701726f1990b7.png

caa23cc524791126ede12942a7db166c.png

第一次握手(客户端→服务端)

客户端发送序列号为Seq = c的SYN数据包给服务器。

070508669d0b9dd08e930c62d348e43f.png

分析:

  • 说明客户端有正常发起请求的能力

49ce39e81c83bd0f876232c1443b6be5.png

第二次握手(服务端→客户端)

服务器接到该包后,响应(或返回)一个序列号为Seq = s,确认号为 Ack = c+1的SYN+ACK数据包给客户端。

e49401a943f2ee61fd165fcf04e144d1.png

分析:

  • 说明服务端有正常接受请求的能力

  • 说明服务端有正常发送请求的能力


cb16bcfc5995a63c523d7f314a80a349.png

第三次握手(客户端→服务端)

客户端收到服务器的响应后,就会回复一个序列号为Seq = c+1, 确认号为Ack = s+1的ACK数据包给服务器,三次握手完成。

62de879e636bb12c12d5e0f251a7e557.png

分析:

  • 说明客户端有正常接受响应的能力


a28bd7d8c1610df7496d5ede26de7065.png

总结

TCP 之所以需要 3 次握手,是因为 TCP 通讯双方都是全双工的,所以要经过 3 次交互才能确认双方的发送能力和接收能力,并且 TCP 握手必须是 3 次,如果是 2 次握手,不能证明服务器端的发送能力和客户端的接收能力;也不能是 4 次握手,因为 3 次已经能证明的事情,再交互握手 1 次完全没有必要。


http://www.ppmy.cn/news/290169.html

相关文章

一文带你了解MySQL之锁

目录 一、解决并发事务带来问题的两种基本方式1.1 一致性读(Consistent Reads)1.2 锁定读(Locking Reads)1.2.1 共享锁和独占锁1.2.2 锁定读的语句 1.3 写操作 二、多粒度锁三、MySQL中的行锁和表锁3.1 其他存储引擎中的锁3.2 Inn…

std::lock_guard

待续 转载于:https://www.cnblogs.com/osbreak/p/11079967.html

cisco IOS,nexus和Arista 的vrrp

最近有用到Arista 7150S 万兆交换机,基本配置跟cisco 的nexus 比较像,但是跟cisco nexus 还是有些差别,后面大家有类似的场景可以注意下:1,Arista 7150s datasheet 设备延时为350ns,比cisco 的250ns 稍高&a…

【笔记】summary函数: summary文件主要调用一系列模块激活hook,用以搭建model(总的layer)中的每一层网络的正向传播框架,使用model(*x)完成网络的正向传播

流程:首先把model中的每一层网络激活hook,完成正向传播的框架搭建,搭建的过程中顺带将每一层的信息进行统计。然后输出input,完成model的正向传播。 x是input type(x) Out: listtype(x[0]) Out: torch.Tensortype(*x) Out: torch…

启天微型计算机可以开vt吗,如何开启笔记本的Virtualization Technology虚拟化技术功能...

现象描述 笔记本是否支持虚拟化功能?是否能开启?如何操作? 现象分析开启虚拟化技术支持,需几个方面的条件支持:芯片组自身支持、BIOS提供支持、处理器自身支持、操作系统支持。操作系统方面,主流操作系统均…

云时代阿里服务器的演进与展望

在整个基础设施中,服务器是面向最终用户提供计算和存储资源,且在数据中心的整体 TCO 中占比最大的至关重要的角色。服务器从诞生到现在,每一次技术的突破和换代,都是朝着更开放、更易用、更优 TCO、更易交付的方向演进。 本文选自…

07_创建tensor,从numpy创建,从List创建,设置默认类型,rand/rand_like,randint,full,arange,linspace/logspace,linspace等等

1.7.创建Tensor 1.7.1.Import from numpy 1.7.2.Import from List 1.7.3.set default type 1.7.4.rand/rand_like,randint 1.7.5.full() 1.7.6.arange() 1.7.7.linspace/logspace 1.7.7.1.torch.linspace() 1.7.7.2.torch.logspace() 1.7.8.ones/zeros/eye 1.7.8.1.ones 1.7.8.…

GM7150 低功耗 NTSC/PAL 视频解码器 PIN TO PIN 完全替代TVP5150

GM7150 低功耗 NTSC/PAL 视频解码器 PIN TO PIN 完全替代TVP5150 1 概述 GM7150 是一款9 位视频输入预处理芯片,该芯片采用CMOS 工艺,通过I2C 总线与PC 或DSP 相连构成应用系统。它内部包含1个模拟处理通道,能实现CVBS、S-Video视频信号源选…