接收數據過程

網絡收發過程中,內核通過中斷跟網卡進行交互。

網卡硬中斷隻處理最核心的網卡數據讀取或發送,而協議棧中的大部分邏輯,都會放到軟中斷中處理。

1 當一個網絡幀到達網卡後,網卡會通過 DMA 方式,把這個網絡包放到收包隊列中;然後通過硬中斷,告訴中斷處理程序已經收到瞭網絡包。2 接著,網卡中斷處理程序會為網絡幀分配內核數據結構(sk_buff),並將其拷貝到sk_buff 緩沖區中;然後再通過軟中斷,通知內核收到瞭新的網絡幀。3 接下來,內核協議棧從緩沖區中取出網絡幀,並通過網絡協議棧,從下到上逐層處理這個網絡幀。過程如下:

  1. 在鏈路層檢查報文的合法性,找出上層協議的類型(比如IPV4還是IPv6),再去掉幀頭、幀尾,然後交給網絡層。
  2. 網絡層取出IP頭,判斷網絡包下一步的走向,比如是交給上層處理還是轉發。當網絡層確認這個包是要發送到本機後,就會取出上層協議的類型(比如TCP還是UDP),去掉IP頭,再交給傳輸層處理。
  3. 傳輸層取出TCP頭或者UDP頭後,根據<源IP、源端口、目的IP、目的端口>四元組作為標識,找出對應的 Socket,並把數據拷貝到 Socket 的接收緩存中。

最後,應用程序就可以使用 Socket 接口,讀取到新接收到的數據瞭。

發送數據過程

由於這是一個系統調用,所以會陷入到內核態的套接字層中。套接字層會把數據包放到Socket 發送緩沖區中。接下來,網絡協議棧從 Socket 發送緩沖區中,取出數據包;再按照 TCP/IP 棧,從上到下逐層處理。比如,傳輸層和網絡層,分別為其增加 TCP 頭和 IP 頭,執行路由查找確認下一跳的 IP,並按照 MTU 大小進行分片。分片後的網絡包,再送到網絡接口層,進行物理地址尋址,以找到下一跳的 MAC 地址。然後添加幀頭和幀尾,放到發包隊列中。這一切完成後,會有軟中斷通知驅動程序:發包隊列中有新的網絡幀需要發送。最後,驅動程序通過 DMA ,從發包隊列中讀出網絡幀,並通過物理網卡把它發送出去。

網絡指標

帶寬,表示鏈路的最大傳輸速率,單位通常為 b/s (比特 / 秒)。

吞吐量,表示單位時間內成功傳輸的數據量,單位通常為 b/s(比特 / 秒)或者 B/s(字節 / 秒)。吞吐量受帶寬限制,而吞吐量 / 帶寬,也就是該網絡的使用率。

延時,表示從網絡請求發出後,一直到收到遠端響應,所需要的時間延遲

除瞭這些指標,網絡的可用性(網絡能否正常通信)、並發連接數(TCP連接數量)、丟包率(丟包百分比)、重傳率(重新傳輸的網絡包比例)等也是常用的性能指標。

ifconfig命令

766d63b9813843d2cac99a0e58799f84

rx表示接受,tx表示發送

errors 表示發生錯誤的數據包數,比如校驗錯誤、幀同步錯誤等;

dropped 表示丟棄的數據包數,即數據包已經收到瞭 Ring Buffer,但因為內存不足等原因丟包;

overruns 表示超限數據包數,即網絡 I/O 速度過快,導致 Ring Buffer 中的數據包來不及處理(隊列滿)而導致的丟包;

carrier 表示發生 carrirer 錯誤的數據包數,比如雙工模式不匹配、物理電纜出現問題等;

collisions 表示碰撞數據包數。

當套接字處於連接狀態(Established)時,

Recv-Q表示套接字緩沖還沒有被應用程序取走的字節數(即接收隊列長度)。

而 Send-Q表示還沒有被遠端主機確認的字節數(即發送隊列長度)。

當套接字處於監聽狀態(Listening)時,

Recv-Q表示syn backlog的當前值。

而Send-Q表示最大的syn backlog值。

而 syn backlog是TCP協議棧中的半連接隊列長度,相應的也有一個全連接隊列(accept queue),它們都是維護 TCP狀態的重要機制。

ping命令

sar命令

ss命令

netstat命令

疑問:select,poll,epoll 的區別

TODO

iperf 測試吞吐量

iperf 和 netperf 都是最常用的網絡性能測試工具,測試 TCP 和 UDP 的吞吐量。它們都以客戶端和服務器通信的方式,測試一段時間內的平均吞吐量

e85a3fa6ff202b417dcd22fa010505fca1f0ff0234e61741af5bf4e23ef293be

ab命令+wrk命令

優化思路

1 從網絡 I/O 的角度

2 從線程的工作模型

3 應用層的網絡協議優化:長連接取代短連接,緩存不常變化的數據,可以降低網絡 I/O 次數,壓縮網絡 I/O 的數據量,減少 DNS 解析的延遲

套接字內核選項列表