SO_TCP_NODELAY設定(Nagleアルゴリズムを無効にする)

SO_TCP_NODELAY設定(Nagleアルゴリズムを無効にする)

私が知る限り、Nagleアルゴリズムを無効にするSO_TCP_NODELAYソケットオプションがあり、これがTCP / IPスタックに実装されていることがわかりました。https://elixir.bootlin.com/linux/v4.4.90/source/net/ipv4/tcp.c#L2401。しかし、カーネルに実装されたNagleアルゴリズムのソースコードがどこにあるのかわかりません。ご存知でしたら、お手伝いできますか?

ベストアンサー1

短い答え:net_ipv4_tcp_output.cのtcp_nagle_check()

Nagleを避けるための条件はコードで確認できます。

/* Return false, if packet can be sent now without violation Nagle's rules:
 * 1. It is full sized. (provided by caller in %partial bool)
 * 2. Or it contains FIN. (already checked by caller)
 * 3. Or TCP_CORK is not set, and TCP_NODELAY is set.
 * 4. Or TCP_CORK is not set, and all sent packets are ACKed.
 *    With Minshall's modification: all sent small packets are ACKed.
 */
static bool tcp_nagle_check(bool partial, const struct tcp_sock *tp,
                            int nonagle)
{
        return partial &&
                ((nonagle & TCP_NAGLE_CORK) ||
                 (!nonagle && tp->packets_out && tcp_minshall_check(tp)));
}

この関数の可能な呼び出しスタックは、 tcp_sendmsg_locked()->tcp_push()->__tcp_push_pending_frames()->tcp_write_xmit()->tcp_nagle_test()->tcp_nagle_check() tcp_scdms 。主な機能はデータを送信することです。この関数が呼び出されるたびに、ソケットからデータセグメントを取得して送信する準備をします。 Nagleのアルゴリズムは、トランスポートストリームを最適化するためにソケットを介して到着するデータを集計する最適化アルゴリズムです。また、見ることができますTCPブロック解除と自動ブロック解除、これはNagleと同様に機能しますが、NO_DELAYオプションよりも優先できます。パケットが遅延なく送信されるようにするには、パケットをキャプチャし(tcpdumpを使用)、送信されたパケットサイズがアプリケーションが送信するデータサイズ(追加されたヘッダーのため)よりわずかに大きいことを確認します。

おすすめ記事