數據包

計算機辭彙

數據包是一個計算機辭彙,是TCP/IP協議通信傳輸中的數據單位。有人說,區域網中傳輸的不是“幀”(Frame)嗎?沒錯,但是TCP/IP協議是工作在OSI模型第三層(網路層)、第四層(傳輸層)上的,而幀是工作在第二層(數據鏈路層)。上一層的內容由下一層的內容來傳輸,所以在區域網中,“包”是包含在“幀”里的。

解釋


包(Packet):在包交換網路里,單個消息被劃分為多個數據塊,這些數據塊稱為包,它包含發送者和接收者的地址信息。這些包然後沿著不同的路徑在一個或多個網路中傳輸,並且在目的地重新組合。
名詞解釋:OSI(Open System Interconnection,開放系統互聯)模型是由國際標準化組織(ISO)定義的標準,它定義了一種分層體系結構,在其中的每一層定義了針對不同通信級別的協議。OSI模型有7層,1到7層分別是:物理層、數據鏈路層、網路層、傳輸層、會話層、表示層、應用層。OSI模型在邏輯上可分為兩個部分:低層的1至3層關注的是原始數據的傳輸;高層的4至7層關注的是網路下的應用程序。

概述


任意一台主機都能夠發送具有任意源地址的數據包。當數據包進行長距離的傳輸時需要經過許多中繼站。每個中繼站就是一台主機或路由器,他們基於路由信息,將數據包向下一個中繼站傳遞。在數據傳輸的路途上,如果路由器遇到大數據流量的情況下,它可能在沒有任何提示的情況下丟掉一些數據包。較高層的協議(如TCP協議)用於處理這些問題,以便為應用程序提供一條可靠的鏈路。如果對於下一個中繼站來說數據包太大,該數據包就會被分片。也就是說,大的數據包會被分成兩個或多個小數據包,每個小數據包都有自己的IP頭,但其凈荷僅僅是大數據包凈荷的一部分。每個小數據包可以經由不同的路徑到達目的地。在傳輸的路途上,每個小數據包還可能會被繼續分片。當這些小數據包到達目標機器時,他們會被重新拼裝到一起。按照規則規定,在中間節點上,不允許對小數據包進行拼裝組合。
數據包捕獲軟體
數據包捕獲軟體
我們可以用一個形象一些的例子對數據包的概念加以說明:我們在郵局郵寄產品時,雖然產品本身帶有自己的包裝盒,但是在郵寄的時候只用產品原包裝盒來包裝顯然是不行的。必須把內裝產品的包裝盒放到一個郵局指定的專用紙箱里,這樣才能夠郵寄。這裡,產品包裝盒相當於數據包,裡面放著的產品相當於可用的數據,而專用紙箱就相當於幀,且一個幀中只有一個數據包。“包”聽起來非常抽象,那麼是不是不可見的呢?通過一定技術手段,是可以感知到數據包的存在的。比如在Windows 2000 Server中,把滑鼠移動到任務欄右下角的網卡圖標上(網卡需要接好雙絞線、連入網路),就可以看到“發送:××包,收到:××包”的提示。通過數據包捕獲軟體,也可以將數據包捕獲並加以分析。就是用數據包捕獲軟體Iris捕獲到的數據包的界面圖,在此,大家可以很清楚地看到捕獲到的數據包的MAC地址、IP地址、協議類型埠號等細節。通過分析這些數據,網管員就可以知道網路中到底有什麼樣的數據包在活動了。

實例


數據包的結構:數據包的結構非常複雜,不是三言兩語能夠說清的,在這裡主要了解一下它的關鍵構成就可以了,這對於理解TCP/IP協議的通信原理是非常重要的。數據包主要由“目的IP地址”、“源IP地址”、“凈載數據”等部分構成,包括包頭和包體,包頭是固定長度,包體的長度不定,各欄位長度固定,雙方的請求數據包和應答數據包的包頭結構是一致的,不同的是包體的定義。數據包的結構與我們平常寫信非常類似,目的IP地址是說明這個數據包是要發給誰的,相當於收信人地址;源IP地址是說明這個數據包是發自哪裡的,相當於發信人地址;而凈載數據相當於信件的內容。正是因為數據包具有這樣的結構,安裝了TCP/IP協議的計算機之間才能相互通信。我們在使用基於TCP/IP協議的網路時,網路中其實傳遞的就是數據包。理解數據包,對於網路管理的網路安全具有至關重要的意義。

