问题一: 全链路分析过程中,发现 OBserver 和应用服务器之间的通信也不完全是三次通信握手,应用收到回包数据后会继续发下一条 SQL?
答:

客户端端口(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 连接,随即可以开始数据的双向传输。
问题二: 应用发送包的 SEQ 值就是后面数据库回包的 ACK 值,为什么这个时候不会 +1?
答: 数据传输阶段并不是通过 TCP 的三次握手来进行的;客户端和服务器之间的连接确实使用了 TCP 协议,而在 TCP 协议建立连接的过程中是需要进行三次握手的,这是 TCP 协议的规定。但是一旦 TCP 连接建立成功,OceanBase 协议的数据传输并不会再次进行三次握手。都已经不是 3 次握手了,所以并不会 +1 了。
适用版本
OceanBase 数据库所有版本。