tcpdump分析tcp三次握手
1) tcpdump
tcpdump:监听流经一个本机网络接口上的数据,功能非常强劲
使用方法:
tcpdump [options] [expression]
options部分命令行选项:
命令 | 说明 |
-c num | 接受到指定num个符合条件的包就退出 |
-n | Ip信息用数字显示 |
-x | 以十六进制方式显示包内容 |
-X | 同时以十六进制、ascii方式显示包内容 |
-i dev | 指定要监听的网络接口 (例如 -i eth0) 注意:: 在同一台机器上进行测试时,最好加上参数: -iany 这样可以接收任何网卡的信息。 |
-w | 把监听的信息写入文件中 |
-r | 从用w选项创建的文件中读取保存的监听信息 |
-s(数据包大小) | 设置每个数据包的大小 -s2400 表示每个数据包的大小是2400 |
-d | 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出。 |
-dd | 把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出。 |
expression 监听网络报的条件表达式,只有符合此条件的数据包才会显示
条件表达式有一个或多个条件组成
条件类型 | 常用条件标志 |
协议条件 | ip, ip6, arp, rarp, tcp ,udp. |
源/目的条件 | src dst |
具体条件 | host,net,port |
其中多个条件可以由关系运算符组合在一起
关系类型 | 关系运算符 |
反 | ! 或 not |
与 | && 或 and |
或 | || 或 or |
使用实例:
a) 显示所有主机192.168.1.3发送出和接收的数据包
tcpdump host 192.168.1.3
b) 显示主机 A 与主机(B 或 C)之间的交互IP数据包
tcpdump ‘ip and host A and (B or C)‘
c) 本机地址192.168.1.3 ,显示从主机192.168.5.1或网络192.168.1到本地53端口的udp数据包,但不显示本机发送到本地53端口的数据包,
同时显示十六进制和ASCII方式的数据包内容
tcpdump -X 'udp and dst host 192.168.1.3 and dst port 53 and (src host 192.168.5.1 or src net 192.168.1) and src not
localhost'
命令参数说明:
udp数据包 :udp
目的地址192.168.1.3 :dst host 192.168.1.3
目的端口 53 :dst port 53
源主机地址192.168.5.1 :src host 192.168.5.1
源网络地址192.168.1 :src net 192.168.1
非本机发送的包 : src not localhost
注意:
-s0 完整显示包内容;类似strace的 -s size
用tcpdump解析tcp连接建立和释放
下面命令抓包:
# tcpdump -n -ieth1 'tcp and dst host 172.25.34.88 and port 7012'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
1.
14:44:52.174122 IP 172.25.38.145.49563 > 172.25.34.88.7012: S 1986599379:1986599379(0) win 5840 <mss 1460,sackOK,timestamp 3824018401 0,nop,wscale 2>
2.
14:44:52.174249 IP 172.25.34.88.7012 > 172.25.38.145.49563: S 4294961892:4294961892(0) ack1986599380 win 5792 <mss 1460,sackOK,timestamp 1927787323 3824018401,nop,wscale 2>
3.
14:44:52.174228 IP 172.25.38.145.49563 > 172.25.34.88.7012: . ack 1 win 1460 <nop,nop,timestamp 3824018401 1927787323>
4.
14:44:52.174433 IP 172.25.38.145.49563 > 172.25.34.88.7012: P 1:109(108) ack 1 win 1460 <nop,nop,timestamp 3824018401 1927787323>
5.
14:44:52.174443 IP 172.25.34.88.7012 > 172.25.38.145.49563: . ack 109 win 1448 <nop,nop,timestamp 1927787323 3824018401>
6.
14:44:52.186891 IP 172.25.34.88.7012 > 172.25.38.145.49563: P 1:857(856) ack 109 win 1448 <nop,nop,timestamp 1927787326 3824018401>
7.
14:44:52.186914 IP 172.25.34.88.7012 > 172.25.38.145.49563: F 857:857(0) ack 109 win 1448 <nop,nop,timestamp 1927787326 3824018401>
8.
14:44:52.187054 IP 172.25.38.145.49563 > 172.25.34.88.7012: . ack 857 win 1888 <nop,nop,timestamp 3824018404 1927787326>
9.
14:44:52.195347 IP 172.25.38.145.49563 > 172.25.34.88.7012: F 109:109(0) ack 858 win 1888 <nop,nop,timestamp 3824018406 1927787326>
10.
14:44:52.195355 IP 172.25.34.88.7012 > 172.25.38.145.49563: . ack 110 win 1448 <nop,nop,timestamp 1927787328 3824018406>
每一行中间都有这个包所携带的标志:
S=SYN
, 发起连接标志。
P=PUSH
, 传送数据标志。
F=FIN
, 关闭连接标志。
ack
表示确认包。
RST=RESET
, 异常关闭连接。
.
表示没有任何标志。
()
括号中的数字是包的长度,建立连接和关闭连接时,包长都为0,括号前面的都是序列号。
上面抓包的过程解析:
第1
行:14:44:52
这个时间,从172.25.38.145
(client
)的临时端口49563
向172.25.34.88
(server
)的7012
监听端口发起连接,
client
初始包序号为1986599379
,
win 滑动窗口大小为
5840
字节(滑动窗口即
tcp接收缓冲区的大小,用于tcp
拥塞控制),
mss 大小为1460(即可接收的最大包长度,通常为MTU减40字节,IP头和TCP头各20字节)。
第2
行: server
响应连接,同时带上第一个包的
ack信息,为client端的初始包序号加1,即1986599380,
也即server端下次等待接受这个包序号的包,用于tcp
字节流的顺序控制。
server
端的初始包序号为
4294961892
,mss
也是1460
。
第3
行:client
再次确认,tcp
连接三次握手完成。
第4
行:client
发请求包,包长度108
字节。
第5
行:server
响应ack
。
第6
行:server
回包,包长度856
字节。
第7
行:client
响应ack
。(这里应该是有问题的,但应该是这样)
第8
行:client
发起关闭连接请求。
第9
行:server
响应ack
,并且也发送FIN
标志关闭。
第10
行:客户端响应ack
,关闭连接的四次握手完成。