電腦網路與連結技術第五章 傳輸層 上一頁    下一頁

5-5  傳輸服務元件

 

傳輸服務元件』(Transport Service Element)是讓使用者(或應用程式)來存取傳輸服務的介面。傳輸服務與網路服務之間的相異如下:網路服務是用來模式化真實網路所提供的服務,然而傳輸服務是提供一個與實際網路無關的抽象環境,讓使用者來連接。真實網路上會有封包遺失與封包錯誤的現象,因此網路服務通常都不太可靠;但傳輸服務主要訴求在於脫離真實網路環境,並提供一個抽象化的系統介面,讓使用者直接存取而無須理會真實環境。亦即在較不可靠的網路環境上,提供一個可靠的介面服務。至於如何提供可靠的傳輸介面,如錯誤偵出、連線管理、資料遺失、或資料重複等等問題,乃是傳輸層的主要功能。

正因如此,使用者連接傳輸服務介面時,無須考慮網路上可能發生的各種情況,以及網路的架構為何。傳輸服務元件好比是一般作業系統中的系統呼叫(System Call)一樣,其處理方式也如同『程序與程序間通訊』(Process-to-process communication的運作方式。對使用者而言,其『不知道也不需要知道網路的存在,或網路上資源的存取方式』。網路上的傳輸服務元件多半大同小異,我們以柏克萊(BerkeleyUnix系統的TCP協定為例,其服務元件如下:

  • socket()產生新的通訊端點。當使用者呼叫 socket() 程式介面時,會產生一個新的端點(或稱傳輸埠口),亦表示已完成建立連線。socket() 參數裡描述所使用的位址格式,和希望連線的服務型式。成功的 socket() 呼叫會回傳一個普通檔案描述子(file identify);接下來,透過網路存取資源就如同在本身電腦上存取檔案一樣,都是針對這個檔案描述子來做存取的動作。Socket() 呼叫方式和開啟檔案的 open() 介面程式完全一樣。

  • bind()銜接一個存取位址(TCP 埠口號碼)。socket() 呼叫成功後,只配置記憶體空間,並未連接到傳輸層的存取點。在 TCP 協定的存取點稱之為埠口(port);我們可以利用 bind() 服務元件呼叫,將 socket() 所產生的端點銜接到(attach)到某一個空閒的埠口以後就可以利用這個埠口和遠端使用者通訊,通訊模式就用類似管道(pipe)的方式,見圖 5-7 所示。

5-7 傳輸鏈路

  • listen()宣告願意接受連結。當使用者呼叫 listen() 程式時,傳輸層會配置記憶體空間作為對方要求連線時存放訊息的佇列,並傳回訊息給呼叫端。

  • accept()接收呼叫,直到對方嘗試連線到達為止。當 listen() 呼叫後,表示已準備好接收訊息。接收訊息以 accept() 程式呼叫來完成,呼叫後該程序(process)會進入等待狀態,直到對方要求連線訊息到達。

  • connect()主動嘗試建立連線。當使用者呼叫 bind() 後,希望主動建立與遠端之間的連線,可呼叫 connect() 程式介面來達成。

  • send()透過連結傳送資料。傳輸層之間的連線就像管道(pipe)一樣,當使用者以 send() 傳送資料,就如將資料填入管道內。管道內能夠存放資料多寡取決於 listen() 呼叫時所配置的空間。

  • receive()透過連結接收資料。

  • close()釋放連結。

使用者可直接透過檔案描述子(socket())來執行傳送與接收(send()/receive())的動作,當執行 send() 時,是將資料傳送緩衝器內,而緩衝器以先進先出(First-in First-out, FIFO)的佇列排列,網路層再依序傳送到網路上;接收端收到資料後,也依照 FIFO 佇列的順序排列於接收緩衝器上,等待使用者以 receive() 呼叫來索取。如以抽象資料型態來觀察,雙方通訊的動作就如同管道(pipe)連線一樣,如圖 5-7 所示。又從另一個觀點來看,當傳送端到將資料寫入管道時,並不表示資料已發送到網路上,而如何發送到網路上,是依照作業系統的排序順序來決定;由接收端而言,當執行一個 receive() 呼叫時,是由接收緩衝器上讀取一份資料,但此時緩衝器不一定會有資料可讀取,因此也可能發生等待的現象,到底是否要等待也是由作業系統(或應用程式)來決定。

翻轉工作室:粘添壽

 

電腦網路與連結技術:

 

 

翻轉電子書系列: