一、前言
目前,網路的速度發展非常快,學習網路的人也越來越多,稍有網路常識的人都知道
TCP/
IP協議是網路的基礎,是Internet的語言,可以說沒有
TCP/
IP協議就沒有互連網的今天。目前號稱搞網的人非常多,許多人就是從一把夾線鉗,一個測線器聯網開始接觸網路的,如果只是聯網玩玩,知道幾個Ping之類的命令就行了,如果想在網路上有更多的發展不管是黑道還是紅道,必須要把
TCP/
IP協議搞的非常明白。
學習過
TCP/
IP協議的人多有一種感覺,這東西太抽像了,沒有什麼資料實例,看完不久就忘了。本文將介紹一種直觀的學習方法,利用
協議分析工具學習
TCP/
IP,在學習的過程中能直觀的看到資料的具體傳輸過程。
為了初學者更容易理解,本文將搭建一個最簡單的網路環境,不包含子網。
二、試驗環境
1、網路環境
如圖1所示
圖1
為了表述方便,下文中208號機即指地址為192.168.113.208的電腦,1號機指地址為192.168.113.1的電腦。
2、操作系統
兩台機器都為Windows 2000 ,1號機機器作為服務器,安裝
FTP服務
3、協議分析工具
Windows環境下常用的工具有:
Sniffer Pro、Natxray、Iris以及windows 2000自帶的網路監視器等。本文選用Iris作為
協議分析工具。
在客戶機208號機安裝IRIS軟件。
三、測試過程
1、測試例子:將1號機電腦中的一個文件通過
FTP下載到208號機中。
2、IRIS的設置。
由於IRIS具有網路監聽的功能,如果網路環境中還有其它的機器將抓很多別的資料包,這樣為學習帶來諸多不便,為了清楚地看清楚上述例子的傳輸過程首先將IRIS設置為只抓208號機和1號機之間的資料包。設置過程如下:
1)用熱鍵CTRL+B彈出如圖所示的地址表,在表中填寫機器的
IP地址,為了對抓的包看得更清楚不要添主機的名字(name),設置好後關閉此視窗。
圖2
2)用熱鍵CTRL+E彈出如圖所示過濾設置,選擇左欄「
IP address」,右欄按下圖將address book中的地址拽到下面,設置好後確定,這樣就這抓這兩台電腦之間的包。
圖3
3、抓包
按下IRIS工具欄中 開始按鈕。在瀏覽器中輸入:
FTP://192.168.113.1,找到要下載的文件 ,滑鼠右鍵該文件,在彈出的表菜單中選擇「複製到資料夾」開始下載,下載完後在IRIS工具欄中按 按鈕停止抓包。圖4顯示的就是
FTP的整個過程,下面我們將詳細
分析這個過程。
圖4
說明:為了能抓到ARP
協議的包,在WINDOWS 2000 中執行arp –d 清除arp快取記憶體。
四、過程分析
1、TCP/IP的基本原理
本文的重點雖然是根據實例來解析
TCP/
IP,但要講明白下面的過程必須簡要講一下
TCP/
IP的基本原理。
A.網路是分層的,每一層分別負責不同的通信功能。
TCP/
IP通常被認為是一個四層
協議系統,
TCP/
IP協議族是一組不同的
協議組合在一起構成的
協議族。儘管通常稱該
協議族為
TCP/
IP,但
TCP和
IP只是其中的兩種
協議而已,如表1所示。每一層負責不同的功能:
表1
分層的概念說起來非常簡單,但在實際的應用中非常的重要,在進行網路設置和排除故障時對網路層次理解得很透,將對工作有很大的幫助。例如:設置路由是網路層
IP協議的事,要查找MAC地址是鏈路層ARP的事,常用的Ping命令由ICMP
協議來做的。
圖5顯示了各層
協議的關係,理解它們之間的關係對下面的
協議分析非常重要。
圖5
b.資料發送時是自上而下,層層加碼;資料接收時是自下而上,層層解碼。
當應用程式用
TCP傳送資料時,資料被送入
協議棧中,然後逐個通過每一層直到被當作一串比特流送入網路。其中每一層對收到的資料都要增加一些首部訊息(有時還要增加尾部訊息),該過程如圖6所示。
TCP傳給
IP的資料單元稱作
TCP報文段或簡稱為
TCP段。I P傳給網路接頭層的資料單元稱作
IP資料報。 通過
以太網傳輸的比特流稱作幀(Frame)。
資料發送時是按照圖6自上而下,層層加碼;資料接收時是自下而上,層層解碼。
圖6
c. 邏輯上通訊是在同級完成的
垂直方向的結構層次是當今普遍認可的資料處理的功能流程。每一層都有與其相鄰層的接頭。為了通信,兩個系統必須在各層之間傳遞資料、指令、地址等訊息,通信的邏輯流程與真正的資料流的不同。雖然通信流程垂直通過各層次,但每一層都在邏輯上能夠直接與遠端電腦系統的相應層直接通信。
從圖7可以看出,通訊實際上是按垂直方向進行的,但在邏輯上通信是在同級進行的。
圖7
2、過程描述
為了更好的
分析協議,我們先描述一下上述例子資料的傳輸步驟。如圖8所示:
1)
FTP客戶端請求
TCP用服務器的
IP地址建立連接。
2)
TCP發送一個連接請求分段到遠端的主機,即用上述
IP地址發送一份
IP資料報。
3) 如果目的主機在本機網路上,那麼
IP資料報可以直接送到目的主機上。如果目的主機在一個遠端網路上,那麼就通過
IP選路函數來確定位於本機網路上的下一站路由器地址,並讓它轉發
IP資料報。在這兩種情況下,
IP資料報都是被送到位於本機網路上的一台主機或路由器。
4) 本例是一個
以太網,那麼發送端主機必須把32位的
IP地址變換成48位的
以太網地址,該地址也稱為MAC地址,它是出廠時寫到網卡上的世界唯一的硬體地址。把
IP地址翻譯到對應的MAC地址是由ARP
協議完成的。
5) 如圖的虛線所示,ARP發送一份稱作ARP請求的
以太網資料幀給
以太網上的每個主機,這個過程稱作廣播。ARP請求資料幀中包含目的主機的
IP地址,其意思是「如果你是這個
IP地址的擁有者,請回答你的硬體地址。」
6) 目的主機的ARP層收到這份廣播後,識別出這是發送端在尋問它的
IP地址,於是發送一個ARP應答。這個ARP應答包含I P地址及對應的硬體地址。
7) 收到ARP應答後,使ARP進行請求—應答交換的
IP資料包現在就可以傳送了。
8) 發送
IP資料報到目的主機。
圖8
3、實例分析
下面通過
分析用iris捕獲的包來
分析一下
TCP/
IP的工作過程,為了更清晰的解釋資料傳送的過程,我們按傳輸的不同階段抓了四組資料,分別是查找服務器、建立連接、資料傳輸和終止連接。每組資料,按下面三步進行解釋。
顯示資料包
解釋該資料包
按層
分析該包的頭訊息
第一組 查找服務器
1)下圖顯示的是1、2行的資料
圖9
2)解釋資料包
這兩行資料就是查找服務器及服務器應答的過程。
在第1行中,源端主機的MAC地址是00:50:FC:22:C7:BE。目的端主機的MAC地址是FF:FF:FF:FF:FF:FF,這個地址是十六進製表示的,F換算為二進制就是1111,全1的地址就是廣播地址。所謂廣播就是向本網上的每台網路設備發送訊息,電纜上的每個
以太網接頭都要接收這個資料幀並對它進行處理,這一行反映的是步驟5)的內容,ARP發送一份稱作ARP請求的
以太網資料幀給
以太網上的每個主機。網內的每個網卡都接到這樣的訊息「誰是192.168.113.1的
IP地址的擁有者,請將你的硬體地址告訴我」。
第2行反映的是步驟6)的內容。在同一個
以太網中的每台機器都會"接收"到這個報文,但正常狀態下除了1號機外其他主機應該會忽略這個報文,而1號的主機的ARP層收到這份廣播報文後,識別出這是發送端在尋問它的
IP地址,於是發送一個ARP應答。告知自己的
IP地址和MAC地址。第2行可以清楚的看出1號回答的訊息__自己的MAC地址00:50:FC:22:C7:BE。
這兩行反映的是資料鏈路層之間一問一答的通信過程。這個過程就像我要在一個坐滿人的教室找一個叫「張三」的人,在門口喊了一聲「張三」,這一聲大家都聽見了,這就叫廣播。張三聽到後做了回應,別人聽到了沒做回應,這樣就與張三取得了聯繫。
3)頭訊息分析
如下圖左欄所示,第1資料包包含了兩個頭訊息:
以太網(
Ethernet)和ARP。
圖10
下表2是
以太網的頭訊息,括號內的數均為該字段所佔字節數,
以太網報頭中的前兩個字段是
以太網的源地址和目的地址。目的地址為全1的特殊地址是廣播地址。電纜上的所有
以太網接頭都要接收廣播的資料幀。兩個字節長的
以太網幀類型表示後面資料的類型。對於ARP請求或應答來說,該字段的值為0806。
第2行中可以看到,儘管ARP請求是廣播的,但是ARP應答的目的地址卻是1號機的(00 50 FC 22 C7 BE)。ARP應答是直接送到請求端主機的。
表2
下表3是ARP
協議的頭訊息。硬體類型字段表示硬體地址的類型。它的值為1即表示
以太網地址。
協議類型字段表示要映射的
協議地址類型。它的值為0800即表示
IP地址。它的值與包含I P資料報的
以太網資料幀中的類型字段的值相同。接下來的兩個1字節的字段,硬體地址長度和
協議地址長度分別指出硬體地址和
協議地址的長度,以字節為單位。對於
以太網上
IP地址的ARP請求或應答來說,它們的值分別為6和4。Op即操作(Opoperation),1是ARP請求、2是ARP應答、3是RARP請求和4為RARP應答,第二行中該字段值為2表示應答。接下來的四個字段是發送端的硬體地址、發送端的
IP地址、目的端的硬體地址和目的端
IP地址。注意,這裡有一些重複訊息:在
以太網的資料幀報頭中和ARP請求資料幀中都有發送端的硬體地址。對於一個ARP請求來說,除目的端硬體地址外的所有其他的字段都有填充值。
表3的第2行為應答,當系統收到一份目的端為本機的ARP請求報文後,它就把硬體地址填進去,然後用兩個目的端地址分別替換兩個發送端地址,並把操作字段置為2,最後把它發送回去。
表3
第二組 建立連接
1)下圖顯示的是3-5行的資料
圖11
2)解釋資料包
這三行資料是兩機建立連接的過程。
這三行的核心意思就是
TCP協議的三次握手。
TCP的資料包是靠
IP協議來傳輸的。但
IP協議是只管把資料送到出去,但不能保證
IP資料報能成功地到達目的地,保證資料的可靠傳輸是靠
TCP協議來完成的。當接收端收到來自發送端的訊息時,接受端詳發送短髮送一條應答訊息,意思是:「我已收到你的訊息了。」第三組資料將能看到這個過程。
TCP是一個面向連接的
協議。無論哪一方向另一方發送資料之前,都必須先在雙方之間建立一條連接。建立連接的過程就是三次握手的過程。
這個過程就像要我找到了張三向他借幾本書,第一步:我說:「你好,我是擔子」,第二步:張三說:「你好,我是張三」,第三步:我說:「我找你借幾本書。」這樣通過問答就確認對方身份,建立了聯繫。
下面來
分析一下此例的三次握手過程。
1))請求端208號機發送一個初始序號(SEQ)987694419給1號機。
2))服務器1號機收到這個序號後,將此序號加1值為987694419作為應答信號(ACK),同時隨機產生一個初始序號(SEQ)1773195208,這兩個信號同時發回到請求端208號機,意思為:「消息已收到,讓我們的資料流以1773195208這個數開始。」
3))請求端208號機收到後將確認序號設置為服務器的初始序號(SEQ)1773195208加1為1773195209作為應答信號。
以上三步完成了三次握手,雙方建立了一條通道,接下來就可以進行資料傳輸了。
下面
分析TCP頭訊息就可以看出,在握手過程中
TCP頭部的相關字段也發生了變化。
3)頭訊息
分析
如圖12所示,第3資料包包含了三頭訊息:
以太網(
Ethernet)和
IP和
TCP。
頭訊息少了ARP多了
IP、
TCP,下面的過程也沒有ARP的參與,可以這樣理解,在局域網內,ARP負責的是在眾多聯網的電腦中找到需要找的電腦,找到工作就完成了。
以太網的頭訊息與第1、2行不同的是幀類型為0800,指明該幀類型為
IP。
圖12
IP協議頭訊息
IP是
TCP/
IP協議族中最為核心的
協議。從圖5可以看出所有的
TCP、
UDP、ICMP及IGMP資料都以
IP資料報格式傳輸的,有個形象的比喻
IP協議就像運貨的卡車,將一車車的貨物運向目的地。主要的貨物就是
TCP或
UDP分配給它的。需要特別指出的是
IP提供不可靠、無連接的資料報傳送,也就是說I P僅提供最好的傳輸服務但不保證
IP資料報能成功地到達目的地。看到這你會不會擔心你的E_MAIL會不會送到朋友那,其實不用擔心,上文提過保證資料正確到達目的地是
TCP的工作,稍後我們將詳細解釋。
如表4是
IP協議的頭訊息。
表4
IP資料報格式及首部中的各字段
圖12中所宣佈分45 00—71 01為
IP的頭訊息。這些數是十六進製表示的。一個數占4位,例如:4的二進制是0100
4位版本:表示目前的
協議版本號,數值是4表示版本為4,因此
IP有時也稱作
IPv4;
4位首部長度:頭部的是長度,它的單位是32位(4個字節),數值為5表示
IP頭部長度為20字節。
8位服務類型(TOS):00,這個8位字段由3位的優先權子字段,現在已經被忽略,4位的TOS子字段以及1 位的未用字段(現在為0)構成。4位的TOS子字段包含:最小延時、最大吞吐量、最高可靠性以及最小費用構成,這四個1位最多只能有一個為1,本例中都為0,表示是一般服務。
16位總長度(字節數):總長度字段是指整個
IP資料報的長度,以字節為單位。數值為00 30,換算為十進制為48字節,48字節=20字節 的
IP頭+28字節的
TCP頭,這個資料報只是傳送的控制訊息,還沒有傳送真正的資料,所以目前看到的總長度就是報頭的長度。
16位標識:標識字段唯一地標識主機發送的每一份資料報。通常每發送一份報文它的值就會加1,第3行為數值為30 21,第5行為30 22,第7行為30 23。分片時涉及到標誌字段和片偏移字段,本文不討論這兩個字段。
8位生存時間(TTL):TTL(time-to-live)生存時間字段設置了資料報可以經過的最多路由器數。它指定了資料報的生存時間。ttl的初始值由源主機設置,一旦經過一個處理它的路由器,它的值就減去1。可根據TTL值判斷服務器是什麼系統和經過的路由器。本例為80,換算成十進制為128,WINDOWS操作系統TTL初始值一般為128,UNIX操作系統初始值為255,本例表示兩個機器在同一網段且操作系統為WINDOWS。
8位
協議:表示
協議類型,6表示傳輸層是
TCP協議。
16位首部檢驗和:當收到一份I P資料報後,同樣對首部中每個16 位進行二進制反碼的求和。由於接收方在計算過程中包含了發送方存在首部中的檢驗和,因此,如果首部在傳輸過程中沒有發生任何差錯,那麼接收方計算的結果應該為全1。如果結果不是全1,即檢驗和錯誤,那麼
IP就丟棄收到的資料報。但是不產生差錯報文,由上層去發現丟失的資料報並進行重傳。
32位源
IP地址和32位目的
IP地址:實際這是
IP協議中核心的部分,但介紹這方面的文章非常多,本文搭建的又是一個最簡單的網路結構,不涉及路由,本文對此只做簡單介紹,相關知識請參閱其它文章。32位的
IP地址由一個網路ID和一個主機ID組成。本例源
IP地址為C0 A8 71 D0,轉換為十進制為:192.168.113.208; 目的
IP地址為C0 A8 71 01,轉換為十進制為:192.168.113.1。網路地址為192.168.113,主機地址分別為1和208,它們的網路地址是相同的所以在一個網段內,這樣資料在傳送過程中可直接到達。
TCP協議頭訊息
如表5是ICP
協議的頭訊息。
表5
TCP包首部
第三行
TCP的頭訊息是:04 28 00 15 3A DF 05 53 00 00 00 00 70 02 40 00 9A 8D 00 00 02 04 05 B4 01 01 04 02
連接阜號:常說
FTP占21連接阜、HTTP占80連接阜、
TELNET占23連接阜等,這裡指的連接阜就是
TCP或
UDP的連接阜,連接阜就像通道兩端的門一樣,當兩機進行通訊時門必須是打開的。源連接阜和目的連接阜各佔16位,2的16次方等於65536,這就是每台電腦與其它電腦聯繫所能開的「門」。一般作為服務一方每項服務的連接阜號是固定的。本例目的連接阜號為00 15,換算成十進制為21,這正是
FTP的預定連接阜,需要指出的是這是
FTP的控制連接阜,資料傳送時用另一連接阜,第三組的
分析能看到這一點。客戶端與服務器聯繫時隨機開一個大於1024的連接阜,本例為04 28,換算成十進制為1064。你的電腦中了木馬也會開一個服務連接阜。觀察連接阜非常重要,不但能看出本機提供的正常服務,還能看出不正常的連接。Windows察看連接阜的命令時netstat。
32位序號:也稱為順序號(Sequence Number),簡寫為SEQ,從上面三次握手的
分析可以看出,當一方要與另一方聯繫時就發送一個初始序號給對方,意思是:「讓我們建立聯繫吧?」,服務方收到後要發個獨立的序號給發送方,意思是「消息收到,資料流將以這個數開始。」由此可看出,
TCP連接完全是雙向的,即雙方的資料流可同時傳輸。在傳輸過程中雙方資料是獨立的,因此每個
TCP連接必須有兩個順序號分別對應不同方向的資料流。
32位確認序號:也稱為應答號(Acknowledgment Number),簡寫為ACK。在握手階段,確認序號將發送方的序號加1作為回答,在資料傳輸階段,確認序號將發送方的序號加發送的資料大小作為回答,表示確實收到這些資料。在第三組的
分析中將看到這一過程。
4位首部長度:。這個字段占4位,它的單位時32位(4個字節)。本例值為7,
TCP的頭長度為28字節,等於正常的長度2 0字節加上可選項8個字節。,
TCP的頭長度最長可為60字節(二進制1111換算為十進制為15,15*4字節=60字節)。
6個標誌位。
URG 緊急指標,告訴接收
TCP模塊緊要指標域指著緊要資料
ACK 置1時表示確認號(為合法,為0的時候表示資料段不包含確認訊息,確認號被忽略。
PSH 置1時請求的資料段在接收方得到後就可直接送到應用程式,而不必等到Buffers區滿時才傳送。
RST 置1時重建連接。如果接收到RST位時候,通常發生了某些錯誤。
SYN 置1時用來發起一個連接。
FIN 置1時表示發端完成發送任務。用來釋放連接,表明發送方已經沒有資料發送了。
圖13的3個圖分別為3-5行
TCP協議的頭訊息,這三行是三次握手的過程,我們看看握手的過程標誌位發生了什麼?
如圖13-1請求端208號機發送一個初始序號(SEQ)987694419給1號機。標誌位SYN置為1。
如圖13-2服務器1號機收到這個序號後,將應答信號(ACK)和隨機產生一個初始序號(SEQ)1773195208發回到請求端208號機,因為有應答信號和初始序號,所以標誌位ACK和SYN都置為1。
如圖13-3請求端208號機收到1號機的信號後,發回訊息給1號機。標誌位ACK置為1,其它標誌為都為0。注意此時SYN值為0,SYN是標示發起連接的,上兩部連接已經完成。
16位視窗大小:
TCP的流量控制由連接的每一端通過聲明的視窗大小來提供。視窗大小為字節數,起始於確認序號字段指明的值,這個值是接收端正期望接收的字節。視窗大小是一個16字節字段,因而視窗大小最大為65535字節。
16位檢驗和:檢驗和覆蓋了整個的
TCP報文段:
TCP首部和
TCP資料。這是一個強制性的字段,一定是由發端計算和存儲,並由收端進行驗證。
16位緊急指標:只有當U R G標誌置1時緊急指標才有效。緊急指標是一個正的偏移量,和序號字段中的值相加表示緊急資料最後一個字節的序號。
選項:圖13-1和圖13-2有8個字節選項,圖13-3沒有選項。最常見的可選字段是最長報文大小,又稱為MSS (Maximum Segment Size)。每個連接方通常都在握手的第一步中指明這個選項。它指明本端所能接收的最大長度的報文段。圖13-1可以看出208號機可以接受的最大字節數為1460字節,1460也是
以太網預定的大小,在第三組的資料
分析中可以看到資料傳送正是以1460字節傳送的。
握手小結
上面我們分開講了三次握手,看著有點散,現在小結一下。
第三組 資料傳輸
1)下圖顯示的是57-60行的資料
圖14
2)解釋資料包
這四行資料是資料傳輸過程中一個發送一個接收的過程。
前文說過,
TCP提供一種面向連接的、可靠的字節流服務。當接收端收到來自發送端的訊息時,接受端要發送一條應答訊息,表示收到此訊息。資料傳送時被
TCP分割成認為最適合發送的資料塊。一般
以太網在傳送時
TCP將資料分為1460字節。也就是說資料在發送方被分成一塊一塊的發送,接受端收到這些資料後再將它們組合在一起。
57行顯示1號機給208號機發送了大小為1514字節大小的資料,注意我們前文講過資料發送時是層層加
協議頭的,1514字節=14字節
以太網頭 + 20字節
IP頭 + 20字節
TCP頭 + 1460字節資料
58行顯示的應答信號ACK為:1781514222,這個數是57行得SEQ序號1781512762加上傳送的資料1460,208號機將這個應答信號發給1號機說明已收到發來的資料。
59、60行顯示的是繼續傳送資料的過程。
這個過程就像我向張三借書,借給我幾本我要說:「我已借了你幾本了。」,他說:「知道了」。
3)頭訊息
圖15-1和圖15-2分別是57行和58行的頭訊息,解釋參考第二組。
第四組 終止連接
1)下圖顯示的是93-96行的資料
圖16