tcpdump

【 使用环境 】测试环境
【问题描述】
我在实际的全链路分析过程中,发现OBserver和应用服务器之间的通信也不完全是三次通信握手,应用收到回包数据后会继续发下一条SQL,这是这是为啥呢,希望各位大佬不吝赐教 :face_with_peeking_eye:

我理解tcp三次握手发生在建连阶段,而不是数据传输阶段吧?

客户端端口(59504)服务端端口(20401)

TCP 在开始实际数据传输之前使用了一种称为“三次握手”(Three-Way Handshake)的过程来建立连接。

第一次握手:SYN(同步序列编号)

客户端 → 服务器:客户端向服务器发送一个 SYN(Synchronize Sequence Number)报文。这个报文包含一个随机序列号(例如:x),它用来标识传输流的起始字节所在的序号。

第二次握手:SYN-ACK(同步确认)

服务器 → 客户端:服务器接收到 SYN 报文后,为了确认收到,它会向客户端发送一个 SYN-ACK(Synchronize-Acknowledgment)报文。这个报文里,ACK (Acknowledgment) 字段被设置成客户端 SYN 报文序列号+1(x+1),以表示下一个期望接收的字节序号;同时,服务器会在这个报文中包含自己的一个随机序列号(例如:y)。

第三次握手:ACK(确认)

客户端 → 服务器:客户端收到服务器的 SYN-ACK 报文后,发送一个 ACK 报文。在这个报文内,它将 ACK 字段设置为服务器的 SYN 报文序列号+1(y+1),同时将自己之前的序列号+1(x+1)作为自己的序列号。

这三步的握手确保了两端的发送和接收器都准备好进行数据传输。在三次握手之后,客户端和服务器都知道彼此是活动的,且已经准备好开始数据传输,从而可以确保建立一个可靠的 TCP 连接。

一旦三次握手成功完成,客户端和服务器就建立了 TCP 连接,随即可以开始数据的双向传输。

2 个赞

哦哦,我这边看到数据传输阶段,应用发送包的seq值就是后面数据库回包的ACK值,为啥这个时候不会+1呢 :joy:

数据传输阶段并不是通过TCP的三次握手来进行的;客户端和服务器之间的连接确实使用了TCP协议,而在TCP协议建立连接的过程中是需要进行三次握手的,这是TCP协议的规定。但是一旦TCP连接建立成功,MySQL协议的数据传输并不会再次进行三次握手。
都已经不是3次握手了,所以并不会+1了

152dc6cfa3acb30e2ebcd2fb4d4e9b3b

1 个赞