版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 畢業(yè)論文</b></p><p><b> 目錄</b></p><p><b> 摘要v</b></p><p> Abstractvi</p><p><b> 前言vii</b></p>&l
2、t;p> 第一章 緒 論1</p><p><b> 1.1課題背景1</b></p><p> 1.2 課題研究的目的和意義1</p><p> 第二章HTTP服務(wù)器的相關(guān)理論基礎(chǔ)3</p><p> 2.1 Linux系統(tǒng)簡介3</p><p> 2.2 TC
3、P/IP協(xié)議分析4</p><p> 2.2.1 TCP/IP協(xié)議概述4</p><p> 2.2.2 網(wǎng)絡(luò)層協(xié)議(IP協(xié)議)5</p><p> 2.2.3 傳輸層協(xié)議(TCP和UDP)7</p><p> 2.3 Linux下網(wǎng)絡(luò)編程介紹9</p><p> 2.3.1 Socket簡介10&
4、lt;/p><p> 2.3.2 Socket創(chuàng)建10</p><p> 2.3.3 Socket配置11</p><p> 2.3.4 建立連接13</p><p> 2.3.5 數(shù)據(jù)傳輸14</p><p> 2.3.6 結(jié)束傳輸15</p><p> 2.3.7 Sock
5、et編程的基本步驟16</p><p> 2.3.8 I/O復(fù)用介紹16</p><p> 2.3.9 Linux下的I/O復(fù)用支持17</p><p> 2.3.10 Linux下EPOLL的使用19</p><p> 2.4 HTTP協(xié)議分析22</p><p> 2.4.1 HTTP協(xié)議概述
6、22</p><p> 2.4.2 HTTP工作原理23</p><p> 2.4.3 HTTP請求報(bào)文分析25</p><p> 2.4.3 HTTP響應(yīng)報(bào)文分析26</p><p> 2.4.4 HTTP/1.0主要特征27</p><p> 2.4.5 HTTP/1.1簡介28</p&g
7、t;<p> 2.5 本章小結(jié)29</p><p> 第三章 HTTP服務(wù)器設(shè)計(jì)30</p><p> 3.1需求分析30</p><p> 3.2 HTTP服務(wù)器模型30</p><p> 3.3 HTTP服務(wù)器實(shí)現(xiàn)目標(biāo)31</p><p> 3.4 HTTP服務(wù)器設(shè)計(jì)思路31&
8、lt;/p><p> 3.5 HTTP服務(wù)器功能模塊圖32</p><p> 3.6 HTTP服務(wù)器工作流程32</p><p> 3.7 HTTP服務(wù)器核心設(shè)計(jì)思想35</p><p> 3.8 本章小結(jié)35</p><p> 第四章 HTTP服務(wù)器實(shí)現(xiàn)36</p><p>
9、 4.1 網(wǎng)絡(luò)連接模塊36</p><p> 4.1.1 數(shù)據(jù)結(jié)構(gòu)與接口設(shè)計(jì)36</p><p> 4.1.2 epoll接口實(shí)現(xiàn)37</p><p> 4.2 HTTP協(xié)議處理模塊39</p><p> 4.2.1 數(shù)據(jù)結(jié)構(gòu)與接口設(shè)計(jì)39</p><p> 4.3 HTTP服務(wù)提供模塊42<
10、;/p><p> 4.3.1 數(shù)據(jù)結(jié)構(gòu)與接口設(shè)計(jì)42</p><p> 4.4 HTTP服務(wù)主程序44</p><p> 4.5 HTTP服務(wù)器運(yùn)行與測試45</p><p> 4.5.1 HTTP服務(wù)器運(yùn)行45</p><p> 4.5.2 HTTP服務(wù)器測試46</p><p&g
11、t; 4.6 本章小結(jié)49</p><p><b> 第五章 結(jié)論50</b></p><p> 第六章 總結(jié)與體會51</p><p><b> 謝辭52</b></p><p><b> 參考文獻(xiàn)53</b></p><p>&l
12、t;b> 附錄55</b></p><p> 附錄1 軟件使用說明55</p><p> 附錄2 英文原文57</p><p> 附錄3 英文翻譯58</p><p><b> 摘要</b></p><p> Linux操作系統(tǒng)是一個(gè)開放源代碼的免費(fèi)操作
13、系統(tǒng)。它不僅有安全、穩(wěn)定、成本低的特點(diǎn),而且很少發(fā)現(xiàn)有病毒傳播。HTTP服務(wù)器是web服務(wù)器的一種,它是基于超文本傳輸協(xié)議HTTP的服務(wù)器?;贚inux具有穩(wěn)定、可靠、安全和強(qiáng)大的網(wǎng)絡(luò)功能這些優(yōu)點(diǎn),使得其主要應(yīng)用于服務(wù)器領(lǐng)域。所以本文選擇在Linux環(huán)境下實(shí)現(xiàn)一個(gè)HTTP服務(wù)器。</p><p> 本文研究了Linux下HTTP服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)。在Linux系統(tǒng)中采用HTTP協(xié)議和瀏覽器完成數(shù)據(jù)的傳輸。闡述
14、了Linux套接字編程的方法、EPOLL等I/O復(fù)用編程模型。詳細(xì)分析了HTTP協(xié)議內(nèi)容以及客戶端與服務(wù)器之間的通信過程。本文實(shí)現(xiàn)了客戶端瀏覽器和服務(wù)器端以HTTP協(xié)議進(jìn)行請求和響應(yīng)的功能。同時(shí)對服務(wù)器進(jìn)行了一個(gè)簡單的壓力測試。所有程序代碼均為Linux下的C語言編程。</p><p> 關(guān)鍵字: Linux、HTTP服務(wù)器、HTTP協(xié)議、EPOLL</p><p><b>
15、 Abstract</b></p><p> The Linux operate system is a free operate system which opens a source code.Not only it has characteristics such as safe,stability,and the low cost,but also it seldom disseminate
16、s the Virus.HTTP server is one of the Web servers and it bases on HTTP protocol.As the Linux operating system has the function of stable,reliable,safe and powerful network, it mainly used in servers.To realize a HTTP ser
17、ver in the Linux environment is the best choice.</p><p> This paper introduces design and implement of HTTP server in Linux operating system.In the Linux system and browser used HTTP protocol for data trans
18、mission. This paper expounds the method of Linux socket programming and EPOLL I/O multiplexing programming model.Detailed analysis the communication process between client and server and HTTP protocol.This paper realizes
19、 the function that the client browser requests and the server responds by HTTP agreement.Make a simple pressure test on the server.</p><p> Keyword: Linux, HTTP Server, HTTP protocol, EPOLL</p><p
20、><b> 前言</b></p><p> 隨著Internet的迅速發(fā)展與普及,網(wǎng)絡(luò)已經(jīng)延伸到世界的各個(gè)角落。在該技術(shù)基礎(chǔ)上發(fā)展起來的www,通過超文本向用戶提供全方位的多媒體、超媒體信息,從而為全世界的Internet用戶提供了一種獲取信息、共享資源的途徑。由于用戶在通過 Web 瀏覽器訪問信息資源的過程中,無需再關(guān)心一些技術(shù)性的細(xì)節(jié),而且界面非常友好,因而 Web 在Inte
21、rnet 上一推出就受到了熱烈的歡迎,走紅全球,并迅速得到了爆炸性的發(fā)展。 所以Web服務(wù)器在網(wǎng)絡(luò)中的地位日益重要。當(dāng)今社會中已有了許多知名的商用服務(wù)器,如Microsoft IIS、IBM WebSphere、BEA WebLogic、Apache、Tomcat等。但往往這些功能強(qiáng)大的服務(wù)器其結(jié)構(gòu)也相當(dāng)復(fù)雜,規(guī)模較大,在一些特定應(yīng)用情景下(如嵌入式設(shè)備)就不太適合了。同時(shí)一個(gè)簡單小巧的服務(wù)器也有利于我們學(xué)習(xí)網(wǎng)絡(luò)編程的相關(guān)知識,對服務(wù)器
22、原理也能有進(jìn)一步的了解。</p><p> 本文設(shè)計(jì)實(shí)現(xiàn)了一個(gè)功能簡單、結(jié)構(gòu)小巧的HTTP服務(wù)器,采用EPOLL多路I/O復(fù)用機(jī)制來實(shí)現(xiàn)并發(fā)服務(wù)。網(wǎng)絡(luò)編程采用socket,服務(wù)器端創(chuàng)建套接字、綁定套接口、設(shè)置套接口為監(jiān)聽模式,將該監(jiān)聽套接字加入EPOLL事件列表,然后無限循環(huán)等待EPOLL返回,對返回事件的套接字進(jìn)行讀或?qū)懙奶幚?。若為新連接,則將其加入到EPOLL事件列表;若為已有連接則讀取其請求或向其發(fā)送響應(yīng)
23、;若客戶端已斷開或已發(fā)送完響應(yīng),服務(wù)器端就斷開該連接,并將該套接字從EPOLL事件列表中移除。主要提供對靜態(tài)請求的處理,解析客戶端請求報(bào)文,回送請求的文件和響應(yīng)報(bào)文的功能。</p><p><b> 第一章 緒 論</b></p><p><b> 1.1課題背景</b></p><p> 隨著Internet的
24、迅速發(fā)展與普及,網(wǎng)絡(luò)已經(jīng)延伸到世界的各個(gè)角落。在該技術(shù)基礎(chǔ)上發(fā)展起來的www,通過超文本向用戶提供全方位的多媒體、超媒體信息,從而為全世界的Internet用戶提供了一種獲取信息、共享資源的途徑。隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展,客戶/服務(wù)器(Client/Server)結(jié)構(gòu)逐漸向?yàn)g覽器/服務(wù)器(Browser/Server)結(jié)構(gòu)遷移,B/S方式已成為一種時(shí)尚,大部分網(wǎng)絡(luò)應(yīng)用系統(tǒng)都是以這種B/S方式與網(wǎng)絡(luò)用戶交換信息。B/S的基礎(chǔ)是客戶端要有一
25、個(gè)瀏覽器程序,服務(wù)器端要有一個(gè)與之對應(yīng)的Web服務(wù)器。所以,Web服務(wù)器在B/S方式下起著決定性的作用,且其應(yīng)用地位日益重要。</p><p> Linux系統(tǒng)憑借其開源、穩(wěn)定、高效的特點(diǎn),在服務(wù)器市場擁有較大的市場份額。Linux作為網(wǎng)絡(luò)服務(wù)器市場的佼佼者,網(wǎng)絡(luò)服務(wù)應(yīng)用是其精華與核心。</p><p> 當(dāng)前商用的服務(wù)器大都規(guī)模比較大,功能強(qiáng)大的同時(shí)結(jié)構(gòu)也比較復(fù)雜。自己實(shí)現(xiàn)一個(gè)簡單小
26、巧的HTTP服務(wù)器,對于理解服務(wù)器工作原理知識,或針對一些特定情景下的HTTP服務(wù)器應(yīng)用來說,不失為一種比較好的方式。</p><p> 1.2 課題研究的目的和意義</p><p> 隨著Internet的普及,網(wǎng)絡(luò)已經(jīng)深入到了我們的生活,跟我們息息相關(guān)。Linux系統(tǒng)作為網(wǎng)絡(luò)應(yīng)用的重要平臺,如何更好的去學(xué)習(xí)和使用Linux系統(tǒng)便是我們要面對的問題。同時(shí),作為當(dāng)今互聯(lián)網(wǎng)最主要的應(yīng)用
27、——www服務(wù),其為全世界的Internet用戶提供了一種獲取信息、共享資源的途徑。www服務(wù)主要的提供者就是其后端的HTTP服務(wù)器,所以如何更為高效的研究和學(xué)習(xí)Web服務(wù)器的相關(guān)知識,也是我們必須要關(guān)注的。</p><p> 本文在Linux環(huán)境下設(shè)計(jì)和實(shí)現(xiàn)了一個(gè)簡單的HTTP服務(wù)器。使用socket庫完成網(wǎng)絡(luò)底層的通信,使用HTTP協(xié)議來和客戶端進(jìn)行數(shù)據(jù)傳輸,使用EPOLL多路I/O復(fù)用機(jī)制來完成并發(fā)服務(wù),
28、最后還進(jìn)行了一個(gè)簡單的并發(fā)性能測試。通過對此課題的研究學(xué)習(xí),我們能更好的掌握Linux系統(tǒng)的使用,加深對HTTP協(xié)議的理解。同時(shí)能對服務(wù)器設(shè)計(jì)的相關(guān)理論和實(shí)踐有一定了解。</p><p> 第二章HTTP服務(wù)器的相關(guān)理論基礎(chǔ)</p><p> 本章主要介紹設(shè)計(jì)HTTP服務(wù)器的相關(guān)理論知識。包括Linux系統(tǒng)簡介、TCP/IP協(xié)議分析、Linux下網(wǎng)絡(luò)編程介紹、HTTP協(xié)議分析。<
29、/p><p> 2.1 Linux系統(tǒng)簡介</p><p> 簡單地說,Linux是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng),它主要用于基于x86系列CPU的計(jì)算機(jī)上。這個(gè)系統(tǒng)是由世界各地的成千上萬的程序員設(shè)計(jì)和實(shí)現(xiàn)的。其目的是建立不受任何商品化軟件的版權(quán)制約的、全世界都能自由使用的Unix兼容產(chǎn)品。 </p><p> Linux以它的高效性和靈活性著稱。Li
30、nux模塊化的設(shè)計(jì)結(jié)構(gòu),使得它既能在價(jià)格昂貴的工作站上運(yùn)行,也能夠在廉價(jià)的PC機(jī)上實(shí)現(xiàn)全部的Unix特性,具有多任務(wù)、多用戶的能力。Linux是在GNU(GNU’s Not Unix)公共許可權(quán)限下免費(fèi)獲得的,是一個(gè)符合POSIX標(biāo)準(zhǔn)的操作系統(tǒng)。Linux操作系統(tǒng)軟件包不僅包括完整的Linux操作系統(tǒng),而且還包括了文本編輯器、高級語言編譯器等應(yīng)用軟件。它還包括帶有多個(gè)窗口管理器的X.Windows圖形用戶界面,如同我們使用Windows
31、NT一樣,允許我們使用窗口、圖標(biāo)和菜單對系統(tǒng)進(jìn)行操作。Linux具有Unix的優(yōu)點(diǎn):穩(wěn)定、可靠、安全,有強(qiáng)大的網(wǎng)絡(luò)功能。在相關(guān)軟件的支持下,可實(shí)現(xiàn)WWW、FTP(File Transfer Protoc01)、DNS(Domain Name System)、DHCP((Dynamic Host Configure Protocol,動(dòng)態(tài)主機(jī)配置協(xié)議)、Email等服務(wù),還可作為路由器使用,利用ipchains/iptables可構(gòu)建NA
32、T(Network Address Translation,網(wǎng)絡(luò)地址轉(zhuǎn)換)及功能</p><p> 現(xiàn)在,Linux已經(jīng)成為了一種受到廣泛關(guān)注和支持的操作系統(tǒng)。包括國際商用機(jī)器公司和惠普、戴爾在內(nèi)的一些計(jì)算機(jī)業(yè)巨頭也陸續(xù)支持Linux,并且成立了一些組織支持其發(fā)展,如Open Invention Network(OIN)(成員有IBM,索尼,NEC,Philips,Novell,Red hat等)購買了微軟專利
33、,允許任何個(gè)體以開放的原則使用。很多人認(rèn)為,和微軟Windows相比,作為自由軟件的Linux具有低軟件成本,高安全性,更加可信賴等優(yōu)勢,但是同時(shí)卻需要更多的人力成本。 </p><p> 2.2 TCP/IP協(xié)議分析</p><p> 由于當(dāng)今世界上的絕大部分網(wǎng)絡(luò)程序都是建立TCP/IP(傳輸控制協(xié)議/網(wǎng)際協(xié)議)協(xié)議的基礎(chǔ)上的。所以有必要對TCP/IP的協(xié)議內(nèi)容有所了解。這一節(jié)主要對
34、TCP/IP協(xié)議進(jìn)行分析。</p><p> 2.2.1 TCP/IP協(xié)議概述</p><p> TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統(tǒng)的開放式系統(tǒng)互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執(zhí)行某一特定任務(wù)。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層和應(yīng)用層。而TCP/IP通訊協(xié)議采用了
35、4層的層級結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來完成自己的需求。這4層分別為:</p><p> 應(yīng)用層:應(yīng)用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠(yuǎn)程訪問協(xié)議(Telnet)等。</p><p> 傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)據(jù)傳送,應(yīng)用程序之間的通信服務(wù),主要功能是數(shù)據(jù)格式化、數(shù)據(jù)確認(rèn)和丟失重傳等。如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)
36、報(bào)協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又校@一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。</p><p> 互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。</p><p> 鏈路接口層:接收IP數(shù)據(jù)報(bào)并進(jìn)行傳輸,從網(wǎng)絡(luò)上接收物理幀,抽取IP數(shù)據(jù)報(bào)轉(zhuǎn)交給下一層,對實(shí)際的網(wǎng)絡(luò)媒
37、體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)(如Ethernet、Serial Line等)來傳送數(shù)據(jù)。 </p><p> 圖2-1 TCP/IP層次結(jié)構(gòu)圖</p><p> 2.2.2 網(wǎng)絡(luò)層協(xié)議(IP協(xié)議)</p><p> IP協(xié)議是網(wǎng)絡(luò)層的主要協(xié)議,是Internet最重要的協(xié)議。在IP協(xié)議中規(guī)定了在Internet上進(jìn)行通信時(shí)應(yīng)遵守的規(guī)則。例如IP數(shù)據(jù)包的組成、
38、路由器如何將IP數(shù)據(jù)包送到目的主機(jī)等。IP協(xié)議在主機(jī)和網(wǎng)絡(luò)之間尋址和路由數(shù)據(jù)包。IP是一個(gè)無連接的協(xié)議,主要負(fù)責(zé)在主機(jī)間尋址并為數(shù)據(jù)包設(shè)定路由,在交換數(shù)據(jù)前它并不建立會話。因?yàn)樗槐WC正確傳遞。另一方面,數(shù)據(jù)在被收到時(shí),IP不需要收到確認(rèn),所以它是不可靠的。</p><p> IP層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)備驅(qū)動(dòng)程序)發(fā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層——TCP或UDP層;相反,IP層也把從TC
39、P或UDP層接收來的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包中含有發(fā)送它的主機(jī)的地址(源地址)和接收它的主機(jī)的地址(目的地址)。</p><p> IP協(xié)議的數(shù)據(jù)格式如下:</p><p> 圖2-2 網(wǎng)際協(xié)議IP數(shù)據(jù)格式</p><p> 版本號:協(xié)議的版本號,不同版本的協(xié)議格式或語言可能不同,現(xiàn)在常用的是IPV4。</p><p> 生存時(shí)
40、間(Time To Live,TTL):8bit,即IP分組在IP網(wǎng)絡(luò)中的壽命。</p><p> 協(xié)議(Protocol):8bit,指明IP分組中數(shù)據(jù)字段攜帶的是哪種高層協(xié)議的數(shù)據(jù)。</p><p> 首部檢查和(header checksum):16bit。此字段只用于檢查IP分組的首部,不包括數(shù)據(jù)字段。</p><p> 源IP地址(source IP
41、 address):32bit,填入源主機(jī)的IP地址。</p><p> 目標(biāo)IP地址(destination IP address):32bit,填入目標(biāo)主機(jī)的IP地址。</p><p> 可選字段(IP options):可選,可變長,1字節(jié)-40字節(jié),但加上填充字段(填充0)后兩個(gè)字段長度必須為4Bytes的整數(shù)倍。</p><p> IP地址標(biāo)識著網(wǎng)絡(luò)
42、中一個(gè)系統(tǒng)的位置。我們知道每個(gè)IP地址都是由兩部分組成的:網(wǎng)絡(luò)號和主機(jī)號。其中網(wǎng)絡(luò)號標(biāo)識一個(gè)物理的網(wǎng)絡(luò),同一個(gè)網(wǎng)絡(luò)上所有主機(jī)需要同一個(gè)網(wǎng)絡(luò)號,該號在互聯(lián)網(wǎng)中是唯一的;而主機(jī)號確定網(wǎng)絡(luò)中的一個(gè)工作端、服務(wù)器、路由器及其它TCP/IP客戶端。對于同一個(gè)網(wǎng)絡(luò)號來說,主機(jī)號是唯一的。每個(gè)TCP/IP主機(jī)由一個(gè)邏輯IP地址確定。</p><p> 2.2.3 傳輸層協(xié)議(TCP和UDP)</p><p
43、><b> TCP協(xié)議</b></p><p> 傳輸控制協(xié)議TCP是一種面向連接(連接導(dǎo)向)的、可靠的、基于字節(jié)流的運(yùn)輸層通信協(xié)議,由IETF的RFC 793說明。它在傳送數(shù)據(jù)時(shí)是分段進(jìn)行的,主機(jī)交換數(shù)據(jù)必須建立一個(gè)會話。它用比特流通信,即數(shù)據(jù)被作為無結(jié)構(gòu)的字節(jié)流。通過每個(gè)TCP傳輸?shù)淖侄沃付樞蛱枺垣@得可靠性。如果一個(gè)分段被分解成幾個(gè)小段,接收主機(jī)會知道是否所有小段都已收到。
44、通過發(fā)送應(yīng)答,用以確認(rèn)別的主機(jī)收到了數(shù)據(jù)。對于發(fā)送的每一個(gè)小段,接收主機(jī)必須在一個(gè)指定的時(shí)間返回一個(gè)確認(rèn)。如果發(fā)送者未收到確認(rèn),數(shù)據(jù)會被重新發(fā)送;如果收到的數(shù)據(jù)段損壞,接收主機(jī)會舍棄它,因?yàn)榇_認(rèn)未被發(fā)送,發(fā)送者會重新發(fā)送分段。TCP端口為信息的傳送指定端口,端口號小于256的定義為常用端口。</p><p> 下圖展示了TCP首部的數(shù)據(jù)格式。如果不計(jì)任選(Options)字段,那么,它的大小是20個(gè)字節(jié)。 &l
45、t;/p><p> 圖2-3 TCP包頭格式</p><p> TCP協(xié)議通過三個(gè)報(bào)文段完成連接的建立,這個(gè)過程稱為三次握手(three-way handshake),過程如下圖所示。 </p><p> (1)客戶機(jī)向服務(wù)器發(fā)送一個(gè)TCP數(shù)據(jù)包,表示請求建立連接。</p><p> (2)服務(wù)器收到了數(shù)據(jù)包,知道這是一個(gè)建立請求的連接,
46、服務(wù)器也通過發(fā)回具有以下項(xiàng)目的數(shù)據(jù)包表示回復(fù):同步標(biāo)志置位、即將發(fā)送的數(shù)據(jù)段的起始字節(jié)的順序號、應(yīng)答并帶有將收到的下一個(gè)數(shù)據(jù)段的字節(jié)順序號。</p><p> (3)客戶機(jī)收到了服務(wù)器的TCP,知道是從服務(wù)器來的確認(rèn)信息。于是客戶機(jī)也向服務(wù)器發(fā)送確認(rèn)信息。至此客戶端完成連接。</p><p> (4)服務(wù)器收到確認(rèn)信息,也完成連接。</p><p> 圖2-4
47、 TCP建立連接(三次握手)</p><p> TCP協(xié)議建立一個(gè)連接需要三次握手,而終止一個(gè)連接要經(jīng)過四次握手,這是由TCP的半關(guān)閉(half-close)造成的。具體過程如下圖所示。 </p><p> 圖2-5 TCP斷開連接</p><p><b> UDP協(xié)議</b></p><p> UDP 是Use
48、r Datagram Protocol的簡稱,中文名是用戶數(shù)據(jù)包協(xié)議,是 OSI 參考模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)。</p><p> 用戶數(shù)據(jù)報(bào)協(xié)議UDP提供了無連接的數(shù)據(jù)報(bào)服務(wù)。它適用于無須應(yīng)答并且通常一次只傳送少量數(shù)據(jù)的應(yīng)用軟件。</p><p> 2.3 Linux下網(wǎng)絡(luò)編程介紹</p><p> Linux下的網(wǎng)
49、絡(luò)編程主要是基于Linux提供的Socket API 函數(shù)來進(jìn)行的。所以,Linux下的網(wǎng)絡(luò)編程的基礎(chǔ)就是對socket API函數(shù)的掌握,就必須理解和學(xué)會使用socket接口。同時(shí)針對并發(fā)服務(wù),Linux下提供了I/O復(fù)用等高效的形式來滿足并發(fā)的要求。</p><p> 2.3.1 Socket簡介</p><p> Socket接口是TCP/IP網(wǎng)絡(luò)的API。Socket接口定義了
50、許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。要學(xué)習(xí)Internet上的TCP/IP網(wǎng)絡(luò)編程,必須理解Socket接口?!? </p><p> Socket接口設(shè)計(jì)者最先是將接口放在Unix操作系統(tǒng)里面的。如果了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。網(wǎng)絡(luò)的 Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個(gè)類似于打開文件
51、的函數(shù)調(diào)用Socket(),該函數(shù)返回一個(gè)整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實(shí)現(xiàn)的。常用的Socket類型有兩種:流式Socket (SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無連接的Socket,對應(yīng)于無連接的UDP服務(wù)應(yīng)用。 </p><p>
52、 2.3.2 Socket創(chuàng)建</p><p> 為了創(chuàng)建Socket,程序可以調(diào)用Socket函數(shù),該函數(shù)返回一個(gè)類似于文件描述符的句柄。socket函數(shù)原型為:</p><p> int socket(int domain, int type, int protocol);</p><p> domain指明所使用的協(xié)議族,通常為PF_INET,表示互聯(lián)網(wǎng)
53、協(xié)議族(TCP/IP協(xié)議族);type參數(shù)指定socket的類型: SOCK_STREAM 或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程序使用低層協(xié)議;protocol通常賦值“0”。 Socket()調(diào)用返回一個(gè)整型socket描述符,你可以在后面的調(diào)用使用它。</p><p> Socket描述符是一個(gè)指向內(nèi)部數(shù)據(jù)結(jié)構(gòu)的指針,它指向描述符表入口。調(diào)用Socke
54、t函數(shù)時(shí),socket執(zhí)行體將建立一個(gè)Socket,實(shí)際上"建立一個(gè)Socket"意味著為一個(gè)Socket數(shù)據(jù)結(jié)構(gòu)分配存儲空間。Socket執(zhí)行體為你管理描述符表。</p><p> 兩個(gè)網(wǎng)絡(luò)程序之間的一個(gè)網(wǎng)絡(luò)連接包括五種信息:通信協(xié)議、本地協(xié)議地址、本地主機(jī)端口、遠(yuǎn)端主機(jī)地址和遠(yuǎn)端協(xié)議端口。Socket數(shù)據(jù)結(jié)構(gòu)中包含這五種信息。 </p><p> 2.3.3 S
55、ocket配置 </p><p> 通過socket調(diào)用返回一個(gè)socket描述符后,在使用socket進(jìn)行網(wǎng)絡(luò)傳輸以前,必須配置該socket。面向連接的socket客戶端通過調(diào)用Connect函數(shù)在socket數(shù)據(jù)結(jié)構(gòu)中保存本地和遠(yuǎn)端信息。無連接socket的客戶端和服務(wù)端以及面向連接socket的服務(wù)端通過調(diào)用 bind函數(shù)來配置本地信息。</p><p> Bind函數(shù)將soc
56、ket與本機(jī)上的一個(gè)端口相關(guān)聯(lián),隨后你就可以在該端口監(jiān)聽服務(wù)請求。Bind函數(shù)原型為:</p><p> int bind(int sockfd,struct sockaddr *my_addr, int addrlen);</p><p> Sockfd是調(diào)用socket函數(shù)返回的socket描述符,my_addr是一個(gè)指向包含有本機(jī)IP地址及端口號等信息的sockaddr類型的指針
57、;addrlen常被設(shè)置為sizeof(struct sockaddr)。</p><p> struct sockaddr結(jié)構(gòu)類型是用來保存socket信息的:</p><p> struct sockaddr {</p><p> unsigned short sa_family; /* 地址族, AF_xxx */</p><p>
58、; char sa_data[14]; /* 14 字節(jié)的協(xié)議地址 */</p><p><b> };</b></p><p> sa_family一般為AF_INET,代表Internet(TCP/IP)地址族;sa_data則包含該socket的IP地址和端口號。</p><p> 另外還有一種結(jié)構(gòu)類型:</p>&
59、lt;p> struct sockaddr_in {</p><p> short int sin_family; /* 地址族 */</p><p> unsigned short int sin_port; /* 端口號 */</p><p> struct in_addr sin_addr; /* IP地址 *</p><p&
60、gt; unsigned char sin_zero[8]; /* 填充0 以保持與struct sockaddr同樣大小 */</p><p><b> };</b></p><p> 這個(gè)結(jié)構(gòu)更方便使用。sin_zero用來將sockaddr_in結(jié)構(gòu)填充到與struct sockaddr同樣的長度,可以用bzero()或memset()函數(shù)將其置為零。指向
61、sockaddr_in 的指針和指向sockaddr的指針可以相互轉(zhuǎn)換,這意味著如果一個(gè)函數(shù)所需參數(shù)類型是sockaddr時(shí),你可以在函數(shù)調(diào)用的時(shí)候?qū)⒁粋€(gè)指向 sockaddr_in的指針轉(zhuǎn)換為指向sockaddr的指針;或者相反。</p><p> 使用bind函數(shù)時(shí),可以用下面的賦值實(shí)現(xiàn)自動(dòng)獲得本機(jī)IP地址和隨機(jī)獲取一個(gè)沒有被占用的端口號:</p><p> my_addr.sin
62、_port = 0; /* 系統(tǒng)隨機(jī)選擇一個(gè)未被使用的端口號 */</p><p> my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本機(jī)IP地址 */</p><p> 通過將my_addr.sin_port置為0,函數(shù)會自動(dòng)為你選擇一個(gè)未占用的端口來使用。同樣,通過將my_addr.sin_addr.s_addr置為INADDR_ANY,系統(tǒng)會
63、自動(dòng)填入本機(jī)IP地址。注意在使用bind函數(shù)是需要將sin_port和sin_addr轉(zhuǎn)換成為網(wǎng)絡(luò)字節(jié)優(yōu)先順序;而sin_addr則不需要轉(zhuǎn)換。</p><p> 計(jì)算機(jī)數(shù)據(jù)存儲有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先和低位字節(jié)優(yōu)先。Internet上數(shù)據(jù)以高位字節(jié)優(yōu)先順序在網(wǎng)絡(luò)上傳輸,所以對于在內(nèi)部是以低位字節(jié)優(yōu)先方式存儲數(shù)據(jù)的機(jī)器,在Internet上傳輸數(shù)據(jù)時(shí)就需要進(jìn)行轉(zhuǎn)換,否則就會出現(xiàn)數(shù)據(jù)不一致。下面是幾個(gè)字節(jié)
64、順序轉(zhuǎn)換函數(shù):</p><p> ·htonl():把32位值從主機(jī)字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序</p><p> ·htons():把16位值從主機(jī)字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序</p><p> ·ntohl():把32位值從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換成主機(jī)字節(jié)序</p><p> ·ntohs():把16位值從網(wǎng)絡(luò)
65、字節(jié)序轉(zhuǎn)換成主機(jī)字節(jié)序</p><p> Bind()函數(shù)在成功被調(diào)用時(shí)返回0;出現(xiàn)錯(cuò)誤時(shí)返回“-1”并將errno置為相應(yīng)的錯(cuò)誤號。需要注意的是,在調(diào)用bind函數(shù)時(shí)一般不要將端口號置為小于1024的值,因?yàn)?到1024是保留端口號,你可以選擇大于1024中的任何一個(gè)沒有被占用的端口號。</p><p> 2.3.4 建立連接</p><p><b>
66、; 第六章 總結(jié)與體會</b></p><p> 畢業(yè)設(shè)計(jì)最初的時(shí)候,主要是對相關(guān)資料的收集和理論知識的學(xué)習(xí)。在這個(gè)階段,最好是同時(shí)結(jié)合資料和源碼一起來看,效果會比較好,學(xué)習(xí)效率較高??促Y料和教程是從細(xì)節(jié)和基礎(chǔ)上去學(xué)習(xí)知識,而看相關(guān)程序的源碼則是從整體和實(shí)現(xiàn)上去了解一個(gè)系統(tǒng)。這樣才能做到“見樹又見林”。學(xué)習(xí)理論知識可以使我們掌握最基礎(chǔ)的知識,能更深入的了解設(shè)計(jì)的底層實(shí)現(xiàn)。當(dāng)在具體實(shí)現(xiàn)的時(shí)候,可以以
67、模塊或分層次的思想來分析系統(tǒng)。重點(diǎn)掌握核心的模塊,其他模塊可以采用現(xiàn)有的類庫或開源的實(shí)現(xiàn),這樣可以提高開發(fā)的效率。軟件開發(fā)其實(shí)對于代碼量的積累是很重要的。當(dāng)積累了一定的代碼量后,看問題就會比較有程序的思想,能夠從層次,模塊的角度來分析問題,這樣思路就比較清晰了。</p><p> 整個(gè)畢業(yè)設(shè)計(jì)的過程其實(shí)就是經(jīng)歷了一個(gè)項(xiàng)目的生命周期。從最初的選題確定后,開始進(jìn)行相關(guān)資料的收集和理論知識的學(xué)習(xí),接著確定自己的方案設(shè)
68、計(jì)和系統(tǒng)整體結(jié)構(gòu),然后開始編碼實(shí)現(xiàn),調(diào)試代碼,直至順利運(yùn)行,再進(jìn)行性能測試,最后寫出論文。這些步驟其實(shí)和一個(gè)軟件項(xiàng)目的開發(fā)是很類似的。軟件的開發(fā)同樣會有這些步驟,需求分析,設(shè)計(jì),編碼,測試,發(fā)布,文檔撰寫等。</p><p> 當(dāng)完成了整個(gè)畢業(yè)設(shè)計(jì)后,對如何把握一個(gè)項(xiàng)目的整體有了一點(diǎn)基本的認(rèn)識。同時(shí)從中體會到時(shí)間控制和進(jìn)度安排都是很重要的,任何任務(wù)和項(xiàng)目都是有時(shí)間期限的,自己的想法和設(shè)計(jì)都是得基于按時(shí)完成這個(gè)前
69、提的。</p><p> 四年的大學(xué)時(shí)光即將結(jié)束,心中還是有不舍。回顧四年的學(xué)習(xí)時(shí)光,感覺自己還是過的蠻充實(shí)的。做過很多有意思的事,也認(rèn)識了一幫好友與同窗。無論是做人還是學(xué)習(xí),我的老師和同學(xué)朋友們都給了我很大的幫助,我非常感謝他們。作為即將踏上工作、步入社會的我,我想我會更加努力奮斗,不讓我的家人、朋友、老師們失望。最后,愿大家在今后的日子里,一帆風(fēng)順,身體健康。</p><p><
70、;b> 謝辭</b></p><p> 本論文的工作是在我的指導(dǎo)老師**老師的悉心指導(dǎo)下完成的,謝濤老師創(chuàng)新的學(xué)習(xí)思想和積極奮斗的人生理念給了我很大的影響,同時(shí)對我的工作和人生規(guī)劃都有很大幫助。在此衷心的感謝謝濤老師。</p><p> 在大學(xué)四年的學(xué)習(xí)過程中,我學(xué)到了很多做人與做事的學(xué)問,度過了一個(gè)充實(shí)而快樂的大學(xué)時(shí)光。非常感謝各位親愛的老師對我的教誨和指導(dǎo),無論
71、是知識的學(xué)習(xí),還是職業(yè)規(guī)劃和人生理想,你們都給了我很多意見和指導(dǎo)。我也很榮幸我能和各位同學(xué)、朋友們一起走過大學(xué)四年,我們共同經(jīng)歷了人生中最美好的時(shí)光。感謝你們的幫助和鼓勵(lì),希望走出校門后的我們?nèi)匀皇且惠呑拥暮门笥选?lt;/p><p> 最后,我要感謝我的父母和親人。是你們的辛勤工作為我創(chuàng)造了良好的學(xué)習(xí)條件,是你們的信任、鼓勵(lì)和理解,我才會取得今天的成就。我會用我的努力工作來回報(bào)你們的養(yǎng)育之恩,希望你們永遠(yuǎn)身體健康
72、,快樂長壽。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] JAMES F.KUROSE,KEITH W.ROSS.計(jì)算機(jī)網(wǎng)絡(luò)——自頂向下方法與Internet特色. 北京:機(jī)械工業(yè)出版社,2005年</p><p> [2] W.RICHARD STEVENS,BILL FENNER,ANDREW M.RUDOF
73、F. UNIX網(wǎng)絡(luò)編程 第1卷套接口API. 北京:清華大學(xué)出版社,2006年6月第3版</p><p> [3] W.RICHARD STEVENS,STEPHEN A.RAGO. UNIX環(huán)境高級編程(第2版).北京:人民郵電出版社,2006年</p><p> [4] 鳥哥.鳥哥的Linux私房菜基礎(chǔ)學(xué)習(xí)篇.北京:人民郵電出版社,2007年9月</p><p&
74、gt; [5] 林宇,郭凌云.Linux網(wǎng)絡(luò)編程.北京:人民郵電出版社,2000.45—65</p><p> [6] 鄭齊,方思行.通用多線程服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn).計(jì)算機(jī)工程與應(yīng)用,2003.16:146—147</p><p> [7] 胥光輝等譯.W.RICHARD STEVENS. TCP/IP詳解(第l卷):協(xié)議.北京:機(jī)械工業(yè)出版社,2000.15—25.</p>
75、;<p> [8] 張南平,徐靜. 基于進(jìn)程池的Linux并發(fā)服務(wù)器的研究. 計(jì)算機(jī)與數(shù)字工程,2009.1:159—161</p><p> [9] 邵芬,于國防,張寧. 基于多線程的HTTP服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn).工礦自動(dòng)化,2007.8:134—136</p><p> [9] 孫霞. 基于java的高效多線程HTTP服務(wù)器的研究及實(shí)現(xiàn). 福建電腦,2003.11:3
76、8—39</p><p> [10] 李磊. 嵌入式WEB服務(wù)器軟件的設(shè)計(jì)與實(shí)現(xiàn). 計(jì)算機(jī)工程與設(shè)計(jì)2003(10) </p><p> [11]白小明, 邱桃榮.基于Linux的嵌入式實(shí)時(shí)操作系統(tǒng)的研究. 微計(jì)算機(jī)信息, 2006,2-2:78-7.</p><p> [12]車飛鋒. 基于嵌入式Linux的Web和郵件服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn). 西安石油大學(xué):計(jì)
77、算機(jī)應(yīng)用技術(shù),2008 </p><p> [13]曲波,吳兆芝. Linux環(huán)境下面向Web服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn). 小型微型計(jì)算機(jī)系統(tǒng), 2002 </p><p> [14] Dan Kegel.The C10K problem. http://www.kegel.com/c10k.html </p><p> [15]Jeff Darcy. High
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- linux下http服務(wù)器設(shè)計(jì)畢業(yè)論文
- 畢業(yè)論文---linux下http服務(wù)器設(shè)計(jì)
- linux下http服務(wù)器設(shè)計(jì)-畢業(yè)論文
- linux下郵件服務(wù)器的搭建畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---linux架構(gòu)郵件服務(wù)器
- 基于Linux-RT-Linux的嵌入式HTTP服務(wù)器的設(shè)計(jì).pdf
- linux課程設(shè)計(jì)-linux下ftp服務(wù)器的搭建
- 畢業(yè)設(shè)計(jì)(論文)-基于linux郵件服務(wù)器的配置與管理
- http服務(wù)器的實(shí)現(xiàn)
- web服務(wù)器安全畢業(yè)設(shè)計(jì)
- 流媒體服務(wù)器畢業(yè)設(shè)計(jì)
- 內(nèi)網(wǎng)服務(wù)器搭建畢業(yè)設(shè)計(jì)
- rhel6下郵件服務(wù)器架構(gòu) 畢業(yè)設(shè)計(jì)
- rhel6下郵件服務(wù)器架構(gòu)畢業(yè)設(shè)計(jì)
- Linux環(huán)境下的DHCP服務(wù)器設(shè)計(jì)與實(shí)現(xiàn).pdf
- 畢業(yè)設(shè)計(jì)----游戲數(shù)據(jù)庫服務(wù)器設(shè)計(jì)
- 【課程設(shè)計(jì)】linux環(huán)境下samba服務(wù)器配置與實(shí)現(xiàn)
- 服務(wù)器故障分析和維護(hù)畢業(yè)設(shè)計(jì)
- Linux虛擬服務(wù)器的設(shè)計(jì)與應(yīng)用.pdf
- 網(wǎng)絡(luò)程序設(shè)計(jì)linux服務(wù)器課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論