運用


簡單的說,你上網打開網頁,這個簡單的動作,就是你先發送數據包給網站,它接收到了之後,根據你發送的數據包的IP地址,返回給你網頁的數據包,也就是說,網頁的瀏覽,實際上就是數據包的交換。
1、數據鏈路層對數據幀的長度都有一個限制,也就是鏈路層所能承受的最大數據長度,這個值
稱為最大傳輸單元,即MTU。以乙太網為例,這個值通常是1500位元組。
2、對於IP數據包來講,也有一個長度,在IP包頭中,以16位來描述IP包的長度。一個IP包,最長可能是65535位元組。
3、結合以上兩個概念,第一個重要的結論就出來了,如果IP包的大小,超過了MTU值,那麼就需要
分片,也就是把一個IP包分為多個,這個概念非常容易理解,一個載重5T的卡車,要拉10T的貨,它
當然就得分幾次來拉了。
4. IP分片是很多資料常講的內容,但是我倒是覺得分不分片其實不重要,重要的是另一個東西。一個數據包穿過一個大的網路,它其間會穿過多個網路,每個網路的MTU值是不同的。我們可以設想,如果接受/發送端都是乙太網,它們的MTU都是1500,我們假設發送的時候,數據包會以1500來封裝,然而,不幸的是,傳輸中有一段X.25網,它的MTU是576,這會發生什麼呢?我想,這個才是我們所關心的。
當然,結論是顯而易見的,這個數據包會被再次分片,咱開始用火車拉,到了半路,不通火車,只通汽車,那一車貨會被分為很多車。僅此而已,更重要的是,這種情況下,如果IP包被設置了“不允許分片標誌”,那會發生些什麼呢?對,數據包將被丟棄,然後收到一份ICMP不可達差錯,告訴你,需要分片!這個網路中最小的MTU值,被稱為路徑MTU,我們應該有一種有效的手段,來發現這個值,最笨的方法或許是先用traceroute查看所有節點,然後一個個ping。
5、到了傳輸層,也會有一個最大值的限制,當然,對於只管發,其它都不管的UDP來說,不在我們討論之列。這裡說的是TCP協議。說到大小,或許會讓人想到TCP著名的滑動窗口的窗口大小,它跟收發兩端的緩存有關,這裡討論的是傳輸的最大數據包大小,所以,它也不在討論之列。
TCP的選項欄位中,有一個最大報文段長度(MSS),表示了TCP傳往另一端的最大數據的長度,當一個連接建立時,連接的雙方都要通告各自的MSS,也就是說,它是與TCP的SYN標誌在一起的。當然,對於傳輸來講,總是希望MSS越大越好,超載這麼嚴重,誰家不希望多拉點貨。但是,MSS總是有個限制的,也就是它的值=MTU-IP頭長度-TCP頭長度,對於乙太網來講它通常是1500-20-20=1460,雖然總是希望它能很大(如1460),但是大多數BSD實現,它都是512的倍數,如1024。
6、回到分片上來,例如,在Win2000下執行如下命令:
"ping192.168.0.1-l1473
按剛才的說法,1473+20(ip頭)+8(icmp頭)=1501,剛好大於1500,它會被分片,但是,我們關心的是:
這個數據包會被怎麼樣分法?
可以猜想,第一個包是
以太頭+IP頭+ICMP頭+1472的數據;
那第二個分片包呢?
它可以是:
以太頭+IP頭+ICMP頭+1個位元組的數據
或者是:
以太頭+IP頭+1個位元組的數據"(引號內的內容可否在這裡不詳細闡述,對於1473的數據如何被分為1472和1不是很清楚2010.01.15 13:50)也就是省去ICMP頭的封裝,當然,IP頭是不可以省的,否則怎麼傳輸了。
事實上,TCP/IP協議採用的是后一種封裝方式,這樣,一次可以節約8個位元組的空間。IP包頭中,用了三個標誌來描述一個分片包:
1、分片標誌:如果一個包被分片了,分片標誌這個欄位被置於1,最後一個分片除外;——這樣,對於接收端來講,可以根據這個標誌位做為重組的重要依據之一;
2、分片偏移標誌:光有一個標誌位說明“自己是不是分片包”是不夠的,偏移標誌位說明了自己這個分片位於原始數據報的什麼位置。很明顯,這兩個標誌一結合,就很容易重組分片包了。