1. 程式人生 > >如何利用UDP協議封裝一個數據包

如何利用UDP協議封裝一個數據包

  在如何封裝一個數據包上,是一個非常細緻的問題,而利用UDP協議來封裝的話,是比較簡單,讓我們一步步來分析典型的TCP/IP協議。一般來說一個典型的一個數據包,包括乙太網MAC頭+網路層IP資料頭+傳輸層UDP頭+要傳輸的資料。讓我們一層層來看看這些資料頭是如何構成的。

  

1、乙太網MAC頭

  一般情況下,乙太網MAC頭由14個位元組構成,12個自己的MAC地址+上層協議的識別符號。舉個例子

  如果你要傳送的目標MAC位00:1d:09:10:d1:9c,而你的MAC地址為01:60:6e:11:02:0f,上層一般都是網路層,即為IP層,IP層的識別符號為0x8000,那麼你的乙太網MAC頭就為

  00 1d 09 10 d1 9c 01 60 6e 11 02 0f 80 00.

  下面是更詳細的解釋,引用http://blog.csdn.net/louiswang2009/archive/2010/05/04/5554524.aspx這片部落格。

  8位元組的前導用於幀同步,CRC域用於幀校驗。這些使用者不必關心其由網絡卡晶片自動新增。目的地址和源地址是指網絡卡的實體地址,即MAC地址,具有唯一性。幀型別或協議型別是指資料包的高階協議,如 0x0806表示ARP協議,0x0800表示IP協議等。  

