2

Boost asio を使用して TCP メッセージを送信しています。これは「リアルタイム」制御システムであるため、NO_DELAY オプションを設定します。Wireshark を使用して、メッセージに PSH フラグが設定されていることがわかります。パフォーマンスに満足しており、期待どおりに機能しています。

興味を引くために、NO_DELAY をオフにして、パフォーマンスの違いを測定することにしました。

既存のコードを交換しました:

m_tcpSocket.open(boost::asio::ip::tcp::v4());
boost::asio::ip::tcp::no_delay noDelayOption(true);
m_tcpSocket.set_option(noDelayOption);

// snip create endpoint
m_tcpSocket.connect(m_tcpServerEndpoint);

// snip build message
m_tcpSocket.send(boost::asio::buffer(pDataBuffer, size));

為に

boost::asio::ip::tcp::no_delay noDelayOption(false);
m_tcpSocket.set_option(noDelayOption);

PSH フラグが設定されたままです。

set_option コードも削除しようとしましたが、まだ設定されています。

Wireshark では次のように表示されます。

104 - 105  SYN
105 - 104  SYN, ACK
104 - 105  ACK
104 - 105  PSH, ACK + my message
105 - 104  ACK

ここで、104 と 105 は私の 2 台の PC の IP アドレスです。私のデータを含むメッセージに ACK があることにも驚きました。

NO_DELAY をオフにするにはどうすればよいですか?

4

2 に答える 2

6

コードは、適切TCP_NODELAYにオンまたはオフに設定されているように見えます。開始するTCP_NODELAYには、次を使用します。

socket.set_option(boost::asio::ip::tcp::no_delay(false));

TCP RFCでは、PSH をプッシュ機能として定義しています。つまり、すべてのデータが送信されたことを受信者に通知するフラグであるため、データをプロトコルスタックに転送します。Boost.Asioはその API を BSD ソケットにマップしますが、BSD ソケットは PSH フラグを制御する方法を提供しません。これは、多くの場合、プロトコル スタック内のカーネルがバッファをクリアするときに処理されます。

TCP/IP Illustratedから:

このフラグは、通常、パケットの送信に伴い、パケットを送信する側のバッファが空になったことを示すために使用されます。つまり、PSH ビット フィールドが設定されたパケットが送信者を離れたとき、送信者には送信するデータがありませんでした。

[...]

プッシュ (受信側はできるだけ早くこのデータをアプリケーションに渡す必要があります。確実に実装または使用されていません)。

于 2013-03-08T15:52:30.250 に答える
3

NO_DELAY は、ピアに送信されるフラグを変更しません。カーネルのバッファリング アルゴリズムを変更します。Nagle アルゴリズムについて Google で調べて、理解を深めてください。

于 2013-03-08T14:02:41.913 に答える