2012-06-23 53 views
2

據我所知,當內核棧(在Tx路徑上)分配一個套接字緩衝區(skb)時,'head'和'tail'指針指向保留內存空間的起始端&。分配給待傳輸數據包skb的空間數量究竟如何確定和分配?

我的問題是:究竟是什麼決定了這個數量:(尾 - 頭)八位組? 是最大MTU嗎?似乎並不像一點點的實驗表明,字節數(tail-head)可能非常小(320字節等)。那麼在這裏扮演角色的套接字應用程序呢?另外,AFAIK的想法是預留足夠的內存,使得在協議棧下面不需要進一步的分配,即保留的空間可以大於有效載荷。如果是這樣,那麼進一步封裝(如VoIP,SSL等)的情況呢?

更新: 這是否有助於回答問題?

  1. 在net /的IPv4/tcp_output.c實測值:

    ... tcp_make_synack() {... SKB = sock_wmalloc(SK,MAX_TCP_HEADER + 15 + s_data_desired,1,GFP_ATOMIC) ; ... }

這似乎是TCP狀態M/C的SYN-ACK的一部分。 所以,通過這種方式,「大小」似乎摸出周圍320

  1. TCP分段的數據包.. 默認的「MSS」是512? < - 基於tcp_base_mss?

TIA!

回答

2

小校正第一 - 緩衝區之間headend,不tail(其與data配對)。

你的基本想法是正確的。 TCP根據它需要的數據進行分配,併爲低層報頭提供空間。由於這些頭文件並不是事先知道的,所以TCP根據最大可能分配(這很可能比實際需要的多得多)。

如果結果不夠,可重新分配數據包(可使用pskb_expand_head)。
在大多數情況下,向數據包添加數據的代碼首先檢查是否有足夠的頂部空間(希望是這種情況),如果不是,則重新分配數據。

「默認」MSS並不重要 - 只有在沒有找到更好的值時纔會使用。通常情況下,MSS將是MTU-40,通常是1460.

+0

謝謝你! 什麼是MTU-40? – kaiwan

+0

接口的MTU(1500)減去40。 – ugoren