URL
在 WWW(world wide web)上,每一信息資源都有統一的且在網上唯一的地址,該地址就叫URL,它是WWW的統一資源定位標志,就是指網絡地址。格式為:
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
| 參數 | 說明 |
|---|---|
| protocol(協議) | 指定使用的傳輸協議 |
| hostname(主機名) | 存放資源的服務器的域名系統(DNS) 主機名或 IP 地址 |
| port(端口號) | 可選,省略時使用方案的默認端口,各種傳輸協議都有默認的端口號 |
| path(路徑) | 由零或多個“/”符號隔開的字符串,用來表示主機上的一個目錄或文件地址。 |
| parameters(參數) | 用於指定特殊參數的可選項 |
| query(查詢) | 可選,用於給動態網頁傳遞參數 |
| fragment(信息片斷) | 用於指定網絡資源中的片斷 |
HTTP 協議
Web 的應用層協議是超文本傳輸協議,這是一個簡單的請求-響應協議,是 Web 的核心。對於 HTTP,這是由 2 個程序實現——客戶端程序和服務器程序,它指定了客戶端可能發送給服務器什么樣的消息以及得到什么樣的響應,通過 HTTP 報文進行回話。對於 Web 來說,Web 瀏覽器是 HTTP 的客戶端,Web 服務器是 HTTP 服務端,Web 頁面是由對象組成的,多數這樣的頁面需要內含 HTML 基本文件和幾個引用對象。
TCP 協議是 HTTP 的支撐運輸協議,這就說明 HTTP 客戶端需要向服務器發起 TCP 連接。通過 TCP 協議,無論是客戶向服務器發送 HTTP 請求還是服務器響應客戶的 HTTP 響應,都可以完整的到達目的地。
HTTP 是個無狀態協議,也就是說 HTTP 服務器不保存關於客戶的任何信息,因此要是客戶在很短的時間內重復請求某個對象,服務器仍然會做出響應,重新發送響應報文。為什么?這是因為有狀態協議更為復雜,主要體現在 2 大方面:
- 有狀態協議要維護歷史狀態;
- 若用戶或服務器失效,將導致狀態出現不一致。

HTTP 協議對資源有如下操作:
| 方法 | 說明 |
|---|---|
| GET | 請求獲取URL位置的資源 |
| HEAD | 請求獲取URL位置資源的響應消息報告,即獲得該資源的頭部信息 |
| POST | 請求向URL位置的資源后附加新的數據 |
| PUT | 請求向URL位置存儲的一個資源,覆蓋原URL位置的資源 |
| PATCH | 請求局部更新URL位置的資源,即改變該處資源的部分內容 |
| DELETE | 請求刪除URL位置存儲的資源 |
一個客戶機與服務器建立連接后,發送一個請求給服務器,請求方式的格式為,統一資源標識符、協議版本號,后邊是MIME信息包括請求修飾符、客戶機信息和可能的內容。服務器接到請求后,給予相應的響應信息,其格式為一個狀態行包括信息的協議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務器信息、實體信息和可能的內容。

基本 HTTP GET/response 交互
實驗步驟
我們開始探索 HTTP,方法是下載一個非常簡單的 HTML 文件 非常短,並且不包含嵌入的對象。執行以下操作:
- 啟動您的瀏覽器。
- 啟動 Wireshark 數據包嗅探器,在 display-filter-specification 窗口中輸入 “http”(只是字母,不含引號標記),這樣就在稍后的分組列表窗口中只捕獲 HTTP 消息。(我們只對 HTTP 協議感興趣,不想看到其他所有的混亂的數據包)。
- 稍等一會兒(我們將會明白為什么不久),然后開始Wireshark數據包捕獲。

4. 在瀏覽器中輸入提供的 URL,您的瀏覽器應顯示非常簡單的單行 HTML 文件。

5. 停止 Wireshark 數據包捕獲。

在分組列表窗口中顯示了兩個被捕獲的 HTTP 消息:GET 消息(從您的瀏覽器發送到 gaia.cs.umass.edu 的 web 服務器)和從服務器到瀏覽器的響應消息。分組內容窗口顯示所選消息的詳細信息(在這種情況下為 HTTP OK 消息)。回想一下,因為 HTTP 消息被裝載在 TCP 報文段內,該報文段是在 IP 分組封裝嗎,進而在以太網幀,和幀中封裝,所以界面中顯示了幀,以太網,IP,TCP 分組信息以及 HTTP 報文信息。我們想最小化非 HTTP 數據的顯示,所以確保幀,以太網,IP 和 TCP 行的信息被隱藏。
問題回答
通過查看HTTP GET和響應消息中的信息,回答以下問題。 在回答以下問題時,您應該指出您在消息中的哪個具體位置找到了回答以下問題的信息。 當您上交作業時,請注明輸出,顯示您在哪些地方表示了您的答案。
- 您的瀏覽器是否運行 HTTP 版本 1.0 或 1.1?服務器運行什么版本的 HTTP?
服務器:

