LwIP之网络技术基础
一、協(xié)議模型
TCP/IP協(xié)議模型(Transmission Control Protocol/Internet Protocol),包含了一系列構(gòu)成互聯(lián)網(wǎng)基礎(chǔ)的網(wǎng)絡(luò)協(xié)議,是Internet的核心協(xié)議,通過(guò)20多年的發(fā)展已日漸成熟,并被廣泛應(yīng)用于局域網(wǎng)和廣域網(wǎng)中,目前已成為事實(shí)上的國(guó)際標(biāo)準(zhǔn)。TCP/IP協(xié)議簇是一組不同層次上的多個(gè)協(xié)議的組合,通常被認(rèn)為是一個(gè)四層協(xié)議系統(tǒng),與OSI的七層模型相對(duì)應(yīng)。
? ? ? ? ? ? ? ? ??
- 鏈路層
用來(lái)處理連接網(wǎng)絡(luò)的硬件部分。包括控制操作系統(tǒng)、硬件的設(shè)備驅(qū)動(dòng)、網(wǎng)卡,及光纖等物理可見(jiàn)部分。
- 網(wǎng)絡(luò)層
用來(lái)規(guī)定通過(guò)怎樣的路徑把數(shù)據(jù)包傳送給對(duì)方計(jì)算機(jī)。
- 傳輸層
主要為兩臺(tái)主機(jī)上的應(yīng)用程序提供端到端的通信。
- 應(yīng)用層
應(yīng)用層負(fù)責(zé)處理特定的應(yīng)用程序細(xì)節(jié)。?
?
二、各層協(xié)議
?各種協(xié)議在TCP/IP協(xié)議模型中所處的層次如下:
? ? ? ? ? ? ? ? ? ? ? ? ?? ?
ARP:通過(guò)IP地址獲取MAC地址。
RARP:通過(guò)MAC地址獲取IP地址。
IP:盡快將數(shù)據(jù)包從一個(gè)主機(jī)傳送到另一個(gè)主機(jī),不保證可靠性。
ICMP:IP層用它來(lái)與其他主機(jī)或路由器交換錯(cuò)誤報(bào)文和其他重要信息。
IGMP:Internet組管理協(xié)議,用來(lái)把UDP數(shù)據(jù)報(bào)多播到多個(gè)主機(jī)。
UDP:簡(jiǎn)單地將數(shù)據(jù)包從一個(gè)應(yīng)用程序發(fā)送到另一個(gè)應(yīng)用程序,不保證可靠性。
TCP:提供一個(gè)應(yīng)用程序到另一個(gè)應(yīng)用程序的可靠傳輸。
?
三、IP地址及分類
互聯(lián)網(wǎng)中采用一套獨(dú)立的編址技術(shù),使任何主機(jī)的編址不受其物理環(huán)境的影響。設(shè)計(jì)人員為每一臺(tái)主機(jī)分配了一個(gè)唯一的32bit整數(shù)地址,稱之為IP地址。
目前IP地址采用了分類的概念,把所有地址劃分為A、B、C、D、E五類。
? ? ? ? ? ? ? ? ? ? ? ? ??
其中,有一些特殊用途的IP地址
環(huán)回地址:127.x.x.x,通常使用127.0.0.1。
網(wǎng)絡(luò)地址:主機(jī)號(hào)全0的地址,如85.0.0.0、134.89.0.0、213.89.89.0等。
直接廣播地址:用于向所在網(wǎng)絡(luò)廣播消息。主機(jī)號(hào)全1的地址,如85.255.255.255、134.89.255.255、213.89.89.255等。
受限廣播地址:255.255.255.255,用于向本地網(wǎng)絡(luò)廣播消息。
不確定IP地址:0.0.0.0,表示整個(gè)網(wǎng)絡(luò)
錯(cuò)誤地址:169.254.x.x,DHCP分配失敗時(shí)系統(tǒng)自動(dòng)分配。
本網(wǎng)絡(luò)特定主機(jī)地址:網(wǎng)絡(luò)號(hào)全0的地址,如0.x.x.x、0.0.x.x、0.0.0.x。
/* 不確定IP地址(表示本機(jī)所有網(wǎng)絡(luò)接口IP地址)指針 */ #define IP_ADDR_ANY ((struct ip_addr *)&ip_addr_any) /* 廣播IP地址指針 */ #define IP_ADDR_BROADCAST ((struct ip_addr *)&ip_addr_broadcast)/* A類地址 */ #define IN_CLASSA(a) ((((u32_t)(a)) & 0x80000000UL) == 0) //是否為A類地址 #define IN_CLASSA_NET 0xff000000 //A類網(wǎng)絡(luò)地址掩碼 #define IN_CLASSA_NSHIFT 24 //A類網(wǎng)絡(luò)地址偏移量 #define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET) //A類主機(jī)地址掩碼 #define IN_CLASSA_MAX 128 //A類網(wǎng)絡(luò)地址最大數(shù)/* B類地址 */ #define IN_CLASSB(a) ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL) //是否為B類地址 #define IN_CLASSB_NET 0xffff0000 //B類網(wǎng)絡(luò)地址掩碼 #define IN_CLASSB_NSHIFT 16 //B類網(wǎng)絡(luò)地址偏移量 #define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) //B類主機(jī)地址掩碼 #define IN_CLASSB_MAX 65536 //B類網(wǎng)絡(luò)地址最大數(shù)/* C類地址 */ #define IN_CLASSC(a) ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL) //是否為C類地址 #define IN_CLASSC_NET 0xffffff00 //C類網(wǎng)絡(luò)地址掩碼 #define IN_CLASSC_NSHIFT 8 //C類網(wǎng)絡(luò)地址偏移量 #define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) //C類主機(jī)地址掩碼/* D類地址(組播) */ #define IN_CLASSD(a) (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL) //是否為D類地址 #define IN_CLASSD_NET 0xf0000000 //D類網(wǎng)絡(luò)地址掩碼 #define IN_CLASSD_NSHIFT 28 //D類網(wǎng)絡(luò)地址偏移量(高4位1110) #define IN_CLASSD_HOST 0x0fffffff //D類主機(jī)地址掩碼 #define IN_MULTICAST(a) IN_CLASSD(a) //是否為組播地址/* 保留未用地址 */ #define IN_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) //是否為保留未用地址 /* 廣播地址 */ #define IN_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) //是否為廣播地址?
四、子網(wǎng)劃分與子網(wǎng)掩碼
標(biāo)準(zhǔn)IP地址使用網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)兩層地址結(jié)構(gòu),當(dāng)大量個(gè)人用戶和小型局域網(wǎng)用戶接入互聯(lián)網(wǎng),即使為其分配一個(gè)C類網(wǎng)絡(luò)也會(huì)造成IP地址的大量浪費(fèi)。隨著互聯(lián)網(wǎng)用戶的劇烈增長(zhǎng),IP地址的分配變得格外緊張,為每個(gè)物理網(wǎng)絡(luò)分配一個(gè)網(wǎng)絡(luò)號(hào)的做法變得很不現(xiàn)實(shí)。
因此,通過(guò)子網(wǎng)掩碼的方式將網(wǎng)絡(luò)進(jìn)一步劃分為多個(gè)子網(wǎng),將原來(lái)的二級(jí)結(jié)構(gòu)變?yōu)槿?jí)結(jié)構(gòu)。如果按照下面的方式進(jìn)行劃分一個(gè)B類網(wǎng)絡(luò)來(lái),則可以在整個(gè)網(wǎng)絡(luò)中劃分出254個(gè)子網(wǎng),每個(gè)子網(wǎng)可以有254臺(tái)主機(jī)。這樣做可以大大減少標(biāo)準(zhǔn)IP編址中地址浪費(fèi)現(xiàn)象。
? ? ? ? ? ?
網(wǎng)掩和IP地址一樣是一個(gè)32位數(shù),其對(duì)應(yīng)網(wǎng)絡(luò)地址(包括網(wǎng)絡(luò)號(hào)和子網(wǎng)號(hào))的所有位置都為1,對(duì)應(yīng)于主機(jī)地址的所有位置都為。按照上圖這種方式劃分一個(gè)B類網(wǎng)絡(luò)時(shí),子網(wǎng)掩碼為255.255.255.0。
對(duì)于一個(gè)主機(jī)或者路由器,當(dāng)接收到一個(gè)數(shù)據(jù)包時(shí)2。若要判斷發(fā)送數(shù)據(jù)的源主機(jī)和自己是否在同一網(wǎng)絡(luò)時(shí),可以將源IP地址和子網(wǎng)掩碼進(jìn)行與運(yùn)算,得到源主機(jī)網(wǎng)絡(luò)地址,并同樣的方式得到自己的網(wǎng)絡(luò)地址,然后進(jìn)行比較。
/* 判斷網(wǎng)段是否相同 */ #define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \(mask)->addr) == \((addr2)->addr & \(mask)->addr))?使用了子網(wǎng)掩碼之后,各個(gè)子網(wǎng)也同樣存在廣播地址。下面這段代碼用于判斷IP地址是否為廣播地址
/* 判斷IP地址是不是廣播地址 */ u8_t ip_addr_isbroadcast(struct ip_addr *addr, struct netif *netif) {u32_t addr2test;addr2test = addr->addr;/* 全0或全1 */if ((~addr2test == IP_ADDR_ANY_VALUE) || (addr2test == IP_ADDR_ANY_VALUE))return 1;/* 網(wǎng)絡(luò)接口不支持廣播 */else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0)return 0;/* 本機(jī)地址 */else if (addr2test == netif->ip_addr.addr)return 0;/* 子網(wǎng)廣播 */else if (ip_addr_netcmp(addr, &(netif->ip_addr), &(netif->netmask)) && ((addr2test & ~netif->netmask.addr) == (IP_ADDR_BROADCAST_VALUE & ~netif->netmask.addr)))return 1;elsereturn 0; }?
五、NAT轉(zhuǎn)換協(xié)議
隨著互聯(lián)網(wǎng)的發(fā)送,IP地址短缺現(xiàn)象越來(lái)越嚴(yán)重,即使是擁有幾百臺(tái)的大型企業(yè),也很難申請(qǐng)到幾個(gè)IP地址。為了解決這個(gè)問(wèn)題,產(chǎn)生了局域網(wǎng)技術(shù)。對(duì)于局域網(wǎng)外部來(lái)說(shuō),所有主機(jī)公用一個(gè)合法IP地址。但是在局域網(wǎng)內(nèi)部,用戶使用專用IP進(jìn)行相互通信。
NAT協(xié)議的功能簡(jiǎn)單來(lái)說(shuō):數(shù)據(jù)發(fā)送到外部時(shí),將局域網(wǎng)內(nèi)部主機(jī)的IP地址轉(zhuǎn)換成一個(gè)外部公用的IP地址;數(shù)據(jù)從外部接收時(shí),將外部公用的IP地址轉(zhuǎn)換成局域網(wǎng)內(nèi)部主機(jī)的IP地址。
NAT最常見(jiàn)的實(shí)現(xiàn)方式是端口多路復(fù)用,它基于TCP或UDP協(xié)議端口號(hào)以及IP地址來(lái)實(shí)現(xiàn)。
?
例如:某公司IP地址為222.178.197.21,局域網(wǎng)內(nèi)部某主機(jī)IP地址為192.168.1.178,該主機(jī)正在使用TCP協(xié)議與某外部服務(wù)器進(jìn)行通信,該外部主機(jī)IP地址為130.21.45.20。TCP雙方,內(nèi)部主機(jī)TCP端口號(hào)為1234,外部主機(jī)TCP端口號(hào)為80。
具有NAT功能的路由器會(huì)在內(nèi)部維護(hù)一個(gè)NAT轉(zhuǎn)換表,當(dāng)路由器收到該分組時(shí),會(huì)在表中為連接(192.168.1.78:1234,130.21.45.20:80)分配一個(gè)路由器內(nèi)部的端口,假設(shè)為5678。數(shù)據(jù)發(fā)送到外部時(shí),路由器會(huì)將數(shù)據(jù)包中的源IP和端口號(hào),由192.168.1.78:1234改為222.178.197.21:5678;數(shù)據(jù)從外部接收時(shí),路由器會(huì)將數(shù)據(jù)包中的目的IP和端口號(hào),由222.178.197.21:5678改為192.168.1.78:1234。
這樣經(jīng)過(guò)兩次NAT轉(zhuǎn)換,局域網(wǎng)用戶就實(shí)現(xiàn)了與外部網(wǎng)絡(luò)的數(shù)據(jù)交互。
?
六、數(shù)據(jù)包格式
Ethernet II幀格式
? ? 前導(dǎo)碼:由8個(gè)8‘b10101010構(gòu)成。
? ? 以太網(wǎng)首部目的地址:目的設(shè)備的MAC物理地址。
? ? 源地址:發(fā)送設(shè)備的MAC物理地址。
? ? 類型:0x0800為IP協(xié)議包,0x0806為ARP協(xié)議包。
? ? 數(shù)據(jù):數(shù)據(jù)長(zhǎng)度最小為46字節(jié),不足46字節(jié)時(shí),填充至46字節(jié)。
? ? FCS: 就是CRC校驗(yàn)值
?
其中,目的地址、源地址和類型,共同組成以太網(wǎng)首部
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
IP數(shù)據(jù)包和ARP數(shù)據(jù)包格式分別如下:
?
?
TCP數(shù)據(jù)幀封裝過(guò)程舉例:
? ? ? ? ? ? ?
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的LwIP之网络技术基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux服务器程序开发,怎样搭建一个l
- 下一篇: STM32之RTT调试