1. 程式人生 > >【計算機網絡】Web和HTTP

【計算機網絡】Web和HTTP

rip 緩存 方式 進一步 rac 解決 支持 響應狀態 rom

第二章第二節 Web和HTTP

這一章中,我們需要討論5種重要的應用:Web、文件傳輸、電子郵件、目錄服務、P2P;這一節中,我們將討論Web和它的應用層協議HTTP。

Outline

  • Web簡介
  • HTTP概況
  • 非持續連接和持續連接
    • HTTP請求/相應的步驟
    • 非持續連接
    • 非持續連接的串行TCP連接、並行TCP連接和響應時間
    • 持續連接
  • HTTP請求協議
    • 請求信息
    • Get請求方法
    • Post請求方法
    • 響應格式
    • 響應狀態碼
  • Cookie
  • Web緩存

Notes

##Web簡介

  • Web即World Wild Web(萬維網),由Tim Berners-Lee發明,是由網頁構成,支持網頁互相連接。
  • Web網頁(Web Page)包含多個對象(Objects),如:HTML文件、JPEG圖片、視頻文件、動態腳本等,多數Web頁面包含一個HTML基本文件,其中包含對其他對象引用的鏈接
  • 對象的尋址(adressing)是通過URL(Uniform Resoure Locator)統一資源定位器來進行。
  • 其格式為:Scheme://hostport/path 如:Http://www.somecompany.com/somePic/pic.png (Http 為協議名、www.somecompany.com為 hostname主機、somePic/pic.png為 pathname路徑名

## HTTP概況

  • HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網服務器傳輸超文本到本地瀏覽器的傳送協議。
  • HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端
  • HTTP協議工作於客戶端-服務端架構為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。
  • HTTP是一個基於TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等),連接建立後,瀏覽器和服務器進程就能通過套接字接口訪問TCP;
  • HTTP是一個屬於應用層的面向對象
    的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。
  • HTTP是一個無狀態協議,服務器向客戶發送被請求的文件,而不存儲任何關於該用戶的信息

  技術分享圖片

【HTTP特點】

  • 簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
  • 靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Conten-Type加以標記。
  • 非持續連接:無連接的含義是限制每次連接只處理一個請求、服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。采用這種方式可以節省傳輸時間。
  • 無狀態:無狀態是指對於事務處理沒有記憶能力,服務器向客戶發送被請求的文件,而不存儲任何關於該用戶的信息。缺少狀態意味著若後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時,它的應答就較快。

## 非持續連接與持續連接

【HTTP請求/響應的步驟】

  HTTP協議采用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。

  • 客戶進程連接到Web服務器:一個HTTP客戶進程,通常是瀏覽器,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接。
  • 發送HTTP請求報文:通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。
  • 服務器接受請求並返回HTTP響應:Web服務器解析請求,定位請求資源。服務器將資源復本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。
  • 釋放TCP連接:若connection 模式為close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;
  • 客戶端瀏覽器解析HTML內容:客戶端瀏覽器首先解析狀態行,查看表明請求是否成功的狀態代碼。然後解析每一個響應頭,響應頭告知以下為若幹字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。

  • 當客戶機/服務器的交互運行於TCP協議上時,應用程序的每個請求/響應對是經一個單獨的TCP連接,則該應用程序使用非持久連接,而當應用程序的每個請求/響應對是經相同的TCP連接發送,則該應用程序使用持久連接。
  • HTTP/1.0 使用非持久連接。 HTTP/1.1 默認使用持久連接

【非持續連接】

  • 示例:在非持續連接中,如果打開一個HTML文件和10個內聯圖象對象的網頁時,HTTP就要建立11次TCP連接才能把文件從服務機傳送到客戶機。
  • 再假設該節本HTML文件的URL為:www.yesky.com/sompath/index.html。
    • HTTP客戶端與服務器主機www.yesky.com中的HTTP服務器建立一個TCP連接。
    • HTTP客戶端發送HTTP請求消息。 包含/sompath/index.html。
    • HTTP服務器接收請求消息,從服務器主機內存或硬盤拿去除對象/sompath/index.html,發出該對象的響應消息。
    • HTTP服務器告知TCP關閉這個TCP連接(TCP要等客戶收到這個響應消息後,才會真正終止這個連接)。
    • HTTP客戶接收響應消息。TCP連接終止。 該消息標明所拆裝的對象是一個HTML文件。客戶取出文件,分析後發現10個JPEG對象的引用。
    • 給每一個引用到的JPEG對象重復步驟1~4。

【非持續連接的串行TCP連接、並行TCP連接和響應時間】

  • 十個JPEG對象,可以通過串行的TCP連接方式先後取到;我們也可以通過並行的TCP同時取到對象,縮短響應時間
  • 客戶端請求一個基本HTML文件,要耗時2個RTT(Round Trip Time)加上服務器服務器
    • RTT:一個短分組從客戶端到服務端在返回客戶所花費的時間
    • 建立瀏覽器和Web服務端的TCP連接,需要經過“三次握手”過程(關於三次握手請參考TCP三次握手詳解及釋放連接過程)
    • 第一次握手發起TCP連接,第三次握手請求文件

