引言:TCP分段的必要性
在TCP/IP協議棧中,MSS(最大分段大小) 限制了單次傳輸的數據量。當應用層發送的數據超過當前路徑的MSS時,內核必須執行分段操作。tcp_fragment
函數正是Linux內核中處理TCP分段的核心機制,它巧妙地在協議合規性、內存安全和性能效率之間取得平衡。
一、函數全景:TCP分段的四步核心流程
1. 安全驗證階段
if (WARN_ON(len > skb->len)) return -EINVAL; if (unlikely((sk->sk_wmem_queued >> 1) > sk->sk_sndbuf)) {NET_INC_STATS(..., LINUX_MIB_TCPWQUEUETOOBIG);return -ENOMEM; }
-
長度校驗:確保請求的分割位置不超過數據包長度
-
內存安全閘門:檢測發送隊列內存占用是否超過緩沖區的2倍
-
觸發條件:
sk_wmem_queued > 2 * sk_sndbuf
-
關鍵保護:返回
-ENOMEM
阻止可能的內存耗盡
</
-