新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于Linux操作系統(tǒng)下的TCP/IP網(wǎng)絡(luò)通信研究與應(yīng)用

基于Linux操作系統(tǒng)下的TCP/IP網(wǎng)絡(luò)通信研究與應(yīng)用

——
作者:高翊宇,馬林華,南秦博 (空軍工程大學(xué) 工程學(xué)院 陜西 西安 710038) 時間:2007-01-26 來源:《現(xiàn)代電子技術(shù)》 收藏

1 引言

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

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

2 tcp/ip協(xié)議概述

tcp/ip即傳輸控制協(xié)議/網(wǎng)絡(luò)協(xié)議[1](transmission control protocol/internet protocol),是一個由多種協(xié)議組成的協(xié)議族,他定義了計算機通過網(wǎng)絡(luò)互相通信及協(xié)議族各層次之間通信的規(guī)范,圖1描述了linux對ip協(xié)議族的實現(xiàn)機制[2]。

本文引用地址:http://m.butianyuan.cn/article/21539.htm

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

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

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

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

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

套接字=網(wǎng)絡(luò)地址+端口號

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

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

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

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

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

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

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

5 文件傳輸程序設(shè)計流程[5,6]

5.1 客戶端的tcp應(yīng)用程序流程

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

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

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

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

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

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

5.2 服務(wù)器端的tcp應(yīng)用程序流程

(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)存中,以便客戶端讀?。?br>
(9)傳輸完畢時,用close()關(guān)閉所有進(jìn)程,結(jié)束文件傳輸。

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

6 結(jié)語

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

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



關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