http原理

HTTP工作原理 
HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端。HTTP協議採用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行作爲響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。 
請求報文 
響應報文 
狀態碼 
* HTTP 請求/響應的步驟* 
1. 客戶端連接到Web服務器 
一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認爲80)建立一個TCP套接字連接。 
2. 發送HTTP請求 
通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。 
3. 服務器接受請求並返回HTTP響應 
Web服務器解析請求,定位請求資源。服務器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。 
4. 釋放連接TCP連接 
若connection 模式爲close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式爲keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求; 
5. 客戶端瀏覽器解析HTML內容 
客戶端瀏覽器首先解析狀態行,查看錶明請求是否成功的狀態代碼。然後解析每一個響應頭,響應頭告知以下爲若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。

在瀏覽器地址欄鍵入URL,按下回車之後會經歷以下流程 
1. 瀏覽器向 DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址; 
2. 解析出 IP 地址後,根據該 IP 地址和默認端口 80,和服務器建立TCP連接; 
3. 瀏覽器發出讀取文件(URL 中域名後面部分對應的文件)的HTTP 請求,該請求報文作爲 TCP 三次握手的第三個報文的數據發送給服務器; 
4. 服務器對瀏覽器請求作出響應,並把對應的 html 文本發送給瀏覽器; 
5. 釋放 TCP連接; 
6. 瀏覽器將該 html 文本並顯示內容;    
緩存控制 
在HTTP 1.1版本之前,瀏覽器緩存是通過對HTTP 1.0的Expire是頭部控制來實現的,Expires只能根據絕對時間來刷新緩存內容,HTTP 1.1增加了Cache-Control頭域,可以支持max-age用來表示相對過期時間,另外請求服務器也可以根據Etag和Last-Modified來判斷是否從瀏覽器緩存中加載文件,此時緩存的控制和判斷將決定服務器的響應報文中頭部內容的狀態碼200還是304。 
判斷過程:

  1. 瀏覽器先查詢Cache-Control,(Expires)也可以
  2. 在瀏覽器端判斷上次文件返回頭中是否含有Etag,有則帶上If-None-Match字段信息請求發送給服務器,服務器判斷Etag未修改返回304,修改了則返回200。
  3. 在瀏覽器端判斷上次文件返回頭中是否含有Last-Modified信息,有則帶上If-Modified-Since字段信息發送請求,服務器判斷Last-Modified失效則返回200,有效返回304。
  4. 如果Etag和Last-Modified都不存在,直接向服務器請求內容。

HTTP2

優點:
  1. HTTP2採用完全二進制的格式傳輸數據,而非HTTP 1.x的默認文本格式,而二進制在網絡中傳輸的基本單位一般爲幀(一個幀可以理解爲具有固定格式和長度的二進制數據包)。我們也可以理解爲HTTP2協議是通過流式傳輸的。同時HTTP2對消息頭採用HPACK壓縮傳輸,最大限度節省了傳輸帶寬。相比於HTTP 1.x每次請求都會攜帶大量冗餘頭信息。
  2. HTTP2採用TCP多路複用的方式來降低網絡請求連接建立和關閉的開銷,多個請求可以通過一個TCP連接來併發完成。HTTP 1.1可以通過PipeLine實現併發請求,但PipeLine是通過串行傳輸的,多個請求之間的響應可能會被阻塞。
  3. HTTP2支持傳輸流的優先級和流量控制機制。HTTP2每一個文件傳輸流都有自己的傳輸優先級,可以通過服務器來動態改變,服務器會保證優先級高的文件流先傳輸。
  4. 支持服務器推送,服務器能夠在特定條件下把資源主動推送給客戶端。

