telnet
インターネット検索の後、Webサーバーをhttpポートに接続し、それを使用してGET
htmlページを検索できることを発見しました。
たとえば、
$ telnet web-server-name 80
しかし、これがどのように可能かを理解できませんか?
ポート80がhttpサーバーで使用されている場合、ポート80はhttp
要求のみを受信します。しかし、港telnet
までどのように行きますか?HTTP
telnet
2つのHTTP
異なるプロトコルではありませんか?
答え1
おめでとうございます。ポートとプロトコルが互いに直接接続されていないことを認識して、ネットワーク層の概念を詳しく調べました。他の人が言ったように、Telnetを使用してすべてのTCPポートに接続できます。ただし、これが考えられる理由を理解するには、ネットワーク層について知っておく必要があります。聞いたことがあるならOSI 7層モデルこれにより、Telnet を使用して別のポートに接続できます。インターネットではレイヤー4にのみ興味がありますが、これをレイヤーといいます。インターネットプロトコルスイート。ネットワーク層がない場合、各プログラムは独自のプロトコルを知る必要があるだけでなく、独自の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ビット文字で構成されているため、プロトコル自体はほとんど見られず、GET、POST、HELOなどの人が見ることができるASCIIワードを使用するHTTPやSMTPなどの他の最新のプロトコルと比較してほぼ透明です。 、ログインなど
これらのプロトコルは通常見えないため、Telnetは他のTCPポートに接続し、ユーザーがプロトコルを手動で入力できるようにする優れたツールを作成します。一部のネットワーク管理者はこの技術を使用してサーバーの問題を診断します。ただし、Telnetプログラムにはまだ独自のプロトコルがあり、時には追加のデータビットを送信できるため、この手法を使用すると問題が発生します。 Telnetを使用すると、実際にはアプリケーション層とトランスポート層で「接続を作成」します。他のアプリケーション層プロトコルはほとんどの診断に対してうまく機能し、Telnetプロトコルを妨げません。これを行うためのより良いプログラムはnc(Net Cat. catコマンドのネットワークベースのバージョン名にちなんで命名されました)です。
$ nc www.stackexchange.com 80
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
GET / HTTP/1.1
Webブラウザでhttp://localhost:12345/に移動すると、ncセッションにブラウザの要求が表示されます。この時点で何かを入力して押すと、Ctrl-D
ブラウザにプレーンテキストとして表示されます(HTMLを表示するには、正しいHTTPプロトコル応答とHTMLコードを再送信する必要があります)。
場合によっては、1つのプロトコル(HTTPなど)をデフォルトで使用するプログラムが、他のプロトコルに対して別のポートに接続することがあります。通常、GUIブラウザは特定のポートへの接続を制限するため、これを行うことはできません。ただし、カールなどのプログラムを使用してポート25(メール送信用のSMTP)に接続すると、プロトコルを破るいくつかのバグが表示されることがあります。
$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.
これは、カールが通常HTTPプロトコルを使用するために発生するため、TCPハンドシェイクを設定した後、次のようにデータ転送を開始します。
GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl
ただし、SMTPサーバーは次のSMTPを期待しています。
HELO myhomecomputername.local
この時点で、サーバーは識別ラインを再送信します。
250 yourispsmtpserverhost.com
したがって、カールがSMTPサーバーとトランスポート層接続を確立するのを防ぐ方法はなく、プロトコルを使用できません。しかし、telnetやより良いncなどのプログラムを使用してプロトコルを直接話すことができます。
答え2
telnet
すべてのTCPポートに接続できるツールです。
デフォルトではTelnetポート(23)に接続されていますが、httpポート(80)、smtpポート(25)、または他のポートに接続するように指示できます。
ただし、リモートサーバーがそのポートでリッスンしているプロトコルを「通知する」方法を知る必要があります。
たとえば、ウェブサイトのタイトルを取得したい場合(有罪人を保護するためにドメイン名などを変更):
$ 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 要求の直後に続く空行です。
答え3
両方のプロトコルの初期ネゴシエーションではテキストコマンドを使用するため、接続してコマンド入力を開始できます。他の人も同じです。古いSMTP、Telnetなどのプロトコルは、長い間問題解決に使用されてきました。つながる適切なサービスに移動します。
例えば
これらのプロトコルは、通信するポートとは無関係です。ほとんどすべての実装は、すべてのポートでリッスンするように構成できます。
HTTPS などの一部のプロトコルでは、ネゴシエーションにテキストコマンドを使用しません。ただし、(通常)次に接続できます。ポートサーバーは聞きますが、役に立つものはありません。
答え4
あなたの理解の一部は正確であり、一部はそうではありません。ポート80は通常HTTP用に予約されていますが、これは慣例です。すべてのプログラムはシステムの開いているすべてのポートをリッスンできます。接続しているシステムにポート80でリッスンしているWebサーバーがある場合は、HTTPを使用して通信する必要があります。
telnet
まったくプロトコルではなく、すべてのポートのすべてのホストに生のテキストを送信できるプログラムです。リモートホストは、どのプログラムが接続されているのかわかりません。見ることができるのは送信されたパケットだけです。リモートホストが期待するプロトコルに準拠したパケットを送信するすべてのプログラムが機能するため、これを使用してテキストベースのプロトコルを介してtelnet
通信できます。
これを送信しましたが、GET /path/to/a/file HTTP/1.1
これは有効です。HTTP 1.1 コマンドWebブラウザが送信するリクエストと同じように見えるので、正常に動作します。