2

私が理解していることから、カーネル スタック (Tx パス上) によってソケット バッファー (skb) が割り当てられると、「ヘッド」ポインターと「テール」ポインターは、予約されたメモリ空間の開始と終了を指します。

私のqsは次のとおりです:この量を正確に決定するもの:(テール-ヘッド)オクテット? 最大MTUですか?少しの実験で、バイト数 (テールヘッド) が非常に小さい (320 バイトなど) 可能性があることが示されているため、そのようには見えません。ここで役割を果たすのはソケットアプリですか?

また、私の知る限り、アイデアは、プロトコルスタックのそれ以上の割り当てが必要ないように十分なメモリを予約することです。つまり、予約されたスペースはペイロードを超える可能性があります。もしそうなら、さらなるカプセル化が行われる場合 (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 に基づく ?

ティア!

4

1 に答える 1

2

最初に小さな修正 - バッファーは と の間headにありend、 ではありませんtail( とペアになっていdataます)。

あなたの基本的な考え方は正しいです。TCP は、必要なデータに加えて、下位層のヘッダー用のスペースに応じて割り当てます。これらのヘッダーは実際には事前にわかっていないため、TCP は可能な最大値に従って割り当てます (これは、実際に必要とされるよりもはるかに多くなる可能性が非常に高くなります)。

これで十分でない場合は、パケットを再割り当てできます (pskb_expand_head使用できます)。
ほとんどの場合、パケットにデータを追加するコードは、最初に十分なヘッドスペースがあるかどうかを確認し (そうであることが望ましい)、そうでない場合は再割り当てします。

「デフォルト」の MSS はそれほど重要ではありません。より適切な値が見つからない場合にのみ使用されます。通常、MSS は MTU-40 で、通常は 1460 です。

于 2012-06-24T13:24:09.743 に答える