tcpdump 是 Unix/Linux 下的抓包工具,可以针对指定网卡、端口、协议进行抓包。
sudo tcpdump host api.test and tcp port 80 -A -nn
sudo tcpdump dst api.test and tcp port 80 -A
man tcpdump
tcpdump -D
tcpdump --list-interfaces
1.en0 [Up, Running]
2.p2p0 [Up, Running]
3.awdl0 [Up, Running]
4.llw0 [Up, Running]
5.utun0 [Up, Running]
6.utun1 [Up, Running]
7.utun2 [Up, Running]
8.en5 [Up, Running]
9.lo0 [Up, Running, Loopback]
10.bridge0 [Up, Running]
11.en1 [Up, Running]
12.en2 [Up, Running]
13.en3 [Up, Running]
14.en4 [Up, Running]
15.gif0 [none]
16.stf0 [none]
17.XHC0 [none]
18.XHC1 [none]
19.ap1 [none]
20.XHC20 [none]
21.VHC128 [none]
Listen on interface.
macOS 下监听适配器,必须使用 root 权限。
sudo tcpdump -i en0
sudo tcpdump -i 1
# 抓取所有经过 en0,目的或源地址是 192.168.50.1 的网络数据
sudo tcpdump -i en0 host 192.168.50.1
# 源地址
sudo tcpdump -i en0 src host 192.168.50.1
# 目的地址
sudo tcpdump -i en0 dst host 192.168.50.1
sudo tcpdump -i en0 port 8080
sudo tcpdump -i en0 net 192.168
sudo tcpdump -i en0 tcp
sudo tcpdump -i en0 udp
sudo tcpdump -i en0 ip
sudo tcpdump -i en0 arp
sudo tcpdump -i en0 icmp
tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
TCP Flag | Flag | Meaning |
---|---|---|
SYN | S | Syn packet, a session establishment request. 一个会话建立请求 |
ACK | A | Ack packet, acknowledge sender’s data. 确认发送方的数据 |
FIN | F | Finish flag, indication of termination. 终止的的标识 |
RESET | R | Reset, indication of immediate abort of conn. 指令立即中止 |
PUSH | P | Push, immediate push of data from sender. 从发送方立即推送数据 |
URGENT | U | Urgent, takes precedence over other data. 优先于其他数据 |
NONE | A dot . | Placeholder, usually used for ACK. 占位符,通常用于 ACK |
抓取所有经过 eth1,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据:
sudo tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host
192.168.1.200)))'
抓取所有经过 eth1,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据:
sudo tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
只抓 SYN 包:
sudo tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
抓 SYN, ACK:
sudo tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'
抓 DNS 请求数据:
sudo tcpdump -i en0 udp dst port 53
-c 参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工 CTRL+C 还是抓的太多,于是可以用 -c 参数指定抓多少个包:
sudo time tcpdump -nn -i en0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null
实时抓取端口号 8000 的 GET 包,然后写入 GET.log:
sudo tcpdump -i eth0 '((port 8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log
客户端 A,服务器 B,初始序号 seq,确认号 ack。
初始状态:B 处于监听状态,A 处于打开状态。
连接后的状态:B 收到 A 的确认后,进入连接状态 ESTABLISHED。
为什么要握手要三次?防止失效的连接请求突然传到服务器端,让服务器端误认为要建立连接。
经过时间等待计时器设置的时间 2MSL 后,A 才进入 CLOSED 状态。
为什么 A 进入 TIME-WAIT 后必须等待 2MSL:
问题 1: 请详细描述三次握手和四次挥手的过程 要求熟悉三次握手和四次挥手的机制,要求画出状态图。
问题 2: 四次挥手中 TIME_WAIT 状态存在的目的是什么? 这个问题是画出四次挥手状态图,会引申问你。不排除还会问为什么四次挥手是四次不是二次等问题。最好是把相关问题均掌握。
问题 3: TCP 是通过什么机制保障可靠性的? 从四个方面进行回答,ACK 确认机制、超时重传、滑动窗口以及流量控制,深入的话要求详细讲出流量控制的机制。
sudo tcpdump -i en0 host www.qq.com and tcp -S -c 50
– EOF –