瀏覽器(要提交 GET 請求):

由此可見,瀏覽器和主機都是使用了 HTTP 1.1 版本。
2. 您的瀏覽器會從接服務器接受哪種語言(如果有的話)?

經查閱資料,接收的語言為簡體中文。
- 您的計算機的 IP 地址是什么? gaia.cs.umass.edu 服務器地址呢?

我的計算機:192.168.67.249
服務器:128.119.245.12
4. 服務器返回到瀏覽器的狀態代碼是什么?

一開始沒注意,返回了 304,說明之前的緩存還能用,看來是因為我刷新了頁面的原因。重新抓包返回 200 OK 表示請求成功,信息在返回的報文里。
- 服務器上HTML文件的最近一次修改是什么時候?

最后一次修改是 2020 年 4 月 21 日,星期二,5 時 59 分 02秒。
6. 服務器返回多少字節的內容到您的瀏覽器?

返回了 128 bytes 字節。
7. 通過檢查數據包內容窗口中的原始數據,你是否看到有協議頭在數據包列表窗口中未顯示? 如果是,請舉一個例子。


經查證資料,“favicon.ico” 這玩意是個圖標,是收藏夾圖標和瀏覽器標簽。瀏覽器可能會自動請求網站根目錄的這個圖標,若目標網站沒有這個圖標就會返回 404。這個信息是個干擾,可以直接忽略掉。
HTTP 條件 Get/response 交互
實驗步驟
大多數Web瀏覽器使用對象緩存,從而在檢索 HTTP 對象時執行條件 GET。執行以下步驟之前,請確保瀏覽器的緩存為空,現在按下列步驟操作:
- 啟動您的瀏覽器,並確保您的瀏覽器的緩存被清除,如上所述。
- 啟動Wireshark數據包嗅探器。

3. 在瀏覽器中輸入提供的 URL,您的瀏覽器應顯示一個非常簡單的五行HTML文件。

4. 再次快速地將相同的 URL 輸入到瀏覽器中(或者只需在瀏覽器中點擊刷新按鈕)。
5. 停止 Wireshark 數據包捕獲,並在 display-filter-specification 窗口中輸入 “http” ,以便只捕獲 HTTP 消息,並在數據包列表窗口中顯示。

我抓的包有一些其他干擾,直接忽略。
問題回答
- 檢查第一個從您瀏覽器到服務器的 HTTP GET 請求的內容。您在 HTTP GET 中看到了 “IF-MODIFIED-SINCE” 行嗎?
翻翻翻,並沒有發現。
2. 檢查服務器響應的內容。服務器是否顯式返回文件的內容? 你是怎么知道的?

有,返回了一段 HTML 標記碼,包括了網頁的文本。
3. 現在,檢查第二個 HTTP GET 請求的內容。您在 HTTP GET 中看到了 “IF-MODIFIED-SINCE:” 行嗎?如果是,“IF-MODIFIED-SINCE:” 頭后面包含哪些信息?

看到了,包含的是一段時間信息,這個時間與網頁最后一次修改時間一致。

查證了資料,知道了這個標簽的含義。
If-Modified-Since是標准的HTTP請求頭標簽,在發送HTTP請求時,把瀏覽器端緩存頁面的最后修改時間一起發到服務器去,服務器會把這個時間與服務器上實際文件的最后修改時間進行比較。
如果時間一致,那么返回HTTP狀態碼304(不返回文件內容),客戶端接到之后,就直接把本地緩存文件顯示到瀏覽器中。
如果時間不一致,就返回HTTP狀態碼200和新的文件內容,客戶端接到之后,會丟棄舊文件,把新文件緩存起來,並顯示到瀏覽器中。
- 針對第二個 HTTP GET,從服務器響應的 HTTP 狀態碼和短語是什么?服務器是否明確地返回文件的內容?請解釋。

這不就是我剛才遇到的問題嗎?附上資料:
如果客戶端發送了一個帶條件的GET 請求且該請求已被允許,而文檔的內容(自上次訪問以來或者根據請求的條件)並沒有改變,則服務器應當返回這個304狀態碼。簡單的表達就是:服務端已經執行了GET,但文件未變化。
也就是說,當前這個頁面的緩存還保存着,並且服務器沒有修改,因此這個緩存還能拿來用,就不需要服務器再發一遍了。
檢索長文件
實驗步驟
在我們到目前為止的例子中,檢索的文檔是簡短的 HTML 文件。 接下來我們來看看當我們下載一個長的 HTML 文件時會發生什么。按以下步驟操作:
- 啟動您的瀏覽器,並確保您的瀏覽器緩存被清除,如上所述。
- 啟動Wireshark數據包嗅探器

