一種基于Linux的TCP/IP編程實(shí)現文件傳輸實(shí)例
1 引言
本文引用地址:http://dyxdggzs.com/article/247105.htmLinux 是一種自由的Unix類(lèi)多用戶(hù),多任務(wù)的操作系統,可在運行在Intel 80386及更高檔次的PC機、ARMS、MIPS和PowerPC等多種計算機平臺,已成為應用廣泛、可靠性高、功能強大的計算機操作系統,Linux 具有內核小、效率高、源代碼開(kāi)放等優(yōu)點(diǎn),還內含了TCP/IP網(wǎng)絡(luò )協(xié)議,很適合在服務(wù)器領(lǐng)域使用,而服務(wù)器主要用途之一就是進(jìn)行網(wǎng)絡(luò )通信,隨著(zhù)計算機辦公自動(dòng)化處理技術(shù)的應用與推廣,網(wǎng)絡(luò )的不斷普及,傳統的紙張式文件傳輸方式已經(jīng)不再適合發(fā)展的需要,人們更期待一種便捷、高效、環(huán)保、安全的網(wǎng)絡(luò )傳輸方式。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
本文就是考慮到這一現狀,結合基于Linux操作系統下的TCP/IP網(wǎng)絡(luò )通信原理,給出了一種基于TCP/IP編程實(shí)現文件傳輸的實(shí)例,因此,TCP/IP網(wǎng)絡(luò )通信研究具有十分重要的意義。
2 TCP/IP協(xié)議概述
TCP/IP即傳輸控制協(xié)議/網(wǎng)絡(luò )協(xié)議[1](Transmission Control Protocol/Internet Protocol),是一個(gè)由多種協(xié)議組成的協(xié)議族,他定義了計算機通過(guò)網(wǎng)絡(luò )互相通信及協(xié)議族各層次之間通信的規范,圖1描述了Linux對IP協(xié)議族的實(shí)現機制[2]。

Linux支持BSD的套接字和全部的TCP/IP協(xié)議,是通過(guò)網(wǎng)絡(luò )協(xié)議將其視為一組相連的軟件層來(lái)實(shí)現的,BSD套接字(BSD Socket)由通用的套接字管理軟件支持,該軟件是INET套接字層,用來(lái)管理基于IP的TCP與UDP端口到端口的互聯(lián)問(wèn)題,從協(xié)議分層來(lái)看,IP是網(wǎng)絡(luò )層協(xié)議,TCP是一個(gè)可靠的端口到端口的傳輸層協(xié)議,他是利用IP層進(jìn)行傳接報文的,同時(shí)也是面向連接的,通過(guò)建立一條虛擬電路在不同的網(wǎng)路間傳輸報文,保證所傳輸報文的無(wú)丟失性和無(wú)重復性。用戶(hù)數據報文協(xié)議(User Datagram Protocol,UDP)也是利用IP層傳輸報文,但他是一個(gè)非面向連接的傳輸層協(xié)議,利用IP層傳輸報文時(shí),當目的方網(wǎng)際協(xié)議層收到IP報文后,必須識別出該報文所使用的上層協(xié)議(即傳輸層協(xié)議),因此,在IP報頭上中,設有一個(gè)"協(xié)議"域(Protocol)。通過(guò)該域的值,即可判明其上層協(xié)議類(lèi)型,傳輸層與網(wǎng)絡(luò )層在功能說(shuō)的最大區別是前者提供進(jìn)程通信能力,而后者則不能,在進(jìn)程通信的意義上,網(wǎng)絡(luò )通信的最終地址不僅僅是主機地址,還包括可以描述進(jìn)程的某種標識符,為此,TCP/UDP提出了協(xié)議端口(Protocol Port)的概念,用于標識通信的進(jìn)程,例如,Web服務(wù)器進(jìn)程通常使用端口80,在/etc/services文件中有這些注冊了的端口地址。
對于TCP傳輸,傳輸節點(diǎn)間先要建立連接,然后通過(guò)該連接傳輸已排好序的報文,以保證傳輸的正確性,IP層中的代碼用于實(shí)現網(wǎng)際協(xié)議,這些代碼將 IP頭增加到傳輸數據中,同時(shí)也把收到的IP報文正確的傳送到TCP層或UDP層。TCP是一個(gè)面向連接協(xié)議,而UDP則是一個(gè)非面向連接協(xié)議,當一個(gè) UDP報文發(fā)送出去后,Linux并不知道也不去關(guān)心他是否成功地到達了目的的主機,IP層之下,是支持所有Linux網(wǎng)絡(luò )應用的網(wǎng)絡(luò )設備層,例如點(diǎn)到點(diǎn)協(xié)議(Point to Point Protocol,PPP)和以太網(wǎng)層。網(wǎng)絡(luò )設備并非總代表物理設備,其中有一些(例如回送設備)則是純粹的軟件設備,網(wǎng)絡(luò )設備與標準的Linux設備不同,他們不是通過(guò)Mknod命令創(chuàng )建的,必須是底層軟件找到并進(jìn)行了初始化之后,這些設備才被創(chuàng )建并可用。因此只有當啟動(dòng)了正確設置的以太網(wǎng)設備驅動(dòng)程序的內核后,才會(huì )有/dev/eth0文件,ARP協(xié)議位于IP層和支持地址解析的協(xié)議層之間。
3 網(wǎng)絡(luò )通信原理
所有的網(wǎng)絡(luò )通信就其實(shí)現技術(shù)可以分為兩種,線(xiàn)路交換和包交換,計算機網(wǎng)絡(luò )一般采用包交換,TCP使用了包交換通信技術(shù),計算機網(wǎng)絡(luò )中所傳輸的數據,全部都以包(Packet)這個(gè)單位來(lái)發(fā)送,包由"報頭"和"報文"組成,結構如圖2所示,在"報頭"中記載有發(fā)送主機地址,接收主機地址及與報文內容相關(guān)的信息等,在"報文"中記載有需要發(fā)送的數據,網(wǎng)絡(luò )中的每個(gè)主機和路由器中都有一個(gè)路由尋址表,根據這個(gè)路由表,包就可以通過(guò)網(wǎng)絡(luò )傳送到相應的目的主機。

