當前位置:
首頁 > 最新 > 網路數據傳輸時經歷了哪些buffer

網路數據傳輸時經歷了哪些buffer

作者:駿馬金龍

鏈接:http://www.cnblogs.com/f-ck-need-u/

碼農有道作了部分修改

碼農有道

打算用一篇文章介紹I/O模型,在引入IO模型前,本文先對io等待時某一段數據的"經歷"做一番解釋。如圖:

當某個進程/線程(後文將不加區分的只認為是進程)需要某段數據時,它只能在用戶空間中屬於它自己的內存中訪問、修改,這段內存暫且稱之為app buffer(用戶緩衝區)。

假設需要的數據在磁碟上,那麼進程首先得發起相關係統調用,通知內核去載入磁碟上的文件。但正常情況下,數據只能載入到內核的緩衝區,暫且稱之為kernel buffer。數據載入到kernel buffer之後,還需將數據複製到app buffer。到了這裡,進程就可以對數據進行訪問、修改了。

現在有幾個需要說明的問題。

為什麼不能直接將數據載入到app buffer呢?

實際上是可以的,有些程序或者硬體為了提高效率和性能,可以實現內核旁路的功能,避過內核的參與,直接在存儲設備和app buffer之間進行數據傳輸,例如RDMA技術就需要實現這樣的內核旁路功能。

但是,最普通也是絕大多數的情況下,為了安全和穩定性,數據必須先拷入內核空間的kernel buffer,再複製到app buffer。

上面提到的數據幾次拷貝過程,拷貝方式是一樣的嗎?

不一樣。現在的存儲設備(包括網卡)基本上都支持DMA操作。什麼是DMA(direct memory access,直接內存訪問)?簡單地說,就是內存和設備之間的數據交互可以直接傳輸,不再需要計算機的CPU參與,而是通過硬體上的晶元(可以簡單地認為是一個小cpu)進行控制。

假設,存儲設備不支持DMA,那麼數據在內存和存儲設備之間的傳輸,必須通過計算機的CPU計算從哪個地址中獲取數據、拷入到對方的哪些地址、拷入多少數據(多少個數據塊、數據塊在哪裡)等等,僅僅完成一次數據傳輸,CPU都要做很多事情。而DMA就釋放了計算機的CPU,讓它可以去處理其他任務。

再說kernel buffer和app buffer之間的複製方式,這是兩段內存空間的數據傳輸,只能由CPU來控制。

所以,在載入硬碟數據到kernel buffer的過程是DMA拷貝方式,而從kernel buffer到app buffer的過程是CPU參與的拷貝方式。

如果數據要通過TCP連接傳輸出去要怎麼辦?

例如,web服務對客戶端的響應數據,需要通過TCP連接傳輸給客戶端。

TCP/IP協議棧維護著兩個緩衝區:send buffer和recv buffer,它們合稱為socket buffer。需要通過TCP連接傳輸出去的數據,需要先複製到send buffer,再複製給網卡通過網路傳輸出去。如果通過TCP連接接收到數據,數據首先通過網卡進入recv buffer,再被複制到用戶空間的app buffer。

同樣,在數據複製到send buffer或從recv buffer複製到app buffer時,是CPU參與的拷貝。從send buffer複製到網卡或從網卡複製到recv buffer時,是DMA操作方式的拷貝。

如下圖所示,是通過TCP連接傳輸數據時的過程。

網路數據一定要從kernel buffer複製到app buffer再複製到send buffer嗎?

不是。如果進程不需要修改數據,就直接發送給TCP連接的另一端,可以不用從kernel buffer複製到app buffer,而是直接複製到send buffer。這就是零複製技術。

例如httpd不需要訪問和修改任何信息時,將數據原原本本地複製到app buffer再原原本本地複製到send buffer然後傳輸出去,但實際上複製到app buffer的過程是可以省略的。使用零複製技術,就可以減少一次拷貝過程,提升效率。

當然,實現零複製技術的方法有多種,後面會有一篇專門總結零複製的文章

以下是以httpd進程處理文件類請求時比較完整的數據操作流程。

大致解釋下:客戶端發起對某個文件的請求,通過TCP連接,請求數據進入TCP 的recv buffer,再通過recv()函數將數據讀入到app buffer,此時httpd工作進程對數據進行一番解析,知道請求的是某個文件,於是發起某個系統調用(例如要讀取這個文件,發起read()),於是內核載入該文件,數據從磁碟複製到kernel buffer再複製到app buffer,此時httpd就要開始構建響應數據了,可能會對數據進行一番修改,例如在響應首部中加一個欄位,最後將修改或未修改的數據複製(例如send()函數)到send buffer中,再通過TCP連接傳輸給客戶端。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 碼農有道 的精彩文章:

判斷一個單鏈表是否有環及環入口

TAG:碼農有道 |