3. 在您的瀏覽器中輸入提供的 URL,您的瀏覽器應顯示相當冗長的一個文件。

4. 停止Wireshark數據包捕獲,並在display-filter-specification窗口中輸入“http”,以便只顯示捕獲的HTTP消息。

在分組列表窗口中,您應該看到您的 HTTP GET 消息,然后是對您的 HTTP GET 請求的多個分組的 TCP 響應。這個多分組響應值得進行一點解釋。HTTP響應消息由狀態行組成,后跟標題行,后跟一個空行,后跟實體主體。在我們的 HTTP GET 這種情況下,響應中的實體主體是整個請求的 HTML 文件。在我們的例子中,HTML 文件相當長,4500 字節太大,一個 TCP 數據包不能容納。因此,單個 HTTP 響應消息由 TCP 分成幾個部分,每個部分包含在單獨的 TCP 報文段中。
問題回答
- 您的瀏覽器發送多少 HTTP GET 請求消息?哪個數據包包含了文件的消息?

發送了一個請求信息。

這個包包含了文件的消息。
2. 哪個數據包包含響應HTTP GET請求的狀態碼和短語?

3. 響應中的狀態碼和短語是什么?
200 OK,表示請求成功,信息在返回的報文里。
4. 需要多少包含數據的 TCP 段來執行單個 HTTP 響應和文本?

目測需要 5 個包含數據的 TCP 段。
具有嵌入對象的 HTML 文檔
現在我們已經看到Wireshark如何顯示捕獲的大型HTML文件的數據包流量,我們可以看看當瀏覽器使用嵌入的對象下載文件時,會發生什么。
實驗步驟
- 啟動您的瀏覽器。
- 啟動Wireshark數據包嗅探器。

3. 在瀏覽器中輸入提供的 URL,您的瀏覽器應顯示包含兩個圖像的短 HTML 文件。這兩個圖像在基本 HTML 文件中被引用。也就是說,圖像本身不包含在 HTML 文件中;相反,圖像的URL包含在已下載的HTML文件中。您的瀏覽器將不得不從指定的網站中檢索這些圖標。

停止 Wireshark 數據包捕獲,並在 display-filter-specification 窗口中輸入 “http”,以便只顯示捕獲的 HTTP 消息。

問題回答
- 您的瀏覽器發送了幾個 HTTP GET 請求消息? 這些 GET 請求發送到哪個IP地址?



發送了 3 個 HTTP GET 請求消息,這些 GET 請求發送到 128.119.245.12。
2. 瀏覽器從兩個網站串行還是並行下載了兩張圖片?請說明。

應該是串行下載,因為根據抓到的包,在第一張圖片被下載完畢之后再開始下載第二張。不過這不符合我的認知,因為並行下載才是高效的方式,所以懷疑有干擾。

從排除干擾的包來看,應該是並行下載。
HTTP 認證
實驗步驟
最后,我們嘗試訪問受密碼保護的網站,並檢查網站的 HTTP 消息交換的序列。提供的 URL 是受密碼保護的。執行以下操作:
- 請確保瀏覽器的緩存被清除,如上所述,然后關閉你的瀏覽器,再然后啟動瀏覽器
- 啟動Wireshark數據包嗅探器。

3. 在瀏覽器中輸入提供的 URL,在彈出框中鍵入所請求的用戶名和密碼。

4. 停止 Wireshark 數據包捕獲,並在 display-filter-specification 窗口中輸入 “http”,以便只顯示捕獲的 HTTP 消息。
由於我只能抓到 404,所以我就使用現成的包來看。

問題回答
- 對於您的瀏覽器的初始HTTP GET消息,服務器響應(狀態碼和短語)是什么響應?
401 Authorization Required,該狀態碼表示用戶沒有訪問權限,需要進行身份認證。
2. 當您的瀏覽器第二次發送HTTP GET消息時,HTTP GET消息中包含哪些新字段?


多了 Authorization 和 Credentials 字段,這兩個字段應該是在向網頁提交用戶名和密碼。
參考資料
《計算機網絡 自頂向下方法》 [美] James F.Kurose,Keith W.Ross 著,陳鳴 譯,機械工業出版社
favicon.ico請求處理
HTTP的請求頭標簽 If-Modified-Since
304狀態碼
401錯誤
