TCP/IP 協定與 Internet 網路:第七章 傳輸層協定 上一頁 下一頁
7-6 TCP 程式介面
既然程式設計師可以透過傳輸埠口連結到應用程式,而不用理會網路所連結型態,這也表示傳輸層介面是和網際層的關係是獨立性的,因此,傳輸層必須提供程式介面讓使用者銜接。使用者也可透過程式介面來開發網路應用程式,在網路系統上有兩個介面標準:Socket 和 TLI(Transport Layer Interface),但 Internet 網路的應用層協定大多建立在 Socket 介面上,我們在第十章有詳細介紹 Socket 開發程式的範例,至於 TLI 介面在 Internet 網路上較少應用,讀者如欲更瞭解 TLI 的運作原理,請參考有關書籍(或附錄上參考書目)。以下就針對這兩個標準作簡單的介紹。
7-6-1 Socket 程式介面
Socket 是一種『應用程式介面』(Application Program Interface, API),它是由一組稱為『Socket Library』的庫存函數所構成,它提供開發各式各樣應用程式的工具,程式設計師只要透過介面程式來編寫應用程式,就不需要去考慮網路是如何實現出來的。就如一般作業系統上的『系統呼叫』(System Call)程式一樣。程式設計者只要呼叫 open() 介面程式,而給予適當的參數(parameter),它便會指定到磁碟機或其他週邊設備上,亦可存取到所需的資料,而無需考慮到磁碟機和其他週邊設備如何驅動馬達和磁軌。
『插座』(Socket)的概念是希望提供一標準介面,來銜接一般應用程式,也就是說,提供一個網路和程式之間的標準介面,只要應用程式合乎 Socket 的介面標準(也就是系統呼叫的參數),便可安然無恙的連接到網路,而不用理會網路實際的連接型態。這種觀念就好像我們一般電話『插座』一樣,只要合乎插座內的配線裝置,就可以連結到電話系統,甚至可撥接電話到任何地方,而不用理會電話系統實體上是如何安裝及跨接。
Socket 為了提高程式設計的方便性,將各種功能呼叫程式製作成庫存函數,並可載入系統核心,讓使用者編寫網路應用程式,就如一般檔案系統一樣,以下簡略介紹一般較常用的 Socket 功能呼叫:
(1) socket():開啟 Socket 通訊服務點。
(2) bind():對 socket() 定址,連結至相對應的 TCP 或 UDP 埠口。
(3) listen():設定 socket 為等待狀態,等待 Client 端要求連線。
(4) connect():要求和對方通訊端(socket)連線。
(5) accept():接受對方(socket)連線要求。
(6) write():將資料寫入連線中的 socket,傳送到通訊對方。
(7) read():由連線的 socket() 中讀取資料。
(8) close():釋放 socket,中斷連線。
圖 7-21 是利用 Socket 功能呼叫所開發之檔案伺服器的主從式架構,此型態是連接導向方式,一般都必須使用 TCP 連線。首先 Server 端利用 socket()、bind() 連結到通訊傳輸埠口(TCP 埠口),而以 listen() 進入聆聽狀態,並以 accept() 等待對方連線要求。Client 端可以用 connect() 要求連線,連線後雙方以 read() 或 write() 來接收或傳送資料,並以 close() 功能呼叫來結束雙方的通訊。
圖 7-21 利用 Socket 發展程式範例
7-6-2 TLI 程式介面
『傳輸層介面』(Transport Layer Interface, TLI)最早是在 Unix System V 3.0 版本中出現,而是作為 OSI 通訊協定的傳輸層介面標準。TLI 介面和 Socket 介面最大的不同點是,Socket Library 中所提供的功能呼叫,如 read()、write() 都屬於 Unix 的『系統呼叫』(System Call),而是屬於作業系統的一部份,也就是說,Socket 介面是包含在 Unix 的核心程式之內。而 TLI 僅是一個介面程式,使用者必須將 TLI Library 和所發展的程式連結(Link)在一起,才可以產生執行檔。TLI 介面在執行時,必須透過 Unix 的 Stream I/O 介面(請參考 Unix 作業系統)才可以和傳輸層作溝通。
雖然 Socket 和 TLI 介面在實現方面有所不同,但它們的目的都是一致的,也是網路應用程式和網路下層之間的標準介面,讓使用者不用理會網路實際的連結型態,便可開發網路應用程式。TLI Library 也提供一系列的標準功能呼叫,以下我們列出一些較常用的介面程式:
(1) t_open():開啟 TLI 通訊端點。
(2) t_bind():對通訊端點定址到 TCP 或 UDP 傳輸埠口。
(3) t-alloc():配置記憶體佔用空間。
(4) t_listen():設定通訊端點為聆聽(Listen)狀態。
(5) t_connect():要求對方連線。
(6) t_accept():接受對方連線要求。
(7) t_snd():連接導向的傳送資料。
(8) t_rcv():連接導向的接收資料。
(9) t_close():結束通訊連線。
圖 7-22 為利用 TLI 發展一個檔案伺服器的主從式架構,此型態也是連接導向方式(TCP 連線)。首先,Server 端利用 t_open() 和 t_bind() 開啟一個通訊端點,並連結到 TCP 傳輸埠口上,再載入記憶體空間內(t_alloc())執行,緊接著,呼叫 t_listen() 來等待 Client 端連線要求。Client 端也連結到通訊端點後,以 t_connect() 向 Server 端要求連線。Server 端收到連線訊號後,以 accept() 呼叫得知連線對方的位址。爾後雙方以 t_snd() 與 t_rcv() 互相傳送與接收資料。
圖 7-22 利用 TLI 發展程式範例