4

TCP接続を受け入れるようにソケットを設定しています

socket(AF_INET, SOCK_STREAM, 0)

そして、私はそれから電話をかけていますbind()listen()そしてaccept()

問題は、listen()を呼び出すと、SYN/ACKパケットがクライアントに送信されることです。これはaccept()を呼び出すまで起こらないと思いましたが、さらに悪いことに、SYN/ACKパケットの確認応答が1つ増えていません。

これの原因は何ですか?どうすれば修正できますか?

ありがとう

補足として-私のTCP接続が非対称であることは重要ですか?

4

3 に答える 3

3

マシンへのTCPの実装では、呼び出した瞬間に着信接続を実際に「受け入れる」ことを選択する場合がありますlisten。「怠惰な」受け入れによる不必要な遅延を避けるために、これは実際には理にかなっています。念のために言っておきますが、のパラメータの1つは、listenいわゆるバックログ番号です。つまり、「バッファリングされた」受け入れの量は保留中です。

syn+ackデータグラムのACKのインクリメントについて。プロトコルが何を述べているかは覚えていませんが、これはおそらくハンドシェイク中の正しい動作です。

于 2012-11-07T00:45:14.510 に答える
2

これは、TCPの「バックログ」キューの通常の操作です。スタックがすでに完了しているが、アプリケーションがまだ受け入れていないのは、接続のキューです。このキューのサイズは、listen()の2番目の引数によって設定されますが、プラットフォームはそれを上下(通常は上)に調整できます。

シーケンス番号について観察したことは何でも正しい動作であるはずです。そうでなければ、何も機能しません。

于 2012-11-07T00:51:58.110 に答える
0

他の回答やコメントで述べたように、これはTCP実装の実際の標準的な動作です。

アプリケーションで着信接続を受け入れることによってTCPハンドシェイクを明示的に完了することを主張する場合は、プラットフォームに依存するソリューションがあります。

Windowsスタックの場合SO_CONDITIONAL_ACCEPT、リスニングソケットでソケットオプションを設定できます。winsockのドキュメントを参照してください。

于 2018-07-16T05:43:22.433 に答える