在如何封裝一個數據包上,是一個非常細致的問題,而利用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