如何遠端登錄到 HTTP 埠 80?
在Google搜尋後,我發現我們可以
telnet
將網路伺服器連接到其 http 埠並用於GET
檢索 html 頁面。例如:
$ telnet web-server-name 80
但我無法理解這怎麼可能?
我認為如果埠 80 用於 http 伺服器,那麼埠 80 將只偵聽
http
請求。但是我怎麼能到telnet
港口HTTP
呢?不是
telnet
和HTTP
兩個不同的協議嗎?
恭喜,您剛剛深入了解了網路層的概念,並意識到埠和協議並不直接相互連接。正如其他人所說,telnet 可用於連接到任何 TCP 埠。但是,要了解為什麼會這樣,您需要了解一些有關網路層的知識。如果您聽說過OSI 7 層模型,這就是允許您使用 telnet 連接到另一個埠的原因。雖然在 Internet 上,他們只關心其中的 4 層,它被稱為Internet 協議套件. 如果沒有網路層,每個程序不僅需要了解自己的協議,還必須定義自己的 IP 定址方案和埠系統,這意味著每個路由器都需要了解如何路由這些方案,不同的協議會很多更難學習和診斷。簡而言之,如果沒有分層,Internet 將無法正常工作。
你關心的是傳輸層和應用層。在傳輸層,我們使用 TCP 和 UDP 等 Internet 協議,每個協議的埠號範圍從 1 到 65535。在應用層,我們有 HTTP、SMTP 和 DNS 等協議。通常,每個定義協議的 Internet 標准文件都會指定該協議預設使用的預設 TCP 或 UDP 埠。如 TCP 埠 80 用於 HTTP,TCP 埠 25 用於 SMTP,UDP 埠 53 用於 DNS,TCP 埠 23 用於 Telnet。telnet程序其實講的是TELNET協議,是標準協議,但按照目前的標準,大多是古老的。因為它的協議序列是由 8 位字元組成的,所以與 HTTP 和 SMTP 等其他更現代的協議相比,它幾乎是透明的,它們使用 ASCII 中的人類可見詞,如 GET、POST、HELO、LOGIN、等等
因為它的協議通常不可見,所以 telnet 是一個不錯的工具,可以連接到其他 TCP 埠並允許使用者手動輸入協議。一些網路管理員使用這種技術來診斷伺服器的問題。但是,由於 telnet 程序仍然有自己的協議,並且有時可能會發送額外的數據位,因此您仍然會遇到使用此技術的問題。當您使用 telnet 時,您實際上是在應用層和傳輸層“建立連接”。碰巧的是,其他應用層協議可以通過它進行大多數診斷,並且不會干擾 telnet 協議。有一個更好的程序可以通過呼叫 nc(Net Cat。它的名字來自 cat 命令的基於網路的版本)來執行此操作。
$ nc www.stackexchange.com 80
nc 程序不使用任何應用層協議,當您與它建立連接時,您只是在 Internet 層(IP 地址)和傳輸層(TCP 或 UDP)“建立連接”。這意味著您可以控制使用什麼應用層協議。幾乎任何事情都是公平的遊戲,甚至是二進制協議。這還允許您執行有用的操作,例如在不損壞文件的情況下傳輸文件,並在埠上偵聽傳入流量:
nc -l 9000 < movie.mp4 (Your friend runs this) nc friends.computer.hostname 9000 > movie.mp4 (you run this)
然後完全不使用應用層協議(如 FTP)通過網路傳輸 movie.mp4。應用程序協議實際上是你的朋友告訴你他們已經準備好讓你執行你的命令了。
nc 還可以處理 UDP 數據包和 UNIX 域套接字。用它來聽也很有趣。
nc -l 12345
現在在您的網路瀏覽器中訪問 http://localhost:12345/ 並在您的 nc 會話中您應該看到瀏覽器的
GET / HTTP/1.1
請求。此時您可以輸入內容並按下Ctrl-D
,它應該會以純文字形式顯示在您的瀏覽器中(如果您想要顯示 HTML,則必須將其發送回正確的 HTTP 協議響應,然後是 HTML 程式碼)。有時,本機使用一種協議(如 HTTP)的程序可以連接到其他用於不同協議的埠。您通常不能再在 GUI 瀏覽器中執行此操作,因為它們已限制它們連接到某些埠,但如果您使用 curl 之類的程序連接到埠 25(用於發送郵件的 SMTP),您可能會看到幾個關於破壞協議的錯誤。
$ 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。