網(wǎng)絡(luò)抓包
下面的例子中我們通過(guò)tcpdump
查看workerman-chat
應(yīng)用通過(guò)websocket
傳輸?shù)臄?shù)據(jù)。workerman-chat
例子中服務(wù)端是通過(guò)7272
端口對(duì)外提供websocket
服務(wù)的,所以我們抓取7272
端口上的數(shù)據(jù)包。
1、運(yùn)行命令 tcpdump -Ans 4096 -iany port 7272
2、在瀏覽器地址欄輸入 http://127.0.0.1:55151
3、輸入昵稱 mynick
4、發(fā)表框輸入 hi, all !
最終抓取的數(shù)據(jù)如下:
/*
* TCP第一次握手
* 瀏覽器本地端口60653向遠(yuǎn)程端口7272發(fā)送SYN包
*/
17:50:00.523910 IP 127.0.0.1.60653 > 127.0.0.1.7272: Flags [S], seq 3524290970, win 32768, options [mss 16396,sackOK,TS val 28679666 ecr 28679554,nop,wscale 7], length 0
E..<.h@.@.HQ...........h..i..........0....@....
............
/*
* TCP第二次握手
* 遠(yuǎn)程端口7272向?yàn)g覽器端口60653回應(yīng)SYN+ACK包
*/
17:50:00.523935 IP 127.0.0.1.7272 > 127.0.0.1.60653: Flags [S.], seq 692696454, ack 3524290971, win 32768, options [mss 16396,sackOK,TS val 28679666 ecr 28679666,nop,wscale 7], length 0
E..<..@.@.<..........h..)I....i......0....@....
............
/*
* TCP第三次握手,完成TCP連接
* 瀏覽器本地端口60653向遠(yuǎn)程端口7272發(fā)送ACK包
*/
17:50:00.523948 IP 127.0.0.1.60653 > 127.0.0.1.7272: Flags [.], ack 1, win 256, options [nop,nop,TS val 28679666 ecr 28679666], length 0
E..4.i@.@.HX...........h..i.)I.......(.....
........
/*
* websocket握手
* 瀏覽器本地端口60653向遠(yuǎn)程端口7272發(fā)送websocket握手請(qǐng)求數(shù)據(jù)
*/
17:50:00.524412 IP 127.0.0.1.60653 > 127.0.0.1.7272: Flags [P.], seq 1:716, ack 1, win 256, options [nop,nop,TS val 28679666 ecr 28679666], length 715
E....j@.@.E............h..i.)I.............
........GET / HTTP/1.1
Host: 127.0.0.1:7272
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: http://127.0.0.1:55151
Sec-WebSocket-Key: zPDr6m4czzUdOFnsxIUEAw==
Cookie: Hm_lvt_abcf9330bef79b4aba5b24fa373506d9=1402048017; Hm_lvt_5fedb3bdce89499492c079ab4a8a0323=1403063068,1403141761; Hm_lvt_7b1919221e89d2aa5711e4deb935debd=1407836536; Hm_lpvt_7b1919221e89d2aa5711e4deb935debd=1407837000
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
/*
* websocket握手
* 遠(yuǎn)程端口7272向?yàn)g覽器端口60653發(fā)送ACK包,表明遠(yuǎn)程7272端口已經(jīng)收到websocket握手請(qǐng)求數(shù)據(jù)
*/
17:50:00.524423 IP 127.0.0.1.7272 > 127.0.0.1.60653: Flags [.], ack 716, win 256, options [nop,nop,TS val 28679666 ecr 28679666], length 0
E..4(u@.@..M.........h..)I....lf.....(.....
........
/*
* websocket握手
* 遠(yuǎn)程端口7272向?yàn)g覽器端口60653發(fā)送websocket握手回應(yīng),表明握手成功
*/
17:50:00.535918 IP 127.0.0.1.7272 > 127.0.0.1.60653: Flags [P.], seq 1:157, ack 716, win 256, options [nop,nop,TS val 28679669 ecr 28679666], length 156
E...(v@.@............h..)I....lf...........
........HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Sec-WebSocket-Version: 13
Connection: Upgrade
Sec-WebSocket-Accept: nSsCeIBUsFnDJCRb/BNlFzBUDpM=
/*
* websocket握手成功
* 瀏覽器本地端口60653向遠(yuǎn)程端口7272發(fā)送ACK,表明接收到websocket握手回應(yīng)數(shù)據(jù)
*/
17:50:00.535932 IP 127.0.0.1.60653 > 127.0.0.1.7272: Flags [.], ack 157, win 256, options [nop,nop,TS val 28679669 ecr 28679669], length 0
E..4.k@.@.HV...........h..lf)I.#.....(.....
........
/*
* 輸入昵稱請(qǐng)求
* 瀏覽器通過(guò)websocket協(xié)議向7272端口發(fā)送 昵稱 請(qǐng)求 {"type":"login","name":"mynick"}
* 由于瀏覽器向服務(wù)端發(fā)送的數(shù)據(jù)為websocket協(xié)議掩碼處理過(guò)的數(shù)據(jù),所以無(wú)法看到原文 {"type":"login","name":"mynick"}
*/
17:50:30.652680 IP 127.0.0.1.60653 > 127.0.0.1.7272: Flags [P.], seq 716:754, ack 157, win 256, options [nop,nop,TS val 28687198 ecr 28679669], length 38
E..Z.l@.@.H/...........h..lf)I.#.....N.....
...^.......&_...+..C}..J0..H}..H>...e.._1..M}.
/*
* 輸入昵稱請(qǐng)求
* 7272端口向?yàn)g覽器返回ACK,表明昵稱請(qǐng)求已經(jīng)接收,并返回用戶列表{"type":"user_list" ...
*/
17:50:30.653546 IP 127.0.0.1.7272 > 127.0.0.1.60653: Flags [P.], seq 157:267, ack 754, win 256, options [nop,nop,TS val 28687198 ecr 28687198], length 110
E...(w@.@............h..)I.#..l............
...^...^.l{"type":"user_list","user_list":[{"uid":783654164,"name":"\u732a\u732a"},{"uid":783700053,"name":"mynick"}]}
/*
* 輸入昵稱請(qǐng)求
* 瀏覽器返回ACK,表明用戶列表數(shù)據(jù)已經(jīng)收到
*/
17:50:30.653559 IP 127.0.0.1.60653 > 127.0.0.1.7272: Flags [.], ack 267, win 256, options [nop,nop,TS val 28687198 ecr 28687198], length 0
E..4.m@.@.HT...........h..l.)I.......(.....
...^...^
/*
* 輸入昵稱請(qǐng)求
* 7272端口向?yàn)g覽器返回ACK,并返回用登錄結(jié)果{"type":"login",...
*/
17:50:30.653689 IP 127.0.0.1.7272 > 127.0.0.1.60653: Flags [P.], seq 267:346, ack 754, win 256, options [nop,nop,TS val 28687198 ecr 28687198], length 79
E...(x@.@............h..)I....l......w.....
...^...^.M{"type":"login","uid":783700053,"name":"mynick","time":"2014-08-12 17:50:30"}
/*
* 輸入昵稱請(qǐng)求 完畢
* 瀏覽器返回ACK,表明登錄結(jié)果數(shù)據(jù)包收到
*/
17:50:30.653695 IP 127.0.0.1.60653 > 127.0.0.1.7272: Flags [.], ack 346, win 256, options [nop,nop,TS val 28687198 ecr 28687198], length 0
E..4.n@.@.HS...........h..l.)I.......(.....
...^...^
/*
* 服務(wù)端7272端口通知其它瀏覽器有新用戶登錄
*/
17:50:30.653749 IP 127.0.0.1.7272 > 127.0.0.1.60584: Flags [P.], seq 436:515, ack 816, win 256, options [nop,nop,TS val 28687198 ecr 28577913], length 79
E.....@.@.3..........h..f....G.......w.....
...^...y.M{"type":"login","uid":783700053,"name":"mynick","time":"2014-08-12 17:50:30"}
/*
* 其它瀏覽器返回 ACK,表明收到新用戶登錄通知的請(qǐng)求
*/
17:50:30.653755 IP 127.0.0.1.60584 > 127.0.0.1.7272: Flags [.], ack 515, win 256, options [nop,nop,TS val 28687198 ecr 28687198], length 0
E..4.X@.@.#j...........h.G..f..$.....(.....
...^...^
/*
* mynick用戶發(fā)言 hi, all !
* 瀏覽器向服務(wù)端7272端口發(fā)送發(fā)言數(shù)據(jù) {"type":"say","to_uid":"all","content":"hi, all !"}
* 由于瀏覽器向服務(wù)端發(fā)送的數(shù)據(jù)為websocket協(xié)議掩碼處理過(guò)的數(shù)據(jù),所以無(wú)法看到原文
*/
17:51:02.775205 IP 127.0.0.1.60653 > 127.0.0.1.7272: Flags [P.], seq 754:812, ack 346, win 256, options [nop,nop,TS val 28695228 ecr 28687198], length 58
E..n.o@.@.H............h..l.)I.......b.....
fTX.d.P[(...9H..C=LT.~.BV=...0SnB-X.
/*
* mynick用戶發(fā)言 hi, all !
* 7272端口向所有瀏覽器客戶端中一個(gè)瀏覽器轉(zhuǎn)發(fā)發(fā)言數(shù)據(jù) {"type":"say","from_uid":....
*/
17:51:02.776785 IP 127.0.0.1.7272 > 127.0.0.1.60653: Flags [P.], seq 346:448, ack 812, win 256, options [nop,nop,TS val 28695229 ecr 28695228], length 102
E...(y@.@............h..)I....l............
.........d{"type":"say","from_uid":783700053,"to_uid":"all","content":"hi, all !","time":"2014-08-12 :51:02"}
/*
* mynick用戶發(fā)言 hi, all !
* 瀏覽器響應(yīng)ACK,收到發(fā)言數(shù)據(jù)
*/
17:51:02.776808 IP 127.0.0.1.60653 > 127.0.0.1.7272: Flags [.], ack 448, win 256, options [nop,nop,TS val 28695229 ecr 28695229], length 0
E..4.p@.@.HQ...........h..l.)I.F.....(.....
........
/*
* mynick用戶發(fā)言 hi, all !
* 7272端口向所有瀏覽器客戶端中一個(gè)瀏覽器轉(zhuǎn)發(fā)發(fā)言數(shù)據(jù) {"type":"say","from_uid":....
*/
17:51:02.776827 IP 127.0.0.1.7272 > 127.0.0.1.60584: Flags [P.], seq 515:617, ack 816, win 256, options [nop,nop,TS val 28695229 ecr 28687198], length 102
E.....@.@.3g.........h..f..$.G.............
.......^.d{"type":"say","from_uid":783700053,"to_uid":"all","content":"hi, all !","time":"2014-08-12 :51:02"}
/*
* mynick用戶發(fā)言 hi, all ! ,所有瀏覽器都收到轉(zhuǎn)發(fā)的發(fā)言數(shù)據(jù),發(fā)言完畢
* 瀏覽器響應(yīng)ACK,收到發(fā)言數(shù)據(jù)
*/
17:51:02.776842 IP 127.0.0.1.60584 > 127.0.0.1.7272: Flags [.], ack 617, win 256, options [nop,nop,TS val 28695229 ecr 28695229], length 0
E..4.Y@.@.#i...........h.G..f........(.....
........
以上是登錄+發(fā)言的所有所有請(qǐng)求,一共有兩個(gè)瀏覽器客戶端。
包數(shù)據(jù)中[S]
代表SYN
請(qǐng)求(發(fā)起連接請(qǐng)求);[.]
代表ACK
回應(yīng),說(shuō)明請(qǐng)求對(duì)端已經(jīng)收到;[P
]代表發(fā)送數(shù)據(jù);[P.]代表[P] + [.]
如果端口上傳輸?shù)臄?shù)據(jù)是二進(jìn)制數(shù)據(jù),則可以以十六進(jìn)制來(lái)查看 tcpdump -XAns 4096 -iany port 7272