关于tcpdump如何抓包,本文不再总结,可以查看 tcpdump的官方地址查看http://www.tcpdump.org
本文重点记录两个部分:
第一部分:tcpdump所抓包与TCP/IP协议的对应分析
第二部分:tcpdump所抓包的分析
先看第一部分
一、tcpdump所抓包与TCP/IP协议的对应分析
在使用tcpdump抓包时, 使用-X参数,可以显示IP包的包头信息; 使用-xx参数,可以显示链路层的包头信息,这里我们只看IP包,IP包包含IP包首部+TCP包首部 + TCP包数据部分。
a、IP包的规则
b、tcp包规则
在了解IP包和tcp包包头规则后,我们使用tcpdump抓包了解一下包头:
16:44:49.073634 IP 10.215.35.230.51245 > 10.221.20.175.http: S 371739021:371739021(0) win 8192 <mss 1260,nop,wscale 2,nop,nop,sackOK> 0x0000: 4500 0034 5cf4 4000 7c06 5387 0ad7 23e6 E..4\.@.|.S...#. 0x0010: 0add 14af c82d 0050 1628 498d 0000 0000 .....-.P.(I..... 0x0020: 8002 2000 d962 0000 0204 04ec 0103 0302 .....b.......... 0x0030: 0101 0402 IP协议头 4500 0034 5cf4 4000 7c06 5387 0ad7 23e6 ===> 来源地址:10.215.35.230 0add 14af ===> 目的地址:10.221.20.175 TCP协议头 c82d 0050 ===> port 51245 to 80 1628 498d ===> seq 371739021 0000 0000 ===> 确认号字段 8002 2000 ===> 1000 000000 000010("1000":数据偏移,"000000":保留,"000010":表示SYN位为1 ) “2000”表示win大小8192 d962 0000 ===> 检验和 和 紧急指针
二、分析tcpdump抓包的描述
下面这段是一次完整的http请求,包含3次握手建立连接,数据传输,四次挥手关闭连接。
10:21:38.331577 IP 10.215.35.230.53845 > 10.221.20.175.http: S 4180790448:4180790448(0) win 8192 <mss 1260,nop,wscale 2,nop,nop,sackOK> 10:21:38.718147 IP 10.221.20.175.http > 10.215.35.230.53845: S 3489059505:3489059505(0) ack 4180790449 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 7> 10:21:38.331981 IP 10.215.35.230.53845 > 10.221.20.175.http: . ack 1 win 16695 10:21:38.332420 IP 10.215.35.230.53845 > 10.221.20.175.http: P 1:339(338) ack 1 win 16695 10:21:38.332455 IP 10.221.20.175.http > 10.215.35.230.53845: . ack 339 win 54 10:21:38.335912 IP 10.221.20.175.http > 10.215.35.230.53845: P 1:383(382) ack 339 win 54 10:21:38.580123 IP 10.215.35.230.53845 > 10.221.20.175.http: . ack 383 win 16599 10:21:48.376411 IP 10.215.35.230.53845 > 10.221.20.175.http: . 338:339(1) ack 383 win 16599 10:21:48.376451 IP 10.221.20.175.http > 10.215.35.230.53845: . ack 339 win 54 <nop,nop,sack 1 {338:339}> 10:21:58.470050 IP 10.215.35.230.53845 > 10.221.20.175.http: . 338:339(1) ack 383 win 16599 10:21:58.470093 IP 10.221.20.175.http > 10.215.35.230.53845: . ack 339 win 54 <nop,nop,sack 1 {338:339}> 10:21:59.640894 IP 61.135.209.214.http > 10.221.20.76.trusted-web: S 282374585:282374585(0) ack 2250754437 win 4380 <mss 1460,nop,wscale 0,nop,nop,timestamp 816129257 3680466592,sackOK,eol> 10:22:08.469017 IP 10.215.35.230.53845 > 10.221.20.175.http: . 338:339(1) ack 383 win 16599 10:22:08.469058 IP 10.221.20.175.http > 10.215.35.230.53845: . ack 339 win 54 <nop,nop,sack 1 {338:339}> 10:22:18.467910 IP 10.215.35.230.53845 > 10.221.20.175.http: . 338:339(1) ack 383 win 16599 10:22:18.467951 IP 10.221.20.175.http > 10.215.35.230.53845: . ack 339 win 54 <nop,nop,sack 1 {338:339}> 10:22:28.467015 IP 10.215.35.230.53845 > 10.221.20.175.http: . 338:339(1) ack 383 win 16599 10:22:28.467033 IP 10.221.20.175.http > 10.215.35.230.53845: . ack 339 win 54 <nop,nop,sack 1 {338:339}> 10:22:38.335353 IP 10.221.20.175.http > 10.215.35.230.53845: F 383:383(0) ack 339 win 54 10:22:38.335841 IP 10.215.35.230.53845 > 10.221.20.175.http: . ack 384 win 16599 10:22:38.336238 IP 10.215.35.230.53845 > 10.221.20.175.http: F 339:339(0) ack 384 win 16599 10:22:38.336255 IP 10.221.20.175.http > 10.215.35.230.53845: . ack 340 win 54
整体上,我们可以看出tcpdump在描述时的格式:
10:21:38.331577 IP 10.215.35.230.53845 > 10.221.20.175.http: S 4180790448:4180790448(0) win 8192 <mss 1260,nop,wscale 2,nop,nop,sackOK> 请求时间 源地址.源端口 > 目的地址.应用协议 :包标示 序号 :确认号 窗口 < 缓存大小>
tcpdump使用下面的字母描述TCP包头标示(CWR | ECE | URG | ACK | PSH | RST | SYN | FIN):
. ACK, S SYN, P PUSH, F FIN
从下面的分析中,我们还可以看出,包头标识的字母描述不是完全准确。像S,既可表示SYN包,也表示 SYN+ACK包,下面我们详细看一下
a、tcp协议的三次握手
通过上面的分析,我们知道,ip包和tcp包,包头都在20个字节(IP包存在可选字段,不确定),下面tcpdump抓到包的显示是按照两个字节两个字节的显示,一行显示16个字节,所以我们不在做处理,直接用16进制来描述包的信息。
11:10:13.363861 IP 10.215.35.89.63665 > 10.221.20.175.http: S 446912846:446912846(0) win 8192 <mss 1260,nop,wscale 2,nop,nop,sackOK> 0x0000: 4500 0034 153a 4000 7c06 9bce 0ad7 2359 E..4.:@.|.....#Y 0x0010: 0add 14af f8b1 0050 1aa3 594e 0000 0000 .......P..YN.... 0x0020: 8002 2000 952f 0000 0204 04ec 0103 0302 ...../.......... 0x0030: 0101 0402 .... 11:10:13.889486 IP 10.221.20.175.http > 10.215.35.89.63665: S 4205029854:4205029854(0) ack 446912847 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 7> 0x0000: 4500 0034 0000 4000 4006 ed08 0add 14af E..4..@.@....... 0x0010: 0ad7 2359 0050 f8b1 faa3 a9de 1aa3 594f ..#Y.P........YO 0x0020: 8012 16d0 f8fe 0000 0204 05b4 0101 0402 ................ 0x0030: 0103 0307 .... 11:10:13.372114 IP 10.215.35.89.63665 > 10.221.20.175.http: . ack 1 win 4410 0x0000: 4500 0028 153b 4000 7c06 9bd9 0ad7 2359 E..(.;@.|.....#Y 0x0010: 0add 14af f8b1 0050 1aa3 594f faa3 a9df .......P..YO.... 0x0020: 5010 113a 3f67 0000 0000 0000 0000 P..:?g........
可以看出流程如下
1、客户端发出 SYN 包,序号x= 1aa3 594e
2、服务端收到包后向客户端发回 ACK+SYN 包,发出 确认号(x+1): 1aa3 594f, 同时发出序号 y= faa3 a9de 供客户端确认
3、客户端收到服务端发回的包后,向服务端发出 ACK包 ,同时发出确认号(y+1): faa3 a9df
如上,我们看到表示包头信息的字节一般是第34个字节,可以看出 对应的3个字节,分别是(02, 12, 10)实际上对应的应该是,(SYN, SYN+ACK, ACK),tcpdump的包标识简写对应是(S, S, .),可以看出tcpdump的对应包简写是不确切的。
b、在完成握手后,发起数据传输
1、下面一个可以看出来是客户端向服务端发出的http请求。看一下标识位(前面说的第34个字节)。“18” ==> “0001 1000” 在ACK位和PSH位做了标识,
1)、在ACK位做的标识,表明应答域有效,可以看到应答域序号是 87ca 7db2
2)、在PSH位做的标识,表明是Push操作,就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队;
14:03:09.022006 IP 10.215.35.89.51584 > 10.221.20.175.http: P 1:344(343) ack 1 win 16695 0x0000: 4500 017f 6a55 4000 7c06 4568 0ad7 2359 E...jU@.|.Eh..#Y 0x0010: 0add 14af c980 0050 5779 8acc 87ca 7db2 .......PWy....}. 0x0020: 5018 4137 459b 0000 4745 5420 2f74 6573 P.A7E...GET./tes 0x0030: 742f 7473 7463 6f64 652e 7068 7020 4854 t/tstcode.php.HT 0x0040: 5450 2f31 2e31 0d0a 486f 7374 3a20 3130 TP/1.1..Host:.10 0x0050: 2e32 3231 2e32 302e 3137 350d 0a55 7365 .221.20.175..Use 0x0060: 722d 4167 656e 743a 204d 6f7a 696c 6c61 r-Agent:.Mozilla 0x0070: 2f35 2e30 2028 5769 6e64 6f77 7320 4e54 /5.0.(Windows.NT 0x0080: 2036 2e31 3b20 7276 3a33 352e 3029 2047 .6.1;.rv:35.0).G 0x0090: 6563 6b6f 2f32 3031 3030 3130 3120 4669 ecko/20100101.Fi 0x00a0: 7265 666f 782f 3335 2e30 0d0a 4163 6365 refox/35.0..Acce 0x00b0: 7074 3a20 7465 7874 2f68 746d 6c2c 6170 pt:.text/html,ap 0x00c0: 706c 6963 6174 696f 6e2f 7868 746d 6c2b plication/xhtml+ 0x00d0: 786d 6c2c 6170 706c 6963 6174 696f 6e2f xml,application/ 0x00e0: 786d 6c3b 713d 302e 392c 2a2f 2a3b 713d xml;q=0.9,*/*;q= 0x00f0: 302e 380d 0a41 6363 6570 742d 4c61 6e67 0.8..Accept-Lang 0x0100: 7561 6765 3a20 7a68 2d63 6e2c 7a68 3b71 uage:.zh-cn,zh;q 0x0110: 3d30 2e38 2c65 6e2d 7573 3b71 3d30 2e35 =0.8,en-us;q=0.5 0x0120: 2c65 6e3b 713d 302e 330d 0a41 6363 6570 ,en;q=0.3..Accep 0x0130: 742d 456e 636f 6469 6e67 3a20 677a 6970 t-Encoding:.gzip 0x0140: 2c20 6465 666c 6174 650d 0a43 6f6e 6e65 ,.deflate..Conne 0x0150: 6374 696f 6e3a 206b 6565 702d 616c 6976 ction:.keep-aliv 0x0160: 650d 0a43 6163 6865 2d43 6f6e 7472 6f6c e..Cache-Control 0x0170: 3a20 6d61 782d 6167 653d 300d 0a0d 0a :.max-age=0....
2、服务端在收到客户端发出的数据包,发送一个确认包(ACK),确认客户端的应答域 87ca 7db2,同时 将确认收到的字节数。将客户端数据包tcp包头,序号+收到字节数,作为需要客户端应答的应答域。
14:03:09.022028 IP 10.221.20.175.http > 10.215.35.89.51584: . ack 344 win 54 0x0000: 4500 0028 31ae 4000 4006 bb66 0add 14af E..(1.@[email protected].... 0x0010: 0ad7 2359 0050 c980 87ca 7db2 5779 8c23 ..#Y.P....}.Wy.# 0x0020: 5010 0036 aef8 0000
3、服务端再向客户端发送请求处理的情况,可以看出,发送的包在ACK位和PSH位做了标识。
14:03:09.025335 IP 10.221.20.175.http > 10.215.35.89.51584: P 1:375(374) ack 344 win 54 0x0000: 4500 019e 31af 4000 4006 b9ef 0add 14af E...1.@.@....... 0x0010: 0ad7 2359 0050 c980 87ca 7db2 5779 8c23 ..#Y.P....}.Wy.# 0x0020: 5018 0036 6c87 0000 4854 5450 2f31 2e31 P..6l...HTTP/1.1 0x0030: 2032 3030 204f 4b0d 0a53 6572 7665 723a .200.OK..Server: 0x0040: 206e 6769 6e78 2f31 2e30 2e38 0d0a 4461 .nginx/1.0.8..Da 0x0050: 7465 3a20 5765 642c 2031 3820 4d61 7220 te:.Wed,.18.Mar. 0x0060: 3230 3135 2030 363a 3033 3a30 3920 474d 2015.06:03:09.GM 0x0070: 540d 0a43 6f6e 7465 6e74 2d54 7970 653a T..Content-Type: 0x0080: 2074 6578 742f 6874 6d6c 0d0a 5472 616e .text/html..Tran 0x0090: 7366 6572 2d45 6e63 6f64 696e 673a 2063 sfer-Encoding:.c 0x00a0: 6875 6e6b 6564 0d0a 436f 6e6e 6563 7469 hunked..Connecti 0x00b0: 6f6e 3a20 6b65 6570 2d61 6c69 7665 0d0a on:.keep-alive.. 0x00c0: 582d 506f 7765 7265 642d 4279 3a20 5048 X-Powered-By:.PH 0x00d0: 502f 352e 332e 380d 0a43 6f6e 7465 6e74 P/5.3.8..Content 0x00e0: 2d45 6e63 6f64 696e 673a 2067 7a69 700d -Encoding:.gzip. 0x00f0: 0a56 6172 793a 2041 6363 6570 742d 456e .Vary:.Accept-En 0x0100: 636f 6469 6e67 0d0a 0d0a 3839 0d0a 1f8b coding....89.... 0x0110: 0800 0000 0000 0003 b229 284a 5548 ce49 .........)(JUH.I 0x0120: 2c2e b655 af48 494d 2a4d d72d 4b2c d24d ,..U.HIM*M.-K,.M 0x0130: 29cd 2d50 5748 c92c b255 cf29 2952 b7b3 ).-PWH.,.U.))R.. 0x0140: 29ce 4dcc c9b1 2b2e 29ca cc4b b7d1 87f0 ).M...+.)..K.... 0x0150: 146c d2f2 f34a 1492 f373 f281 ea94 9393 .l...J...s...... 0x0160: 0d80 40dd 4efd c8e3 5d87 d56d f441 9240 [email protected]...]..m.A.@ 0x0170: 3599 761a 39a9 79e9 2519 b626 9a36 fa99 5.v.9.y.%..&.6.. 0x0180: 765c 36fa 403b ed00 0000 00ff ff03 0076 v\6.@;.........v 0x0190: 6e19 4779 0000 000d 0a30 0d0a 0d0a n.Gy.....0....
4、客户端对服务端发回的数据做了应答,应答内容包括,重复客户端的确认号5779 8c23, 以及发送给服务端的确认号 87ca 7f28,确认号 87ca 7db2 + 接收到的数据长度。
14:03:09.220663 IP 10.215.35.89.51584 > 10.221.20.175.http: . ack 375 win 16601 0x0000: 4500 0028 6a56 4000 7c06 46be 0ad7 2359 E..(jV@.|.F...#Y 0x0010: 0add 14af c980 0050 5779 8c23 87ca 7f28 .......PWy.#...( 0x0020: 5010 40d9 6cdf 0000 0000 0000 0000 [email protected].........
5、下面的发送和应答,可以看出,是客户端为了保持和服务端的连接做的,保持连接是为了避免再做三次握手,我们可以看下面的过程每隔10秒,客户端发送一个ACK包,包的序号是上次客户端发给服务端的确认号减一 。
14:03:19.020809 IP 10.215.35.89.51584 > 10.221.20.175.http: . 343:344(1) ack 375 win 16601 0x0000: 4500 0029 6a64 4000 7c06 46af 0ad7 2359 E..)jd@.|.F...#Y 0x0010: 0add 14af c980 0050 5779 8c22 87ca 7f28 .......PWy."...( 0x0020: 5010 40d9 6cdf 0000 0000 0000 0000 [email protected]......... 14:03:19.020855 IP 10.221.20.175.http > 10.215.35.89.51584: . ack 344 win 54 <nop,nop,sack 1 {343:344}> 0x0000: 4500 0034 31b0 4000 4006 bb58 0add 14af E..41.@[email protected].... 0x0010: 0ad7 2359 0050 c980 87ca 7f28 5779 8c23 ..#Y.P.....(Wy.# 0x0020: 8010 0036 b032 0000 0101 050a 5779 8c22 ...6.2......Wy." 0x0030: 5779 8c23 Wy.# 14:03:29.021003 IP 10.215.35.89.51584 > 10.221.20.175.http: . 343:344(1) ack 375 win 16601 0x0000: 4500 0029 6a71 4000 7c06 46a2 0ad7 2359 E..)jq@.|.F...#Y 0x0010: 0add 14af c980 0050 5779 8c22 87ca 7f28 .......PWy."...( 0x0020: 5010 40d9 6cdf 0000 0000 0000 0000 [email protected]......... 14:03:29.021048 IP 10.221.20.175.http > 10.215.35.89.51584: . ack 344 win 54 <nop,nop,sack 1 {343:344}> 0x0000: 4500 0034 31b1 4000 4006 bb57 0add 14af E..41.@[email protected].... 0x0010: 0ad7 2359 0050 c980 87ca 7f28 5779 8c23 ..#Y.P.....(Wy.# 0x0020: 8010 0036 b032 0000 0101 050a 5779 8c22 ...6.2......Wy." 0x0030: 5779 8c23 Wy.# 14:03:39.021319 IP 10.215.35.89.51584 > 10.221.20.175.http: . 343:344(1) ack 375 win 16601 0x0000: 4500 0029 6a89 4000 7c06 468a 0ad7 2359 E..)j.@.|.F...#Y 0x0010: 0add 14af c980 0050 5779 8c22 87ca 7f28 .......PWy."...( 0x0020: 5010 40d9 6cdf 0000 0000 0000 0000 [email protected]......... 14:03:39.021364 IP 10.221.20.175.http > 10.215.35.89.51584: . ack 344 win 54 <nop,nop,sack 1 {343:344}> 0x0000: 4500 0034 31b2 4000 4006 bb56 0add 14af E..41.@[email protected].... 0x0010: 0ad7 2359 0050 c980 87ca 7f28 5779 8c23 ..#Y.P.....(Wy.# 0x0020: 8010 0036 b032 0000 0101 050a 5779 8c22 ...6.2......Wy." 0x0030: 5779 8c23 Wy.# 14:03:49.023828 IP 10.215.35.89.51584 > 10.221.20.175.http: . 343:344(1) ack 375 win 16601 0x0000: 4500 0029 6a9c 4000 7c06 4677 0ad7 2359 E..)j.@.|.Fw..#Y 0x0010: 0add 14af c980 0050 5779 8c22 87ca 7f28 .......PWy."...( 0x0020: 5010 40d9 6cdf 0000 0000 0000 0000 [email protected]......... 14:03:49.023873 IP 10.221.20.175.http > 10.215.35.89.51584: . ack 344 win 54 <nop,nop,sack 1 {343:344}> 0x0000: 4500 0034 31b3 4000 4006 bb55 0add 14af E..41.@[email protected].... 0x0010: 0ad7 2359 0050 c980 87ca 7f28 5779 8c23 ..#Y.P.....(Wy.# 0x0020: 8010 0036 b032 0000 0101 050a 5779 8c22 ...6.2......Wy." 0x0030: 5779 8c23 Wy.# 14:03:59.023741 IP 10.215.35.89.51584 > 10.221.20.175.http: . 343:344(1) ack 375 win 16601 0x0000: 4500 0029 6aaa 4000 7c06 4669 0ad7 2359 E..)j.@.|.Fi..#Y 0x0010: 0add 14af c980 0050 5779 8c22 87ca 7f28 .......PWy."...( 0x0020: 5010 40d9 6cdf 0000 0000 0000 0000 [email protected]......... 14:03:59.023787 IP 10.221.20.175.http > 10.215.35.89.51584: . ack 344 win 54 <nop,nop,sack 1 {343:344}> 0x0000: 4500 0034 31b4 4000 4006 bb54 0add 14af E..41.@[email protected].... 0x0010: 0ad7 2359 0050 c980 87ca 7f28 5779 8c23 ..#Y.P.....(Wy.# 0x0020: 8010 0036 b032 0000 0101 050a 5779 8c22 ...6.2......Wy." 0x0030: 5779 8c23 Wy.# 14:04:09.024169 IP 10.215.35.89.51584 > 10.221.20.175.http: . 343:344(1) ack 375 win 16601 0x0000: 4500 0029 6abc 4000 7c06 4657 0ad7 2359 E..)j.@.|.FW..#Y 0x0010: 0add 14af c980 0050 5779 8c22 87ca 7f28 .......PWy."...( 0x0020: 5010 40d9 6cdf 0000 0000 0000 0000 [email protected]......... 14:04:09.024215 IP 10.221.20.175.http > 10.215.35.89.51584: . ack 344 win 54 <nop,nop,sack 1 {343:344}> 0x0000: 4500 0034 31b5 4000 4006 bb53 0add 14af E..41.@[email protected].... 0x0010: 0ad7 2359 0050 c980 87ca 7f28 5779 8c23 ..#Y.P.....(Wy.# 0x0020: 8010 0036 b032 0000 0101 050a 5779 8c22 ...6.2......Wy." 0x0030: 5779 8c23 Wy.#
c、四次挥手断开连接
1、在经过一段时间的保持连接后,服务端发起请求,要求终止连接,服务端发出ACK+FIN包,
14:04:09.025772 IP 10.221.20.175.http > 10.215.35.89.51584: F 375:375(0) ack 344 win 54 0x0000: 4500 0028 31b6 4000 4006 bb5e 0add 14af E..(1.@.@..^.... 0x0010: 0ad7 2359 0050 c980 87ca 7f28 5779 8c23 ..#Y.P.....(Wy.# 0x0020: 5011 0036 ad81 0000 P..6....
2、客户端收到后,做出回答,发出ACK包应答服务端要求
14:04:09.026201 IP 10.215.35.89.51584 > 10.221.20.175.http: . ack 376 win 16601 0x0000: 4500 0028 6abe 4000 7c06 4656 0ad7 2359 E..(j.@.|.FV..#Y 0x0010: 0add 14af c980 0050 5779 8c23 87ca 7f29 .......PWy.#...) 0x0020: 5010 40d9 6cde 0000 0000 0000 0000 [email protected].........
3、客户端再发送ACK+FIN包
14:04:09.026382 IP 10.215.35.89.51584 > 10.221.20.175.http: F 344:344(0) ack 376 win 16601 0x0000: 4500 0028 6abf 4000 7c06 4655 0ad7 2359 E..(j.@.|.FU..#Y 0x0010: 0add 14af c980 0050 5779 8c23 87ca 7f29 .......PWy.#...) 0x0020: 5011 40d9 6cdd 0000 0000 0000 0000 [email protected].........
4、服务端发出ACK包应答
14:04:09.026399 IP 10.221.20.175.http > 10.215.35.89.51584: . ack 345 win 54 0x0000: 4500 0028 0000 4000 4006 ed14 0add 14af E..(..@.@....... 0x0010: 0ad7 2359 0050 c980 87ca 7f29 5779 8c24 ..#Y.P.....)Wy.$ 0x0020: 5010 0036 ad80 0000 P..6....
总结:
TCP/IP协议在做数据传输过程中是非常复杂的,要处理数据的拥塞,重传等等,这里使用tcpdump抓包来分析包,只是从实践的一方面来加深对tcp的理解。