《電子技術(shù)應用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設計應用 > 基于Linux操作系統(tǒng)下的TCP/IP網(wǎng)絡通信研究與應用
基于Linux操作系統(tǒng)下的TCP/IP網(wǎng)絡通信研究與應用
現(xiàn)代電子技術(shù)
摘要: 本文是介紹基于Linux操作系統(tǒng)下TCP/IP網(wǎng)絡通信的實際應用主要用于文件的網(wǎng)絡傳輸,,解決了文件傳輸?shù)男蕟栴},,作為進一步完善,,可以在文件傳送的過程中,,加入如身份驗證,、權(quán)限分配,、文件加密等安全機制,,保證一些重要文件在傳送過程中不會出現(xiàn)泄密的情況,,該設計可廣泛應用企業(yè)辦公區(qū)域網(wǎng)中,。
Abstract:
Key words :

1 引言

Linux是一種自由的Unix類多用戶,多任務的操作系統(tǒng),,可在運行在Intel 80386及更高檔次的PC機,、ARMS、MIPS和PowerPC等多種計算機平臺,,已成為應用廣泛,、可靠性高、功能強大的計算機操作系統(tǒng),,Linux具有內(nèi)核小,、效率高、源代碼開放等優(yōu)點,,還內(nèi)含了TCP/IP網(wǎng)絡協(xié)議,,很適合在服務器領域使用,而服務器主要用途之一就是進行網(wǎng)絡通信,,隨著計算機辦公自動化處理技術(shù)的應用與推廣,,網(wǎng)絡的不斷普及,傳統(tǒng)的紙張式文件傳輸方式已經(jīng)不再適合發(fā)展的需要,,人們更期待一種便捷,、高效、環(huán)保,、安全的網(wǎng)絡傳輸方式,。

本文就是考慮到這一現(xiàn)狀,結(jié)合基于Linux操作系統(tǒng)下的TCP/IP網(wǎng)絡通信原理,給出了一種基于TCP/IP編程實現(xiàn)文件傳輸?shù)膶嵗?,因此,,TCP/IP網(wǎng)絡通信研究具有十分重要的意義。

2 TCP/IP協(xié)議概述

TCP/IP即傳輸控制協(xié)議/網(wǎng)絡協(xié)議[1](Transmission Control Protocol/Internet Protocol),,是一個由多種協(xié)議組成的協(xié)議族,,他定義了計算機通過網(wǎng)絡互相通信及協(xié)議族各層次之間通信的規(guī)范,圖1描述了Linux對IP協(xié)議族的實現(xiàn)機制[2],?! ?/p>

Linux支持BSD的套接字和全部的TCP/IP協(xié)議,是通過網(wǎng)絡協(xié)議將其視為一組相連的軟件層來實現(xiàn)的,,BSD套接字(BSD Socket)由通用的套接字管理軟件支持,,該軟件是INET套接字層,用來管理基于IP的TCP與UDP端口到端口的互聯(lián)問題,,從協(xié)議分層來看,,IP是網(wǎng)絡層協(xié)議,TCP是一個可靠的端口到端口的傳輸層協(xié)議,,他是利用IP層進行傳接報文的,,同時也是面向連接的,通過建立一條虛擬電路在不同的網(wǎng)路間傳輸報文,,保證所傳輸報文的無丟失性和無重復性,。用戶數(shù)據(jù)報文協(xié)議(User Datagram Protocol,UDP)也是利用IP層傳輸報文,,但他是一個非面向連接的傳輸層協(xié)議,,利用IP層傳輸報文時,當目的方網(wǎng)際協(xié)議層收到IP報文后,,必須識別出該報文所使用的上層協(xié)議(即傳輸層協(xié)議),,因此,在IP報頭上中,,設有一個"協(xié)議"域(Protocol),。通過該域的值,即可判明其上層協(xié)議類型,,傳輸層與網(wǎng)絡層在功能說的最大區(qū)別是前者提供進程通信能力,,而后者則不能,在進程通信的意義上,,網(wǎng)絡通信的最終地址不僅僅是主機地址,,還包括可以描述進程的某種標識符,為此,,TCP/UDP提出了協(xié)議端口(Protocol Port)的概念,,用于標識通信的進程,,例如,Web服務器進程通常使用端口80,,在/etc/services文件中有這些注冊了的端口地址,。

