理解Socket

Socket的概念

什麼是Socket?很多博客總結的不到位。這裏做一個全面的解釋。

基本原理的角度來看,Socket起源於Unix,Unix/Linux基本哲學之一就是“一切皆文件”,Socket是一種"打開—讀/寫—關閉"模式的實現,可以被認爲是服務器和客戶端各自維護的一種特殊文件,在建立連接打開後,可以向自己文件寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉文件。

進程通信的角度來看,Socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象爲幾個簡單的接口供應用層調用已實現進程在網絡中通信。還可以認爲,Socket是進程通訊的一種方式,即調用這個網絡庫的一些API函數實現分佈在不同主機的相關進程之間的數據交換。


Socket通信流程

網絡中不同主機的進程能夠通信的基本前提是什麼?

對於本地進程通訊,可以使用PID來唯一標示一個進程,但PID只在本地唯一,但網絡中的兩個進程PID衝突機率很大,這時候用一個三元組可以在全局唯一標誌一個進程:

(協議,本地地址,本地端口號)

這樣一個三元組,叫做一個半相關,它指定連接的每半部分。


順便提一下半相關和全相關:

半相關:是一個三元組(協議,本地網絡地址,端口號);在全局中唯一地標示一個進程;socket就是半相關描述;

全相關:是一個五元組(協議,本地網絡地址,本地端口號,遠端網絡地址,遠端端口號),在網際中唯一地標示一次通信。


有了這個基本前提,就可以實現進程間跨網絡通信。

前面提到過,Socket本質上可以被理解爲"打開—讀/寫—關閉"模式的實現,Socket提供的函數接口對應於這些操作。

關於每個函數具體的解析就不介紹了,這裏只看Server端和Client端調用函數實現通信的過程。

從TCP連接的視角看Socket通信流程,如下圖所示:

 


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