第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号ISN(比如是100),那客户端向服务端发送的报文段包含SYN标志位(也就是SYN=1),序列 号seq=100。
第二次握手:服务端收到客户端发过来的报文后,发现
SYN=1
,知道这是一个连接请求,于是将客户端的起始序列号
100
存起来,并且随机生成一个服务端的起始序列号
(
比 如是300)
。然后给客户端回复一段报文,回复报文包含
SYN
和
ACK
标志
(
也就是
SYN=1,ACK=1)
、序列号
seq=300
、确认号
ack=101(
客户端发过来的序列号
+1)
。
第三次握手:客户端收到服务端的回复后发现
ACK=1
并且
ack=101,
于是知道服务端已经收到了序列号为
100
的那段报文;同时发现
SYN=1
,知道了服务端同意了这次连接,于是就将服务端的序列号300
给存下来。然后客户端再回复一段报文给服务端,报文包含
ACK
标志位
(ACK=1)
、
ack=301(
服务端序列号
+1)
、
seq=101(
第一次握手时发送报文 是占据一个序列号的,所以这次seq
就从
101
开始,需要注意的是不携带数据的
ACK
报文是不占据序列号的,所以后面第一次正式发送数据时
seq
还是
101)
。当服务端收到报 文后发现ACK=1
并且
ack=301
,就知道客户端收到序列号为
300
的报文了,就这样客户端和服务端通过
TCP
建立了连接。