5

ネットワークプログラミングに問題があります。サーバーとクライアント間の通信に TCP プロトコルを使用しています。私のコードは機能していますが、データが正常に送信されたか、失敗したかをまだ検出できません。次の質問があります。

  1. バイトがソケット TCP で正常に送信されたかどうかを確認するにはどうすればよいですか?
  2. 確認応答 (ACK) は TCP プロトコルでどのように機能しますか?
  3. ソケットプログラミングを使用して安全な通信を行うにはどうすればよいですか?

C#、Java、または PHP で説明できます。

4

2 に答える 2

5

TCP/IP がどのように機能するかの説明は、その場しのぎの SO の質問ではなく、研究課題として残しておくのが最善です。通常、最初に立ち寄るのはWikipediaかもしれませんが、それでは概念レベルからの適切な紹介が得られない可能性があります。コメントには、 TCP チュートリアルへのリンクもあります。

ただし、本質的には、TCP はその名前が示すように、バイト ストリームを確実に配信するためのメカニズムを提供する伝送制御プロトコルです。バイト ストリームが与えられると、TCP は基本的に、受信側が正しい順序でバイトを受信することを保証します。ストリームの途中でバイトが「失われた」場合、TCP はこれを検出し、再送信を手配します。これらはすべて、受信側には透過的です。TCP の魔法は、受信側がソケットから読み取るだけで、データがそのままの状態で正しい順序で表示されることです。

TCP ソケットを使用する場合、ACK と NACK、および再送信を処理しません。これらはすべて、アプリケーションに対して透過的です。

これで、相手が離れたことを検出できますが、相手が確実にメッセージを受信したか、受信しなかったかを知ることはできません。これが二大将の問題です。

しかし実際には、TCP の仕組みに興味がある場合は、W Richard Stevens の TCP/IP Illustratedを読んでください。あなたをなだめようとしているわけではありませんが、それを理解するには、実際に離れてそれについて読む必要があります(オンラインまたは枯れ木で).

于 2012-04-17T03:28:15.960 に答える
1
  1. 通常、データを送信するために使用している関数は、送信されたバイト数を返します。これをカウントして、すべてが送信されたことを確認する必要があります。具体例はこちら

  2. ACK (通知) パケットは、別のソケットへの接続の確立中、データの送信中、およびリモート ホストへの接続の終了時に送信されます。基本的に、送信されたデータを受信したかどうかを相手に知らせるためのものです。生のソケットをコーディングしている場合を除き、それらを台無しにすることはできません。これは、明らかな理由 (実装標準など) からお勧めしません。また、ルート/管理者アクセス権を持っていない限り、ほとんどのシステムで raw ソケットを開くことは禁止されています。まだ生のソケットに興味がある場合は、これを読んでください。TCP RFCとその関連ドキュメントも読む必要があります。

  3. SSL の実装は、どのように実行するかに依存します。つまり、プロトコルをどのように機能させたいかによって異なります。PHP 固有の OpenSSL 関数はこちらにあります。HTTPS の内部動作について詳しく知りたい場合は、こちらをお読みください

また、独自のプロトコルを作成している場合は、 Google の Protocol Buffersをのぞいてみると役立つかもしれません。言うまでもなく、実際に試す前に、インターネットが一般的にどのように機能し、何に夢中になっているかについてある程度理解しておく必要があります。

PS: raw ソケットについては、何らかの理由で他の言語のドキュメントがほとんど、またはまったくないように思われるため、C の知識を持って試してみてください (おそらく、実際にそれらに触れる必要がないため)。いずれにせよ、これは役に立つかもしれません: http://www.tenouk.com/Module43a.html

于 2012-04-17T03:22:29.713 に答える