一、抓包分析TCP协议
1.1 简介
- TCP协议是在传输层中,一种面向连接的、可靠的、基于字节流的传输层通信协议。
1.2 环境准备
- 对接口测试工具进行分类:
-
- 网络嗅探工具:Tcpdump、wireshark
-
- 代理工具:Fiddler、Charles、Anyproxy、burp suite、Mitmproxy
-
- 分析工具:Curl、Postman、Chrome Devtool
-
二、Tcpdump
- Tcpdump是一款将网络中传送的数据包的“头”完全截取下来,提供分析的工具。
- 它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句,去掉无用的信息。
- 让Tcpdump时刻监听443端口,如果有异样就输入到log文件中。
- 利用这条命令,会把得到的报告放到目录 /tmp/tcp.log 中。
sudo tcpdump port 443 -v -w /tmp/tcp.log
常用参数 | 含义 |
---|---|
port 443 | 监听443端口 |
-x | 十六进制展示 |
-v | 输出更加详细的信息 |
-w | 把数据写到文件中 |
三、Wireshark
- Wireshark也是一款网络嗅探工具,它除了拥有Tcpdump功能,还有更多扩展功能,比如分析工具,但是在接口测试中,抓包过程往往都是在服务器进行,服务器一般不提供UI界面,所以Wireshark无法在服务器工作,只能利用Tcpdump抓包生成log,然后将log导入Wireshark使用,在有UI界面的客户端上进行分析。
四、实战
- 抓取一个HTTP的GET请求:
(1)在百度搜mp3:http://www.baidu.com/s?wd=mp3
(2)用Tcpdump截获这个get请求,并生成log
(3)用Wireshark打开Tcpdump生成的log
- 使用 Wireshark 查看 log,如图所示:
- 三次握手与四次挥手
- log 的前几段信息是三次握手。因为信道是不可靠的,在发送数据前,就必须确保信道稳定,而三次握手就像是下面这些操作:
(1)第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SENT 状态,等待服务器确认。
(2)第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(seq=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。
(3)第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手,如图所示是三次握手的过程。
结束交流时,也需要进行四次挥手:
(1)第一次挥手:客户端向服务器端发送一个 FIN,请求关闭数据传输。
(2)第二次挥手:服务器接收到客户端的 FIN,向客户端发送一个 ACK,其中 ack 的值等于 FIN+SEQ。
(3)第三次挥手:服务器向客户端发送一个 FIN,告诉客户端应用程序关闭。
(4)第四次挥手:客户端收到服务器端的 FIN,回复一个 ACK 给服务器端。其中 ack 的值等于 FIN+SEQ。
注意: 一个请求可能分为多个包,一个数据也是这样,于是在 Wireshark 会看到很多包。