0

サーバーの負荷が高い状況を再現しようとしていましたが、netcat で視覚化された SYN_SENT のステータスにいくつかの接続があるはずです。

サーバーソケットを作成し、netcat から 10 個の接続を開きました。私はそれらがSYN_SENTとしてnetstatに表示されると仮定しましたが、tcpdumpを使用すると、カーネルがsyn-ackを送信し、クライアントがackで応答し、tcpハンドシェイクが完了し、すべて確立されているように見えます。

import java.io.IOException;
import java.net.ServerSocket;

public class Server {

    public static void main(String[] args) throws IOException, InterruptedException {
        ServerSocket ss = new ServerSocket(9999);
        Thread.currentThread().join();
    }
}

そのため、接続の確立 (送信serversocket.acceptするかどうかの決定) では何の役割も果たさず、OS/カーネルがそのソケットに io ハンドルを割り当てるのを待ちますか? syn.ackこの動作は、異なる OS 間で一貫していますか?

4

2 に答える 2

1

接続確立されているためです。accept() の呼び出しは、そのための前提条件ではありません。システムは着信接続を受け入れ、それらをバックログ キューに入れます。accept() を呼び出すと、アイテムがキューから削除され、空の間はブロックされます。

于 2013-09-01T10:34:15.843 に答える