對于TCP傳輸,傳輸節(jié)點間先要建立連接,,然后通過該連接傳輸已排好序的報文,,以保證傳輸?shù)恼_性,IP層中的代碼用于實現(xiàn)網(wǎng)際協(xié)議,,這些代碼將IP頭增加到傳輸數(shù)據(jù)中,同時也把收到的IP報文正確的傳送到TCP層或UDP層,。TCP是一個面向連接協(xié)議,,而UDP則是一個非面向連接協(xié)議,當一個UDP報文發(fā)送出去后,,Linux并不知道也不去關(guān)心他是否成功地到達了目的的主機,,IP層之下,是支持所有Linux網(wǎng)絡應用的網(wǎng)絡設備層,,例如點到點協(xié)議(Point to Point Protocol,,PPP)和以太網(wǎng)層。網(wǎng)絡設備并非總代表物理設備,,其中有一些(例如回送設備)則是純粹的軟件設備,,網(wǎng)絡設備與標準的Linux設備不同,他們不是通過Mknod命令創(chuàng)建的,,必須是底層軟件找到并進行了初始化之后,,這些設備才被創(chuàng)建并可用。因此只有當啟動了正確設置的以太網(wǎng)設備驅(qū)動程序的內(nèi)核后,,才會有/dev/eth0文件,,ARP協(xié)議位于IP層和支持地址解析的協(xié)議層之間。

3 網(wǎng)絡通信原理

所有的網(wǎng)絡通信就其實現(xiàn)技術(shù)可以分為兩種,,線路交換和包交換,,計算機網(wǎng)絡一般采用包交換,TCP使用了包交換通信技術(shù),,計算機網(wǎng)絡中所傳輸?shù)臄?shù)據(jù),,全部都以包(Packet)這個單位來發(fā)送,包由"報頭"和"報文"組成,,結(jié)構(gòu)如圖2所示,,在"報頭"中記載有發(fā)送主機地址,接收主機地址及與報文內(nèi)容相關(guān)的信息等,,在"報文"中記載有需要發(fā)送的數(shù)據(jù),,網(wǎng)絡中的每個主機和路由器中都有一個路由尋址表,,根據(jù)這個路由表,包就可以通過網(wǎng)絡傳送到相應的目的主機,。

  

  

網(wǎng)絡通信中的一個非常重要的概念就是套接字(Socket)[3,,4],簡單地說,,套接字就是網(wǎng)絡進程的ID,,網(wǎng)絡通信歸根到底是進程的通信,在網(wǎng)絡中,,每個節(jié)點有一個網(wǎng)絡地址(即IP地址),,兩個進程通信時,首先要確定各自所在網(wǎng)絡節(jié)點的網(wǎng)絡地址,,但是,,網(wǎng)絡地址只能確定進程所在的計算機,而一臺計算機上可能同時有多個網(wǎng)絡進程,,還不能確定到底是其中的哪個進程,,由此套接字中還要有其他的信息,那就是端口號(Port),,在一臺計算機中,,一個端口一次只能分配給一個進程,即端口號與進程是一一對應的關(guān)系,,所以,,端口號和網(wǎng)絡地址就能唯一地確定Internet中的一個網(wǎng)絡進程??梢哉J為:套接字=網(wǎng)絡地址+端口號

系統(tǒng)調(diào)用一個Socket()得到一個套接字描述符,,然后就可以通過他進行網(wǎng)絡通信了。

套接字有很多種類,,最常用的就有兩種,;流式套接字和數(shù)據(jù)報套接字。在Linux中分別稱之為"SOCK_STREAM"和"SOCK_DGRAM)"他們分別使用不同的協(xié)議,,流式套接字使用TCP協(xié)議,,數(shù)據(jù)報套接字使用UDP協(xié)議,本文所使用的是流式套接字協(xié)議,。

4 網(wǎng)絡通信原理在文件傳輸程序設計中的應用

網(wǎng)絡上的絕大多數(shù)通信采用的都是客戶機/服務器機制(Client/Server),,即服務器提供服務,客戶是這些服務的使用者,,服務器首先創(chuàng)建一個Socket,,然后將該Socket與本地地址/端口號綁定(Bind()),成功之后就在相應的Socket上監(jiān)聽(Listen()) ,。當Accept()函數(shù)捕捉到一個連接服務(Connect())請求時,,接受并生成一個新的Socket,并通過這個新的Socket與客戶端通信,,客戶端同樣也要創(chuàng)建一個Socket,將該Socket與本地地址/端口號綁定,,還需要指定服務器端的地址與端口號,,隨后向服務器端發(fā)出Connect(),請求被服務器端接受后,,可以通過Socket與服務器端通信,。

TCP是一種面向連接的、可靠的,、雙向的通信數(shù)據(jù)流,,說他可靠,是因為他使用3段握手協(xié)議傳輸數(shù)據(jù),,并且在傳輸時采用"重傳肯定確認"機制保證數(shù)據(jù)的正確發(fā)送:接收端收到的數(shù)據(jù)后要發(fā)出一個肯定確認,,而發(fā)送端必須要能接受到這個肯定信號,否則就要將數(shù)據(jù)重發(fā),。在此原理基礎之上,設計了基于Linux操作系統(tǒng)下TCP/IP編程實現(xiàn)文件傳輸?shù)膶嵗?。我們采用客戶機/服務器模式通信時,,通信雙方發(fā)送/接收數(shù)據(jù)的工作流程如圖3所示。

 

