第11章 網(wǎng)絡(luò)通信_第1頁
第11章 網(wǎng)絡(luò)通信_第2頁
第11章 網(wǎng)絡(luò)通信_第3頁
第11章 網(wǎng)絡(luò)通信_第4頁
第11章 網(wǎng)絡(luò)通信_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、TCP/IP協(xié)議概述OSI參考模型及TCP/IP參考模型 te ln e t f tp IP v 4 、 IP v 6 A R P 、 R A R P M P L S IG M P IC M P T C P U D P 應(yīng) 用 層 傳 輸 層 網(wǎng) 絡(luò) 層 網(wǎng) 絡(luò) 接 口 層 TCP 三次握手和TCP數(shù)據(jù)包頭格式為應(yīng)用程序提供可靠的通信連接。適合于一次傳輸大批數(shù)據(jù)的情況。并適用于要求得到響應(yīng)的應(yīng)用程序。 SYN J SYN K, ACK J+1 ACK K+1 UDP UDP即用戶數(shù)據(jù)報協(xié)議,它是一種無連接協(xié)議,因此不需要像TCP那樣通過三次握手來建立一個連接。同時,一個UDP應(yīng)用可同時作為應(yīng)用

2、的客戶或服務(wù)器方。由于UDP協(xié)議并不需要建立一個明確的連接,因此建立UDP應(yīng)用要比建立TCP應(yīng)用簡單得多。它比TCP協(xié)議更為高效,也能更好地解決實時性的問題。如今,包括網(wǎng)絡(luò)視頻會議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都使用UDP協(xié)議。 協(xié)議的選擇 (1)對數(shù)據(jù)可靠性的要求對數(shù)據(jù)要求高可靠性的應(yīng)用需選擇TCP協(xié)議,如驗證、密碼字段的傳送都是不允許出錯的,而對數(shù)據(jù)的可靠性要求不那么高的應(yīng)用可選擇UDP傳送。(2)應(yīng)用的實時性TCP協(xié)議在傳送過程中要使用三次握手、重傳確認等手段來保證數(shù)據(jù)傳輸?shù)目煽啃?。使用TCP協(xié)議會有較大的時延,因此不適合對實時性要求較高的應(yīng)用,如VOIP、視頻監(jiān)控等。相反,

3、UDP協(xié)議則在這些應(yīng)用中能發(fā)揮很好的作用。(3)網(wǎng)絡(luò)的可靠性由于TCP協(xié)議的提出主要是解決網(wǎng)絡(luò)的可靠性問題,它通過各種機制來減少錯誤發(fā)生的概率。因此,在網(wǎng)絡(luò)狀況不是很好的情況下需選用TCP協(xié)議(如在廣域網(wǎng)等情況),但是若在網(wǎng)絡(luò)狀況很好的情況下(如局域網(wǎng)等)就不需要再采用TCP協(xié)議,而建議選擇UDP協(xié)議來減少網(wǎng)絡(luò)負荷。 網(wǎng)絡(luò)基礎(chǔ)編程socket概念在Linux中的網(wǎng)絡(luò)編程是通過socket接口來進行的。socket是一種特殊的I/O接口,它也是一種文件描述符。它是一種常用的進程之間通信機制,通過它不僅能實現(xiàn)本地機器上的進程之間的通信,而且通過網(wǎng)絡(luò)能夠在不同機器上的進程之間進行通信。每一個sock

4、et都用一個半相關(guān)描述協(xié)議、本地地址、本地端口來表示;一個完整的套接字則用一個相關(guān)描述協(xié)議、本地地址、本地端口、遠程地址、遠程端口來表示。socket也有一個類似于打開文件的函數(shù)調(diào)用,該函數(shù)返回一個整型的socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^socket來實現(xiàn)的。 socket類型 (1)流式socket(SOCK_STREAM)流式套接字提供可靠的、面向連接的通信流;它使用TCP協(xié)議,從而保證了數(shù)據(jù)傳輸?shù)恼_性和順序性。(2)數(shù)據(jù)報socket(SOCK_DGRAM)數(shù)據(jù)報套接字定義了一種無連接的服務(wù),數(shù)據(jù)通過相互獨立的報文進行傳輸,是無序的,并且不保證是可靠、無差錯的。

5、它使用數(shù)據(jù)報協(xié)議UDP。(3)原始socket原始套接字允許對底層協(xié)議如IP或ICMP進行直接訪問,它功能強大但使用較為不便,主要用于一些協(xié)議的開發(fā)。 socket信息數(shù)據(jù)結(jié)構(gòu)struct sockaddr unsigned short sa_family; /*地址族*/ char sa_data14; /*14字節(jié)的協(xié)議地址,包含該socket的IP地址和端口號。*/;struct sockaddr_in short int sa_family; /*地址族*/ unsigned short int sin_port; /*端口號*/ struct in_addr sin_addr; /*

6、IP地址*/ unsigned char sin_zero8; /*填充0 以保持與struct sockaddr同樣大小*/;數(shù)據(jù)存儲優(yōu)先順序 的轉(zhuǎn)換計算機數(shù)據(jù)存儲有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先(稱為大端模式)和低位字節(jié)優(yōu)先(稱為小端模式)。Internet上數(shù)據(jù)以高位字節(jié)優(yōu)先順序在網(wǎng)絡(luò)上傳輸,因此在有些情況下,需要對這兩個字節(jié)存儲優(yōu)先順序進行相互轉(zhuǎn)化。這里用到了四個函數(shù):htons()、ntohs()、htonl()和ntohl()。這四個地址分別實現(xiàn)網(wǎng)絡(luò)字節(jié)序和主機字節(jié)序的轉(zhuǎn)化,這里的h代表host,n代表network,s代表short,l代表long。通常16位的IP端口號用s代表

