在windows下,linux
圖1 Wireshark界面展現(基於1.99.1)windows
Wireshark是經過底層的winpcap來實現抓包的。winpcap是用於網絡封包抓取的一套工具,可適用於32/64位的操做平臺上解析網絡封包,包含了數據包截獲驅動程序,一個底層動態連接庫,和一個高層靜態連接庫,winpcap在內核中把全部網卡收到的報文複製一份。服務器
Display Filter(顯示過濾器), 用於過濾網絡
Packet List Pane(封包列表),顯示捕獲到的封包,包括編號,時間戳,源地址,目標地址,協議,長度,以及封包信息。不一樣的協議用了不一樣的顏色顯示。多線程
Packet Details Pane(封包詳細信息),顯示封包中的字段工具
Dissector Pane(16進制數據)學習
Miscellaneous(狀態欄)大數據
文件傳輸協議(FTP)做爲網絡共享文件的傳輸協議,在網絡應用軟件中具備普遍的應用。FTP的目標是提升文件的共享性和可靠高效地傳送數據。在傳輸文件時,FTP客戶端程序先與服務器創建鏈接,而後向服務器發送命令。服務器收到命令後給予響應,並執行命令。FTP協議與操做系統無關,任何操做系統上的程序只要符合FTP協議,就能夠相互傳輸數據。編碼
1. FTP協議簡介url
FTP是僅基於TCP的服務,不支持UDP,相比其餘協議(如 HTTP協議),FTP協議要複雜一些。與通常的C/S應用不一樣點在於通常的C/S應用程序通常只會創建一個Socket鏈接,這個鏈接同時處理服務器端和客戶端的鏈接命令和數據傳輸。而FTP協議中將命令與數據分開傳送的方法提升了效率。
FTP使用2個端口,一個數據端口和一個命令端口(也叫作控制端口)。控制Socket用來傳送命令,數據Socket是用於傳送數據。每個 FTP命令發送以後,FTP服務器都會返回一個字符串,其中包括一個響應代碼和一些說明信息。其中的返回碼主要是用於判斷命令是否被成功執行了。
圖2 Wireshark與對應的OSI七層模型
Frame: 物理層的數據幀概況
Ethernet II: 數據鏈路層以太網幀頭部信息
Internet Protocol Version 4: 互聯網層IP包頭部信息
Transmission Control Protocol: 傳輸層T的數據段頭部信息,此處是TCP
File Transfer Protocol: 應用層的信息,此處是FTP協議
二、TCP包的具體內容
三、命令端口和數據端口
通常來講,客戶端有一個 Socket 用來鏈接 FTP 服務器的相關端口,它負責 FTP 命令的發送和接收返回的響應信息。一些操做如「登陸」、「改變目錄」、「刪除文件」,依靠這個鏈接發送命令就可完成。服務器的命令端口號通常是21。
對於有數據傳輸的操做,主要是顯示目錄列表,上傳、下載文件,咱們須要依靠另外一個Socket來完成。 若是使用被動模式,一般服務器端會返回一個端口號。客戶端須要用另開一個Socket來鏈接這個端口,而後咱們可根據操做來發送命令,數據會經過新開的一個端口傳輸。
若是使用主動模式,一般客戶端會發送一個端口號給服務器端,並在這個端口監聽。服務器須要鏈接到客戶端開啓的這個數據端口,並進行數據的傳輸。主動模式下,服務器的數據端口號通常是20。
四、主動模式(PORT)和被動模式(PASV)
主動模式下,客戶端隨機打開一個大於1024的端口向服務器的命令端口P(即21端口),發起鏈接,同時開放N +1端口監聽,並向服務器發出「port N+1」命令,由服務器從它本身的數據端口(即20端口)主動鏈接到客戶端指定的數據端口(N+1)。FTP的客戶端只是告訴服務器本身的端口號,讓服務器來鏈接客戶端指定的端口。對於客戶端的防火牆來講,這是從外部到內部的鏈接,可能會被阻塞。
爲了解決服務器發起到客戶的鏈接問題,有了另外一種FTP鏈接方式,即被動方式。命令鏈接和數據鏈接都由客戶端發起,這樣就解決了從服務器到客戶端的數據端口的鏈接被防火牆過濾的問題。被動模式下,當開啓一個FTP鏈接時,客戶端打開兩個任意的本地端口(N > 1024和N+1)。第一個端口鏈接服務器的21端口,提交PASV命令。而後服務器會開啓一個任意的端口(P > 1024),返回如227 entering passive mode (h1,h2,h3,h4,p1,p2)。它返回了227開頭的信息,在括號中有以逗號隔開的六個數字,前四個指服務器的地址,最後兩個,將倒數第二個乘 256再加上最後一個數字,這就是FTP服務器開放的用來進行數據傳輸的端口。
如獲得227 entering passive mode(h1,h2,h3,h4,p1,p2),那麼端口號是p1*256+p2,ip地址爲h1.h2.h3.h4。這意味着在服務器上有一個端口被開放。客戶端收到命令取得端口號以後,會經過N+1號端口鏈接服 務器的端口P,而後在兩個端口之間進行數據傳輸。
五、主要的FTP命令
FTP 每一個命令都有 3 到 4 個字母組成,命令後面跟參數,用空格分開。每一個命令都以"\r\n"結束。 要下載或上傳一個文件,首先要登入 FTP 服務器,而後發送命令,最後退出。
這個過程當中,主要用到的命令有 USER、PASS、SIZE、REST、CWD、RETR、PASV、PORT、QUIT。
USER: 指定用戶名。一般是控制鏈接後第一個發出的命令。「USER ftp_test\r\n」: 用戶名爲ftp_test 登陸。 PASS: 指定用戶密碼。該命令緊跟 USER 命令後。「PASS ftptest\r\n」:密碼爲 ftptest。
SIZE: 從服務器上返回指定文件的大小。「SIZE file.txt\r\n」:若是 file.txt 文件存在,則返回該文件的大小。 CWD: 改變工做目錄。如:「CWD bankafile\r\n」。
PASV: 讓服務器在數據端口監聽,進入被動模式。如:「PASV\r\n」。
PORT: 告訴 FTP 服務器客戶端監聽的端口號,讓 FTP 服務器採用主動模式鏈接客戶端。如:「PORT h1,h2,h3,h4,p1,p2」。
RETR: 下載文件。「RETR LIST 4.4BSD-Lite.tar.gz \r\n」:下載文件LIST 4.4BSD-Lite.tar.gz。
APPE: 上傳文件。「STOR LIST 4.4BSD-Lite.tar.gz\r\n」:上傳文件LIST 4.4BSD-Lite.tar.gz,若是文件存在,那麼就增長上傳。
STOR: 上傳文件。「STOR LIST 4.4BSD-Lite.tar.gz\r\n」:上傳文件LIST 4.4BSD-Lite.tar.gz。
REST: 該命令並不傳送文件,而是略過指定點後的數據。此命令後應該跟其它要求文件傳輸的 FTP 命令。「REST 100\r\n」 : 從新指定文件傳送的偏移量爲 100 字節。
QUIT: 關閉與服務器的鏈接。
六、FTP 響應碼
客戶端發送FTP命令後,服務器返回響應碼,響應碼用三位數字編碼表示:
第一個數字給出了命令狀態的通常性指示,好比響應成功、失敗或不完整。
第二個數字是響應類型的分類,如 2 表明跟鏈接有關的響應,3 表明用戶認證。
第三個數字提供了更加詳細的信息。
第一個數字的含義以下:
1 表示服務器正確接收信息,還未處理。
2 表示服務器已經正確處理信息。
3 表示服務器正確接收信息,正在處理。
4 表示信息暫時錯誤。
5 表示信息永久錯誤。
第二個數字的含義以下:
0 表示語法。
1 表示系統狀態和信息。
2 表示鏈接狀態。
3 表示與用戶認證有關的信息。
4 表示未定義。
5 表示與文件系統有關的信息。
1)創建命令通道
客戶端192.168.0.101首先經由端口37280與FTP服務器192.168.1.170端口21通過TCP三次握手創建鏈接,創建鏈接成 功後,FTP服務器返回狀態碼220,表示服務就緒。登錄過程首先由終端向FTP服務器發送登錄用戶名」ftp_test」並等待驗證。用戶名驗證經過後,FTP 服務器返回狀態碼331,表示用戶名驗證已經過並須要輸入密碼。終端將登錄密碼」ftptest」發送給FTP服務器,FTP服務器驗證後返回狀態碼 230,表示用戶已經登錄。終端向FTP服務器發送命令「TYPE I」,表示設置文件傳輸類型爲二進制流,FTP服務器返回狀態碼 200,表示命令執行成功。
2)創建數據通道
客戶端請求被動模式,FTP服務器經過21端口返回227 Entering Passive Mode (192,168,1,170,162,240),服務器將開放端口41712(162*256+240)接受來自客戶端的數據鏈接,客戶端則將使用端口38436進行數據鏈接。而後客戶端向FTP服務器發送命令「APPE 4.4BSD-Lite.tar.gz」,表示要上傳文件4.4BSD-Lite.tar.gz。指定要上傳的文件後,客戶端由端口38436主動去鏈接 FTP服務器端口41712,經過TCP三次握手創建數據鏈接」FTP-DATA」,用於傳輸數據。創建數據鏈接後,FTP服務器經過端口21返回狀態碼 150,表示文件狀態正確,正在打開數據鏈接。
3)數據傳輸
經過TCP三次握手創建數據鏈接時,客戶端和服務器協商雙方的MSS值(即TCP數據包每次可以傳輸的最大數據分段)爲1460個字節。客戶端經過端口58436不斷服務器端口41712,發送大小爲1024字節(小於1460)的TCP數據包,服務端每收到1個或2個數據包後返回ACK確認收到了數據包。能夠看到Wireshark每次抓到的FTP數據大小爲1506字節,而不是以太網幀最大的1518字節,這是由於在物理層網卡要先去掉前導同步碼和幀開始定界符,而後對幀進行CRC檢驗,若是幀校驗和錯,就丟棄此幀。若是校驗和正確,就判斷幀的目的硬件地址是否符合本身的接收條件(目的地址是本身的物理硬件地址、廣播地址、可接收的多播硬件地址等),若是符合就將幀交「設備驅動程序」作進一步處理。這時抓包軟件才能抓到數據,所以Wireshark抓到的是去掉前導同步碼、幀 開始分界符、FCS以外的數據,少了12字節。
第59七、599和600三個數據包,客戶端向服務器連續發送兩個大小爲1448, 7240字節的TCP數據包,其中第597個包的Seq爲318481,第599個包的Seq爲319929。服務器收到這兩個數據包後,在第600個包回ACK確認,攜帶的ACK值爲327169,表示已收到Seq318481和Seq319929,須要客戶端下次發送Seq爲327169(318481+1448+7240)的數據包。
4)多線程數據傳輸
上面只是單線程的數據傳輸,數據只在41712和8146這對端口之間傳輸。若是再經過TCP三次握手創建一個或多個數據鏈接用於傳輸,那就是多線程的數據傳輸。
客戶端向FTP服務器發送命令請求上傳文件4.4BSD-Lite.tar.gz5,和4.4BSD-Lite.tar.gz80.
右鍵點擊TCP包,選擇Follow TCP Stream,能夠查看兩個線程的應用層數據,分別顯示了4.4BSD-Lite.tar.gz5和4.4BSD-Lite.tar.gz80的整個下載過程。
下載兩個文件4.4BSD-Lite.tar.gz5和4.4BSD-Lite.tar.gz80一共創建了4個TCP鏈接:兩個命令通道和兩個數據通道。Wireshark菜單中選擇Statistics->Conversation List->TCP(IPv4 & IPv6),能夠列出每一個TCP鏈接的一些概要信息
傳輸4.4BSD-Lite.tar.gz80的數據使用的是端口48430,控制通道的客戶端端口爲34023
傳輸4.4BSD-Lite.tar.gz5的數據使用的是端口54564,控制通道的客戶端端口爲54983
5)數據分析
Wireshark菜單中選擇Statistics->IO Graphs,能夠輸出對當前抓取的數據的速率概況分析,對於圖中給出的速率降下來的小坑的地方能夠用鼠標雙擊進入查看是否有大量的丟包或者延遲等異常。
Wireshark菜單中選擇Analyze->Expert Info Composite,(該功能windows版本是沒有的,linux版本是有的)能夠輸出對當前抓取的數據的分析信息,裏面有
對各種異常的統計,好比TCP接收窗口爲0的統計,丟包和重傳的統計,重複ACK的統計,TCP包亂序的統計等等,根據這些統計信息能夠大致估計當前網絡的一些情況。
本文只對上傳部分的內容進行說明,與ftp下載的內容的基本類似,參考文章就是基於下載部分寫的。之因此本文是基於上傳,緣由僅僅是在分析了很久,才發現打開的數據包居然是上傳的。不過也沒有什麼,經過wireshark工具,最好在linux下使用,功能會更增強大,這裏最開始使用的最新版本的window 64bit的wireshark,可是到最後發現,原做者使用的是linux下的wireshark。幸好我還有linux,嘿嘿。
工具都只是次要的,關鍵還得對TCP協議有更加深刻的理解,這在讀《TCP/IP詳解卷一》關於ftp協議的部分的時候,發現的。一直覺得本身對TCP協議有了解,到此時才知道,TCP也是博大精深的,「聖經」是要多讀才行啊。
MTU:Maximum Transmission Unit 最大傳輸單元
MTU就是IP數據包每次可以傳輸的最大長度,即以太網幀的最大淨載荷payload,大部分網絡設備的MTU都是1500。因爲以太網 EthernetII最大的數據幀是1518Bytes,刨去以太網幀的幀頭(DMAC目的地址MAC48bit=6Bytes+SMAC源MAC地址 48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗部分4Bytes(有時候也叫作FCS),那麼剩下承載上層協議的地 方也就是Data域最大就只能有1500Bytes,這個值稱之爲MTU。MTU過大或者太小都會產生IP層分片,致使速率不穩,最大速率也上不去。
MSS:Maximum Segment Size 最大分段大小
MSS就是TCP數據包的最大淨載荷payload,默認值爲1460,MTU的值1500Bytes減去IP數據包頭20Bytes和TCP數據包頭20Bytes獲得1460Bytes。爲了達到最佳的傳輸效能,TCP協議在創建鏈接的時候一般要協商雙方的MSS值,通信雙方會根據各自提供的 MSS最小值肯定爲此次鏈接的最大MSS值。
TCP滑動窗口
當網絡鏈接的兩端速度不匹配時,發送端的發送速度快於接收端的處理能力,便會出現快速的發送端將慢速的接收端淹沒的現象,致使數據丟失。爲了防止因爲發送端與接收端之間的不匹配而致使的數據丟失,TCP採用滑動口進行流量控制。
滑動窗口機制經過設定的數據發送區間即窗口(單位byte)進行流控制,該窗口是接收方容許發送方發送的字節流的數據範圍,發送方只能發送位於窗口內的字節流中的字節。發送方可在不超過窗口大小範圍的條件下連續發送若干個分組,而沒必要每次發送都要在前一個分組的ACK確認信息收到後進行。該窗口隨着 發送方的出站字節流和接收方的入站字節流而滑動,發送方只有收到了接收方的ACK確認,窗口才能夠向前移動。TCP傳輸過程當中的滑動窗口並非固定不變的,在傳輸過程當中會動態調整,接收方會不斷的在ACK中將本身的接收窗口大小(window size)通告發送方,發送方將此做爲發送窗口的大小。
發送方在兩種狀況下會中止發送數據:一是網絡傳輸延遲致使發送窗口中全是已發送未確認的數據,二是接收方進程處理太慢致使接收方的接收窗口大小爲0(Zero window)。
TCP滑動窗口的大小會影響單線程FTP下載的速率,由於在時延RTT必定的狀況下,單線程下只有一個窗口能夠接收數據,這時須要修改電腦的註冊表來調整窗口大小。可是當FTP下載的線程足夠多時,窗口大小的影響能夠忽略。
參考文檔:經過Wireshark學習FTP流程