根據連接啓動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分爲三個步驟:服務器監聽,客戶端請求,連接確認。
服務器監聽:是服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態。
Socket套接字簡介
1 Socket套接字
Socket套接字由遠景研究規劃局(Advanced Research Projects Agency, ARPA)資助加里福尼亞大學伯克利分校的一個研究組研發。其目的是將TCP/IP協議相關軟件移植到UNIX類系統中。設計者開發了一個接口,以便應用程序能簡單地調用該接口通信。這個接口不斷完善,最終形成了Socket套接字。Linux系統採用了Socket套接字,因此,Socket接口就被廣泛使用,到現在已經成爲事實上的標準。與套接字相關的函數被包含在頭文件sys/socket.h中。
2 Socket套接字簡介
Socket的英文原意是"插座",作爲類UNIX系統的進程通信機制,它如同插座一樣方便的幫助計算機接入互聯網通信。
任何用戶在通信之前,首先要先申請一個Socket號,Socket號相當於自己的電話號碼。同時要知道對方的電話號碼,相當於對方有一個Socket。然後向對方撥號呼叫,相當於發出連接請求(假如對方不在同一區內,還要撥對方區號,相當於給出網絡地址)。對方假如在場並空閒(相當於通信的另一主機開機且可以接受連接請求),拿起電話話筒,雙方就可以正式通話,相當於連接成功。雙方通話的過程,是向電話機發出信號和從電話機接受信號的過程,相當於Socket發送數據和從Socket接受數據。通話結束後,一方掛起電話機,相當於關閉Socket,撤銷連接。
由此可見,Socket的通信機制與電話交換機制非常相似。Socket實質上提供了進程通信的端點。進程通信之前,雙方首先必須各自創建一個端點,否則是沒有辦法建立聯繫並相互通信的。每一個Socket都用一個半相關描述。
- {協議,本地地址,本地端口}。
一個完整的Socket則用一個相關描述:
- {協議,本地地址,本地端口,遠程地址,遠程端口}。
每一個Socket有一個本地的唯一Socket號,由操作系統分配。套接字有3種類型:流式套接字(SOCK_STREAM)、數據包套接字(SOCK_DGRAM)和原始套接字。流式套接字可以提供可靠的、面向連接的通信流。如果通過流式套接字發送了順序的數據:1、2。那麼數據到達遠程時候的順序也是1、2。流式套接字可用於Telnet遠程連接、WWW服務等需要使數據順序傳遞的應用,它使用TCP協議保證數據傳輸的可靠性。流式套接字的工作原理如圖18.9所示,我們將網絡中的兩臺主機分別作爲服務器和客戶機看待。
數據包套接字定義了一種無連接的服務,數據通過相互獨立的報文進行傳輸,是無序的,並且不保證可靠性。數據包套接字使用者數據包協議UDP,數據只是簡單地傳送到對方。數據包套接字的工作原理如圖18.10所示。
(點擊查看大圖)圖18.9 流式套接字的工作原理 |
(點擊查看大圖)圖18.10 數據套接字的工作原理 |