作業系統中,通常會為應用程式提供一組應用程式介面(API),稱為Socket API。應用程式可以通過Socket API來使用網路Socket以進行資料交換。最早的Socket介面來自於4.2 BSD,因此現代常見的Socket API大多源自Berkeley Sockets標準。在Socket API中,以IP位址及通訊埠組成Socket位址。遠端的Socket位址以及原生的Socket位址完成連線後,再加上使用的協定(protocol),這個五元組(five-element tuple)作為Socket對(socket pairs),之後就可以彼此交換資料。作業系統根據Socket位址,可以決定應該將資料送達特定的行程或執行緒。這就像是電話系統中,以電話號碼加上分機號碼,來決定通話物件一般。
系統內部介面(內部網路),介面描述符(抽象介面描述符)和介面位址之間差別其實很細微,一般編寫程式時幾乎不做區別。詳細的網路介面有下面幾種特徵:
本機介面位址,由本機ip位址和通訊埠號
傳輸協定,例如TCP、UDP、raw IP協定等等,如果只是指定IP位址,那麼TCP 53與UDP 53不是一個介面。
一個已經建立連接的介面雙方都有整數形式的介面描述符,用來唯一表示該介面。作業系統根據對方介面發過來的IP以及傳輸協定標投資訊來提取介面的位址資訊,並且將封包數據去除標頭資訊之後提交給相應的應用程式。
簡言之,Socket網路通訊指的是網路上的兩個程式通過一個雙向的通訊連線實現資料傳輸,連線的一端稱為一個socket,建立網路通訊連線至少要一對socket。一般使用上的Socket通訊主要分成兩種,其中一個是 "Stream Socket"(串流式 Socket),而另一個是 "Datagram Socket"(訊息式 Socket)
其中Stream socket 是可靠的、雙向連接的通信串流。若你以 "1、2" 的順序將兩個項目輸出到 socket,它們在另一端則會以 "1、2" 的順序抵達。而且不會出錯。如Telnet、HTTP都需要這種高品質解穩定正確的傳輸,它們用便是所謂的 "The Transmission Control Protocol"(傳輸控制協定,請見 RFC 791[7]),就是很常聽說的TCP協定。
Datagram sockets 也使用 IP 進行路由遶送,不過它們不用 TCP而是使用 UDP協定,User Datagram Protocol(使用者資料包協定,請見 RFC 768 [8])。這跟使用 stream socket時不同,系統不用維護一個開啟的連線,應用程式只需建立封包並且給它一個 IP標頭與目的資訊,不需要與對方建立連線只需要送出封包,只要對方有開啟通訊埠監聽便能接收封包,不過在這種通訊情況下,即便對方沒有接收也不會有資訊通知發送方。通常用 datagram socket 的時機是在需要快速傳輸而且部分封包遺失不會造成什麼重大事故時。這類應用程式的例子有:tftp(trivial file transfer protocol,簡易檔案傳輸協定),多人遊戲、串流音樂、影像會議等。
而本司的精準定位封包便是使用UDP協定的Socket通訊,因為定位過程中會發送快速且大量的定位封包,對於大部分定位應用而言缺失一兩個定位封包並不影響監控結果,因為每個定位位置都是相對獨立,在極短的時間內缺少數個定位資訊並不會造成資訊損失。當然,如果建立的監控系統是需要快速移動物件的軌跡錄,那就可能會需要更為穩定通訊傳輸方式。
以下是IBM提供的Socket連接典型流程圖:
1. socket() API 會創建一個溝通端點並且回傳這個端點的描述符。
2. 當應用程式取得描述符後會綁定一個socket唯一名稱,只有綁定為名稱後服務端才能從網路訪問。
3. The listen() API表示監聽並允許其他人連接,但是不會主動進行socket連接,而服務端監聽的前提是必須先使用bind() API綁定名稱。
4. 客戶端程式會使用connect() API 來與服務端進行socket連接。
5. 服務端使用 accept() API來接受客戶端的連接請求。
6. 當建立socket連接後既可雅此用各種存取函式來進行通訊。
7. 當服務端或是客戶端想終止連線時,只需要調用close()API來釋放socket連接的所有資源即可。
請注意,socket連接並不存在通訊分層的分類,這只是一個提供應用層與傳輸層/網路層的通訊界面,其關係如下圖所示:
另外,一般而言在網路配置上不會允許內部網路與安全性較低萬部網路連接,但是使用socket連接卻可以讓服務端與低安全性系統通訊。
以下簡單說明UDP與TCP的通訊格式,有下圖可以了解UDP與TCP位於網路模型中的傳輸層,該層的協定為應用行程提供端到端的通訊服務,提供面向連接的資料流支援、可靠性、流量控制、多路復用等服務。
其中TCP的通訊格式較為複雜,因為TCP屬於可靠式傳輸,因此很多欄位是用來驗證傳輸資料的可靠性,相對傳輸速度會比UDP緩慢
下圖為TCP的連接驗證示意圖
下圖為UDP的通訊格式,相對而言簡單很多,只有來源IP、目的IP、資料長度與檢查碼