Stanford CS 144, Lab 0: networking warmup 實驗

2023-03-29 18:01:04

Stanford CS 144, Lab 0: networking warmup

>>> lsb_release -a // 執行環境展示
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04 LTS
Release:        22.04
Codename:       jammy

>>> g++ -v
gcc version 8.4.0 (Ubuntu 8.4.0-3ubuntu2) 

2 Networking by hand

2.1 Fetch a Web page

visit http://cs144.keithw.org/hello and observe the result:

observeWebPage

Now, we want to do same things by our hand.

  1. telnet cs144.keithw.org httpThis tells the telnet program to open a reliable byte stream between your computer and another computer (named \(\texttt{cs144.keithw.org}\)), and with a particular service running on that computer: the 「http」 service, for the Hyper-Text Transfer Protocol, used by the World Wide Web. Then, i saw the output in the terminal:

    >>> user$ telnet cs144.keithw.org http
    Trying 104.196.238.229...
    Connected to cs144.keithw.org.
    Escape character is '^]'.
    Connection closed by foreign host.
    

    Telnet是一種網路協定,用於遠端登入到計算機或其他裝置上並在其上執行命令。通過Telnet,使用者可以通過網路連線到遠端主機並像本地主機一樣進行命令列操作。在Linux系統中,Telnet使用者端程式和伺服器程式可以使用telnet命令來啟動和連線。

    Telnet協定使用使用者端/伺服器模型。Telnet使用者端向Telnet伺服器建立連線並提供憑據以進行身份驗證。一旦連線建立,Telnet使用者端可以像使用本地終端一樣在遠端系統上執行命令。

    儘管Telnet協定在過去很受歡迎,但由於其不安全性,現在已被SSH協定取代。因為Telnet協定在傳輸資料時未加密,所以可能會洩露使用者的敏感資訊(例如使用者名稱和密碼)。SSH協定提供了加密和身份驗證功能,可以更安全地遠端連線到Linux系統。

  2. Type GET /hello HTTP/1.1 ⏎

  3. Type Host: cs144.keithw.org ⏎

  4. Type Connection: close ⏎

  5. Hit the Enter key one more times: This sends an empty line and tells the server that you are done with your HTTP request.

  6. If all went well, you will see the same response that your browser saw, preceded by HTTP headers that tell the browser how to interpret(explain) the response.

>>> user$ telnet cs144.keithw.org http
Trying 104.196.238.229...
Connected to cs144.keithw.org.
Escape character is '^]'.
GET /hello HTTP/1.1
Host: cs144.keithw.org
Connection: close

HTTP/1.1 200 OK
Date: Mon, 20 Mar 2023 11:23:14 GMT
Server: Apache
Last-Modified: Thu, 13 Dec 2018 15:45:29 GMT
ETag: "e-57ce93446cb64"
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Content-Type: text/plain

Hello, CS144!
Connection closed by foreign host.

Then, we'll explain the meaning of each step.

GET /hello HTTP/1.1 This tells the server the path part of the URL(The starting with the third slash, like: http://cs144.keithw.org/hello.)

這段命令是 HTTP 協定中使用者端向伺服器傳送 HTTP 請求的一部分,它由三部分組成:

  1. 請求方法(Request Method):在這裡是 GET。它指定了使用者端請求的動作型別,常見的方法有 GET、POST、PUT、DELETE 等。
  2. 請求 URI(Uniform Resource Identifier):在這裡是 /hello。它指定了使用者端要請求的資源的位置,URI 由路徑和查詢引陣列成。例如,在這個例子中,URI 是 /hello,表示使用者端請求位於伺服器根目錄下的名為 hello 的資源。
  3. 協定版本(Protocol Version):在這裡是 HTTP/1.1。它指定了使用者端使用的 HTTP 協定版本。在 HTTP/1.1 中,使用者端和伺服器之間的通訊是持久連線的,這意味著使用者端可以在同一連線上傳送多個請求,並且伺服器可以在同一連線上返回多個響應。

因此,GET /hello HTTP/1.1 這個命令的意思是使用者端使用 HTTP/1.1 協定,向伺服器傳送一個 GET 請求,請求伺服器位於根目錄下的名為 hello 的資源。伺服器在收到請求後將返回相應的響應,包括狀態碼、頭部資訊和響應內容等。

Host: cs144.keithw.org This tells the server the host part of the URL. (The part between http:// and the third slash.)

這段命令是HTTP請求中的一個頭部資訊(header),用於指定使用者端請求的目標伺服器。

在這個例子中,Host: cs144.keithw.org 指定了使用者端要請求的伺服器主機名為 cs144.keithw.org。HTTP/1.1 引入了「虛擬主機」(Virtual Host)的概念,使得多個域名可以共用同一個IP地址,並根據 Host 頭部資訊將請求路由到正確的伺服器。因此,Host 頭部資訊對於使用者端請求的處理非常重要。

除了 Host 頭部資訊,HTTP請求還可以包含許多其他頭部資訊,用於傳遞關於使用者端、請求內容、請求處理方式和請求接受格式等方面的資訊。這些頭部資訊通常使用「鍵值對」的形式表示,例如「Content-Type: application/json」表示請求中包含的資料型別為JSON格式。

Connection: close This tells the server that you are finished making requests, and it should close the connection as soon as if finishes replying.

這段命令是HTTP請求中的一個頭部資訊(header),用於指定使用者端和伺服器之間的連線型別。

在這個例子中,Connection: close 指定了使用者端和伺服器之間的連線型別為「關閉連線」。這意味著,在使用者端傳送完請求並收到伺服器的響應後,連線將被立即關閉,而不是保持開啟狀態以等待其他請求。這種連線型別稱為「短連線」(short-lived connection)。

在HTTP/1.1中,預設情況下,使用者端和伺服器之間的連線型別為「持久連線」(persistent connection),也稱為「長連線」(long-lived connection)。這意味著使用者端可以在同一連線上傳送多個請求,並且伺服器可以在同一連線上返回多個響應。在這種情況下,Connection頭部資訊應設定為「Connection: keep-alive」。

在HTTP/2中,連線型別預設為「持久連線」,而不需要顯式指定 Connection頭部資訊。

因此,Connection頭部資訊用於指定使用者端和伺服器之間的連線型別,通常包括「關閉連線」和「保持連線」兩種型別。它對於HTTP請求和響應的處理和效能優化非常重要。

Assignment:

>>> user$ telnet cs144.keithw.org http
Trying 104.196.238.229...
Connected to cs144.keithw.org.
Escape character is '^]'.
GET /lab0/sunetid HTTP/1.1
Host: cs144.keithw.org
Connection: close

HTTP/1.1 200 OK
Date: Mon, 20 Mar 2023 11:59:46 GMT
Server: Apache
X-You-Said-Your-SunetID-Was: sunetid
X-Your-Code-Is: 746452
Content-length: 111
Vary: Accept-Encoding
Connection: close
Content-Type: text/plain

Hello! You told us that your SUNet ID was "sunetid". Please see the HTTP headers (above) for your secret code.

2.2 Send yourself an email

Now that you know how to fetch a Web page, it’s time to send an email message, again using a reliable byte stream to a service running on another computer. (Since we don't have a Stanford email, we have to use our own, such as QQ email.)

QQ 郵箱授權碼 tuplkrnwplxtbage

由於我們沒有 Stanford 的郵箱