新聞中心
關(guān)于linux網(wǎng)絡(luò)相關(guān)的基礎(chǔ)知識點,最熱的兩個就是socket和epoll,接下來我就用最簡單的方式把他倆說清楚便于大家理解!

創(chuàng)新互聯(lián)公司始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達10多年累計超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)推廣解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:木屋等企業(yè),備受客戶表揚。
Socket
Socket 是一種進程間通信的方法,它允許位于同一主機(計算機)或使用網(wǎng)絡(luò)連接起來的不同主機上的應(yīng)用程序之間交換數(shù)據(jù)。
Socket起源于Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open> 讀寫write/read > 關(guān)閉close”模式來操作。Socket就是該模式的一個實現(xiàn),socket即是一種特殊的文件,一些socket函數(shù)就是對其進行的操作(讀/寫IO、打開、關(guān)閉)
Socket實現(xiàn)細節(jié)
當有客戶端連接服務(wù)端時,服務(wù)端 Socket 文件中會寫入這個客戶端 Socket 的文件描述符。進程可以通過 accept() 方法,從服務(wù)端 Socket 文件中讀出客戶端的 Socket 文件描述符,從而拿到客戶端的 Socket 文件。
程序猿實現(xiàn)一個網(wǎng)絡(luò)服務(wù)器的時候,會先手動去創(chuàng)建一個服務(wù)端 Socket 文件。服務(wù)端的 Socket 文件依然會存在操作系統(tǒng)內(nèi)核之中,并且會綁定到某個 IP 地址和端口上。以后凡是發(fā)送到這臺機器、目標 IP 地址和端口號的連接請求,在形成了客戶端 Socket 文件之后,文件的文件描述符都會被寫入到服務(wù)端的 Socket 文件中。
應(yīng)用只要調(diào)用 accept 方法,就可以拿到這些客戶端的 Socket 文件描述符,這樣服務(wù)端的應(yīng)用就可以方便地知道有哪些客戶端連接了進來。而每個客戶端對這個應(yīng)用而言,都是一個文件描述符。如果需要讀取某個客戶端的數(shù)據(jù),就讀取這個客戶端對應(yīng)的 Socket 文件。如果要向某個特定的客戶端發(fā)送數(shù)據(jù),就寫入這個客戶端的 Socket 文件。
epoll
與 socket 的交互,最核心的場景就是網(wǎng)絡(luò) IO 的處理, epoll 會協(xié)助我們高效完成。我們新建立一個網(wǎng)絡(luò) socket 的時候,交給 epoll 就可以了,當網(wǎng)絡(luò) IO 有數(shù)據(jù)到來時它會通知我們,當我們要往網(wǎng)絡(luò) IO 寫數(shù)據(jù)時,epoll 也會自動幫我們發(fā)送,本質(zhì)上epoll實現(xiàn)了IO 多路復(fù)用。
Epoll數(shù)據(jù)結(jié)構(gòu)如下:
· rbr:被 epoll 所管理的所有 socket 都存儲在紅黑樹中。
· rdllist:存儲著所有就緒的 socket(所謂"就緒",意思指有網(wǎng)絡(luò)數(shù)據(jù)到來,或者有數(shù)據(jù)要發(fā)送出去。)
就緒列表是 epoll 能夠高效的核心,對于每一個就緒的 socket,會直接放入 rdllist 中,epoll_wait 獲取到就緒的 socket 時,直接從 rdllist 中進行獲取就可以了,無需再進行查找。epoll 是基于事件回調(diào)機制地,當 epoll 所管理地 socket 有數(shù)據(jù)到來時,會觸發(fā)事件回調(diào)函數(shù),將就緒的 socket 放置在 rdllist 中,并且通知 epoll_wait 所在的進程來處理數(shù)據(jù)。epoll的優(yōu)點如下:
- 支持海量并發(fā)連接。
- 使用時間復(fù)雜度為 O(logn)的紅黑樹管理所有的 socket。
- 提高 CPU 的使用率,高效地使用 CPU 時間片處理所管理的 socket 連接。
- 基于事件回調(diào)機制處理消息,而不是主動輪詢機制。
除了epoll,內(nèi)核還提供了select和poll,但是二者效率較差,這里就不再進行介紹了。
最后的總結(jié)
不同的客戶端與服務(wù)端通信通過Socket實現(xiàn),而epoll使得通信變更加高效!
分享題目:五分鐘幫您理解Linux網(wǎng)絡(luò)核心知識點——Socket和Epoll
URL鏈接:http://m.5511xx.com/article/djjehgd.html


咨詢
建站咨詢
