socket編程原理(一)

出處:老頑童網站
 

 

UNIX系統的I/O命令集,是從Maltics和早期系統中的命令演變出來的,其模式爲打開一讀/寫一關閉(open-write-read-close)。在一個用戶進程進行I/O操作時,它首先調用"打開"獲得對指定文件或設備的使用權,並返回稱爲文件描述符的整型數,以描述用戶在打開的文件或設備上進行I/O操作的進程。然後這個用戶進程多次調用"讀/寫"以傳輸數據。當所有的傳輸操作完成後,用戶進程關閉調用,通知操作系統已經完成了對某對象的使用。 
    TCP/IP協議被集成到UNIX內核中時,相當於在UNIX系統引入了一種新型的I/O操作。UNIX用戶進程與網絡協議的交互作用比用戶進程與傳統的I/O設備相互作用複雜得多。首先,進行網絡操作的兩個進程在不同機器上,如何建立它們之間的聯繫?其次,網絡協議存在多種,如何建立一種通用機制以支持多種協議?這些都是網絡應用編程界面所要解決的問題。
    在UNIX系統中,網絡應用編程界面有兩類:UNIX BSD的套接字(socket)和UNIX System V的TLI。由於Sun公司採用了支持TCP/IP的UNIX BSD操作系統,使TCP/IP的應用有更大的發展,其網絡應用編程界面──套接字(socket)在網絡軟件中被廣泛應用,至今已引進微機操作系統DOS和Windows系統中,成爲開發網絡應用軟件的強有力工具,本章將要詳細討論這個問題。
2.2 套接字編程基本概念
在開始使用套接字編程之前,首先必須建立以下概念。
2.2.1 網間進程通信
    進程通信的概念最初來源於單機系統。由於每個進程都在自己的地址範圍內運行,爲保證兩個相互通信的進程之間既互不干擾又協調一致工作,操作系統爲進程通信提供了相應設施,如UNIX BSD中的管道(pipe)、命名管道(named pipe)和軟中斷信號(signal),UNIX system V的消息(message)、共享存儲區(shared memory)和信號量(semaphore)等,但都僅限於用在本機進程之間通信。網間進程通信要解決的是不同主機進程間的相互通信問題(可把同機進程通信看作是其中的特例)。爲此,首先要解決的是網間進程標識問題。同一主機上,不同進程可用進程號(process ID)唯一標識。但在網絡環境下,各主機獨立分配的進程號不能唯一標識該進程。例如,主機A賦於某進程號5,在B機中也可以存在5號進程,因此,"5號進程"這句話就沒有意義了。
    其次,操作系統支持的網絡協議衆多,不同協議的工作方式不同,地址格式也不同。因此,網間進程通信還要解決多重協議的識別問題。
    爲了解決上述問題,TCP/IP協議引入了下列幾個概念。
端口
    網絡中可以被命名和尋址的通信端口,是操作系統可分配的一種資源。
    按照OSI七層協議的描述,傳輸層與網絡層在功能上的最大區別是傳輸層提供進程通信能力。從這個意義上講,網絡通信的最終地址就不僅僅是主機地址了,還包括可以描述進程的某種標識符。爲此,TCP/IP協議提出了協議端口(protocol port,簡稱端口)的概念,用於標識通信的進程。
    端口是一種抽象的軟件結構(包括一些數據結構和I/O緩衝區)。應用程序(即進程)通過系統調用與某端口建立連接(binding)後,傳輸層傳給該端口的數據都被相應進程所接收,相應進程發給傳輸層的數據都通過該端口輸出。在TCP/IP協議的實現中,端口操作類似於一般的I/O操作,進程獲取一個端口,相當於獲取本地唯一的I/O文件,可以用一般的讀寫原語訪問之。
    類似於文件描述符,每個端口都擁有一個叫端口號(port number)的整數型標識符,用於區別不同端口。由於TCP/IP傳輸層的兩個協議TCP和UDP是完全獨立的兩個軟件模塊,因此各自的端口號也相互獨立,如TCP有一個255號端口,UDP也可以有一個255號端口,二者並不衝突。
    端口號的分配是一個重要問題。有兩種基本分配方式:第一種叫全局分配,這是一種集中控制方式,由一個公認的中央機構根據用戶需要進行統一分配,並將結果公佈於衆。第二種是本地分配,又稱動態連接,即進程需要訪問傳輸層服務時,向本地操作系統提出申請,操作系統返回一個本地唯一的端口號,進程再通過合適的系統調用將自己與該端口號聯繫起來(綁紮)。TCP/IP端口號的分配中綜合了上述兩種方式。TCP/IP將端口號分爲兩部分,少量的作爲保留端口,以全局方式分配給服務進程。因此,每一個標準服務器都擁有一個全局公認的端口(即周知口,well-known port),即使在不同機器上,其端口號也相同。剩餘的爲自由端口,以本地方式進行分配。TCP和UDP均規定,小於256的端口號才能作保留端口。
地址
    網絡通信中通信的兩個進程分別在不同的機器上。在互連網絡中,兩臺機器可能位於不同的網絡,這些網絡通過網絡互連設備(網關,網橋,路由器等)連接。因此需要三級尋址:
1. 某一主機可與多個網絡相連,必須指定一特定網絡地址;
2. 網絡上每一臺主機應有其唯一的地址;
3. 每一主機上的每一進程應有在該主機上的唯一標識符。
    通常主機地址由網絡ID和主機ID組成,在TCP/IP協議中用32位整數值表示;TCP和UDP均使用16位端口號標識用戶進程。
網絡字節順序
    不同的計算機存放多字節值的順序不同,有的機器在起始地址存放低位字節(低價先存),有的存高位字節(高價先存)。爲保證數據的正確性,在網絡協議中須指定網絡字節順序。TCP/IP協議使用16位整數和32位整數的高價先存格式,它們均含在協議頭文件中。
連接
    兩個進程間的通信鏈路稱爲連接。連接在內部表現爲一些緩衝區和一組協議機制,在外部表現出比無連接高的可靠性。
半相關
    綜上所述,網絡中用一個三元組可以在全局唯一標誌一個進程:
    (協議,本地地址,本地端口號)
    這樣一個三元組,叫做一個半相關(half-association),它指定連接的每半部分。
全相關
    一個完整的網間進程通信需要由兩個進程組成,並且只能使用同一種高層協議。也就是說,不可能通信的一端用TCP協議,而另一端用UDP協議。因此一個完整的網間通信需要一個五元組來標識:
   &

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章