目的是客户端和服务器都要确认:彼此都具有「收信息」和「发信息」的能力

第一次握手:客户端向服务端发送请求报文,服务器确认客户端「发信息」的能力,和自己「收信息」的能力
客户A发送 SYN = 1, seq = x
- SYN=1:客户A告诉服务器B:“你好,我想和你建立连接!”
- seq=x:客户A随机选择一个初始序列号x,告诉服务器B:“我从序列号x开始发送数据。”
第二次握手:服务器向客户段回复报文,客户端确认自己有「发信息」「收信息」的能力,和服务器「发信息」「收信息」的能力
服务器B发送 SYN = 1, ACK = 1, seq = y, ack = x + 1
- SYN=1:服务器B告诉客户A:“我也同意建立连接!”
- ACK=1:服务器B告诉客户A:“我收到了你的连接请求。”
- seq=y:服务器B也随机选择一个初始序列号y,告诉客户A:“我从序列号y开始发送数据。”
- ack=x+1:服务器B告诉客户A:“我已经收到了你所有从x开始的数据(只有一个SYN包,占一个字节),现在我期望你下次从序列号x+1开始发送数据。”(这个ack=x+1是对客户A的SYN包的确认)
第三次握手:客户端收到请求后,给服务器发信息,服务器确认了客户端「收信息」的能力,和自己「发信息」能力
客户A发送 ACK = 1, seq = x + 1, ack = y + 1
- ACK=1:客户A告诉服务器B:“我收到了你的确认和同意建立连接的请求。”
- seq=x+1:客户A继续使用自己的序列号(因为第一次发送的SYN包占了一个序列号,所以现在从x+1开始)。
- ack=y+1:客户A告诉服务器B:“我已经收到了你所有从y开始的数据(只有一个SYN+ACK包,占一个字节),现在我期望你下次从序列号y+1开始发送数据。”(这个ack=y+1是对服务器B的SYN包的确认)
各个字段的解释
-
SYN (Synchronize Sequence Numbers):
- 含义:它是一个控制位,表示“请求建立连接”或“同步序列号”。当SYN=1时,意味着发送方希望建立一个连接。
- 作用:在第一次握手和第二次握手中,发送SYN包是为了发起连接请求。
-
ACK (Acknowledgement):
- 含义:它也是一个控制位,表示“确认”。当ACK=1时,表示确认收到对方的数据包。
- 作用:除了第一次握手,后续所有的数据包(包括第二次和第三次握手)都会将ACK位设置为1,表示对之前收到的包的确认。
-
seq (Sequence Number):
- 含义:序列号。它是一个32位的数字,表示发送方本次发送的数据的第一个字节的序号。
- 作用:用于保证数据传输的顺序性和可靠性。发送方会为发送的每个字节编号,接收方可以根据这些序列号来重组数据,并检测是否有丢包。
-
ack (Acknowledgement Number):
- 含义:确认号。它是一个32位的数字,表示接收方期望收到对方的下一个字节的序列号。简单来说,它表示“我已经收到了截止到此序列号-1的所有数据”。
- 作用:用来告知发送方,接收方已经成功收到了哪些数据,并希望从哪个序列号开始接收下一个数据包。