私はLinuxでパケット転送の一部としてTCP / IPで使用されているバッファを見つけようとしました。読むほど、私は混乱します。以下に私の問題があります。誰かが私が理解するのを助けることができますか?
1) ドライバキューは、TCPの受信バッファと送信バッファと同様に、記述子がskbsを指すリングバッファとして実装されていますか?そうでない場合、TCPの受信/送信バッファはいつパケット転送に表示されますか?
2)TCP接続バックログキューは受け入れ/受信キューとは全く異なりますか?バックログキューはパケット転送のどこに適していますか?バックログキューは保留中の接続用のものであることを理解してください。
3)各ソケットにはTCP受信/送信バッファからデータを転送するための別々のバッファがありますか?
4)着信接続の正しいプロセスは何ですか? NIC - >カーネルリングバッファ(skb) - > IPスタック - > TCP受け入れ/受信バッファ - > Qdiscレイヤ - >接続用のソケットバッファ。
答え1
通常、ネットワークドライバには独自のキューがあり、Linuxではパケットがsk_buffに格納され、キューに入ります。これは、カーネルパケット処理に関する限り、最も重要な構造です。このバッファ(sk_buff)には、現在TCP、IPv4 / IPv6などのヘッダへのポインタが含まれています。
TCPバックログは、TCPステータスを処理し、再組み立てするパケットをバッファリングするstruct sockによって処理されます。
一般に、最も重要な構造はsk_bufとsockであると言いたいと思います。カーネルのソースコードに加えて、このリンクをチェックするのが役立ちます。
https://ops.tips/blog/how-linux-tcp-introspection/
http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html
それがあなたに役立つことを願っています