應(yīng) 用 層 (Application) | HTTP、Telnet、FTP、SMTP、SNMP |
傳 輸 層 (Transport) | TCP、UDP |
網(wǎng) 間 網(wǎng)層 (Internet) | IP【ARP、RARP、ICMP】 |
網(wǎng)絡(luò)接口層 (Network) | Ethernet、X.25、SLIP、PPP |
協(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ā)送者本機網(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ù)報頭格式如下圖:
我們用單片機實現(xiàn)TCP/IP協(xié)議要作一些簡化,不考慮數(shù)據(jù)分片和優(yōu)先權(quán)。因此,在此我們不討論服務(wù)類型和標志偏移域,只需填“0” 即可。協(xié)議“版本”為4,“頭長度”單位為32Bit,“總長度”以字節(jié)為單位,表示整個IP數(shù)據(jù)報長度。“標識”是數(shù)據(jù)包的ID號,用于識別不同的IP數(shù)據(jù)包。“生存時間” TTL是個數(shù)量及的概念,防止無用數(shù)據(jù)包一直存在網(wǎng)絡(luò)中。一般每經(jīng)過路由器時減一,因此通過TTL 可以算出數(shù)據(jù)包到達目的地所經(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便是利用此報文來測試信宿機的可到達性。報文格式如下圖所示:
類型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ù)流中的位置。“確認號”指出本機希望下一個接收的字節(jié)的序號。與IP校驗不同的是TCP,UDP校驗采用偽頭標加整個報文一同校驗的方法。TCP協(xié)議工作原理另行介紹。