嵌入式linux系統(tǒng)與應(yīng)用lec13網(wǎng)絡(luò)編程_第1頁(yè)
嵌入式linux系統(tǒng)與應(yīng)用lec13網(wǎng)絡(luò)編程_第2頁(yè)
嵌入式linux系統(tǒng)與應(yīng)用lec13網(wǎng)絡(luò)編程_第3頁(yè)
嵌入式linux系統(tǒng)與應(yīng)用lec13網(wǎng)絡(luò)編程_第4頁(yè)
嵌入式linux系統(tǒng)與應(yīng)用lec13網(wǎng)絡(luò)編程_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Linux網(wǎng)絡(luò)編程部門日期

版本管理修改記錄

審核記錄版本號(hào).作者描述修改日期V01KITTCreated2013-03-25V02xushanModified2015-04-23版本號(hào).職務(wù)簽名修改日期主要內(nèi)容TCP/IP概述TCP/IP協(xié)議族TCP和UDP協(xié)議Socket套接字概述地址和順序處理Socket基礎(chǔ)編程TCP編程實(shí)驗(yàn)TCP/IP概述OSI參考模型

網(wǎng)絡(luò)結(jié)構(gòu)的標(biāo)準(zhǔn)模型是OSI模型,它是由國(guó)際標(biāo)準(zhǔn)化組織ISO定義的網(wǎng)絡(luò)分層模型,一般稱為OSI/ISO開放互聯(lián)參考模型。它分為7層:應(yīng)用層、表示層、會(huì)話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層及物理層。TCP/IP概述TCP/IP參考模型

由于OSI模型過于復(fù)雜,與此相區(qū)別的TCP/IP模型從一開始就遵循簡(jiǎn)單明確的結(jié)構(gòu),它將OSI的7層協(xié)議模型簡(jiǎn)化為4層: 1、應(yīng)用層:負(fù)責(zé)應(yīng)用程序的網(wǎng)絡(luò)訪問 2、傳輸層:負(fù)責(zé)端與端之間的通信會(huì)話連接與建立 3、網(wǎng)絡(luò)層:負(fù)責(zé)將數(shù)據(jù)幀封裝成IP數(shù)據(jù)包 4、網(wǎng)絡(luò)接口層:負(fù)責(zé)將二進(jìn)制流轉(zhuǎn)換成數(shù)據(jù)幀,并進(jìn)行數(shù)據(jù)幀的發(fā)送與接收TCP/IP概述OSI和TCP/IP的對(duì)應(yīng)TCP/IP協(xié)議族常用網(wǎng)絡(luò)協(xié)議TCP:為應(yīng)用程序提供可靠的通信UDP:提供無連接的通信ICMP:用于發(fā)送有關(guān)數(shù)據(jù)包的傳送錯(cuò)誤的協(xié)議IGMP:被IP主機(jī)用來向本地多路廣播路由器報(bào)告主機(jī)組

成員的協(xié)議IP:負(fù)責(zé)在主機(jī)與網(wǎng)絡(luò)之間尋址和路由數(shù)據(jù)包ARP:用于獲得同一物理網(wǎng)絡(luò)中的硬件主機(jī)地址TCP/IP協(xié)議族TCP協(xié)議概述

TCP傳輸控制協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。在數(shù)據(jù)進(jìn)行傳輸前,TCP協(xié)議需要先建立連接,然后TCP報(bào)文在此連接的基礎(chǔ)上傳輸。TCP采用校驗(yàn)和應(yīng)答重發(fā)機(jī)制確保了數(shù)據(jù)傳輸?shù)目煽啃浴L攸c(diǎn)

1、為應(yīng)用程序提供可靠的通信連接 2、適合于一次傳輸批量數(shù)據(jù)的情況

3、適用于要求得到響應(yīng)的應(yīng)用程序TCP協(xié)議TCP握手機(jī)制

通過三次握手來進(jìn)行初始化。其目的是使數(shù)據(jù)的發(fā)送和接收同步,告訴其他主機(jī)一次可接收的數(shù)據(jù)量,并建立虛擬連接。TCP協(xié)議TCP握手過程

