Notes on Wireshark

命令行辅助工具

# 用-s指定抓多少字节
# 指定抓多少字节。等同于Wireshark的Capture|Options|Limit each packet to ...
tcpdump -i eth0 -s 200 -w file.pcap

# 只抓指定IP的包
tcpdump host 192.168.1.121 -w d.pcap

# 只抓80端口的包,通常普通HTTP请求:注意这里的`tcp port 80`一起构成捕获条件
tcpdump -i eth0 tcp port 80

# 查找路由表
netstat -rn
# 或
route

# 发送1个指定大小的ping包
ping 192.168.1.121 -nc 1 -s 1

Wireshark过滤器

顾名思义,查询过滤器是对结果进行过滤,而捕获过滤器则表示只抓取满足条件的包。

查询过滤器

tcp.port == 8080
tcp.port==80 && ip.addr==192.168.1.112
# 排除某个地址的包时应该用如下表达式,而非ip.addr!=192.168.1.121,后者不会过滤任何包
!(ip.addr==192.168.1.121)
http.request.method==POST
http.host contains "baidu"
# 正则匹配dob
ftp.request.arg matches "(?i)(cat|dog)"
# 相邻两帧时差大于1秒的包
frame.time_delta > 1

除以上过滤器外,还可以在Wireshark的右键选择Follow Tcp StreamFollow Tcp Stream过滤一次TCP/UDP请求。

捕获过滤器

host 192.168.1.112
not host 192.168.1.112
net 192.168.1.1/24
# 端口
port 80
# 端口范围
portrange 80-8080
# TCP端口
tcp port 8080

TCP协议

MTU

MTU(Max Transfer Unit)的计算公式为

MTU=MSS+TCP头+IP头

其中MSS即Max Sigment Size。TCP连接建立进行三次握手时会协商MTU值。

Seq

TCP包的两端各自维护一个Seq号,以便在收到乱序包时可以重新排序。

发送方发出的相邻两个包的Seq号的关系是

seq_n=seq_c+length_c

接收方响应ack的计算方式为,

ack=seq_r+length_r

表示相应包及之前的包已经收到

TCP标志位

  • SYN 发起连接请求
  • FIN 请求终止连接
  • RST 重置混乱连接或拒绝无效请求

TCP连接的建立与终止

TCP建立连接时使用的三次握手而非两次握手,是为了防止建立无效连接。TCP终止连接需要四次握手。

Selenium IDE

TCP窗口大小

TCP窗口大小(TCP window size)声明当前发送方的可用缓存。对方发送包时,不会超过此大小。

与MSS的关系:窗口大小决定了同时能发送多少字节,MSS决定了一个TCP包的大小

由于TCP头只留了16bit给TCP窗口(最多表示65535)值,所以为了表示更大的窗口值,需要用Window size scaling factor表示。将其乘以Window size value才是真实的窗口大小。

丢包

RTO:原始包发送至重传的时间差

在本机模拟丢包:

tc qdisc change dev eth0 root netem loss 2%

nslookup

DNS查询默认使用UDP,在nslookup里用如下方式强制使用TCP查询:

nslookup
> set vc
> example.com

检查否存在暴露的内网主机:

nslookup
> set type=srv
> example.com

tshark

# 统计TCP会话
tshark -n -q -r d.pcap -z "conv,tcp"

# 使用显示过滤器
tshark -r test.pcapng -2 -R "ip.addr==192.168.1.112"

# 统计重传
tshark -n -q -r test.pcap.pcapng -z "io,stat,0,tcp.analysis.retransmission"

注意tskark的显示过滤器与抓包过滤器格式不一样:

tshark -i eth0 -f 'tcp'  -n -q -w d.pcap

拆分大包

# 每8秒拆分为1个包
editcap retran.pcap out.cap -i 8

问题

  • 使用sudo在后台抓包:nohup sudo -b tcpdump -i eth0 tcp port 80 -w http.pcap
Comment