TCP 通信抓包分析

287 阅读3分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

TCP 三次握手流程

TCP 保证可靠传输,在通信之前会进行三次握手,确保通信双方的发送能力、接收能力正常。

首先服务端要处于监听状态。第一次握手是客户端主动发起请求,客户端发送请求报文,请求报文段中同步 SYN=1 ,并且要消耗一个序号,假设初始序号 seq=x ,发送完后,客户端进入同步已发送状态。 服务端接收到连接请求后,如果同意连接,会有第二次握手,服务端发送确认报文段,确认报文段中 SYN 标志位和 ACK 标志位都为1,假设初始序号 seq=y ,确认序号 ack 是 x+1,然后服务器端进入同步接收状态。客户端接收到确认报文后,会有第三次握手,客户端发送确认报文,确认报文段中 ACK=1 ,序号 seq=x+1 ,确认序号 ack=y+1 ,然后客户端进入连接状态,服务端接收到确认报文后也会进入连接状态。

抓包分析

以上我们了解了 TCP 三次握手的大致过程,现在我们给百度网站发送一个网络请求,通过 wireshark 软件抓包,分析握手过程的数据包。

image.png

发送请求前先打开开发者工具,启动 wireshark 进行抓包,通过上面的截图可以看到,发送给百度的请求的目标服务器 IP 地址是14.215.177.48。

对抓包结果进行筛选后,很容易看到三次握手的三个数据包。

image.png

打开第一个数据包,我们先看下网络层的 IP 数据包。网络层是在两台主机传送数据,而运输层是在两个进程之间传送数据,因此,IP 数据包有源地址和目标地址这两个字段,分别是我主机的 IP 地址和目标机器的 IP 地址,通过目标 IP 地址,路由器才知道要将它发给哪个主机。

image.png

查看运输层的 TCP 数据包,源端口是60539,目的端口是443,本地主机创建了打开60539端口的进程,和百度服务器的443端口建立 TCP 连接。Flags 标志位 SYN=1 , ACK=0 ,表示这是一个建立连接的报文。并且初始序号 seq=0。TCP 连接中传送的数据流中的每一个字节都被编上序号,seq 字段指本报文段所发送数据的第一个字节的序号。

image.png

TCP 建立连接第二次握手的报文中, SYN=1 , ACK=1 。序号 seq=0,确认号 ack=1。确认号是接收方发送的期望收到对方下一个报文段的第一个数据字节的序号,若确认号为N,则到序号N-1为止的所有数据都已正确收到。

image.png

第三次握手确认连接的报文, ACK=1。 序号 seq=1,确认号 ack=1。至此,TCP 连接三次握手完成。

image.png