2017-12-27 47 views
2

TCP/IPの基本を学習しています。私はサーバが1024番のポートを開き、クライアントがそれにメッセージを送ることができるサーバ - クライアントチャットアプリケーションを作った。私は、サーバーとクライアントによって交換されるTCP/IPパケットの内容について少し混乱しています。クライアントがサーバにメッセージを送ると、イーサネット経由でパケットとして送られます。クライアントからのイーサネットフレームでは、データフィールドはTCP/IP形式でエンコードされます。 TCP/IPフレームでは、宛先ポートは1024になりますが、送信元ポートの値はどのようになりますか?クライアントはポートをオープンしていません。サーバーのみがポートを開きます。また、PCで送受信されたこれらのTCP/IPパケットを監視する方法があるかどうかを知りたいと思います。TCP/IPパケットのポート番号

+0

「クライアントがポートを開こうとしていません」というわけではありません。オペレーティングシステムはクライアントプロセスをその時点で使用可能なポートにバインドします。つまり、クライアント側の特定のポートとオペレーティングシステムその時点で使用可能なポートにクライアントプロセスをバインドします。 – tkhurana96

+0

サーバーはクライアントに通常応答できる必要があります。つまり、クライアントがランダムポートを選択し、サーバーに応答を送信できることを伝えます。 Wiresharkは、https://www.wireshark.org/ –

答えて

2

multiple layers involve hereがあることを忘れないでください。 TCP、IP、イーサネットは、頻繁に併用されても、異なるものになります。分離は覚えておくことが重要です。イーサネット(レイヤ2)は、個々のコンピュータを接続するプロトコルですが、どのIPアドレスを持っているかは気にしません。 IPは、コンピュータをはるかに大規模に接続します。これは、イーサネットだけではなく、さまざまな「レイヤー2」ネットワークテクノロジにルーティングして送信することができます。

IETFインターネットプロトコルの素晴らしい点は、すべてthoroughly documentedだから、内部的にどのように動作するかを知ることができるということです。 IPの上で動作するTCPの場合、ポート番号はTCP層にあります。 IP自体は気にしませんが、送信元と宛先のアドレスのみに関心があります。

0     1     2     3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |   Source Port   |  Destination Port  | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |      Sequence Number      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |     Acknowledgment Number      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    | Data |   |U|A|P|R|S|F|        | 
    | Offset| Reserved |R|C|S|S|Y|I|   Window    | 
    |  |   |G|K|H|T|N|N|        | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |   Checksum   |   Urgent Pointer  | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |     Options     | Padding | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |        data        | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

移入されなければならない両方のソースと宛先ポート:

キーは右ここでTCPヘッダを説明する図です。これは、システムのIPスタックがどのパケットがどの接続に関係しているかを追跡する重要な要素です。

通常、サーバーに接続するコードを書くとき、接続は(やや)ランダムな送信元ポートから発生します。ポートでリッスンするサーバープロセスを作成すると、そのポートを自動的に割り当てるか、または特別に設定できます。

HTTPのようなサービスでは、他のクライアントがそのサービスに接続するようにするには、そのポートを80に固定する必要があるため、自動割り当ては役に立ちません。場合によっては自動割り当てが望ましいので、競合はありません。

tcpdumpWiresharkのようなツールですべてを監視できます。彼らはさまざまな層を掘り下げ、何が起こっているかを示すことができます。

+0

を監視するための適切なツールです。 VBでTCPサーバーとクライアントアプリケーションを作成し、クライアントとサーバーの間でデータを送受信しました。サーバーは私のラップトップの自宅のWiFiネットワークでポート1234を使用しています。しかしWiresharkは、そのポートのクライアントとサーバーの間で交換するフレームを表示していません。私はコマンドプロンプトをチェックし、ポート1234はそこでアクティブに表示されます。理由は何でしょうか? –

+0

正しいインターフェイスで「リッスン」していることを確認してください。 WiFiを使用しているときにイーサネットポートで誤って聴くのは簡単です(逆も同様です)。それらは2つの異なるハードウェアインタフェースであり、 "ループバック"またはローカルホストインタフェースは、しばしば3番目のインタフェースです。 – tadman

+0

両方ともlocalhost 127.0.0.1にあります。それは私のwifiとは関係がありません? –

1

ポート番号は、server/clientで実行中のプロセスを識別するために使用される論理エンティティ/番号です。サーバーアプリケーションにポート番号(決定したもの)があるように、クライアントアプリケーションには、OSによって割り当てられたポート番号も関連付けられます。コマンドプロンプトでnetstat -abと入力すると、クライアントアプリケーションに関連付けられているポート番号が、プロセスのリストおよびコマンドで指定された対応するポート番号に表示されます。

関連する問題