1.启动
普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包,注意这里使用超级用户。当用户上网得时候,就会将监视得数据打印出来。
我没使用root用户,结果输入tcpdump命令,提示:
tcpdump: packet printing is not supported for link type BLUETOOTH_HCI_H4_WITH_PHDR: use –w
2.简单实例
监听网卡(我的网卡号是eno16777736)
# tcpdump -i eno16777736
监听指定协议的数据
# tcpdump -i eno16777736 -nn ‘icmp‘ (-nn的功能是用ip地址表示主机。)
说明: 这个是用来监听icmp协议的数据,就是ping命令使用的协议。类似的,如果要监听tcp或者是udp协议,只需要修改上例的icmp就可以了。
3.针对网络接口、端口和协议的数据包截取。
我在虚拟机上运行了一个TCP服务端程序,接收数据,端口为9877,本机上运行客户端发送数据,然后用tcpdump抓包:
# tcpdump -w test.pcap -i eno16777736 tcp port 9877
运行客户端发送数据完成之后,结束抓包(按ctrl+ c中断tcpdump命令的执行)就会在当前目录下生成一个test.pcap文件。
这个文件可以用抓包工具wireshark来分析,直接打开就可以看到这个pcap文件的信息,实际就是TCP数据包格式存储的数据,熟悉TCP格式的话基本都能看懂了。
4.数据包分析
以上一个为例,抓了一个发送“HelloSocket!”的数据包,命令行提示:
5 packets captured
5 packets received by filter
0 packets dropped by kernel
就是抓了一个包。
TCP包最大能容纳65535字节数据,于是我就试想发送一个65535字节的数据,会不会抓到2个,然而提示的是:
13 packets captured
13 packets received by filter
0 packets dropped by kernel
也就是说抓了13个包。原来有个MUT的概念,也就是分片。而且第一次显示的是5个包,第二次显示的是13个包,为何数据量小于MUT不是1个包,经过分析才知道,服务器上面的抓包命令不但抓了收到数据“HelloSocket!”的数据包,还把TCP三次握手的包夜抓了,每次握手传一个包,就是3个包(注意包括服务器发送出去的包),最后还有个XXXXXXXXXXXX包。想要只抓数据包,得修改命令参数,后面补充。
通过这次抓包,可以明显观察到TCP三次握手的情景(下图1,2,3步就是TCP三次握手情形,参考《UNIX网络编程卷1,第三版》,第2.6节TCP连接的建立和终止):
另外,第二次抓包有一个TCP的状态为PSH,如下图(第12步):
我看了一下TCP状态说明,PSH表示有 DATA数据传输,前面第十步,第八步都有数据传输,为何没有PSH呢?