技術分享圖片

  • TCP的缺點
    • 每個連接,TCP得在客戶端和服務端分配TCP緩沖區,並維持TCP變量。 對於同時為來自數百個不同客戶的請求提供服務的web服務器來說,這會嚴重增加其負擔。
    • 每個對象有2個RTT
    • 每個對象都遭受TCP緩啟動,因為每個TCP連接都起始於緩啟動階段。

【持續連接】(關於持續連接、非持續連接請參考HTTP協議:持久連接、非持久連接)

  • 持續連接:服務器在發送響應後,保持該TCP連接打開。在相同的客戶機與服務器之間的後續請求和響應報文通過相同的連接進行傳送。不需要再次建立tcp連接
  • 不帶流水線(without pipelining):客戶只在收到前一個請求的響應後,才發出新的請求。
    • 與非持續連接的2個RTT延遲相比,不帶流水線每個引用到的對象各有1個RTT的延遲
  • 帶流水線(with pipelining):HTTP客戶每碰到一個引用就立即發送一個請求,即HTTP客戶可以一個接 一個挨著發送各個引用對象的請求。服務器收到這些請求後,也可以一個接一個的發送各個對象的響應。
    • 帶流水線的持久連接中服務器空等請求的時間較少,所有引用到的對象一共只經歷1個RTT的延時。

## HTTP請求協議

HTTP協議包括:請求消息 與 響應消息

【請求信息】

一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行請求數據4個部分組成,下圖給出了請求報文的一般格式。

技術分享圖片

  • HTTP請求報文的第一行叫做請求行(request line),請求行由 方法字段URL字段 HTTP協議版本字段 3個字段組成,它們用空格分隔。
    • HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
  • 後繼的行叫做請求頭部行:
    • 請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知服務器有關於客戶端請求的信息,典型的請求頭有:
    • User-Agent:產生請求的瀏覽器類型。
    • Accept:客戶端可識別的內容類型列表。
    • Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。
    • Connection:告訴服務器是否需要持續連接
  • 空行:最後一個請求頭之後是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭。
    • 回車符:cr;換行符:lf;空格:sp

