Linux 實際按照 TCP/IP 模型,實現了網絡協議棧。服務器
網絡包在每一層的處理邏輯,都取決於各層採用的網絡協議。處理過程就是不斷拆包,封包的過程。網絡
咱們從上到下來看這個網絡棧,你能夠發現,數據結構
當一個網絡幀到達網卡後,網卡會經過 DMA
方式,把這個網絡包放到收包隊列中;而後經過硬中斷
,告訴中斷處理程序已經收到了網絡包。接着,網卡中斷處理程序會爲網絡幀分配內核數據結構(sk_buff),並將其拷貝到 sk_buff 緩衝區中;而後再經過軟中斷,通知內核收到了新的網絡幀。併發
接下來,內核協議棧從緩衝區中取出網絡幀,並經過網絡協議棧,從下到上逐層處理這個網絡幀。ide
網絡包的發送流程瞭解網絡包的接收流程後,就很容易理解網絡包的發送流程。網絡包的發送流程就是上圖的右半部分,很容易發現,網絡包的發送方向,正好跟接收方向相反。性能
首先,應用程序調用 Socket API(好比 sendmsg)發送網絡包。code
因爲這是一個系統調用,因此會陷入到內核態的套接字層中。套接字層會把數據包放到 Socket 發送緩衝區中。blog
接下來,網絡協議棧從 Socket 發送緩衝區中,取出數據包;再按照 TCP/IP 棧,從上到下逐層處理。好比,傳輸層和網絡層,分別爲其增長 TCP 頭和 IP 頭,執行路由查找確認下一跳的 IP,並按照 MTU 大小進行分片。接口
分片後的網絡包,再送到網絡接口層,進行物理地址尋址,以找到下一跳的 MAC 地址。而後添加幀頭和幀尾,放到發包隊列中。這一切完成後,會有軟中斷通知驅動程序:發包隊列中有新的網絡幀須要發送。隊列
帶寬,表示鏈路的最大傳輸速率,單位一般爲 b/s (比特 / 秒)。
吞吐量,表示單位時間內成功傳輸的數據量,單位一般爲 b/s(比特 / 秒)或者 B/s(字節 / 秒)。吞吐量受帶寬限制,而吞吐量 / 帶寬,也就是該網絡的使用率。
延時,表示從網絡請求發出後,一直到收到遠端響應,所須要的時間延遲。在不一樣場景中,這一指標可能會有不一樣含義。好比,它能夠表示,創建鏈接須要的時間(好比 TCP 握手延時),或一個數據包往返所需的時間(好比 RTT)。
除了這些指標,網絡的可用性(網絡可否正常通訊)、併發鏈接數(TCP 鏈接數量)、丟包率(丟包百分比)、重傳率(從新傳輸的網絡包比例)等也是經常使用的性能指標。