資源描述:
《第10章 嵌入式Linux網(wǎng)絡(luò)編程》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、本章的要求第10章、嵌入式Linux網(wǎng)絡(luò)編程掌握TCP/IP協(xié)議的基礎(chǔ)知識(shí)掌握嵌入式Linux基礎(chǔ)網(wǎng)絡(luò)編程掌握嵌入式Linux高級(jí)網(wǎng)絡(luò)編程分析理解Ping源代碼能夠獨(dú)立編寫客戶端、服務(wù)器端的通信程序能夠獨(dú)立編寫NTP協(xié)議實(shí)現(xiàn)程序本章的主要內(nèi)容10.1TCP/IP協(xié)議概述10.2網(wǎng)絡(luò)基礎(chǔ)編程10.3網(wǎng)絡(luò)高級(jí)編程10.4ping源碼分析10.5實(shí)驗(yàn)內(nèi)容——NTP協(xié)議實(shí)現(xiàn)10.1TCP/IP協(xié)議概述OSI參考模型及TCP/IP參考模型TCP三次握手和TCP數(shù)據(jù)包頭格式為應(yīng)用程序提供可靠的通信連接。適合
2、于一次傳輸大批數(shù)據(jù)的情況。并適用于要求得到響應(yīng)的應(yīng)用程序。UDPUDP即用戶數(shù)據(jù)報(bào)協(xié)議,它是一種無連接協(xié)議,因此不需要像TCP那樣通過三次握手來建立一個(gè)連接。同時(shí),一個(gè)UDP應(yīng)用可同時(shí)作為應(yīng)用的客戶或服務(wù)器方。由于UDP協(xié)議并不需要建立一個(gè)明確的連接,因此建立UDP應(yīng)用要比建立TCP應(yīng)用簡(jiǎn)單得多。它比TCP協(xié)議更為高效,也能更好地解決實(shí)時(shí)性的問題。如今,包括網(wǎng)絡(luò)視頻會(huì)議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都使用UDP協(xié)議。協(xié)議的選擇(1)對(duì)數(shù)據(jù)可靠性的要求對(duì)數(shù)據(jù)要求高可靠性的應(yīng)用需選擇TC
3、P協(xié)議,如驗(yàn)證、密碼字段的傳送都是不允許出錯(cuò)的,而對(duì)數(shù)據(jù)的可靠性要求不那么高的應(yīng)用可選擇UDP傳送。(2)應(yīng)用的實(shí)時(shí)性TCP協(xié)議在傳送過程中要使用三次握手、重傳確認(rèn)等手段來保證數(shù)據(jù)傳輸?shù)目煽啃?。使用TCP協(xié)議會(huì)有較大的時(shí)延,因此不適合對(duì)實(shí)時(shí)性要求較高的應(yīng)用,如VOIP、視頻監(jiān)控等。相反,UDP協(xié)議則在這些應(yīng)用中能發(fā)揮很好的作用。(3)網(wǎng)絡(luò)的可靠性由于TCP協(xié)議的提出主要是解決網(wǎng)絡(luò)的可靠性問題,它通過各種機(jī)制來減少錯(cuò)誤發(fā)生的概率。因此,在網(wǎng)絡(luò)狀況不是很好的情況下需選用TCP協(xié)議(如在廣域網(wǎng)等情況)
4、,但是若在網(wǎng)絡(luò)狀況很好的情況下(如局域網(wǎng)等)就不需要再采用TCP協(xié)議,而建議選擇UDP協(xié)議來減少網(wǎng)絡(luò)負(fù)荷。10.2網(wǎng)絡(luò)基礎(chǔ)編程socket概念在Linux中的網(wǎng)絡(luò)編程是通過socket接口來進(jìn)行的。socket是一種特殊的I/O接口,它也是一種文件描述符。它是一種常用的進(jìn)程之間通信機(jī)制,通過它不僅能實(shí)現(xiàn)本地機(jī)器上的進(jìn)程之間的通信,而且通過網(wǎng)絡(luò)能夠在不同機(jī)器上的進(jìn)程之間進(jìn)行通信。每一個(gè)socket都用一個(gè)半相關(guān)描述{協(xié)議、本地地址、本地端口}來表示;一個(gè)完整的套接字則用一個(gè)相關(guān)描述{協(xié)議、本地地址
5、、本地端口、遠(yuǎn)程地址、遠(yuǎn)程端口}來表示。socket也有一個(gè)類似于打開文件的函數(shù)調(diào)用,該函數(shù)返回一個(gè)整型的socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^socket來實(shí)現(xiàn)的。socket類型(1)流式socket(SOCK_STREAM)流式套接字提供可靠的、面向連接的通信流;它使用TCP協(xié)議,從而保證了數(shù)據(jù)傳輸?shù)恼_性和順序性。(2)數(shù)據(jù)報(bào)socket(SOCK_DGRAM)數(shù)據(jù)報(bào)套接字定義了一種無連接的服務(wù),數(shù)據(jù)通過相互獨(dú)立的報(bào)文進(jìn)行傳輸,是無序的,并且不保證是可靠、無差錯(cuò)的。它
6、使用數(shù)據(jù)報(bào)協(xié)議UDP。(3)原始socket原始套接字允許對(duì)底層協(xié)議如IP或ICMP進(jìn)行直接訪問,它功能強(qiáng)大但使用較為不便,主要用于一些協(xié)議的開發(fā)。socket信息數(shù)據(jù)結(jié)構(gòu)structsockaddr{unsignedshortsa_family;/*地址族*/charsa_data[14];/*14字節(jié)的協(xié)議地址,包含該socket的IP地址和端口號(hào)。*/};structsockaddr_in{shortintsa_family;/*地址族*/unsignedshortintsin_port;
7、/*端口號(hào)*/structin_addrsin_addr;/*IP地址*/unsignedcharsin_zero[8];/*填充0以保持與structsockaddr同樣大小*/};數(shù)據(jù)存儲(chǔ)優(yōu)先順序的轉(zhuǎn)換計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先(稱為大端模式)和低位字節(jié)優(yōu)先(稱為小端模式)。Internet上數(shù)據(jù)以高位字節(jié)優(yōu)先順序在網(wǎng)絡(luò)上傳輸,因此在有些情況下,需要對(duì)這兩個(gè)字節(jié)存儲(chǔ)優(yōu)先順序進(jìn)行相互轉(zhuǎn)化。這里用到了四個(gè)函數(shù):htons()、ntohs()、htonl()和ntohl()。這
8、四個(gè)地址分別實(shí)現(xiàn)網(wǎng)絡(luò)字節(jié)序和主機(jī)字節(jié)序的轉(zhuǎn)化,這里的h代表host,n代表network,s代表short,l代表long。通常16位的IP端口號(hào)用s代表,而IP地址用l來代表。地址格式轉(zhuǎn)化(1)通常用戶在表達(dá)地址時(shí)采用的是點(diǎn)分十進(jìn)制表示的數(shù)值(或者是以冒號(hào)分開的十進(jìn)制IPv6地址),而在通常使用的socket編程中所使用的則是二進(jìn)制值,這就需要將這兩個(gè)數(shù)值進(jìn)行轉(zhuǎn)換。這里在IPv4中用到的函數(shù)有inet_aton()、inet_addr()和inet_ntoa(),而IPv4和IPv6兼容的函數(shù)