網(wǎng)絡(luò )通信中的一個(gè)非常重要的概念就是套接字(Socket)[3,4],簡(jiǎn)單地說(shuō),套接字就是網(wǎng)絡(luò )進(jìn)程的ID,網(wǎng)絡(luò )通信歸根到底是進(jìn)程的通信,在網(wǎng)絡(luò )中,每個(gè)節點(diǎn)有一個(gè)網(wǎng)絡(luò )地址(即IP地址),兩個(gè)進(jìn)程通信時(shí),首先要確定各自所在網(wǎng)絡(luò )節點(diǎn)的網(wǎng)絡(luò )地址,但是,網(wǎng)絡(luò )地址只能確定進(jìn)程所在的計算機,而一臺計算機上可能同時(shí)有多個(gè)網(wǎng)絡(luò )進(jìn)程,還不能確定到底是其中的哪個(gè)進(jìn)程,由此套接字中還要有其他的信息,那就是端口號(Port),在一臺計算機中,一個(gè)端口一次只能分配給一個(gè)進(jìn)程,即端口號與進(jìn)程是一一對應的關(guān)系,所以,端口號和網(wǎng)絡(luò )地址就能唯一地確定Internet中的一個(gè)網(wǎng)絡(luò )進(jìn)程??梢哉J為:套接字= 網(wǎng)絡(luò )地址+端口號
系統調用一個(gè)Socket()得到一個(gè)套接字描述符,然后就可以通過(guò)他進(jìn)行網(wǎng)絡(luò )通信了。
套接字有很多種類(lèi),最常用的就有兩種;流式套接字和數據報套接字。在Linux中分別稱(chēng)之為"SOCK_STREAM"和"SOCK_DGRAM)"他們分別使用不同的協(xié)議,流式套接字使用TCP協(xié)議,數據報套接字使用UDP協(xié)議,本文所使用的是流式套接字協(xié)議。
4 網(wǎng)絡(luò )通信原理在文件傳輸程序設計中的應用
網(wǎng)絡(luò )上的絕大多數通信采用的都是客戶(hù)機/服務(wù)器機制(Client/Server),即服務(wù)器提供服務(wù),客戶(hù)是這些服務(wù)的使用者,服務(wù)器首先創(chuàng )建一個(gè)Socket,然后將該Socket與本地地址/端口號綁定(Bind()),成功之后就在相應的Socket上監聽(tīng)(Listen()) 。當Accept()函數捕捉到一個(gè)連接服務(wù)(Connect())請求時(shí),接受并生成一個(gè)新的Socket,并通過(guò)這個(gè)新的Socket與客戶(hù)端通信,客戶(hù)端同樣也要創(chuàng )建一個(gè)Socket,將該Socket與本地地址/端口號綁定,還需要指定服務(wù)器端的地址與端口號,隨后向服務(wù)器端發(fā)出 Connect(),請求被服務(wù)器端接受后,可以通過(guò)Socket與服務(wù)器端通信。
TCP是一種面向連接的、可靠的、雙向的通信數據流,說(shuō)他可靠,是因為他使用3段握手協(xié)議傳輸數據,并且在傳輸時(shí)采用"重傳肯定確認"機制保證數據的正確發(fā)送:接收端收到的數據后要發(fā)出一個(gè)肯定確認,而發(fā)送端必須要能接受到這個(gè)肯定信號,否則就要將數據重發(fā)。在此原理基礎之上,設計了基于Linux 操作系統下TCP/IP編程實(shí)現文件傳輸的實(shí)例。我們采用客戶(hù)機/服務(wù)器模式通信時(shí),通信雙方發(fā)送/接收數據的工作流程如圖3所示。

