客户端和服务器在发送数据之前会进行三次交互建立连接,然后再发送数据。
1.客户端发送SYN=1
(表示建立连接),同时发送一个随机数Seq=x
2.服务器收到请求后回复Ack=x+1
,同时发送一个随机数Seq=y
3.客户端收到响应后回复Ack=y+1
,同时发送Seq=x+1
TCP是一种可靠的全双工传输方式,三次握手保证了客户端和服务端的序列号都能保证确认。
选择你的上网网卡,我选的是
WI-FI: en0
ip.addr == 106.15.55.64 && tcp表示根据源ip目标ip和tcp协议进行过滤。
106.15.55.64
就是服务器的地址。
红框就是三次握手的过程
本来想用
https://rumenz.com
做演示,但是因为使用了https
协议,抓包就比较复杂。为了说明问题就使用了http://tshici.com
进行了演示。
蓝色框的序号是服务器给的序列号(相对序列号
Seq=0
,实际序列号Seq=502372503
),目的是让客户端进行确认。
红框是服务器确认前面客户端的请求序列。
相对回复值
Ack=1
实际回复值
Ack=348969745
就是上一步的实际Seq+1
客户端回复服务器的响应,并确认了上一步的序列号
相对回复值
Ack=1
实际回复值
Ack=502372504
就是上一步的实际Seq+1(上一步的实际序列号是
Seq=502372503
)
到此客户端已经和服务器建立的链接,下面就可以传输网页数据了。
上面我提到了SYN,ACK。在TCP协议里面有
控制位
结构,一共有 6 个标志位如下:
URG (Urgent Bit):值为 1 时,紧急指针生效
ACK (Acknowledgment Bit):值为 1 时,确认序号生效
PSH (Push Bit):接收方应尽快将这个报文段交给应用层
RST (Reset Bit):发送端遇到问题,想要重建连接
SYN (Synchronize Bit):同步序号,用于发起一个连接
FIN (Finish Bit):发送端要求关闭连接