1、初始化主機(jī)通過一個(gè)同步標(biāo)志置位的數(shù)據(jù)段發(fā)出會(huì)話請(qǐng)求 2、接收主機(jī)通過發(fā)回具有以下項(xiàng)目的數(shù)據(jù)段表示回復(fù):同步標(biāo)志位、即將發(fā)送的數(shù)據(jù)段的起始字節(jié)的順序號(hào)、應(yīng)答并帶有將收到的下一個(gè)數(shù)據(jù)段的字節(jié)順序號(hào) 3、請(qǐng)求主機(jī)再回送一個(gè)數(shù)據(jù)段,并帶有確認(rèn)順序號(hào)和確認(rèn)號(hào)TCP協(xié)議TCP數(shù)據(jù)包格式TCP協(xié)議TCP格式定義:源端口、目的端口:16位長(zhǎng),標(biāo)識(shí)出遠(yuǎn)端和本地的端口號(hào)序號(hào):32位長(zhǎng),標(biāo)識(shí)發(fā)送的數(shù)據(jù)包的順序確認(rèn)號(hào):32位長(zhǎng),希望接收的下一個(gè)數(shù)據(jù)包的序列號(hào)TCP頭長(zhǎng):4位長(zhǎng),表明TCP頭中包含多少個(gè)32位字ACK:該位置1表明確認(rèn)號(hào)合法,置0表明不包含確認(rèn)信息SYN:用于建立連接的同步字段窗口大?。?6位長(zhǎng),表示剩余發(fā)送字節(jié)容量校驗(yàn)和:16位長(zhǎng),為確保高可靠性而設(shè)置此位UDP協(xié)議概述

UDP即用戶數(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)單得多。特點(diǎn)

UDP比TCP協(xié)議更為高效,能更好地解決實(shí)時(shí)性的問題。如今,包括網(wǎng)絡(luò)視頻會(huì)議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都使用UDP協(xié)議。UDP協(xié)議UDP數(shù)據(jù)包格式源地址、目的地址:16位長(zhǎng),標(biāo)識(shí)出遠(yuǎn)端和本地的端口號(hào)UDP長(zhǎng)度:指包括報(bào)頭和數(shù)據(jù)部分在內(nèi)的總的字節(jié)數(shù)。因?yàn)閳?bào)頭的長(zhǎng)度是固定的,所以該域主要用來計(jì)算可變長(zhǎng)度的數(shù)據(jù)部分協(xié)議的選擇1、對(duì)數(shù)據(jù)可靠性的要求 對(duì)數(shù)據(jù)要求高可靠性的應(yīng)用需選擇TCP協(xié)議,如驗(yàn)證、密碼字段的傳送都是不允許出錯(cuò)的,而對(duì)數(shù)據(jù)的可靠性要求不那么高的應(yīng)用可選擇UDP傳送。2、應(yīng)用的實(shí)時(shí)性

TCP協(xié)議在傳送過程中要使用三次握手、重傳確認(rèn)等手段來保證數(shù)據(jù)傳輸?shù)目煽啃浴J褂肨CP協(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)等情況),但是若在網(wǎng)絡(luò)狀況很好的情況下(如局域網(wǎng)等)就不需要再采用TCP協(xié)議,而建議選擇UDP協(xié)議來減少網(wǎng)絡(luò)負(fù)荷。Socket概述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é)議、本地地址、本地端口、遠(yuǎn)程地址、遠(yuǎn)程端口}來表示。socket也有一個(gè)類似于打開文件的函數(shù)調(diào)用,該函數(shù)返回一個(gè)整型的socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^socket來實(shí)現(xiàn)的。Socket概述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ò)的。它使用數(shù)據(jù)報(bào)協(xié)議UDP。3、原始socket

