[グラフィックLinux] [ネットワークスタックシリーズ]:ネットワークパッケージからアプリケーションへのデータフロー

在这里插入图片描述

ネットワークカードからプロトコルスタック境界までの処理:

在这里插入图片描述

データパケットの受け入れプロセス

データパケットの受信は、ネットワークカードドライバー、システムカーネルスペース、最後にユーザースペースのアプリケーションの3層で行われます。
次に、詳細を説明します。

  • 新しいデータパケットが到着すると、データパケットをカーネルメモリ領域に配置することによりNICnetwork interface controller)が呼び出さDMA engineRing Bufferます。
  • データパケットが正常に受信されるとNIC、割り込みが開始され、カーネルの割り込みハンドラーがデータパケットをIPレイヤーに渡します。
  • IPレイヤー処理、データパケットはキューに入れられ、TCPレイヤー処理を待ちます。各データパケットはTCP、レイヤー内の一連の複雑なステップを経て、TCPステートマシンを更新します。
  • 最終的に到着recv Bufferし、アプリケーションによって受信および処理されるのを待っています。

いくつかの点を説明しましょう:

  • Linuxカーネルはsk_buffsocket kernel buffers)データ構造を使用してデータパケットを記述します。
  • Ring Bufferのサイズは固定されており、実際のデータパケットは含まれていませんが、指定されたsk_buff記述子が含まれています。それがあるときはRing ``Buffer、完全な、新しいパケットが破棄されます。
  • NICメモリpackageデータを経由しないかもしれませんCPUに直接コピーされたKernelメモリ、このプロセスがある
    DMADirectional Memory Access主に高速なデータ交換に使用します。
  • 上の図から、DMAメモリのカーネルで動作していることがわかります。このメモリはDevice DriverKernel事前のアプリケーションの登録時に実際に登録されます。
  • 最后需要注意,数据包到达 recv BufferTCP就会回ACK确认,既TCPACK表示数据包已经被操作系统内核收到,但并不确保应用层一定收到数据(例如这个时候系统crash),因此一般建议应用协议层也要设计自己的确认机制。

数据包的发送过程

上图中红色的线条表示发送数据包的过程,和接收数据的路径相反,数据包的发送从上往下也经过了三层:用户态空间的应用、系统内核空间、最后到网卡驱动。

  • 应用先将数据写入TCP send bufferTCP层将send buffer中的数据构建成数据包转交给IP层。
  • IP层会将待发送的数据包放入队列 QDisc(queueing discipline)。
  • 数据包成功放入QDisc后,指向数据包的描述符sk_buff被放入Ring Buffer输出队列,随后网卡驱动调用DMA engine将数据发送到网络链路上。

おすすめ

転載: blog.csdn.net/qq_33487044/article/details/108137455