send()のブロッキング呼び出しを調べており、接続速度などについて定性分析を行うことができるように、その時間中に発生したイベントを知ることができる一方で、関数で費やされた時間を測定する方法があるかどうかを調べています。 。
それで、最初に知っておくべきことの1つは、関数が成功を返すのはどのレイヤーであるかということです。
APIは、データを保持するのに十分なバッファスペースがあり、ルーティングテーブルがパケットをピアにルーティングする方法を示している場合、send()
ほぼ即座に成功を返します。(実際にピアに到達できる必要はありません。マシンにネクストホップが使用可能である必要があります...)バッファスペースが解放されるのを待つ必要がある場合は、そうなります。(有線でACKまたは送信されるデータを監視するのはWiresharkで簡単なはずです。)
ちなみに、OSI層はTCP/IPファミリーのプロトコルに完全には適用されていません。レイヤー1と2は非常に密接に適合し、レイヤー3はおおよそIPルーティングであり、レイヤー4はおおよそTCP、UDP、SCTP、ICMPなどです。しかし、レイヤー5、6、7には実際の類似物はありません。SMTPoverTLSはレイヤー7と見なされるか、SMTPがレイヤー7で、TLSがレイヤー6です...すべてが非常にすばやくあいまいになります。
興味のあるTCP/IPプロトコルスタックの特定の層について話す方が簡単です。send()
ストリーム、データグラム、およびrawソケットで動作するため、スタックの複数のレイヤーにまたがることができます。必要に応じて、TCP、UDP、SCTP、またはICMPパケットを送信したり、ネットワーク上で直接落書きしたりできます。