通过 Wireshark 分析 TCP 原理
前言
使用 Wireshark 作为抓包工具,通过 ftp 文件上传过程分析 tcp 原理,主要分析过程包括三次握手建立连接的过程,文件传输的过程,四次挥手断开连接的过程。
设备信息
- 主机:安装了 ftp 的 windows11(ip:172.23.224.1)
- 虚拟机:安装了 vsftpd 的 wsl2(ubuntu18)(ip:172.23.234.65)
操作与分析过程
打开 Wireshark 进行捕获
- 选择
vEthernet(WSL)
连接进行捕获。 - 使用过滤表达式
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,分析捕获的数据:
上图已经包括了三次握手建立连接,登录验证,文件传输,四次挥手结束连接这几个主要的过程。
下面通过生成流量图进行具体分析:
(一)三次握手建立连接
-
第一次握手:client 通过 6518 端口向 server 发送连接请求,发送 SYN 和 SEQ,server 在端口 21 进行监听并接收到请求。
-
第二次握手:server 监听到请求后发送 SYN,ACK 和 SEQ,client 接收到回复。
-
第三次握手:client 接收到恢复后发送 SEQ(等于刚接收到的 ACK 的值)和ACK,server 接收到并确认 SEQ 正确,完成连接。
(二)文件传输过程
- 首先,还是三次握手在 client 端口 6540 和 server 端口 20 之间建立连接,这两个端口用于传输数据;
- 接着,server 端口 21 回复 “Response 150 Ok to send data” 给 client 端口 6518,含 PSH 标识,表明可以开始传输数据;
- 然后,client 开始发送数据包,长为 42,且含 PSH,表示可以接收数据,server 接收到后回传的 ACK 应该加上数据包长,即 43=1+42;
- 接着,client 发送了 FIN 标识,表明发送完毕,server 发送了 FIN 标识,表明将停止接收,client 发送 ACK 确定 server 可以停止接收;
- 最后,client 端口 6518 回复 “Response 226 Transfer complete” 给 server 端口 21,表明传输完毕。
(三)四次挥手结束连接
- 第一次挥手:server 发送了 FIN 标识,向 client 确认是否可以关闭连接;
- 第二次挥手:client 接收到 FIN,发送 ACK,确定 server 可以关闭连接,这时 server 确定 ACK 正确后将进入半关闭态,还可以接收 client 发送的数据;
- 第三次挥手:这次由 client 发送 FIN 标识,让server真的关闭连接;
- 第四次挥手:server 关闭连接,发送 ACK 向 client 确认已关闭,至此,ftp 通信完毕。