文件傳輸就是基于客戶機/服務器模型而設計的,,客戶機和服務器之間利用TCP建立連續(xù),,因文件傳輸是一個交互式會話系統(tǒng),客戶機每次執(zhí)行文件傳輸,,都需要與服務器建立控制連接和數(shù)據(jù)連接,,其中控制連接負責傳輸控制信息、利用控制命令,、客戶機可以向服務器提出無限次的請求,,客戶機每次提出的請求,服務器與客戶機建立一個數(shù)據(jù)連接,,進行實際的數(shù)據(jù)傳輸,,數(shù)據(jù)傳輸完畢后,對應的數(shù)據(jù)連接被清除,,控制連接依然保持,,等待客戶機發(fā)出新的傳輸請求,直到客戶機撤銷控制連接,,結(jié)束會話,。

當進行文件傳輸時,首先向服務器發(fā)出連接請求,,服務器驗證身份后,,與客戶端建立連接,,雙方進入會話狀態(tài),這時只要客戶端向服務器端發(fā)出數(shù)據(jù)連接請求,,建立起數(shù)據(jù)連接后,,雙方就進入數(shù)據(jù)傳輸狀態(tài),數(shù)據(jù)傳輸完畢后,,數(shù)據(jù)連接被撤銷,,如此循環(huán)反復,直到會話結(jié)束,,從而實現(xiàn)將文件從服務器端傳輸至客戶機端,。

5 文件傳輸程序設計流程[5,6]

5.1 客戶端的TCP應用程序流程

(1)先用Socket()創(chuàng)建本地套接口,,給服務器端套接口地址結(jié)構(gòu)賦值,。

(2)用Connect()函數(shù)使本地套接口向服務器端套接口發(fā)出建立連接請求,經(jīng)3次握手建立TCP連接,。

(3)用Read()函數(shù)讀取所要接收的文件名以及存放在內(nèi)存里的文件內(nèi)容,。

(4)用Open()函數(shù)打開客戶端新建立的目標文件,如果沒有建立,,該函數(shù)會自動生成目標文件,,等待存放文件內(nèi)容。

(5)最后用Write()函數(shù)將讀取的文件內(nèi)容存放在新的目標文件中,,以實現(xiàn)服務器端向客戶端的文件傳輸,。

(6)通信結(jié)束,用Close()關(guān)閉套接口,,停止接收文件,。

5.2 服務器端的TCP應用程序流程

(1)先用Open()函數(shù)打開等待傳輸?shù)目勺x文件;

(2)用Socket()創(chuàng)建套接口,,并給套接口地址結(jié)構(gòu)賦值,;

(3)用Bind()函數(shù)綁定套接口;

(4)用Listen()函數(shù)在該套接口上監(jiān)聽請求,;

(5)用Accept()函數(shù)接受請求,,產(chǎn)生新的套接口及描述字,并與客戶端連接,;

(6)用Lseek()函數(shù)是為了在每次接受客戶機連接時,,將用于讀的源文件指針移到文件頭;

(7)用Read()函數(shù)讀取一定長度的源文件數(shù)據(jù),;

(8)最后用Write()函數(shù)將讀取的源文件數(shù)據(jù)存放在內(nèi)存中,,以便客戶端讀取,;

(9)傳輸完畢時,,用Close()關(guān)閉所有進程,,結(jié)束文件傳輸。

在文件傳輸過程中,,很重要的一點是:當服務器端開始發(fā)送數(shù)據(jù)時,,客戶端要同時進行文件數(shù)據(jù)的接收。如果客戶端沒有運行,,服務器端會一直等待客戶端發(fā)送請求,,當服務器源文件發(fā)送完畢,則客戶端也將源文件的數(shù)據(jù)完全接收,,并生成新的目標文件,,從而實現(xiàn)文件的網(wǎng)絡通信。

6 結(jié)語

Linux操作系統(tǒng)在網(wǎng)絡應用方面具有很強的開發(fā)潛力,,同時Linux也是可靠性,、安全性非常高的系統(tǒng),因此在基于TCP/IP網(wǎng)絡通信的研究與開發(fā)中,,通常選用Linux操作系統(tǒng)作為開發(fā)平臺,。

    本文是介紹基于Linux操作系統(tǒng)下TCP/IP網(wǎng)絡通信的實際應用主要用于文件的網(wǎng)絡傳輸,解決了文件傳輸?shù)男蕟栴},,作為進一步完善,,可以在文件傳送的過程中,加入如身份驗證,、權(quán)限分配、文件加密等安全機制,,保證一些重要文件在傳送過程中不會出現(xiàn)泄密的情況,,該設計可廣泛應用企業(yè)辦公區(qū)域網(wǎng)中。

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。