花5分鐘瞭解一下linux套介面層

當初我學習linux套介面程式設計的時候,就有個疑問,要想編寫一個socket程式,首先得先呼叫socket函式,返回一個socket描述符,緊接著還有繫結埠和ip等,於是,我抽出時間,閱讀linux核心中的套介面的原始碼,才明白是怎麼回事,今天就把我學的東西與大家進行分享,當然一篇文章不能介紹所有的內容,我就一篇一篇的寫,給大家進行介紹,文章的更新,得看我的自由時間了,好了,開始吧。

現如今,套介面已經成為通用的網路程式設計的介面,大家所熟悉的作業系統,基本都支援套介面的網路程式設計,套介面之所以受到廣大的應用,是因為套介面它的設計,它幫我們遮蔽了底層的具體細節,應用程式無需關心底層的具體實現,而是藉助套介面層將應用程式的請求對映到具體的協議上,見下圖所示:

花5分鐘瞭解一下linux套介面層

圖1

從上圖我們知道,應用程式透過系統呼叫切換到核心空間,在核心空間呼叫套介面函式去處理應用程式的請求,具體呼叫TCP的介面還是UDP的介面,取決於套介面中的proto_ops中的函式。proto_ops的賦值取決於family。後續程式碼分析的時候會講到。

接下來我們看一看套介面層最核心的資料結構,socket:

花5分鐘瞭解一下linux套介面層

圖2

socket_state state:

這個變數用於表示套介面所處於的狀態,這些狀態僅僅對TCP有用。

花5分鐘瞭解一下linux套介面層

圖2

const struct proto_ops *ops:

指定了套介面對應的傳輸層型別的呼叫介面,用來將套介面對映到對應的傳輸層的實現,主要的型別如下:

花5分鐘瞭解一下linux套介面層

圖3

struct file *file:

儲存了與該套介面繫結的檔案結構,具體後續章節會講到。

從上述的介紹我們知道,struct proto_ops *ops這個資料結構是socket的核心的結構,因為透過它可以呼叫傳輸層的真正的實現。

而這種設計,恰恰是我們可以學習的,也是linux核心比較優秀的設計思想,這種遮蔽底層細節的設計,在未來的專案中,我們可以用到。