原始套接字允許對(duì)底層協(xié)議如IP或ICMP進(jìn)行直接訪問,它功能強(qiáng)大但使用較為不便,主要用于一些協(xié)議的開發(fā)。Socket概述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;/*端口號(hào)*/ structin_addrsin_addr;/*IP地址*/ unsignedcharsin_zero[8];/*填充0以保持與structsockaddr同樣大小*/ };Socket概述Socket信息數(shù)據(jù)結(jié)構(gòu)地址和順序處理數(shù)據(jù)存儲(chǔ)優(yōu)先順序 計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)有兩種字節(jié)優(yōu)先順序: 1、網(wǎng)絡(luò)字節(jié)序--高位字節(jié)優(yōu)先(稱為大端模式) 2、主機(jī)字節(jié)序--低位字節(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()這四個(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來代表。地址和順序處理數(shù)據(jù)存儲(chǔ)優(yōu)先順序地址和順序處理地址格式轉(zhuǎn)化

通常用戶在表達(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ù)有inet_pton()和inet_ntop()。地址和順序處理地址和順序處理名字地址轉(zhuǎn)化 通常,人們?cè)谑褂眠^程中都不愿意記憶冗長(zhǎng)的IP地址,尤其到IPv6時(shí),地址長(zhǎng)度多達(dá)128位,那時(shí)就更加不可能一次次記憶那么長(zhǎng)的IP地址了。因此,使用主機(jī)名將會(huì)是很好的選擇。 在Linux中,同樣有一些函數(shù)可以實(shí)現(xiàn)主機(jī)名和地址的轉(zhuǎn)化,最為常見的有g(shù)ethostbyname()、gethostbyaddr()和getaddrinfo()等,它們都可以實(shí)現(xiàn)IPv4和IPv6的地址和主機(jī)名之間的轉(zhuǎn)化。其中g(shù)ethostbyname()是將主機(jī)名轉(zhuǎn)化為IP地址,gethostbyaddr()則是逆操作,是將IP地址轉(zhuǎn)化為主機(jī)名,另外getaddrinfo()還能實(shí)現(xiàn)自動(dòng)識(shí)別IPv4地址和IPv6地址。地址和順序處理名字地址轉(zhuǎn)化--信息數(shù)據(jù)結(jié)構(gòu)structhostent{char*h_name;/*正式主機(jī)名*/char**h_aliases;/*主機(jī)別名*/inth_addrtype;/*地址類型*/inth_length;/*地址字節(jié)長(zhǎng)度*/char**h_addr_list;/*指向IPv4或IPv6的地址指針數(shù)組*/}structaddrinfo{intai_flags;/*AI_PASSIVE,AI_CANONNAME;*/intai_family;/*地址族*/intai_socktype;/*socket類型*/intai_protocol;/*協(xié)議類型*/size_tai_addrlen;/*地址字節(jié)長(zhǎng)度*/char*ai_canonname;/*主機(jī)名*/structsockaddr*ai_addr;/*socket結(jié)構(gòu)體*/structaddrinfo*ai_next;/*下一個(gè)指針鏈表*/}地址和順序處理名字地址轉(zhuǎn)化--函數(shù)格式地址和順序處理名字地址轉(zhuǎn)化--函數(shù)格式Socket基礎(chǔ)編程Socket編程的基本函數(shù)有socket()、bind()、listen()、accept()、send()、sendto()、recv()以及recvfrom()等,其中根據(jù)客戶端還是服務(wù)端,或者根據(jù)使用TCP協(xié)議還是UDP協(xié)議,這些函數(shù)的調(diào)用流程都有所區(qū)別。socket():該函數(shù)用于建立一個(gè)socket連接,可指定socket類型等信息。在建立了socket連接之后,可對(duì)sockaddr或sockaddr_in結(jié)構(gòu)進(jìn)行初始化,以保存所建立的socket地址信息。bind():該函數(shù)是用于將本地IP地址綁定到端口號(hào),若綁定其他IP地址則不能成功。另外,它主要用于TCP的連接,而在UDP的連接中則無必要。Socket基礎(chǔ)編程listen():在服務(wù)端程序成功建立套接字和與地址進(jìn)行綁定之后,還需要準(zhǔn)備在該套接字上接收新的連接請(qǐng)求。此時(shí)調(diào)用listen()函數(shù)來創(chuàng)建一個(gè)等待隊(duì)列,在其中存放未處理的客戶端連接請(qǐng)求。accept():服務(wù)端程序調(diào)用listen()函數(shù)創(chuàng)建等待隊(duì)列之后,調(diào)用accept()函數(shù)等待并接收客戶端的連接請(qǐng)求。它通常從由bind()所創(chuàng)建的等待隊(duì)列中取出第一個(gè)未處理的連接請(qǐng)求。connect():該函數(shù)在TCP中是用于bind()的之后的client端,用于與服務(wù)器端建立連接,而在UDP中由于沒有了bind()函數(shù),因此用connect()有點(diǎn)類似bind()函數(shù)的作用。Socket基礎(chǔ)編程send()和recv():這兩個(gè)函數(shù)分別用于發(fā)送和接收數(shù)據(jù),可以用在TCP中,也可以用在UDP中。當(dāng)用在UDP時(shí),可以在connect()函數(shù)建立連接之后再用。sendto()和recvfrom():這兩個(gè)函數(shù)的作用與send()和recv()函數(shù)類似,也可以用在TCP和UDP中。當(dāng)用在TCP時(shí),后面的幾個(gè)與地址有關(guān)參數(shù)不起作用,函數(shù)作用等同于send()和recv();當(dāng)用在UDP時(shí),可以用在之前沒有使用connect()的情況下,這兩個(gè)函數(shù)可以自動(dòng)尋找指定地址并進(jìn)行連接。TCP協(xié)議-程序流程圖UDP協(xié)議-程序流程圖Socket函數(shù)格式

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論