<b>tcpdump/HTTP协议</b><b>实践</b>
500)this.width=500;" border="0" />
客户端:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务端:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
# tcpdump host 192.168.64.71 and port 80 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 96 bytes
10:13:01.617505 IP 10.1.9.11.58384 > 192.168.64.71.80: <b>S</b>yn 3718379515:3718379515(0) win 65535 <b>客户端发起连接请求</b>
10:13:01.617631 IP 192.168.64.71.80 > 10.1.9.11.58384: <b>S</b>yn 261066897:261066897(0) ack 3718379516 win 5840 <b> </b><b>服务端响应连接请求</b>
10:13:01.617766 IP 10.1.9.11.58384 > 192.168.64.71.80: . ack 1 win 65535
10:13:01.618011 IP 10.1.9.11.58384 > 192.168.64.71.80: <b>P</b>ush 1:612(611) ack 1 win 65535 <b>客户端向服务端发送数据</b><b>(HTTP</b><b>请求</b><b>)</b>
10:13:01.618023 IP 192.168.64.71.80 > 10.1.9.11.58384: . ack 612 win 6721
10:13:01.618486 IP 192.168.64.71.80 > 10.1.9.11.58384: <b>P</b>ush 1:329(328) ack 612 win 6721<b>服务端向客户端回送数据</b><b>(HTTP</b><b>响应</b><b>)</b>
10:13:01.618510 IP 192.168.64.71.80 > 10.1.9.11.58384: <b>P</b>ush 329:1303(974) ack 612 win 6721
10:13:01.619638 IP 10.1.9.11.58384 > 192.168.64.71.80: . ack 1303 win 64233
10:13:11.574352 IP 10.1.9.11.58384 > 192.168.64.71.80: <b>F</b>in 612:612(0) ack 1303 win 64233 <b>客户端先发起关闭连接操作</b>
10:13:11.574455 IP 192.168.64.71.80 > 10.1.9.11.58384: <b>F</b>in 1303:1303(0) ack 613 win 6721 <b>服务端响应客户端的关闭连接操作</b>
10:13:11.574991 IP 10.1.9.11.58384 > 192.168.64.71.80: . ack 1304 win 64233 <b>客户端进入</b><b>TIME_WAIT</b><b>状态</b>
? 服务端(192.168.64.71.80)向客户端(10.1.9.11.58384)回送的响应分了两个tcp包:
第一个包发送了328字节,第二个包发送了974字节
? 关闭连接由客户端(10.1.9.11.58384)首先发起,因此客户端(192.168.64.71.80)需要经历一个TIME_WAIT过程
Site found: www.tcpdump.com=192.168.64.71
Connecting to 192.168.64.71
Connected to 192.168.64.71
GET http:// www.tcpdump.com/
> Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
> User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
> Host: tsf.oa.com
Request sent. 611 bytes
Data available. 974/974 bytes
<a>HTTP/1.1 200 OK</a>
Date: Sun, 10 Aug 2008 02:27:08 GMT
Server: Apache/2.0.59 (Unix) DAV/2 PHP/5.2.1 SVN/1.4.6
Last-Modified: Wed, 21 May 2008 01:19:21 GMT
ETag: "298227-3ce-62ec9840"
Accept-Ranges: bytes
Content-Length: <b>974</b>
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=GB2312
200 Request complete
从上面的抓包结果来看,Apache将HTTP响应头和数据部分是分成两两部分发送的,而且TCP/IP协议栈没有再对其分包,也就是每个send调用都将数据发送完毕。
显示包的内容:
tcpdump -i eth1 -n -vv -x -e -s 1600 # 仅二进制
tcpdump -i eth1 -n -vv -X -e -s 1600 # 二进制和文本
-s 指定显示多少字节的包内容
<a></a>
HTTP响应头共328字节。
附:常用命令
A.查看端口被谁占用
lsof -i:port,如:lsof -i:80
B.查看tcp监听端口
netstat -lpnt
C.查看udp监听端口
netstat -lpnu
D.查看本机IP
netstat -ie
E.lsof高级用法
lsof -i [46][protocol][@hostname|hostaddr][:service|port]
46表示ipv4和ipv6,protocol取值为tcp或udp,
hostname主机名,hostaddr为IP地址,
service为/etc/service中定义的service名,可以不止一个,
port也可以不止一个
示例1:lsof -i4
示例2:lsof -i [email protected]:7778
更详细细节可以“man lsof”搜索“hostname”。
1.监听指定网卡
tcpdump -i eth1
2.监听指定UDP端口
tcpdump udp port 10888
3.监听指定TCP端口
tcpdump tcp port 80
4.监听A和B或A和C间的通讯
tcpdump host A and \(B or C \)
如:tcpdump host 127.0.0.1 and \(127.0.0.1 or 110.240.110.18 \)
5.监听A的所有通讯,但不包括A和B的
tcpdump ip A and not B
6.监听A发出的所有包
tcpdump -i eth1 src host A
7.监听所有发送到B的包
tcpdump -i eth1 dst host B
8.监听A收到或发出的所有http包
tcpdump tcp port 80 and host A
9.列出tcpdump能够监听的网卡
tcpdump -D
10.监听所有网卡,要求2.2或更高版本内核
tcpdump -i any
11.详细显示捕获的信息
tcpdump -v
更详细可以使用tcpdump -vv和tcpdump -vvv
12.以十六进制和ASCII方式打印包,除了连接层头
tcpdump -v -X
13.以十六进制和ASCII方式打印包,包括连接层头
tcpdump -v -XX
14.限制捕获100个包
tcpdump -c 100
15.将记录写入文件
tcpdump -w filename.log
16.使用IP代替域名
tcpdump -n
17.捕获每个包的100字节而不是默认的68字节
tcpdump -s 500
如果要捕获所有字节则为tcpdump -s 0
18.捕获所有广播或多播包
tcpdump -n "broadcast or multicast"
19.捕获所有icmp和arp包
tcpdump -v "icmp or arp"
20.捕获arp包
tcpdump -v arp
21.捕获目标地址是192.168.0.1,端口是80或443的包
tcpdump -n "dst host 192.168.0.1 and (dst port 80 or dst port 443)"
22.捕获目标端口号在1-1023间的UDP包
tcpdump -n udp dst portrange 1-1023
如果是tcp则改成:tcpdump -n tcp dst portrange 1-1023
23.捕获目标端口号为23的包
tcpdump dst port 23
24.捕获目标网络为192.168.1.0/24的包
tcpdump -n dst net 192.168.1.0/24
25.捕获源网络为192.168.1.0/24的包
tcpdump -n src net 192.168.1.0/24