GET和POST的區別 
1. GET提交,請求的數據會附在URL之後(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,多個參數用&連接;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果數據是英文字母/數字,原樣發送,如果是空格,轉換爲+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX爲該符號以16進製表示的ASCII。 
POST提交:把提交的數據放置在是HTTP包的body中。 
因此,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變 
2. GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。 
3. 傳輸數據的大小:首先聲明:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規範也沒有對URL長度進行限制。 
而在實際開發中存在的限制主要有: 
GET:特定瀏覽器和服務器對URL長度有限制,例如 IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系統的支持。 
因此對於GET提交時,傳輸數據就會受到URL長度的限制。 
POST:由於不是通過URL傳值,理論上數據不受限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自的配置。 
4. 安全性 
POST的安全性要比GET的安全性高。比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,因爲(1)登錄頁面有可能被瀏覽器緩存;(2)其他人查看瀏覽器的歷史紀錄,那麼別人就可以拿到你的賬號和密碼了,除此之外,使用GET提交數據還可能會造成Cross-Site Request Forgery攻擊。 
GET和POST相同的地方 
HTTP GET、POST協議都是在HTTP上運行的 
1. GET:請求參數是作爲一個key/value對的序列(查詢字符串)附加到URL上的。查詢字符串的長度受到web瀏覽器和web服務器的限制(如IE最多支持2048個字符),不適合傳輸大型數據集同時,它很不安全 
2. POST:請求參數是在HTTP標題的一個不同部分(名爲entity body)傳輸的,這一部分用來傳輸表單信息,因此必須將Content-type設置爲:application/x-www-form-urlencoded。POST設計用來支持web窗體上的用戶字段,其參數也是作爲key/value對傳輸。但是:它不支持複雜數據類型,因爲POST沒有定義傳輸數據結構的語義和規則。 
HTTP請求頭字段

//Accept設置接受的內容類型
Accept:text/plain
//Accept-Charset設置接受的字符編碼
Accept-Charset:utf-8
//Accept-Encoding設置接受的編碼格式
Accept-Encoding:gzip,deflate
//Accept-Datetime設置接受的版本時間
Accept-Datetime:Thu,31 May 2007 20:35:00 GMT
//Accept-Language設置接受的語言
Accept-Language:en-US
//Authorization設置HTTP身份驗證的憑證
Authorization:Basic QWxhZGRpbjpv
//Cache-Control 設置請求響應鏈上所有的緩存機制必須遵守的指令
Cache-Control:no-cache
//Connection:設置當前連接和hop-by-hop協議請求字段列表的控制選項
Connection:keep-alive
Connection:Upgrade
//Content-Length:設置請求體的字節長度
Content-Length348
//Content-MD5設置基於MD5算法對請求題內容進行Base64二進制編碼
Content-MD5:Q2hl
//Content-Type設置請求體的MIME類型(適用POST和PUT請求)
Content-Type:application/x-www-form-urlencoded
//cookie設置服務器使用Set-Cookie發送的http cookie
Cookie:$Version=1;Skin=new;
//Date 設置消息發送的日期和時間
Date:Tue,15 Nov 1994
//Expect標識客戶端需要的特殊瀏覽器行爲
Expect:100-continue
//Forwarded 披露客戶端通過http代理連接web服務的源信息
Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
Forwarded: for=192.0.2.43, for=198.51.100.17
//From 設置發送請求的用戶的email地址
From: user@example.com
//Host 設置服務器域名和TCP端口號,如果使用的是服務請求標準端口號,端口號可以省略
Host: en.wikipedia.org:8080
Host: en.wikipedia.org
//If-Match 設置客戶端的ETag,當時客戶端ETag和服務器生成的ETag一致才執行,適用於更新自從上次更新之後沒有改變的資源
If-Match: "737060cd8c284d8af7ad3082f209582d"
//If-Modified-Since 設置更新時間,從更新時間到服務端接受請求這段時間內如果資源沒有改變,允許服務端返回304 Not Modified
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
//If-None-Match 設置客戶端ETag,如果和服務端接受請求生成的ETage相同,允許服務端返回304 Not Modified
If-None-Match: "737060cd8c284d8af7ad3082f209582d"
//If-Range 設置客戶端ETag,如果和服務端接受請求生成的ETage相同,返回缺失的實體部分;否則返回整個新的實體
If-Range: "737060cd8c284d8af7ad3082f209582d"
//If-Unmodified-Since 設置更新時間,只有從更新時間到服務端接受請求這段時間內實體沒有改變,服務端纔會發送響應
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
//Max-Forwards 限制代理或網關轉發消息的次數
Max-Forwards: 10
//Origin 標識跨域資源請求(請求服務端設置Access-Control-Allow-Origin響應字段)
Origin: http://www.example-social-network.com
//Pragma 設置特殊實現字段,可能會對請求響應鏈有多種影響
Pragma: no-cache
//Proxy-Authorization 爲連接代理授權認證信息
Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
//Range 請求部分實體,設置請求實體的字節數範圍,具體可以參見HTTP/1.1中的Byte serving
Range: bytes=500-999
//Referer 設置前一個頁面的地址,並且前一個頁面中的連接指向當前請求,意思就是如果當前請求是在A頁面中發送的,那麼referer就是A頁面的url地址(軼事:這個單詞正確的拼法應該是"referrer",但是在很多規範中都拼成了"referer",所以這個單詞也就成爲標準用法)
Referer: http://en.wikipedia.org/wiki/Main_Page
//Upgrade 請求服務端升級協議
Upgrade: HTTP/2.0, HTTPS/1.3, IRC/6.9, RTA/x11, websocket
//User-Agent 用戶代理的字符串值
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

DNS解析原理 
- 一個域中的每個主機名與其IP地址的映射關係由這個域的DNS服務器負責管理,例如,“www.it315.org”、“ftp.it315.org”、“blog.it315.org”等主機名都由管理域“it315.org”的DNS服務器進行管理,而不能由管理域“org”的DNS服務器進行管理。 
- 每個子域都必須在其直接父域的DNS服務器上註冊該子域的名稱和該子域的DNS服務器的IP地址,例如,必須在管理域“org”的DNS服務器註冊子域“it315.org”和管理子域“it315.org”的DNS服務器的IP地址後,域名“it315.org”才能真正被外界所認可。 
- 爲了方便對頂級域名的統一管理,在頂級域名之上其實還有一個根域名,根域名用點(.)表示,例如,“www.it315.org”也可以寫爲“www.it315.org.”,“www.it315.org.”中的最後的那個點(.)就表示根域名。 Internet中的根域名由InterNIC(國際互聯網絡信息中心)集中管理,頂級域名和其下的域名則由擁有該域名的組織、公司和個人自己管理。

域名解析方式一: 
域名解析方式 
域名解析方式二: 
域名解析方式二

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章