Socket底層探究與實現——理論篇
學過網路程式設計的人都知道Socket這個東西,Socket又稱伯克利Socket,是網路通訊中很重要的一環
我們都知道不論是C, C++, C#, java等等語言,要想進行網路程式設計,Socket是必不可少的重要環節,例項化Socket,繫結,連線,監聽,傳送,接收,當然啦,還有非同步Socket,但是流程都是一樣的。
但是如何去自己實現一個Socket呢?我們都知道Socket承擔著網路通訊的基礎,那麼Socket又是如何與遠端進行通訊呢?
說起Socket的實現,不得不去說TCP/IP協議,如果說Socket是網路程式設計的底層的話,那麼TCP/IP協議就是網路通訊的底層,當然,如果追根溯源,可能會牽扯到網路驅動程式,那就是硬體層面了。
TCP/IP協議又是什麼呢?TCP/IP協議就是計算機之間進行網路互動的一種協議,通俗的講,就是一種規則,一種演算法。計算機A通過這套演算法可以與其他計算機進行通訊,計算機A上面的一個應用程式C可以呼叫TCP/IP API向計算機B上面的應用程式D傳送資料,而Socket簡單理解就是對TCP/IP API進行的封裝(雖然遠遠不止對TCP/IP API的封裝,還有對其他協議的封裝)
TCP/IP協議包括兩部分,一部分是TCP/IP的報文規定,也就是TCP/IP的資料結構;另一部分就是TCP/IP的傳輸規定,也就是TCP/IP怎麼傳輸資料,報文怎麼發,發多少,多少次握手之類的。
說了這麼多,其實我們也不難看出,實現Socket大致有這麼幾步(假設只封裝TCP/IP協議):
第一步,使用特定語言依照協議定義TCP/IP報文的資料結構
第二步,使用特定語言依照協議提供TCP/IP的傳輸方法,比如監聽,繫結,連線
第三步,呼叫底層網路驅動程式完成所需的網路操作
也就是說,實現一個Socket需要有呼叫底層驅動程式的能力,而這樣的能力只有C語言具備並能夠發揮很好的效能(組合語言更好,只是書寫起來比較困難),至於說那些高階語言是如何做到上述幾點,有很大機率是呼叫C語言的程式碼