【Get請求方法】

  最常見的一種請求方式,當客戶端要從服務器中讀取文檔時,當點擊網頁上的鏈接或者通過在瀏覽器的地址欄輸入網址來瀏覽網頁的,使用的都是GET方式。GET方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。使用GET方法時,請求參數和對應的值附加在URL後面,利用一個問號(“?”)代表URL的結尾與請求參數的開始,傳遞參數長度受限制。例如,/index.jsp?id=100&op=bind,這樣通過GET方式傳遞的數據直接表示在地址中,所以我們可以把請求結果以鏈接的形式發送給好友。(轉自:https://www.cnblogs.com/rainydayfmb/p/5319318.html) 下例為請求打開本博客中莫伊照片的請求方法頭:

GET /images/upup.gif HTTP/1.1
Host: static.cnblogs.com
Connection: keep-alive
If-Modified-Since: Sun, 17 Dec 2017 20:47:09 GMT
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: https://www.cnblogs.com/bundles/blog-common.css?v=PX31qVjOE47mNaZI9JUSFK-ajuzMnpXA9PeteRNR1Qw1
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7
  • 地址中”?”之後的部分就是通過GET發送的請求數據,我們可以在地址欄中清楚的看到,各個數據之間用”&”符號隔開。顯然,這種方式不適合傳送私密數據。另外,由於不同的瀏覽器對地址的字符限制也有所不同,一般最多只能識別1024個字符,所以如果需要傳送大量數據的時候,也不適合使用GET方式。
  • HTTP默認的請求方法就是GET
    • 沒有請求體
    • 數據量有限制!
    • GET請求數據會暴露在瀏覽器的地址欄中
  • GET請求常用的操作:
    • 在瀏覽器的地址欄中直接給出URL,那麽就一定是GET請求
    • 點擊頁面上的超鏈接也一定是GET請求
    • 提交表單時,表單默認使用GET請求,但可以設置為POST
  • 請求頭:  
1、Host:請求的web服務器域名地址
2、User-Agent:HTTP客戶端運行的瀏覽器類型的詳細信息。通過該頭部信息,web服務器可以判斷出http請求的客戶端的瀏覽器的類型。
3、Accept:指定客戶端能夠接收的內容類型,內容類型的先後次序表示客戶都接收的先後次序
4、Accept-Lanuage:指定HTTP客戶端瀏覽器用來展示返回信息優先選擇的語言
5、Accept-Encoding:指定客戶端瀏覽器可以支持的web服務器返回內容壓縮編碼類型。表示允許服務器在將輸出內容發送到客戶端以前進行壓縮,以節約帶寬。
而這裏設置的就是客戶端瀏覽器所能夠支持的返回壓縮格式。
6、Accept-Charset:HTTP客戶端瀏覽器可以接受的字符編碼集
7、If-modified-since:記錄網頁最後更新的時間,以允許緩存器證明它的對象是不是最新的 7、Content-Type: 顯示此HTTP請求提交的內容類型。一般只有post提交時才需要設置該屬性 有關Content-Type屬性值有如下兩種編碼類型: (1)“application/x-www-form-urlencoded”: 表單數據向服務器提交時所采用的編碼類型,默認的缺省值就是“application/x-www-form-urlencoded”。 然而,在向服務器發送大量的文本、包含非ASCII字符的文本或二進制數據時這種編碼方式效率很低。 (2)“multipart/form-data”: 在文件上載時,所使用的編碼類型應當是“multipart/form-data”,它既可以發送文本數據,也支持二進制數據上載。 當提交為表單數據時,可以使用“application/x-www-form-urlencoded”;當提交的是文件時,就需要使用“multipart/form-data”編碼類型。

【Post請求方法】

使用POST方法可以允許客戶端給服務器提供信息較多。POST方法將 請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,可以傳輸大量數據,這樣POST方式對傳送的數據大小沒有限制,而且也不會顯示在URL中。下例為登陸郵箱時請求方法頭:

POST /contacts/[email protected] HTTP/1.1
Host: mail.163.com
Connection: keep-alive
Content-Length: 36
Origin: https://mail.163.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Content-type: application/x-www-form-urlencoded
Accept: */*
Referer: https://mail.163.com/js6/main.jsp?sid=rAraHhmcZFpASRsJRyccJovqsYPSLZYL&df=mail163_letter
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7

【響應格式】

  一般情況下,服務器接收並處理客戶端發過來的請求後會返回一個HTTP的響應消息。

  HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。

  技術分享圖片

HTTP/1.1 200 OK 
Connection: close
Date: Thu, 06 Aug 1998 12:00:15 GMT 
Server: Apache/1.3.0 (Unix) 
Last-Modified: Mon, 22 Jun 1998 ...... 
Content-Length: 6821 
Content-Type: text/html

(data data data data……)
  • 第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。
    • 第一行為狀態行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態消息為(ok)
  • 第二部分:消息報頭,用來說明客戶端要使用的一些附加信息
    • Date:生成響應的日期和時間;
    • Content-Type:指定了MIME類型的HTML(text/html)
  • 第三部分:空行,消息報頭後面的空行是必須的
  • 第四部分:響應正文,服務器返回給客戶端的文本信息

【響應狀態碼】

  狀態碼分類:

狀態代碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求

  常見狀態碼:

200 OK                        //客戶端請求成功
400 Bad Request               //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized              //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 
403 Forbidden                 //服務器收到請求,但是拒絕提供服務
404 Not Found                 //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error     //服務器發生不可預期的錯誤
503 Server Unavailable        //服務器當前不能處理客戶端的請求,一段時間後可能恢復正

  更多的狀態碼鏈接:http://www.runoob.com/http/http-status-codes.html

【GET與POST請求的區別】(參考:https://blog.csdn.net/javandroid/article/details/29884033)

## Cookie

  • 由於HTTP協議無狀態,無法知道客戶的相關信息,使得一些應用難以實現,如網上購物(你需要掌握好客戶端的狀態),故引入Cookie技術來解決這個問題。
  • Cookie是在遠程瀏覽器端存儲數據並以此跟蹤和識別用戶身份的機制,即Cookie是存儲在客戶端的一小段數據,瀏覽器(即客戶端)通過HTTP協議和服務器端進行Cookie的交互。
  • cookie允許站點對用戶進行跟蹤。
  • Cookie技術有4個組件:
    • 在HTTP響應報文中的一個cookie首部行
    • 在HTTP請求報文中的一個Cookie首部行
    • 在用戶端系統中保留有一個Cookie文件,並由用戶的瀏覽器進行管理
    • 位於web站點的一個後端數據庫

栗子:

技術分享圖片

## Web緩存

  • Web緩存器(Web cache),也叫代理服務器(proxy server),是能夠代表初始Web服務器來滿足HTTP請求的網絡實體。
  • Web cache有自己的磁盤存儲,並在存儲空間中保存最近請求過的對象的副本。通過配置客戶端瀏覽器,使得用戶的所有HTTP請求首先指向Web緩存器。
  • proxy server既是服務器同時又是客戶:當它接收客戶端的請求並響應時,它是一個服務器;當它向初始服務器發出請求並接收響應時,它是一個客戶。
  • 使用Web緩存的原因:
    • Web緩存器可以大大減少客戶端請求的響應時間;
    • Web緩存器能夠大大減少一個組織機構的接入鏈路到因特網的通信量而降低帶寬費用。
  • 通過使用內容分發網絡(Content Distribution Network,CDN),Web緩存器正在Internet中發揮著越來越重要的作用。

技術分享圖片技術分享圖片

【計算機網絡】Web和HTTP