花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內核比較優秀的設計思想,這種屏蔽底層細節的設計,在未來的項目中,我們可以用到。


分享到:


相關文章: