tcpdump是强大的socket抓包工具,可分析网络通信情况,mac下使用必须用root权限执行该工具。
sudo tcpdump, 输入root密码即可使用。
以下是一个简单的UDP套接字交互,用于演示tcpdump的各种参数,
udp服务端:
require "socket"include Socket::Constants
socket = Socket.new(AF_INET, SOCK_DGRAM, 0)
sockaddr = Socket.pack_sockaddr_in(2200, "127.0.0.1")
socket.bind(sockaddr)
loop {
message,client_addr = socket.recvfrom(20)
p message
sleep 1
socket.send(message, 0, client_addr)
}
udp客户端:
require "socket"include Socket::Constants
socket = Socket.new(AF_INET, SOCK_DGRAM, 0)
sockaddr = Socket.pack_sockaddr_in(2200, "127.0.0.1")
loop {
msg = STDIN.gets
socket.send(msg,0,sockaddr)
sleep(3)
message,client_addr = socket.recvfrom(20)
p message
}
tcpdump -D,参数D会列出网络适配器列表
~ sudo tcpdump -D
1.en0
2.fw0
3.utun0
4.en1
5.p2p0
6.lo0
上面的代码是用的环路地址127.0.0.1,所以对应的适配器是6.lo0
要抓取以上代码的tcpdump命令如下:
~ sudo tcpdump -i 6 udp port 2200
-i 6 指定监视环路适配器,udp协议,端口为2200的网络通信
~ sudo tcpdump -X -i 6 udp port 2200
-X 显示通信的数据
启动UDP服务端和客户端,并发送数据,在打开tcpdump的终端窗口可如下所见
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 65535 bytes
15:25:35.952875 IP localhost.30713 > localhost.ici: UDP, length 6
0x0000: 4500 0022 b236 0000 4011 0000 7f00 0001 E..".6..@.......
0x0010: 7f00 0001 77f9 0898 000e fe21 6865 6c6c ....w......!hell
0x0020: 6f0a o.
15:25:36.953409 IP localhost.ici > localhost.30713: UDP, length 6
0x0000: 4500 0022 8777 0000 4011 0000 7f00 0001 E..".w..@.......
0x0010: 7f00 0001 0898 77f9 000e fe21 6865 6c6c ......w....!hell
0x0020: 6f0a o.
以上就是tcpdump抓取的包情况。
~ sudo tcpdump -i 6
重新启动tcpdump工具,并监控环路上所用数据
现在中断UDP服务端,只启动客户端并发送数据,观察tcpdump情况如下:
15:49:40.283935 IP localhost.12195 > localhost.ici: UDP, length 7
15:49:40.283982 IP localhost > localhost: ICMP localhost udp port ici unreachable, length 36
因为服务器停止了,所以这里能看到错误原因:ICMP localhost udp port ici unreachable。