(原創(chuàng))如何利用UDP協(xié)議封裝一個數(shù)據(jù)包
作者:yingfang18 | 出處:博客園 |
2011/10/27 5:35:34 | 閱讀13次
在如何封裝一個數(shù)據(jù)包上,是一個非常細致的問題,而利用UDP協(xié)議來封裝的話,是比較簡單,讓我們一步步來分析典型的TCP/IP協(xié)議。一般來說一個典型的一個數(shù)據(jù)包,包括以太網(wǎng)MAC頭+網(wǎng)絡(luò)層IP數(shù)據(jù)頭+傳輸層UDP頭+要傳輸?shù)臄?shù)據(jù)。讓我們一層層來看看這些數(shù)據(jù)頭是如何構(gòu)成的。
1、以太網(wǎng)MAC頭一般情況下,以太網(wǎng)MAC頭由14個字節(jié)構(gòu)成,12個自己的MAC地址+上層協(xié)議的標識符。舉個例子 如果你要發(fā)送的目標MAC位00:1d:09:10:d1:9c,而你的MAC地址為01:60:6e:11:02:0f,上層一般都是網(wǎng)絡(luò)層,即為IP層,IP層的標識符為0x8000,那么你的以太網(wǎng)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字節(jié)的前導用于幀同步,CRC域用于幀校驗。這些用戶不必關(guān)心其由網(wǎng)卡芯片自動添加。目的地址和源地址是指網(wǎng)卡的物理地址,即MAC地址,具有唯一性。幀類型或協(xié)議類型是指數(shù)據(jù)包的高級協(xié)議,如 0x0806表示ARP協(xié)議,0x0800表示IP協(xié)議等?! ?/p> 2、網(wǎng)絡(luò)層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的意思,而后面低字節(jié)5表示的是指明IPv4協(xié)議包頭長度的字節(jié)數(shù)包含多少個32位,這里是5,也就是說協(xié)議頭是5*4=20個字節(jié)的大小。 0x00,定義IP封包在傳送過程中要求的服務(wù)類型,如果所有4bit均為0,那么就意味著是一般服務(wù),具體如下: ◆000..... (Routine): 過程字段,占3位?設(shè)置了數(shù)據(jù)包的重要性,取值越大數(shù)據(jù)越重要,取值范圍為:0(正常)~ 7(網(wǎng)絡(luò)控制) ◆...0....(Delay):延遲字段 ,占1位,取值:0(正常)?1(期特低的延遲) ◆....0...(Throughput):流量字段,占1位?取值:0(正常)?1(期特高的流量) ◆.....0..(Reliability) :可靠性字段,占1位?取值:0(正常)?1(期特高的可靠性) ◆…..0.(ECN-Capable Transport):顯式擁塞指示傳輸字段,占1位?由源端設(shè)置,以顯示源端節(jié)點的傳輸協(xié)議是支持ECN(Explicit Cogestion Notifica tion,顯式擁塞指示)的?取值:0(不支持ECN)?1(支持ECN) ◆.......0(Congestion Experienced):擁塞預警字段,占1位?取值:0(正常,不擁塞)?1(擁塞) IPlenght_h, IPlenght_l,表示的是包總長度=IP頭長度+UDP頭長度+數(shù)據(jù)長度,最后講長度分為高8位和低8位。 0x00, 0x00,是上面的標志位,16個字節(jié)。每一個IP封包都有一個16位的唯一識別碼?當程序產(chǎn)生的數(shù)據(jù)要通過網(wǎng)絡(luò)傳送時都會被拆散成封包形式發(fā)送,當封包要進行重組的時候這個ID就是依據(jù)了。 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協(xié)議頭格式規(guī)定當封包被分段之后,由于網(wǎng)路情況或其它因素影響其抵達順序不會和當初切割順序一至,所以當封包進行分段的時候會為各片段做好定位記錄,以便在重組的時候就能夠 對號入座?值為多少個字節(jié),如果封包并沒有被分段,則FO值為“0"? 占13位? 0x80表示生存時間。生存時間字段設(shè)置了數(shù)據(jù)報可以經(jīng)過的最多路由器數(shù),表示數(shù)據(jù)包在網(wǎng)絡(luò)上生存多久?TTL的初始值由源主機設(shè)置(通常為32或64),一旦經(jīng)過一個處理它的路由器,它的值就減去1?當該字段的值為0時,數(shù)據(jù)報就被丟棄,并發(fā)送ICMP消息通知源主機?這樣當封包在傳遞過程中由於某些原因而未能抵達目的地的時候就可以避免其一直充斥在網(wǎng)路上面?占8位? 0x11表示的是傳輸層的協(xié)議。如下表所示: IPchecksum4, IPchecksum5這兩個是頭校驗和的高8位和低8位。 指IPv4數(shù)據(jù)報包頭的校驗和?這個數(shù)值用來檢錯用的,用以確保封包被正確無誤的接收到?當封包開始進行傳送后,接收端主機會利用這個檢驗值會來檢驗余下的封包,如果一切無誤就會發(fā)出確認信息表示接收正常?與UDP和TCP協(xié)議包頭中的校驗和作用是一樣的?占16位? 首部檢驗和字段是根據(jù)IP首部計算的檢驗和碼,不對首部后面的數(shù)據(jù)進行計算?ICMP?IGMP?UDP和TCP協(xié)議在它們各自的首部中均含有同時覆蓋首部和數(shù)據(jù)檢驗和碼? IP協(xié)議頭格式規(guī)定了:計算一份數(shù)據(jù)報的IP檢驗和,首先把檢驗和字段置為0?然后,對首部中每個16位進行二進制反碼求和(整個首部看成是由 一串16位的字組成),結(jié)果存在檢驗和字段中?當接收端收到一份IP數(shù)據(jù)報后,同樣對首部中每個16 位進行二進制反碼的求和?由于接收方在計算過程中包含了發(fā)送方存在首部中的檢驗和,因此,如果首部在傳輸過程中沒有發(fā)生任何差錯,那么接收方計算的結(jié)果應(yīng)該為全1?如果結(jié)果不是全1(即檢驗和錯誤),那么IP就丟棄收到的數(shù)據(jù)報?但是不生成差錯消息,由上層去發(fā)現(xiàn)丟失的數(shù)據(jù)報并進行重傳? ICMP?IGMP?UDP和TCP都采用相同的檢驗和算法,盡管TCP和UDP除了本身的首部和數(shù)據(jù)外,在IP首部中還包含不同的字段?由于路由器經(jīng)常只修改TTL字段(減1),因此當路由器轉(zhuǎn)發(fā)一份消息時可以增加它的檢驗和,而不需要對IP整個首部進行重新計算? IPsource_1, IPsource_2, IPsource_3, IPsource_4,IPdestination_1, IPdestination_2, IPdestination_3, IPdestination_4這兩個就表示了源IP和目標IP。 3、UDP數(shù)據(jù)頭0x04, 0x00,0x04, 0x00, lenght_h, lenght_l, 0x00, 0x00
0x04, 0x00表示的是UDP的源端口,這里為1024; 0x04, 0x00表示的是UDP的目標端口,這里為1024; lenght_h, lenght_l,為整個數(shù)據(jù)包的長度,包括MAC頭+ip頭+UDP頭+校驗位。 0x00, 0x00這些是UDP協(xié)議的選項和填充位。 這兩個選項較少使用,只有某些特殊的封包需要特定的控制才會利用到?這些選項通常包括: ◆安全和處理限制:用于軍事領(lǐng)域 ◆記錄路徑:讓每個路由器都記下它的IP地址 ◆時間戳:讓每個路由器都記下它的IP地址和時間 ◆寬松的源站選路:為數(shù)據(jù)報指定一系列必須經(jīng)過的IP地址 ◆嚴格的源站選路:與寬松的源站選路類似,但是要求只能經(jīng)過指定的這些地址,不能經(jīng)過其他的地址? 以上這些選項很少被使用,而且并非所有的主機和路由器都支持這些選項? 總結(jié):上面是對一個UDP封裝數(shù)據(jù)的總結(jié),便于以后更好的記憶。 |
|
來自: 網(wǎng)文收集 > 《我的圖書館》