[轉帖]Linux核心原始碼分析分享專題

济南小老虎發表於2024-05-24
https://heapdump.cn/monographic/detail/41/4591445

巡山小汪

當今網際網路中的大千世界都駐足於TCP/IP協議之上。而透過Socket操作TCP/IP協議已經成為了事實上的標準,Socket甚至已經成為了網路程式設計的同義詞。當然了,由於我們早已習慣於各種封裝/框架,很少裸用Socket,所以對它的理解始終有一種模糊的感覺。
image1.png
今天,我就來介紹一下Socket。

Socket

socket在網路程式設計中被翻譯為套接字。它的本意是插座,把它用來表示網路通訊的介面確實很貼切。你看,兩個需要通訊的機器把他們的線纜插上插座(Socket),就可以通訊了。

image2.png

Socket處於程式設計的什麼位置

socket在程式設計師看來其實就是一個操作網路的API,應用程式透過Socket來和核心層面的tcp/ip等例程進行互動,最後由網路卡發到整個網路上。

image3.png
當然了,Socket不僅僅是TCP的API,UDP、IP甚至其它一些協議也用Socket來操作。由於它是個普遍的標準,所以基本一切可供應用層使用的協議API都和Socket有關。

平常的Socket都用到哪

一般應用裡面只要和別人通訊,都需要socket。無論是http、dubbo還是jdbc,林林總總,有通訊的地方都有socket。

image4.png

為什麼Socket這麼流行

為什麼Socket這麼流行,已經成為了網路程式設計的同義詞呢?其實就是由於其提供了非常簡潔的介面。除了開啟方式稍稍有些複雜之外,其它和讀檔案一樣,只需要read/write即可。
image5.png

Socket和連線之間的關係

一對相互通訊的socket就組成了我們天天掛在嘴邊的連線,一般(本端ip:port,協議,對端ip:port)組成一個唯一的連線。
image6.png

Client端socket以及Server端socket

就TCP來說,Socket分為Client端和Server端兩種。就以一個簡單的Java時間伺服器為例

看下,程式碼的編寫方法。

image7.png
這邊client端採用的是短連線的方式連線server端,而server端用的是單執行緒處理socket的方式。採用的都是最簡單的方案。其中有一個細節,如果需要讓socket.read返回-1,那麼對端的socket必須shutdown或者close才行。下圖就是我們的處理流程:
image8.png

上面的程式碼筆者放在碼雲上面,有需要的同學可以去碼雲下載

git clone https://gitee.com/alchemystar/zero

總結

Socket由於其簡潔的API被廣泛使用,到現在已經成為了網路程式設計的同義詞。正是由於其簡潔性和易用性,在我們程式猿的手上演化出各種複雜的用法(阻塞/非阻塞,短連線/長連線,超時…),後面筆者會一一道來。

相關文章