用wireshark抓包分析TCP三次握手、四次揮手以及TCP實現可靠傳輸的機制(轉)
關於TCP三次握手和四次揮手大家都在《計算機網路》課程裡學過,還記得當時高超老師耐心地講解。大學裡我遇到的最好的老師大概就是這位了,雖然他只給我講過《java程式設計》和《計算機網路》,但每次課幾乎都動手敲程式碼或者當場做實驗。好了不扯了,下面進入正題。
關於三次握手和四次揮手的理論部分可以在很多資料上找到,我今天動手抓了幾個包驗證書上的理論,畢竟那些欄位和整個通訊的過程學起來很枯燥。
一、三次握手:
我用wireshark抓取的資料包如下:
觀察其中紅色方框內的3條資料包就是一次TCP建立連線的過程,客戶端首先向伺服器發一個數據包syn位置1,5774->80,嘿,哥們兒,您我想訪問你的web資源,能不能把你的80埠開啟;伺服器向客戶端返回一個數據包syn位置1,ack位置1,80->5774,可以啊,我已經把80埠打開了,但是為了保證待會兒可靠傳輸,你也把你的5774埠開啟唄;最後,客戶端會再向伺服器端傳送一個數據包ack位置1,5774->80,沒問題我也把的5774埠打開了,好的到此一次TCP連線就此建立。下面具體分析資料包的各個欄位。
在wireshark的這個介面中,左邊這個框框是對資料包各個層的概述和詳細資訊,右邊的框框是真實的資料包,我調成用16進位制顯示,最右邊還有一堆亂七八糟的符號,其實就是16進位制資料的ascii碼解釋,0000,0010,0020,0030就是16進位制的地址,如果對彙編比較熟的話右邊的框框應該很容易看明白。左邊的框框第一行是資料包整體概述,第二行是乙太網這一層(鏈路層)的詳細資訊,最主要的是雙方的mac地址,第三行是網路層(網際層)的詳細資訊,最主要的是雙方的IP地址,第四行是傳輸層的詳細資訊,最主要的是雙方的埠號。
每一層都有一個欄位指向上一層,表明上一層是什麼協議。這大概是因為發包的時候會在資料上依次加上應用層、傳輸層、網路層、鏈路層的頭部,但是對方收到資料包後是從最底層(鏈路層)開始層層剝去頭部解包的,所以在每層上有一個欄位指向上層表明上層的協議,對方就知道下一步該怎麼解包了。說了這麼多,可能又要被噴了,no picture you say a J8 a !
由於建立TCP連線用不到應用層協議,所以傳輸層就沒有相應的指明上層(應用層)的欄位了。
下面更直觀地感受一下,三次握手過程中標誌位的變化情況,首先客戶端傳送的資料包syn位置1,然後伺服器端回覆的資料包syn位置1,ack位置1,最後客戶端傳送的資料包ack位置1.以下三幅圖分別為TCP三次握手的資料包中傳輸層的標誌位欄位
二、四次揮手:
這次抓到的包和書本上分析的過程有點不一樣,過程就不贅述了,直接看圖分析
關於可靠傳輸好像沒抓到合適的包啊,下次有機會再寫一篇部落格,今天太晚了。
三、抓取telnet明文傳輸的值
眾所周知,telnet在網上是明文傳輸,因為這樣技術出現比較早,當時的人心裡也沒那麼黑暗,想不到去盜取別人賬號密碼什麼的,現在不同了,用telnet這種遠端登入方式是很不安全的,如果黑客通過一定方式把你的流量欺騙到他的電腦,再通過抓包軟體分析你的賬號和密碼,那就.........。所以,建議使用ssh,畢竟安全一點。
我這次是用telnet遠端登入美國的一臺開放的路由器telnet route-server.ip.att.net。賬號:rviews,密碼:rviews。用wireshark抓包並過濾後發現了密碼和賬號。還是那句話,no picture you say a J8 a!由於telnet是一個字元一個字元的傳的,所以截的圖可能會有點多。先使用者名稱部分:
可見,將這些字元連起來就可以得到rviews,也就是使用者名稱。而且最後傳送的'\r\n'還可以推斷作者用的是windows系統,因為linux下的換行是'\n',而windows下是'\r\n'。密碼部分只上傳部分截圖:
關於可靠傳輸也找到了一個好點的例子,沒錯,就是telnet,TCP通過每個資料包的seq序列號+len長度都等於下個數據包的seq序列號,如果不等說明中間丟了位元,下次會從新的seq位開始傳一定長度的資料。telnet每次好像都傳1位元,傳2位元的是'\r\n'字元。