




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
在線教務輔導網:://教材其余課件及動畫素材請查閱在線教務輔導網QQ:349134187
或者直接輸入下面地址:嵌入式應用程序設計
第七章嵌入式Linux網絡編程
7.1TCP/IP概述7.2網絡編程基礎知識7.3網絡高級編程7.4Web服務器7.5 實驗內容7.6小結7.7思考與練習本章課程:37.1TCP/IP概述7.1.1TCP/IP的分層模型7.1.2TCP/IP的分層模型特點7.1.3TCP/IP核心協議47.1.1TCP/IP的分層模型OSI協議參考模型,它是基于國際標準化組織(ISO)的建議發展起來的,它分為7個層次:應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層及物理層。這個7層的協議模型雖然規定得非常細致和完善,但在實際中卻得不到廣泛的應用,其重要的原因之一就在于它過于復雜。但它仍是此后很多協議模型的基礎。與此相區別的TCP/IP協議模型將OSI的7層協議模型簡化為4層,從而更有利于實現和使用。57.1.1TCP/IP的分層模型TCP/IP的協議參考模型和OSI協議參考模型的對應關系如下圖:67.1.1TCP/IP的分層模型網絡接口層(NetworkInterfaceLayer) 網絡接口層是TCP/IP協議軟件的最底層,負責將二進制流轉換為數據幀,并進行數據幀的發送和接收。數據幀是網絡傳輸的基本單元。網絡層(InternetLayer) 網絡層負責在主機之間的通信中選擇數據報的傳輸路徑,即路由。當網絡層接收到傳輸層的請求后,傳輸某個具有目的地址信息的分組。該層把分組封裝在IP數據報中,填入數據報的首部,使用路由算法來確定是直接交付數據報,還是把它傳遞給路由器,然后把數據報交給適當的網絡接口進行傳輸。 網絡層還要負責處理傳入的數據報,檢驗其有效性,使用路由算法來決定應該對數據報進行本地處理還是應該轉發。 如果數據報的目的機處于本機所在的網絡,該層軟件就會除去數據報的首部,再選擇適當的運輸層協議來處理這個分組。最后,網絡層還要根據需要發出和接收ICMP(Internet控制報文協議)差錯和控制報文。77.1.1TCP/IP的分層模型傳輸層(TransportLayer) 傳輸層負責提供應用程序之間的通信服務。這種通信又稱為端到端通信。傳輸層要系統地管理信息的流動,還要提供可靠的傳輸服務,以確保數據到達無差錯、無亂序。為了達到這個目的,傳輸層協議軟件要進行協商,讓接收方回送確認信息及讓發送方重發丟失的分組。傳輸層協議軟件把要傳輸的數據流劃分為分組,把每個分組連同目的地址交給網絡層去發送。應用層(ApplicationLayer) 應用層是分層模型的最高層,在這個最高層中,用戶調用應用程序通過TCP/IP互聯網來訪問可行的服務。與各個傳輸層協議交互的應用程序負責接收和發送數據。每個應用程序選擇適當的傳輸服務類型,把數據按照傳輸層的格式要求封裝好向下層傳輸。87.1.2TCP/IP的分層模型特點TCP/IP模型邊界特性TCP/IP分層模型中有兩大邊界特性:一個是地址邊界特性,它將IP邏輯地址與底層網絡的硬件地址分開;一個是操作系統邊界特性,它將網絡應用與協議軟件分開。97.1.2TCP/IP的分層模型特點IP層特性IP層作為通信子網的最高層,提供無連接的數據報傳輸機制,但IP協議并不能保證IP報文傳遞的可靠性,IP的機制是點到點的。用IP進行通信的主機或路由器位于同一物理網絡,對等機器之間擁有直接的物理連接。TCP/IP設計原則之一是為包容各種物理網絡技術,包容性主要體現在IP層中。各種物理網絡技術在幀或報文格式、地址格式等方面差別很大,TCP/IP的重要思想之一就是通過IP將各種底層網絡技術統一起來,達到屏蔽底層細節,提供統一虛擬網的目的。IP向上層提供統一的IP報文,使得各種網絡幀或報文格式的差異性對高層協議不復存在。IP層是TCP/IP實現異構網互聯最關鍵的一層。107.1.2TCP/IP的分層模型特點TCP/IP的可靠性特性在TCP/IP網絡中,IP采用無連接的數據報機制,對數據進行“盡力而為”的傳遞機制,即只管將報文盡力傳送到目的主機,無論傳輸正確與否,不做驗證,不發確認,也不保證報文的順序。TCP/IP的可靠性體現在傳輸層協議之一的TCP協議。TCP協議提供面向連接的服務,因為傳輸層是端到端的,所以TCP/IP的可靠性被稱為端到端可靠性。TCP/IP的特點就是將不同的底層物理網絡、拓撲結構隱藏起來,向用戶和應用程序提供通用、統一的網絡服務。這樣,從用戶的角度看,整個TCP/IP互聯網就是一個統一的整體,它獨立于具體的各種物理網絡技術,能夠向用戶提供一個通用的網絡服務。TCP/IP網絡完全撇開了底層物理網絡的特性,是一個高度抽象的概念,正是由于這個原因,其為TCP/IP網絡賦予了巨大的靈活性和通用性。117.1.3TCP/IP核心協議在TCP/IP協議族中,有很多種協議。127.1.3TCP/IP核心協議TCPTCP的上一層是應用層,TCP向應用層提供可靠的面向對象的數據流傳輸服務,TCP數據傳輸實現了從一個應用程序到另一個應用程序的數據傳遞。它能提供高可靠性通信(即數據無誤、數據無丟失、數據無失序、數據無重復到達的通信。),應用程序通過向TCP層提交數據接發送/收端的地址和端口號而實現應用層的數據通信。通過IP的源/目的可以唯一的區分網絡中兩個設備的連接,通過socket的源/目的可以唯一的區分網絡中兩個應用程序的連接。137.1.3TCP/IP核心協議三次握手TCP是面向連接的,所謂面向連接,就是當計算機雙方通信時必需先建立連接,然后進行數據通信,最后拆除連接三個過程。TCP在建立連接時又分三步走:第一步(A->B):主機A向主機B發送一個包含SYN即同步(Synchronize)標志的TCP報文,SYN同步報文會指明客戶端使用的端口以及TCP連接的初始序號;第二步(B->A):主機B在收到客戶端的SYN報文后,將返回一個SYN+ACK的報文,表示主機B的請求被接受,同時TCP序號被加一,ACK即確認(Acknowledgement)。第三步(A->B):主機A也返回一個確認報文ACK給服務器端,同樣TCP序列號被加一,到此一個TCP連接完成。147.1.3TCP/IP核心協議三次握手157.1.3TCP/IP核心協議TCP數據包頭TCP數據包頭格式:167.1.3TCP/IP核心協議UDPUDP即用戶數據報協議,是一種面向無連接的不可靠傳輸協議,不需要通過3次握手來建立一個連接,同時,一個UDP應用可同時作為應用的客戶或服務器方。由于UDP協議并不需要建立一個明確的連接,因此建立UDP應用要比建立TCP應用簡單得多。UDP比TCP協議更為高效,也能更好地解決實時性的問題,如今,包括網絡視頻會議系統在內的眾多的客戶/服務器模式的網絡應用都使用UDP協議。177.1.3TCP/IP核心協議UDP數據包頭187.1.3TCP/IP核心協議協議選擇協議的選擇應該考慮到數據可靠性、應用的實時性和網絡的可靠性。對數據可靠性要求高的應用需選擇TCP協議,而對數據的可靠性要求不那么高的應用可選擇UDP傳送。TCP協議中的3次握手、重傳確認等手段可以保證數據傳輸的可靠性,但使用TCP協議會有較大的時延,因此不適合對實時性要求較高的應用;而UDP協議則有很好的實時性。網絡狀況不是很好的情況下需選用TCP協議(如在廣域網等情況),網絡狀況很好的情況下選擇UDP協議可以減少網絡負荷。197.2網絡基礎編程7.2.1套接字(socket)概述7.2.2地址及順序處理7.2.3套接字編程207.2.1套接字(socket)概述套接字定義在Linux中的網絡編程是通過socket接口來進行的。套接字(socket)是一種特殊的I/O接口,它也是一種文件描述符。socket是一種常用的進程之間通信機制,通過它不僅能實現本地機器上的進程之間的通信,而且通過網絡能夠在不同機器上的進程之間進行通信。每一個socket都用一個半相關描述{協議、本地地址、本地端口}來表示;一個完整的套接字則用一個相關描述{協議、本地地址、本地端口、遠程地址、遠程端口}來表示。socket也有一個類似于打開文件的函數調用,該函數返回一個整型的socket描述符,隨后的連接建立、數據傳輸等操作都是通過socket來實現的。217.2.1套接字(socket)概述套接字類型流式套接字(SOCK_STREAM) 流式套接字提供可靠的、面向連接的通信流;它使用TCP協議,從而保證了數據傳輸的可靠性和順序性。數據報套接字(SOCK_DGRAM) 數據報套接字定義了一種無可靠、面向無連接的服務,數據通過相互獨立的報文進行傳輸,是無序的,并且不保證是可靠、無差錯的。它使用數據報協議UDP。原始套接字(SOCK_RAW) 原始套接字允許對底層協議如IP或ICMP進行直接訪問,它功能強大但使用較為不便,主要用于一些協議的開發。227.2.2地址及順序處理地址結構處理structsockaddr{ unsignedshortsa_family;/*地址族*/ charsa_data[14];/*14字節的協議地址,包含該socket的IP地址和端口號。*/};structsockaddr_in{ shortintsa_family;/*地址族*/ unsignedshortintsin_port;/*端口號*/ structin_addrsin_addr;/*IP地址*/ unsignedcharsin_zero[8];/*填充0以保持與structsockaddr同樣大小*/};這兩個數據類型是等效的,可以相互轉化,通常sockaddr_in數據類型使用更為方便。在建立socketadd或sockaddr_in后,就可以對該socket進行適當的操作了。237.2.2地址及順序處理sa_family字段可選的常見值:247.2.2地址及順序處理數據存儲優先順序計算機數據存儲有兩種字節優先順序:高位字節優先(稱為大端模式)和低位字節優先(稱為小端模式,PC機通常采用小端模式)。Internet上數據以高位字節優先順序在網絡上傳輸,因此在有些情況下,需要對這兩個字節存儲優先順序進行相互轉化。htonl()
4字節主機字節序轉換為網絡字節序ntohl()
4字節網絡字節序轉換為主機字節序htons()
2字節主機字節序轉換為網絡字節序ntohs()
2字節網絡字節序轉換為主機字節序257.2.2地址及順序處理數據存儲優先順序函數語法:267.2.2地址及順序處理地址格式轉化用戶在表達地址時通常采用點分十進制表示的數值字符串(或者是以冒號分開的十進制IPv6地址),而在通常使用的socket編程中所使用的則是二進制值(例如,用in_addr結構和in6_addr結構分別表示IPv4和IPv6中的網絡地址),這就需要將這兩個數值進行轉換。在IPv4中用到的函數有inet_aton()、inet_addr()和inet_ntoa(),而IPv4和IPv6兼容的函數有inet_pton()和inet_ntop()。inet_pton()函數是將點分十進制地址字符串轉換為二進制地址而inet_ntop()是inet_pton()的反操向作,將二進制地址轉換為點分十進制地址字符串。277.2.2地址及順序處理inet_pton()函數格式:287.2.2地址及順序處理inet_ntop()函數格式:297.2.2地址及順序處理名字地址轉換gethostbyname()根據主機名取得主機信息gethostbyaddr()根據主機地址取得主機信息getaddrinfo()還能實現自動識別IPv4地址和IPv6地址307.2.2地址及順序處理名字地址轉換gethostbyname()和gethostbyaddr()都涉及到一個hostent的結構體structhostent{ char*h_name; /*正式主機名*/ char**h_aliases; /*主機別名*/ inth_addrtype; /*地址類型*/ inth_length; /*地址字節長度*/ char**h_addr_list; /*指向IPv4或IPv6的地址指針數組*/}317.2.2地址及順序處理名字地址轉換getaddrinfo()函數涉及到一個addrinfo的結構體structaddrinfo{ intai_flags; /*AI_PASSIVE,AI_CANONNAME;*/ intai_family; /*地址族*/ intai_socktype; /*socket類型*/ intai_protocol; /*協議類型*/ size_tai_addrlen; /*地址字節長度*/ char*ai_canonname; /*主機名*/ structsockaddr*ai_addr; /*socket結構體*/ structaddrinfo*ai_next; /*下一個指針鏈表*/}327.2.2地址及順序處理名字地址轉換gethostbyname()函數語法:337.2.2地址及順序處理名字地址轉換getaddrinfo()函數語法:347.2.2地址及順序處理名字地址轉換addrinfo常見選項:357.2.2地址及順序處理名字地址轉換注意:
通常服務器端在調用getaddrinfo()之前,ai_flags設置AI_PASSIVE,用于bind()函數(用于端口和地址的綁定,后面會講到),主機名nodename通常會設置為NULL。客戶端調用getaddrinfo()時,ai_flags一般不設置AI_PASSIVE,但是主機名nodename和服務名servname(端口)則應該不為空。367.2.3套接字編程函數說明socket()創建套接字bind()綁定本機端口connect()建立連接listen()監聽端口accept()接受連接recv(),read(),recvfrom()數據接收send(),write(),sendto()數據發送close(),shutdown()關閉套接字377.2.3套接字編程使用TCP時Socket編程387.2.3套接字編程使用UDP時Socket編程397.2.3套接字編程socket()函數語法:407.2.3套接字編程bind()函數語法:417.2.3套接字編程listen()函數語法:427.2.3套接字編程accept()函數語法:437.2.3套接字編程connect()函數語法:447.2.3套接字編程send()函數語法:457.2.3套接字編程recv()函數語法:467.2.3套接字編程sendto()函數語法:477.2.3套接字編程recvfrom()函數語法:48
非阻塞和異步I/O在socket編程中可以使用函數fcntl(intfd,intcmd,intarg)的如下的編程特性。獲得文件狀態標志:將cmd設置為F_GETFL,會返回由fd指向的文件的狀態標志。非阻塞I/O:將cmd設置為F_SETFL,將arg設置為O_NONBLOCK異步I/O:將cmd設置為F_SETFL,將arg設置為O_ASYNC示例:
intflag
flag=fcntl(sockfd,F_GETFL,0); flag|=O_NONBLOCK; fcntl(sockfd,F_SETFL,flag);7.3網絡高級編程49
使用多路復用使用fcntl()函數雖然可以實現非阻塞I/O或信號驅動I/O,但在實際使用時往往會對資源是否準備完畢進行循環測試,這樣就大大增加了不必要的CPU資源的占用。在這里可以使用select()函數(或者使用poll()函數)來解決這個問題,同時,使用select()函數還可以設置等待的時間,可以說功能更加強大。7.3網絡高級編程50
NTP的客戶端實現實驗目的通過實現NTP協議的練習,進一步掌握Linux網絡編程,并且提高協議的分析與實現能力,為完成綜合性項目打下良好的基礎。7.4實驗內容517.4Web服務器Internet的基本協議是TCP/IP協議,然而在TCP/IP模型最上層的是應用層。它包含文件傳輸協議(FTP)、簡單郵件傳輸協議(SMTP)、域名系統服務(DNS)、網絡新聞傳輸協議(NNTP)和超文本傳輸協議(HTTP)等很多高層協議。本節將運用前面學到的知識編寫一個簡單功能的基于應用層HTTP協議的Web服務器。527.4.1Web服務器的工作原理客戶端(瀏覽器)與Web服務器之間的交互主要包含客戶的請求和服務器的應答。請求和應答的格式在超文本傳輸協議(HTTP)中有定義。HTTP協議是用于從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先于圖形)等。通常,由HTTP客戶端發起一個請求,建立一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器則在該端口監聽客戶端發送過來的請求。一旦收到請求,服務器(向客戶端)發回一個狀態行和響應的消息,消息的消息體可能是請求的文件、錯誤消息、或者其它一些信息。537.4.1Web服務器的工作原理1.HTTP請求HTTP請求信息格式如下所示:HTTP請求消息:=請求行實體頭信息列表CRLF[實體內容]請求行:=方法URL
HTTP版本號CRLF
方法:=GET|HEAD|POST|擴展方法
URL:=協議名稱+宿主名+目錄與文件名實體頭信息列表:=實體頭信息1CLRF實體頭信息2CLRF……實體頭信息nCLRF實體頭信息:=頭部字段名:值其中"CRLF"表示回車換行。"請求行"中的"方法"描述了對指定資源執行的動作,常用的方法"GET"、"HEAD"和"POST"等3種547.4.1Web服務器的工作原理1.HTTP請求方法描述GET從WEB服務器中獲取對象,不同類型的對象將獲取不同的信息,比如:·文件類型對象,獲取該文件的內容。·可運行程序類型對象,獲取該程序執行的結果。·數據庫查詢類型對象,獲取該查詢的結果。HEAD要求服務器查找對象的元信息。POST從客戶端向WEB服務器發送數據。557.4.1Web服務器的工作原理應答Web服務器處理客戶請求,并向客戶機發送應答報文,HTTP協議的應答報文格式為如下所示。應答報文:=狀態行實體頭信息列表CRLF[實體內容]狀態行
=HTTP版本號狀態碼原因敘述實體頭信息列表:=實體頭信息1CLRF實體頭信息2CLRF……實體頭信息nCLRF實體頭信息:=頭部字段名:值狀態碼描述了Web服務器執行客戶機請求的狀態信息567.4.1Web服務器的工作原理應答狀態碼含義1XX保留2XX成功接收,比如“200”表示處理成功。3XX客戶需進一步細化請求。4XX客戶錯誤,比如“404”表示訪問的指定資源不存在。5XX服務器出錯。577.4.1Web服務器的工作原理Web服務器實際上是一個目錄服務器的擴展,通過HTTP協議讀取服務器相關目錄上的內容。Web服務器通常需要具備3種用戶操作:列舉目錄信息、顯示文件內容和運行應用程序。Web服務器通過基于流的套接字連接,為客戶提供上述3種操作。用戶連接到服務器后,用戶陸續發送請求,服務器會處理每條客戶的請求信息并返回應答信息。587.4.1Web服務器的工作原理從流程圖可以看出,Web服務器和瀏覽器之間的通信流程為:客戶端(用戶的瀏覽器)向Web服務器發送連接請求,服務器會接收該請求,建立一個套接字連接。服務器端陸續讀取客戶端的請求,進行相應的處理并返回應答信息客戶端讀取服務器端的應答信息,并將其按照各種格式顯示在瀏覽器中(文本、圖片、聲音等內容)。597.4.2Web服務器的編程實現本節中的Web服務器只支持GET命令,只接收請求行,跳過其余參數,然后處理請求和發送應答,主要循環如下:while(1){ fd=accept(sock,NULL,NULL);/*接收請求*/ fpin=fdopen(fd,"r"); fgets(request,BUFSIZ,fpin);/*讀取客戶端的請求*/ ignore_others(fpin);/*跳過其他命令*/ process_request(request,fd);/*接收客戶端的請求*/ fclose(fpin);}607.4.2Web服務器的編程實現(1)建立客戶端與服務器端的通信(2)處理請求(3)目錄列表函數(4)運行可執行文件的函數(5)表示其他格式文件的內容(文本、網頁、圖片等)617.4.3運行Web服務器讀者交叉編譯web服務器程序,然后下載到目標板上,在某個端口上運行它,如下所示:#arm-linux-gcc–oweb_server(可以使用同目錄下的Makefile)#./web_server1234現在讀者可以在主機上打開網頁瀏覽器(Filefox等)訪問該Web服務器,網址為://目標板的IP地址:1234/。此時打開的主頁上會列出當前web服務器程序所在的目錄下的所有文件。接下來,分別將html文件、文本文件、jpg文件、cgi文件放到該目錄中,并且在網頁瀏覽器中輸入“://目標板IP地址:1234/文件名(例如:)”,則用戶會發現不同類型的文件的顯示方式。627.4.3運行Web服務器下面給出最簡單的html文件和cgi文件(需要將cgi文件的權限改成可運行文件)的例子,以供參考。/*cgi文件的例子*/#!/bin/shecho"Content-type:text/plain\n\n"echo"WelcometoWebServer\n"/*html文件例子*/<html><head><title>HelloWorld</title></head><body>WelcometoWebServer</body></html>637.5實驗內容——NTP協議的客戶端實現實驗目的通過實現NTP協議的練習,進一步掌握Linux網絡編程,并且提高協議的分析與實現能力,為參與完成綜合性項目打下良好的基礎實驗內容NetworkTimeProtocol(NTP)協議是用來使計算機時間同步化的一種協議,它可以使計算機對其服務器或時鐘源(如石英鐘,GPS等)做同步化,它可以提供高精確度的時間校正(LAN上與標準時間差小于1毫秒,WAN上幾十毫秒),且可用加密確認的方式來防止惡毒的協議攻擊。NTP提供準確時間,首先要有準確的時間來源,這一時間應該是國際標準時間UTC。NTP獲得UTC的時間來源可以是原子鐘、天文臺、衛星,也可以從Internet上獲取。這樣就有了準確而可靠的時間源。時間是按NTP服務器的等級傳播。按照距離外部UTC源的遠近將所有服務器歸入不同的Stratum(層)中。Stratum-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業園區防火安全教育
- 工業機器人市場分析與發展趨勢
- 工業機器人技術與應用前景展望
- 工業建筑設計與發展趨勢
- 工業用熱風爐的技術革新及節能措施
- 工業生產中的自動化與智能化轉型
- 工業機器人安全與防護技術
- 工業生產中的節能減排方案
- 工業自動化設備的故障診斷與排除技巧
- 工作與休息的平衡規劃指南
- 修理工安全試題及答案
- 地面地磚檢修方案(3篇)
- 公司工會內控管理制度
- 水發能源考試題及答案
- 2025年一年級語文1-8單元期末考試復習基礎知識點默寫清單(有答案)
- 2025年重癥醫學科ICU護理質量控制計劃
- 食堂燃氣培訓試題及答案
- 產業協同創新對制造業升級的促進機制研究
- 2025陜西中考:語文必考知識點
- 泥漿消納協議書
- 2025-2030北京市大健康產業發展決策及未來經營模式戰略規劃研究報告
評論
0/150
提交評論