文件傳輸就是基于客戶(hù)機/服務(wù)器模型而設計的,客戶(hù)機和服務(wù)器之間利用TCP建立連續,因文件傳輸是一個(gè)交互式會(huì )話(huà)系統,客戶(hù)機每次執行文件傳輸,都需要與服務(wù)器建立控制連接和數據連接,其中控制連接負責傳輸控制信息、利用控制命令、客戶(hù)機可以向服務(wù)器提出無(wú)限次的請求,客戶(hù)機每次提出的請求,服務(wù)器與客戶(hù)機建立一個(gè)數據連接,進(jìn)行實(shí)際的數據傳輸,數據傳輸完畢后,對應的數據連接被清除,控制連接依然保持,等待客戶(hù)機發(fā)出新的傳輸請求,直到客戶(hù)機撤銷(xiāo)控制連接,結束會(huì )話(huà)。
當進(jìn)行文件傳輸時(shí),首先向服務(wù)器發(fā)出連接請求,服務(wù)器驗證身份后,與客戶(hù)端建立連接,雙方進(jìn)入會(huì )話(huà)狀態(tài),這時(shí)只要客戶(hù)端向服務(wù)器端發(fā)出數據連接請求,建立起數據連接后,雙方就進(jìn)入數據傳輸狀態(tài),數據傳輸完畢后,數據連接被撤銷(xiāo),如此循環(huán)反復,直到會(huì )話(huà)結束,從而實(shí)現將文件從服務(wù)器端傳輸至客戶(hù)機端。
5 文件傳輸程序設計流程[5,6]
5.1 客戶(hù)端的TCP應用程序流程
(1)先用Socket()創(chuàng )建本地套接口,給服務(wù)器端套接口地址結構賦值。
(2)用Connect()函數使本地套接口向服務(wù)器端套接口發(fā)出建立連接請求,經(jīng)3次握手建立TCP連接。
(3)用Read()函數讀取所要接收的文件名以及存放在內存里的文件內容。
(4)用Open()函數打開(kāi)客戶(hù)端新建立的目標文件,如果沒(méi)有建立,該函數會(huì )自動(dòng)生成目標文件,等待存放文件內容。
(5)最后用Write()函數將讀取的文件內容存放在新的目標文件中,以實(shí)現服務(wù)器端向客戶(hù)端的文件傳輸。
(6)通信結束,用Close()關(guān)閉套接口,停止接收文件。
5.2 服務(wù)器端的TCP應用程序流程
(1)先用Open()函數打開(kāi)等待傳輸的可讀文件;
(2)用Socket()創(chuàng )建套接口,并給套接口地址結構賦值;
(3)用Bind()函數綁定套接口;
(4)用Listen()函數在該套接口上監聽(tīng)請求;
(5)用Accept()函數接受請求,產(chǎn)生新的套接口及描述字,并與客戶(hù)端連接;
(6)用Lseek()函數是為了在每次接受客戶(hù)機連接時(shí),將用于讀的源文件指針移到文件頭;
(7)用Read()函數讀取一定長(cháng)度的源文件數據;
(8)最后用Write()函數將讀取的源文件數據存放在內存中,以便客戶(hù)端讀取;
(9)傳輸完畢時(shí),用Close()關(guān)閉所有進(jìn)程,結束文件傳輸。
在文件傳輸過(guò)程中,很重要的一點(diǎn)是:當服務(wù)器端開(kāi)始發(fā)送數據時(shí),客戶(hù)端要同時(shí)進(jìn)行文件數據的接收。如果客戶(hù)端沒(méi)有運行,服務(wù)器端會(huì )一直等待客戶(hù)端發(fā)送請求,當服務(wù)器源文件發(fā)送完畢,則客戶(hù)端也將源文件的數據完全接收,并生成新的目標文件,從而實(shí)現文件的網(wǎng)絡(luò )通信。
6 結語(yǔ)
Linux操作系統在網(wǎng)絡(luò )應用方面具有很強的開(kāi)發(fā)潛力,同時(shí)Linux也是可靠性、安全性非常高的系統,因此在基于TCP/IP網(wǎng)絡(luò )通信的研究與開(kāi)發(fā)中,通常選用Linux操作系統作為開(kāi)發(fā)平臺。
本文是介紹基于Linux操作系統下TCP/IP網(wǎng)絡(luò )通信的實(shí)際應用主要用于文件的網(wǎng)絡(luò )傳輸,解決了文件傳輸的效率問(wèn)題,作為進(jìn)一步完善,可以在文件傳送的過(guò)程中,加入如身份驗證、權限分配、文件加密等安全機制,保證一些重要文件在傳送過(guò)程中不會(huì )出現泄密的情況,該設計可廣泛應用企業(yè)辦公區域網(wǎng)中。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)移動(dòng)電源相關(guān)文章:移動(dòng)電源是什么
linux相關(guān)文章:linux教程
路由器相關(guān)文章:路由器工作原理
tcp/ip相關(guān)文章:tcp/ip是什么
路由器相關(guān)文章:路由器工作原理
評論