回答:
おめでとうございます。ポートとプロトコルが互いに直接接続されていないことを理解することで、ネットワーク層の概念を掘り下げました。他の人が言っているように、telnetを使用して任意のTCPポートに接続できます。ただし、なぜこれが可能なのかを理解するには、ネットワーク層について少し理解する必要があります。OSI 7層モデルについて聞いたことがあるなら、これがtelnetを使用して別のポートに接続できるようにするものです。インターネット上では、彼らは4つの層にしか関心がなく、Internet Protocol Suiteと呼ばれます。ネットワーキングの層がなければ、各プログラムは独自のプロトコルを理解する必要があるだけでなく、独自のIPアドレス指定スキームとポートシステムを定義する必要があります。つまり、各ルーターはこれらのスキームのルーティング方法を理解する必要があり、異なるプロトコルは多くなります学習と診断が難しくなります。簡単に言えば、インターネットはレイヤーなしではほとんど機能しません。
懸念しているのは、トランスポート層とアプリケーション層です。トランスポート層には、TCPやUDPなどのインターネットプロトコルがあり、それぞれに1〜65535のポート番号があります。アプリケーション層には、HTTP、SMTP、DNSなどのプロトコルがあります。通常、プロトコルを定義する各インターネット標準文書は、プロトコルがデフォルトで使用するデフォルトのTCPまたはUDPポートを指定します。HTTPのTCPポート80、SMTPのTCPポート25、DNSのUDPポート53、TelnetのTCPポート23など。telnetプログラムは、実際には標準プロトコルであるTELNETプロトコルを話します、しかし現在の標準ではほとんどが古代のものです。プロトコルシーケンスは8ビット文字で構成されているため、HTTPやSMTPのように、GET、POST、HELO、LOGIN、等
そのプロトコルは一般に表示されないため、telnetは他のTCPポートに接続し、ユーザーがプロトコルを手動で入力できる適切なツールを作成しました。一部のネットワーク管理者は、サーバーの問題を診断するためにこの手法を使用します。ただし、telnetプログラムにはまだ独自のプロトコルがあり、時々余分なデータを送信する可能性があるため、この手法で問題が発生する可能性があります。telnetを使用する場合、実際にはアプリケーション層とトランスポート層で「接続を確立」しています。他のアプリケーション層プロトコルがほとんどの診断で問題なく動作し、telnetプロトコルに干渉しないことがあります。これを行うには、nc(NetCat。catコマンドのネットワークベースのバージョンであることからその名前が付けられます)と呼ばれるより良いプログラムがあります。
$ nc www.stackexchange.com 80
ncプログラムはアプリケーション層プロトコルを話さないため、ncプログラムと接続すると、インターネット層(IPアドレス)とトランスポート層(TCPまたはUDP)でのみ「接続を確立」します。つまり、使用するアプリケーション層プロトコルを制御するということです。ほとんどすべてが公正なゲームであり、バイナリプロトコルであってもです。これにより、ファイルを破損せずに転送したり、ポートで受信トラフィックをリッスンしたりするなどの便利なことができます。
nc -l 9000 < movie.mp4 (Your friend runs this)
nc friends.computer.hostname 9000 > movie.mp4 (you run this)
そして、movie.mp4は、アプリケーション層プロトコル(FTPなど)をまったく使用せずにネットワーク経由で転送されます。アプリケーションプロトコルは、実際には、コマンドを実行する準備ができていることを伝える友達です。
ncは、UDPパケットとUNIXドメインソケットも処理できます。それを使用して聞くことも興味深い場合があります。
nc -l 12345
Webブラウザでhttp:// localhost:12345 /にアクセスすると、ncセッションでブラウザのGET / HTTP/1.1
リクエストが表示されます。この時点で何かを入力して押すCtrl-D
と、ブラウザにプレーンテキストで表示されるはずです(HTMLを表示するには、適切なHTTPプロトコル応答に続いてHTMLコードを返送する必要があります)。
HTTPのような1つのプロトコルをネイティブに話すプログラムは、別のプロトコル用の他のポートに接続できる場合があります。一部のポートへの接続が制限されているため、通常はGUIブラウザーでこれを行うことはできませんが、curlなどのプログラムを使用してポート25(メール送信用のSMTP)に接続すると、おそらく2、3が表示されますプロトコルの破壊に関するエラー。
$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.
これは、curlが通常HTTPプロトコルを話すため、TCPハンドシェイクを確立した後、次のようなデータの送信を開始するために発生します。
GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl
しかし、SMTPサーバーが期待しているのはSMTPで、これは次のようなものです。
HELO myhomecomputername.local
その時点で、サーバーは識別行を送り返します。
250 yourispsmtpserverhost.com
したがって、curlがSMTPサーバーとのトランスポート層接続を確立するのを妨げるものは何もないことがわかります。プロトコルが話せません。ただし、telnetまたはより好ましくはncなどのプログラムを使用して、自分でプロトコルを話すことができます。
curl
必要-v
OS Xで出力VERBOSE表示するには、引数を
telnet
任意のtcpポートに接続できるツールです。
デフォルトでは、telnetポート(23)に接続しますが、httpポート(80)またはsmtpポート(25)などに接続するように指示できます。
ただし、リモートサーバーがそのポートでリッスンしているプロトコルを「話す」方法を知る必要があります。
たとえば、Webサイトのヘッダーを取得する場合(ドメイン名などは有罪を保護するために変更されます):
$ telnet www.example.com 80
Trying xxx.xxx.xxx.xxx...
Connected to www.example.com.
Escape character is '^]'.
HEAD http://www.example.com/ HTTP/1.0
HTTP/1.1 200 OK
Date: Fri, 30 Oct 2015 09:28:58 GMT
Server: Apache/2.4.17 (Debian)
Last-Modified: Sun, 14 Nov 2010 06:30:26 GMT
ETag: "843-494fd75830480"
Accept-Ranges: bytes
Content-Length: 2115
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
Connection closed by foreign host.
HEAD
ラインは、私は、接続に入力したものです。httpプロトコルでは、空行を送信して、HEADまたはGETの終了、またはその他の要求を示す必要があることに注意してください。これは、HEADリクエストの直後の空白行です。
両方のプロトコルの初期ネゴシエーションではテキストコマンドが使用されるため、接続してコマンドの入力を開始できます。これは、SMTPなどの他の古いプロトコルにも当てはまり、telnetはそれぞれのサービスへの接続のトラブルシューティングに長い間使用されてきました。
例えば
プロトコルは、通信するポートに依存しません。ほとんどすべての実装は、任意のポートでリッスンするように構成できます。
一部のプロトコル(HTTPSなど)は、ネゴシエーションにテキストコマンドを使用しません。ただし、サーバーがリッスンするポートに(通常)接続することはできますが、何の役にも立ちません。
あなたの理解の一部は正しく、一部は正しくありません。通常、ポート80はHTTP用に予約されていますが、これは単なる規則です。すべてのプログラムは、システム上の開いているポートでリッスンできます。接続しているシステムのポート80でリッスンしているWebサーバーがある場合、HTTPを使用して通信する必要があります。
telnet
はまったくプロトコルではなく、生のテキストを任意のポートの任意のホストに送信できるプログラムです。リモートホストには、どのプログラムが接続しているのかわかりません。確認できるのは、送信されているパケットのみです。リモートホストが想定しているプロトコルに準拠したパケットを送信するプログラムはすべてtelnet
機能するため、テキストベースのプロトコルを使用して通信できます。
の行に沿って何かを送信しましたGET /path/to/a/file HTTP/1.1
。これは有効なHTTP 1.1コマンドであり、Webブラウザーから送信される要求と同じように見えるため、正常に機能します。
telnet
あるプロトコルRFC 854。それは、一般的なtelnet
クライアントがtelnet
に接続するときを除いてプロトコルを使用しようとしないことtcp/21
です。マニュアルページから:「telnetポート以外のポートに接続する場合、telnetはtelnetプロトコルネゴシエーションを試行しません。これにより、混乱することなくtelnetプロトコルをサポートしないサービスに接続できます。ポート番号の前にダッシュを置きます。」
nc(1)
)コマンドははるかに柔軟です。SSL / TLS暗号化サービスに接続でき、サーバーとして使用したり、データを中継したりすることもできます。