發(fā)布時間:2024-04-12 文章來源:深度系統(tǒng)下載 瀏覽:
我們都知道TCP的連接的建立是通過三次握手,連接的斷開是通過四次揮手完成。大部分人是從大學網(wǎng)絡老師的講課中得知,或者從baidu或者google搜索學習這一過程。但是這些都是理論的,并且很難被記住。
今天我們就通過抓包的方式,用抓到的實際的包來分析這一過程的建立。
我們所使用的抓包工具是: Microsoft Network Monitor 3.4.
硬件環(huán)境是: 一臺筆記本,一臺pc.
網(wǎng)絡環(huán)境是: 筆記本通過無線連接網(wǎng)絡, pc通過有線連接網(wǎng)絡。
軟件環(huán)境: 兩臺都是xp, 有兩個簡單的測試程序,tcp 的服務器S和客戶端C。服務器部署在pc上,客戶端部署在筆記本上。 Network Monitor運行在客戶端,也就是筆記本上。 服務端IP:192.168.200.128, 監(jiān)聽端口6001 客戶端IP:192.168.200.107
好了,我們現(xiàn)在開始。啟動抓包工具,start new capture, 在filter中輸入, Tcp.SrcPort==6001 || Tcp.DstPort==6001, 然后apply, 接下來我們就可以啟動抓包了。
啟動服務器S,然后用客戶端C去連接。 很快我們就可以看到總共有3個包進出:
184 9:42:45 2011-4-29 22.2968750 TestTCPClient.exe 192.168.200.107 192.168.200.128 TCP TCP:Flags=……S., SrcPort=1086, DstPort=6001, PayloadLen=0, Seq=278035085, Ack=0, Win=16384 ( ) = 16384 {TCP:33,
185 9:42:45 2011-4-29 22.2968750 TestTCPClient.exe 192.168.200.128 192.168.200.107 TCP TCP:Flags=…A..S., SrcPort=6001, DstPort=1086, PayloadLen=0, Seq=3353324968, Ack=278035086, Win=65535 ( Scale factor
186 9:42:45 2011-4-29 22.2968750 TestTCPClient.exe 192.168.200.107 192.168.200.128 TCP TCP:Flags=…A…., SrcPort=1086, DstPort=6001, PayloadLen=0, Seq=278035086, Ack=3353324969, Win=17520 (scale factor 0x0)
第一個包是從客戶端(192.168.200.107)發(fā)出,當然是這樣,因為連接的建立肯定是由客戶端想服務端發(fā)起,目的地址就是我們的服務器所在的pc的ip 地址和端口,服務器的端口是我們事先設定的,而客戶端的端口則是tcp協(xié)議棧分配的,這里可以看出,客戶端通訊端口的分配時在第一次發(fā)包時就已經(jīng)確定好了的,其實這個過程在rfc在有個專門的術語來描述,TCB的建立(transmit control block)。這也就是我們在學校老師講的第一次握手。 為了更好的分析這個包,我們引入tcp的包結構:
以及整個包的二進制表示: 00 1A A0 C6 BC 79 00 13 02 4A 3A 8A 08 00 45 00 00 30 09 F6 40 00 80 06 DE 94 C0 A8 C8 6B C0 A8 C8 80 04 3E 17 71 10 92 7A 8D 00 00 00 00 70 02 40 00 8A 13 00 00 02 04 05 B4 01 01 04 02
這個包里面其實包含了Ethernet header, IP header, TCP header. 為了更加清晰對這個包分析,我么順帶也把其他兩個包的格式列出: IP包格式
好了有了這些東西我們就分析包里面的東西,我是以圖片的形式展示給大家: (抱歉,可能圖片有點丑,因為我是用微軟的畫圖程序畫的)
上面的以太網(wǎng)頭部分我們只是標出它的位置,并不做詳細的分析,IP包頭部分我們只看里面的最后8個字節(jié),分別為源IP地址,這里看到正是我們的客戶端,也就是筆記本的Ip地址;還有目的IP地址,正是我們的服務端的Ip地址,也就是pc的Ip地址。 糾正一下:上圖中端口0186應為1086,屬于筆誤。 對于TCP的包頭結構,我做了詳細的分析,只有’Data offset, reserved and flag’這四個字節(jié)需要進一步的說明,因為幾個部分不是字節(jié)對齊的,reserved and flag都是6bit,所以不能簡單一眼看出,需要把他們轉換成二進制表示:
1100000000000010
紅色部分表示偏移量:1010剛好是5,注意這里的5,并不是5個字節(jié),而是5個偏移量單位,而偏移量單位為4個字節(jié),這樣總偏移量就剛好是我們tcp包頭的大小20個字節(jié)。 藍色部分是保留部分,必須全是0. 綠色部分是標志位,分別代表:
可以看到,第一個請求包,只有SYN標志位是置為1的,其他均為0,表示發(fā)起一個連接。
到此第一個包我們就分析完畢。接下來用同樣的方法來分析剩下的兩個包。 第二個包: 00 1A A0 C6 BC 79 00 13 02 4A 3A 8A 08 00 45 00 00 30 09 F6 40 00 80 06 DE 94 C0 A8 C8 6B C0 A8 C8 80 04 3E 17 71 10 92 7A 8D 00 00 00 00 70 02 40 00 8A 13 00 00 02 04 05 B4 01 01 04 02
源IP變成了192.168.200.128,端口是6001; 而目的IP變成了192.168.200.107,端口是1086.可以看出這是服務器那邊的機器發(fā)給客戶端的包。 然后看flag部分是:
1110000000010010
對照tcp包結構就可以看出這個包中,ACK和SYN均置為1,其余均為0. 也就是服務器回應給發(fā)起連接的客戶端的包中ACK和SYN均被置位。
第三個包: 1A A0 C6 BC 79 00 13 02 4A 3A 8A 08 00 45 00 00 28 09 F7 40 00 80 06 DE 9B C0 A8 C8 6B C0 A8 C8 80 源IP:192.168.200.107,端口1086; 目的IP:192.168.200.128,端口6001; flag部分是:
1110000000010000
只有SYN置為1,其余均為0,包括ACK。
這樣整個連接就建立了。
下面用圖示的方式簡單的表示我們上面分析的結果:
到此結束。 |
上一篇:丟包補償技術完成教程