網絡數據在計算機內部的發送和接收處理(網絡數據在計算機內部的發送和接收處理方式)
在高級語言中一般會使用類似HttpClient、TcpClient、UdpClient等封裝好的API進行數據的發送和接收,它們的底層都是基于Socket,而Socket又是基于操作系統內核的TCP/IP協議棧,TCP/IP協議處理平常就很難接觸到了,再往下內核和網卡又是怎么交互的呢?
這篇文章就來介紹網絡數據在計算機內部的發送和接收處理過程。
先來看一張示意圖,左側是數據的發送處理,右側是數據的接收處理,下邊會按照步驟進行說明。
數據發送
1、應用程序從內存讀取要發送的數據。這里的內存是應用程序進程管理的內存,也可稱為用戶空間內存。
2、應用程序通過Socket接口將讀取到的數據發送到內核協議棧進行處理。
3、內核中的TCP/IP協議棧接收到Socket傳遞過來的數據,進行TCP、IP打包,最終以IP數據包的格式寫入到內核空間的一塊緩存中。數據包寫入后會觸發一個軟中斷,通知底層模塊來讀取數據。
4、網卡中的DMA單元讀取這些要發送的數據,然后發送到網卡的數據鏈路層和物理層,最終發送到網絡中進行傳輸。
5、DMA讀取數據完畢后,會向CPU發送一個中斷,觸發清理內核空間中的發送數據緩存,以便下一次發送處理。
數據接收
1、網卡中的DMA從數據鏈路層接收到數據,然后寫入到內核空間的一塊緩存中。
2、緩存寫入完畢后會發送一個CPU中斷,觸發程序讀取緩存,并發送到內核協議棧。
3、內核中的TCP/IP協議棧對接收到的數據進行解包,去掉IP協議頭、TCP協議頭,然后繼續向上傳遞數據。
4、應用程序通過Socket接口讀取數據,這時讀取到的數據就是發送方發出來的數據了。
5、然后應用將這些數據寫入到自己的進程內存中,供進一步使用。
圖中的線條和步驟主要描述了數據的流轉,并沒有提供控制邏輯和尋址邏輯的說明,比如DMA向內存寫數據需要獲取對應的內存地址,以及申請總線通道用來傳輸數據到內存。