7、,而IP地址用l來代表。地址格式轉(zhuǎn)化(1) 通常用戶在表達地址時采用的是點分十進制表示的數(shù)值(或者是以冒號分開的十進制IPv6地址),而在通常使用的socket編程中所使用的則是二進制值,這就需要將這兩個數(shù)值進行轉(zhuǎn)換。這里在IPv4中用到的函數(shù)有inet_aton()、inet_addr()和inet_ntoa(),而IPv4和IPv6兼容的函數(shù)有inet_pton()和inet_ntop()。 地址格式轉(zhuǎn)化(2)名字地址轉(zhuǎn)化 (1)通常,人們在使用過程中都不愿意記憶冗長的IP地址,尤其到IPv6時,地址長度多達128位,那時就更加不可能一次次記憶那么長的IP地址了。因此,使用主機名將會是很好

8、的選擇。在Linux中,同樣有一些函數(shù)可以實現(xiàn)主機名和地址的轉(zhuǎn)化,最為常見的有g(shù)ethostbyname()、gethostbyaddr()和getaddrinfo()等,它們都可以實現(xiàn)IPv4和IPv6的地址和主機名之間的轉(zhuǎn)化。其中g(shù)ethostbyname()是將主機名轉(zhuǎn)化為IP地址,gethostbyaddr()則是逆操作,是將IP地址轉(zhuǎn)化為主機名,另外getaddrinfo()還能實現(xiàn)自動識別IPv4地址和IPv6地址。名字地址轉(zhuǎn)化 (2)- 主要數(shù)據(jù)結(jié)構(gòu)struct hostent char *h_name;/*正式主機名*/ char *h_aliases;/*主機別名*/ int

9、 h_addrtype;/*地址類型*/ int h_length;/*地址字節(jié)長度*/ char *h_addr_list;/*指向IPv4或IPv6的地址指針數(shù)組*/struct addrinfo int ai_flags;/*AI_PASSIVE, AI_CANONNAME;*/ int ai_family;/*地址族*/ int ai_socktype;/*socket類型*/ int ai_protocol;/*協(xié)議類型*/ size_t ai_addrlen;/*地址字節(jié)長度*/ char *ai_canonname;/*主機名*/ struct sockaddr *ai_addr

10、;/*socket結(jié)構(gòu)體*/ struct addrinfo *ai_next;/*下一個指針鏈表*/名字地址轉(zhuǎn)化 (3)名字地址轉(zhuǎn)化 (4)socket基礎(chǔ)編程 (1) socket編程的基本函數(shù)有socket()、bind()、listen()、accept()、send()、sendto()、recv()以及recvfrom()等,其中根據(jù)客戶端還是服務(wù)端,或者根據(jù)使用TCP協(xié)議還是UDP協(xié)議,這些函數(shù)的調(diào)用流程都有所區(qū)別。 socket():該函數(shù)用于建立一個socket連接,可指定socket類型等信息。在建立了socket連接之后,可對sockaddr或sockaddr_in結(jié)構(gòu)進

11、行初始化,以保存所建立的socket地址信息。 bind():該函數(shù)是用于將本地IP地址綁定到端口號,若綁定其他IP地址則不能成功。另外,它主要用于TCP的連接,而在UDP的連接中則無必要。 listen():在服務(wù)端程序成功建立套接字和與地址進行綁定之后,還需要準備在該套接字上接收新的連接請求。此時調(diào)用listen()函數(shù)來創(chuàng)建一個等待隊列,在其中存放未處理的客戶端連接請求。socket基礎(chǔ)編程 (2) accept():服務(wù)端程序調(diào)用listen()函數(shù)創(chuàng)建等待隊列之后,調(diào)用accept()函數(shù)等待并接收客戶端的連接請求。它通常從由bind()所創(chuàng)建的等待隊列中取出第一個未處理的連接請求。

12、 connect():該函數(shù)在TCP中是用于bind()的之后的client端,用于與服務(wù)器端建立連接,而在UDP中由于沒有了bind()函數(shù),因此用connect()有點類似bind()函數(shù)的作用。 send()和recv():這兩個函數(shù)分別用于發(fā)送和接收數(shù)據(jù),可以用在TCP中,也可以用在UDP中。當用在UDP時,可以在connect()函數(shù)建立連接之后再用。 sendto()和recvfrom():這兩個函數(shù)的作用與send()和recv()函數(shù)類似,也可以用在TCP和UDP中。當用在TCP時,后面的幾個與地址有關(guān)參數(shù)不起作用,函數(shù)作用等同于send()和recv();當用在UDP時,可以

溫馨提示

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

評論

0/150

提交評論