2、網路層IP頭

  0x45, 0x00, IPlenght_h, IPlenght_l,

  0x00, 0x00, 0x00, 0x00, 0x80, 0x11,

  IPchecksum4, IPchecksum5,

   IPsource_1, IPsource_2, IPsource_3, IPsource_4,IPdestination_1, IPdestination_2, IPdestination_3, IPdestination_4

  上面是一個簡單的ip頭的例子,下面一個個的來解釋啊!

  0x45,其中的高位0x4,表示的是版本號,ipv4的意思,而後面低位元組5表示的是指明IPv4協議包頭長度的位元組數包含多少個32位,這裡是5,也就是說協議頭是5*4=20個位元組的大小。

  0x00,定義IP封包在傳送過程中要求的服務型別,如果所有4bit均為0,那麼就意味著是一般服務,具體如下:

    ◆000..... (Routine): 過程欄位,佔3位。設定了資料包的重要性,取值越大資料越重要,取值範圍為:0(正常)~ 7(網路控制)

    ◆...0....(Delay):延遲欄位 ,佔1位,取值:0(正常)、1(期特低的延遲) 

    ◆....0...(Throughput):流量欄位,佔1位。取值:0(正常)、1(期特高的流量) 

    ◆.....0..(Reliability) :可靠性欄位,佔1位。取值:0(正常)、1(期特高的可靠性)

    ◆…..0.(ECN-Capable Transport):顯式擁塞指示傳輸欄位,佔1位。由源端設定,以顯示源端節點的傳輸協議是支援ECN(Explicit Cogestion Notifica tion,顯式擁塞指示)的。取值:0(不支援ECN)、1(支援ECN)

    ◆.......0(Congestion Experienced):擁塞預警欄位,佔1位。取值:0(正常,不擁塞)、1(擁塞)

  IPlenght_h, IPlenght_l,表示的是包總長度=IP頭長度+UDP頭長度+資料長度,最後講長度分為高8位和低8位。

  0x00, 0x00,是上面的標誌位,16個位元組。每一個IP封包都有一個16位的唯一識別碼。當程式產生的資料要通過網路傳送時都會被拆散成封包形式傳送,當封包要進行重組的時候這個ID就是依據了。

  0x00, 0x00這16位是由兩部分組成,包括3bit的標記位和13bit的分段偏移量。

    這是當封包在傳輸過程中進行最佳組合時使用的3個bit的識別記號。佔3位。

    ◆000(Reserved Fragment):保留分段。當此值為0的時候表示目前未被使用。

    ◆.0.(Don't Fragment):不分段。當此值為0的時候表示封包可以被分段,如果為1則不能被分割。 

    ◆..0( More Fragment):更多分段。當上一個值為0時,此值為0就示該封包是最後一個封包,如果為1則表示其後還有被分割的封包。

    IP協議頭格式規定當封包被分段之後,由於網路情況或其它因素影響其抵達順序不會和當初切割順序一至,所以當封包進行分段的時候會為各片段做好定位記錄,以便在重組的時候就能夠

    對號入座。值為多少個位元組,如果封包並沒有被分段,則FO值為“0"。 佔13位。 

  0x80表示生存時間。生存時間欄位設定了資料報可以經過的最多路由器數,表示資料包在網路上生存多久。TTL的初始值由源主機設定(通常為32或64),一旦經過一個處理它的路由器,它的值就減去1。當該欄位的值為0時,資料報就被丟棄,併發送ICMP訊息通知源主機。這樣當封包在傳遞過程中由於某些原因而未能抵達目的地的時候就可以避免其一直充斥在網路上面。佔8位。

  0x11表示的是傳輸層的協議。如下表所示:

  IPchecksum4, IPchecksum5這兩個是頭校驗和的高8位和低8位。

  指IPv4資料報包頭的校驗和。這個數值用來檢錯用的,用以確保封包被正確無誤的接收到。當封包開始進行傳送後,接收端主機會利用這個檢驗值會來檢驗餘下的封包,如果一切無誤就會發出確認資訊表示接收正常。與UDP和TCP協議包頭中的校驗和作用是一樣的。佔16位。

  首部檢驗和欄位是根據IP首部計算的檢驗和碼,不對首部後面的資料進行計算。ICMP、IGMP、UDP和TCP協議在它們各自的首部中均含有同時覆蓋首部和資料檢驗和碼。

  IP協議頭格式規定了:計算一份資料報的IP檢驗和,首先把檢驗和欄位置為0。然後,對首部中每個16位進行二進位制反碼求和(整個首部看成是由一串16位的字組成),結果存在檢驗和欄位中。當接收端收到一份IP資料報後,同樣對首部中每個16 位進行二進位制反碼的求和。由於接收方在計算過程中包含了傳送方存在首部中的檢驗和,因此,如果首部在傳輸過程中沒有發生任何差錯,那麼接收方計算的結果應該為全1。如果結果不是全1(即檢驗和錯誤),那麼IP就丟棄收到的資料報。但是不生成差錯訊息,由上層去發現丟失的資料報並進行重傳。

  ICMP、IGMP、UDP和TCP都採用相同的檢驗和演算法,儘管TCP和UDP除了本身的首部和資料外,在IP首部中還包含不同的欄位。由於路由器經常只修改TTL欄位(減1),因此當路由器轉發一份訊息時可以增加它的檢驗和,而不需要對IP整個首部進行重新計算。

   IPsource_1, IPsource_2, IPsource_3, IPsource_4,IPdestination_1, IPdestination_2, IPdestination_3, IPdestination_4這兩個就表示了源IP和目標IP。

3、UDP資料頭

0x04, 0x00,0x04, 0x00, lenght_h, lenght_l, 0x00, 0x00  

 

  0x04, 0x00表示的是UDP的源埠,這裡為1024;

  0x04, 0x00表示的是UDP的目標埠,這裡為1024;

  lenght_h, lenght_l,為整個資料包的長度,包括MAC頭+ip頭+UDP頭+校驗位。

  0x00, 0x00這些是UDP協議的選項和填充位。

  這兩個選項較少使用,只有某些特殊的封包需要特定的控制才會利用到。這些選項通常包括:

  ◆安全和處理限制:用於軍事領域

  ◆記錄路徑:讓每個路由器都記下它的IP地址

  ◆時間戳:讓每個路由器都記下它的IP地址和時間

  ◆寬鬆的源站選路:為資料報指定一系列必須經過的IP地址

  ◆嚴格的源站選路:與寬鬆的源站選路類似,但是要求只能經過指定的這些地址,不能經過其他的地址。

  以上這些選項很少被使用,而且並非所有的主機和路由器都支援這些選項。

 總結:

  上面是對一個UDP封裝資料的總結,便於以後更好的記憶。

 

http://www.cnblogs.com/yingfang18/archive/2010/11/29/1890831.html