關于linux網絡相關的基礎知識點,最熱的兩個就是socket和epoll,接下來我就用最簡單的方式把他倆說清楚便于大家理解!
Socket 是一種進程間通信的方法,它允許位于同一主機(計算機)或使用網絡連接起來的不同主機上的應用程序之間交換數據。
Socket起源于Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open> 讀寫write/read > 關閉close”模式來操作。Socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉)
當有客戶端連接服務端時,服務端 Socket 文件中會寫入這個客戶端 Socket 的文件描述符。進程可以通過 accept() 方法,從服務端 Socket 文件中讀出客戶端的 Socket 文件描述符,從而拿到客戶端的 Socket 文件。
程序猿實現一個網絡服務器的時候,會先手動去創建一個服務端 Socket 文件。服務端的 Socket 文件依然會存在操作系統內核之中,并且會綁定到某個 IP 地址和端口上。以后凡是發送到這臺機器、目標 IP 地址和端口號的連接請求,在形成了客戶端 Socket 文件之后,文件的文件描述符都會被寫入到服務端的 Socket 文件中。
應用只要調用 accept 方法,就可以拿到這些客戶端的 Socket 文件描述符,這樣服務端的應用就可以方便地知道有哪些客戶端連接了進來。而每個客戶端對這個應用而言,都是一個文件描述符。如果需要讀取某個客戶端的數據,就讀取這個客戶端對應的 Socket 文件。如果要向某個特定的客戶端發送數據,就寫入這個客戶端的 Socket 文件。
與 socket 的交互,最核心的場景就是網絡 IO 的處理, epoll 會協助我們高效完成。我們新建立一個網絡 socket 的時候,交給 epoll 就可以了,當網絡 IO 有數據到來時它會通知我們,當我們要往網絡 IO 寫數據時,epoll 也會自動幫我們發送,本質上epoll實現了IO 多路復用。
Epoll數據結構如下:
· rbr:被 epoll 所管理的所有 socket 都存儲在紅黑樹中。
· rdllist:存儲著所有就緒的 socket(所謂"就緒",意思指有網絡數據到來,或者有數據要發送出去。)
就緒列表是 epoll 能夠高效的核心,對于每一個就緒的 socket,會直接放入 rdllist 中,epoll_wait 獲取到就緒的 socket 時,直接從 rdllist 中進行獲取就可以了,無需再進行查找。epoll 是基于事件回調機制地,當 epoll 所管理地 socket 有數據到來時,會觸發事件回調函數,將就緒的 socket 放置在 rdllist 中,并且通知 epoll_wait 所在的進程來處理數據。epoll的優點如下:
除了epoll,內核還提供了select和poll,但是二者效率較差,這里就不再進行介紹了。
不同的客戶端與服務端通信通過Socket實現,而epoll使得通信變更加高效!
本文鏈接:http://www.tebozhan.com/showinfo-26-5179-0.html五分鐘幫您理解Linux網絡核心知識點——Socket和Epoll
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: CSS 漸變中的顏色空間和色相插值
下一篇: SpringBoot3基礎用法