通过 Wireshark 分析 TCP 原理

5 minute

前言

使用 Wireshark 作为抓包工具,通过 ftp 文件上传过程分析 tcp 原理,主要分析过程包括三次握手建立连接的过程,文件传输的过程,四次挥手断开连接的过程。

设备信息

  1. 主机:安装了 ftp 的 windows11(ip:172.23.224.1)
  2. 虚拟机:安装了 vsftpd 的 wsl2(ubuntu18)(ip:172.23.234.65)

操作与分析过程

打开 Wireshark 进行捕获

  1. 选择 vEthernet(WSL) 连接进行捕获。
  2. 使用过滤表达式 ip.addr==172.23.234.65&&tcp 进行捕获。

通过 ftp 上传文件

 1> ftp 172.23.234.65
 2
 3# 连接到 172.23.234.65。
 4# 220 (vsFTPd 3.0.3)
 5# 200 Always in UTF8 mode.
 6# 用户(172.23.234.65:(none)): akyna
 7# 331 Please specify the password.
 8# 密码:
 9# 230 Login successful.
10
11ftp> put a.txt
12# 200 PORT command successful. Consider using PASV.
13# 150 Ok to send data.
14# 226 Transfer complete.
15# ftp: 发送 42 字节,用时 0.00秒 42000.00千字节/秒。

可见已经传输成功。

对捕获的数据进行分析

回到 Wireshark,分析捕获的数据:

tcp_ftp

上图已经包括了三次握手建立连接,登录验证,文件传输,四次挥手结束连接这几个主要的过程。

下面通过生成流量图进行具体分析:

(一)三次握手建立连接

tcp

  • 第一次握手:client 通过 6518 端口向 server 发送连接请求,发送 SYN 和 SEQ,server 在端口 21 进行监听并接收到请求。

  • 第二次握手:server 监听到请求后发送 SYN,ACK 和 SEQ,client 接收到回复。

  • 第三次握手:client 接收到恢复后发送 SEQ(等于刚接收到的 ACK 的值)和ACK,server 接收到并确认 SEQ 正确,完成连接。

(二)文件传输过程

tcp_file

  1. 首先,还是三次握手在 client 端口 6540 和 server 端口 20 之间建立连接,这两个端口用于传输数据;
  2. 接着,server 端口 21 回复 “Response 150 Ok to send data” 给 client 端口 6518,含 PSH 标识,表明可以开始传输数据;
  3. 然后,client 开始发送数据包,长为 42,且含 PSH,表示可以接收数据,server 接收到后回传的 ACK 应该加上数据包长,即 43=1+42;
  4. 接着,client 发送了 FIN 标识,表明发送完毕,server 发送了 FIN 标识,表明将停止接收,client 发送 ACK 确定 server 可以停止接收;
  5. 最后,client 端口 6518 回复 “Response 226 Transfer complete” 给 server 端口 21,表明传输完毕。

(三)四次挥手结束连接

tcp

  1. 第一次挥手:server 发送了 FIN 标识,向 client 确认是否可以关闭连接;
  2. 第二次挥手:client 接收到 FIN,发送 ACK,确定 server 可以关闭连接,这时 server 确定 ACK 正确后将进入半关闭态,还可以接收 client 发送的数据;
  3. 第三次挥手:这次由 client 发送 FIN 标识,让server真的关闭连接;
  4. 第四次挥手:server 关闭连接,发送 ACK 向 client 确认已关闭,至此,ftp 通信完毕。