TCP/IP協(xié)議是一個比較復(fù)雜的協(xié)議集,,有很多專業(yè)書籍介紹,。在此,我僅介紹其與編程密切相關(guān)的部分:以太網(wǎng)上TCP/IP協(xié)議的分層結(jié)構(gòu)及其報文格式,。我們知道TCP/IP協(xié)議采用分層結(jié)構(gòu),,其分層模型及協(xié)議如下表:
協(xié)議采用分層結(jié)構(gòu),,因此,,數(shù)據(jù)報文也采用分層封裝的方法。下面以應(yīng)用最廣泛的以太網(wǎng)為例說明其數(shù)據(jù)報文分層封裝,,如下圖所示: 任何通訊協(xié)議都有獨特的報文格式,,TCP/IP協(xié)議也不例外。對于通訊協(xié)議編程,,我們首先要清楚其報文格式。由于TCP/IP協(xié)議采用分層模型,,各層都有專用的報頭,,以下就簡單介紹以太網(wǎng)下TCP/IP各層報文格式。 以太網(wǎng)幀格式如下圖: 8字節(jié)的前導(dǎo)用于幀同步,CRC域用于幀校驗,。這些用戶不必關(guān)心其由網(wǎng)卡芯片自動添加,。目的地址和源地址是指網(wǎng)卡的物理地址,即MAC地址,,具有唯一性,。幀類型或協(xié)議類型是指數(shù)據(jù)包的高級協(xié)議,如 0x0806表示ARP協(xié)議,,0x0800表示IP協(xié)議等,。 ARP/RARP(地址解析/反向地址解析)報文格式如下圖: “硬件類型”域指發(fā)送者本機(jī)網(wǎng)絡(luò)接口類型(值“1”代表以太網(wǎng))。“協(xié)議類型”域指發(fā)送者所提供/請求的高級協(xié)議地址類型(“0x0800”代表IP協(xié)議),。“操作”域指出本報文的類型(“1”為ARP請求,,“2”為ARP響應(yīng),“3”為RARP請求,,“4”為RARP響應(yīng)),。 IP數(shù)據(jù)報頭格式如下圖: 我們用單片機(jī)實現(xiàn)TCP/IP協(xié)議要作一些簡化,不考慮數(shù)據(jù)分片和優(yōu)先權(quán),。因此,,在此我們不討論服務(wù)類型和標(biāo)志偏移域,只需填“0” 即可,。協(xié)議“版本”為4,,“頭長度”單位為32Bit,“總長度”以字節(jié)為單位,,表示整個IP數(shù)據(jù)報長度,。“標(biāo)識”是數(shù)據(jù)包的ID號,用于識別不同的IP數(shù)據(jù)包,。“生存時間” TTL是個數(shù)量及的概念,,防止無用數(shù)據(jù)包一直存在網(wǎng)絡(luò)中。一般每經(jīng)過路由器時減一,,因此通過TTL 可以算出數(shù)據(jù)包到達(dá)目的地所經(jīng)過的路由器個數(shù),。“協(xié)議”域表示創(chuàng)建該數(shù)據(jù)包的高級協(xié)議類型。如 1表示ICMP協(xié)議,,6表示TCP協(xié)議,,17表示 UDP協(xié)議等。IP數(shù)據(jù)包為簡化數(shù)據(jù)轉(zhuǎn)發(fā)時間,,僅采用頭校驗的方法,,數(shù)據(jù)正確性由高層協(xié)議保證。 ICMP(網(wǎng)間網(wǎng)控制報文協(xié)議)協(xié)議應(yīng)用廣泛,。在此僅給出最常見的回應(yīng)請求與應(yīng)答報文格式,,用戶命令ping便是利用此報文來測試信宿機(jī)的可到達(dá)性,。報文格式如下圖所示: 類型0 為回應(yīng)應(yīng)答報文,8 為回應(yīng)請求報文,。整個數(shù)據(jù)包均參與檢驗,。注意ICMP封裝在IP數(shù)據(jù)包里傳送。 UDP報文格式如下圖: TCP報文格式如下圖: TCP 是面向連接的可靠數(shù)據(jù)傳輸協(xié)議,,因此比較復(fù)雜,,在此僅作簡單介紹。“序號”指數(shù)據(jù)在發(fā)送端數(shù)據(jù)流中的位置,。“確認(rèn)號”指出本機(jī)希望下一個接收的字節(jié)的序號,。與IP校驗不同的是TCP,UDP校驗采用偽頭標(biāo)加整個報文一同校驗的方法,。TCP協(xié)議工作原理另行介紹,。 |
|