①網絡配置-②獲取MAC地址-③DNS域名解析-④TCP鏈接創建-⑤HTTP GET 報文發送給服務器-⑥服務器生成HTTP 響應報文-⑦瀏覽器接收數據-⑧提取渲染git
若是已經有主機信息既不須要這一步驟【獲取網絡配置信息】github
①DHCP 請求報文:源端口:68,目標端口:67【默認UDP數據報信息,長度超過 512 字節時使用 TCP】;源ip:0.0.0.0;目標地址:255.255.255.255【IP數據報】;放入MAC幀【數據幀】中;【廣播數據合成】數據庫
②將上述數據廣播到全部交換機鏈接的設備;瀏覽器
③DHCP服務器接收到廣播數據幀,生成DHCP ACK報文,包含:IP 地址、DNS 服務器的 IP 地址、默認網關路由器的 IP 地址和子網掩碼緩存
④該幀的目的地址是請求主機的 MAC 地址,由於交換機具備自學習能力,以前主機發送了廣播幀以後就記錄了 MAC 地址到其轉發接口的交換表項,所以如今交換機就能夠直接知道應該向哪一個接口發送該幀。安全
⑤主機收到該幀後,不斷分解獲得 DHCP 報文。以後就配置它的 IP 地址、子網掩碼和 DNS 服務器的 IP 地址,並在其 IP 轉發表中安裝默認網關。服務器
主機經過瀏覽器生成一個 TCP 套接字,套接字向 HTTP 服務器發送 HTTP 請求。爲了生成該套接字,主機須要知道網站的域名對應的 IP 地址。網絡
主機生成一個 DNS 查詢報文,該報文具備 53 號端口,由於 DNS 服務器的端口號是 53。工具
該 DNS 查詢報文被放入目的地址爲 DNS 服務器 IP 地址的 IP 數據報中。學習
該 IP 數據報被放入一個以太網幀中,該幀將發送到網關路由器。
DHCP 過程只知道網關路由器的 IP 地址,爲了獲取網關路由器的 MAC 地址,須要使用 ARP 協議【廣播接收MAC地址】。
主機生成一個包含目的地址爲網關路由器 IP 地址的 ARP 查詢報文,將該 ARP 查詢報文放入一個具備廣播目的地址(FF:FF:FF:FF:FF:FF)的以太網幀中,並向交換機發送該以太網幀,交換機將該幀轉發給全部的鏈接設備,包括網關路由器。
網關路由器接收到該幀後,不斷向上分解獲得 ARP 報文,發現其中的 IP 地址與其接口的 IP 地址匹配,所以就發送一個 ARP 回答報文,包含了它的 MAC 地址,發回給主機。
知道了網關路由器的 MAC 地址以後,就能夠繼續 DNS 的解析過程了。
網關路由器接收到包含 DNS 查詢報文的以太網幀後,抽取出 IP 數據報,並根據轉發表決定該 IP 數據報應該轉發的路由器。
由於路由器具備內部網關協議(RIP、OSPF)和外部網關協議(BGP)這兩種路由選擇協議,所以路由表中已經配置了網關路由器到達 DNS 服務器的路由表項。
到達 DNS 服務器以後,DNS 服務器抽取出 DNS查詢報文,並在 DNS 數據庫中查找待解析的域名。
找到 DNS 記錄以後,發送 DNS 回答報文,將該回答報文放入 UDP 報文段中,而後放入 IP 數據報中,經過路由器反向轉發回網關路由器,並通過以太網交換機到達主機。
有了 HTTP 服務器的 IP 地址以後,主機就可以生成 TCP 套接字,該套接字將用於向 Web 服務器發送 HTTP GET 報文。
在生成 TCP 套接字以前,必須先與 HTTP 服務器進行三次握手來創建鏈接【TCP鏈接創建】。生成一個具備目的端口 80 的 TCP SYN 報文段,並向 HTTP 服務器發送該報文段。
HTTP 服務器收到該報文段以後,生成 TCP SYN ACK 報文段,發回給主機。
鏈接創建以後,瀏覽器生成 HTTP GET 報文,並交付給 HTTP 服務器。
HTTP 服務器從 TCP 套接字讀取 HTTP GET 報文,生成一個 HTTP 響應報文,將 Web 頁面內容放入報文主體中,發回給主機。【數據傳輸】
瀏覽器收到 HTTP 響應報文後,抽取出 Web 頁面內容,以後進行渲染,顯示 Web 頁面。
服務器返回的 響應報文 中第一行爲狀態行,包含了狀態碼以及緣由短語,用來告知客戶端請求的結果。
200 OK
204 No Content :請求已經成功處理,可是返回的響應報文不包含實體的主體部分。通常在只須要從客戶端往服務器發送信息,而不須要返回數據時使用。
206 Partial Content :表示客戶端進行了範圍請求,響應報文包含由 Content-Range 指定範圍的實體內容。
301 Moved Permanently :永久性重定向
302 Found :臨時性重定向
303 See Other :和 302 有着相同的功能,可是 303 明確要求客戶端應該採用 GET 方法獲取資源。
注:雖然 HTTP 協議規定 30一、302 狀態下重定向時不容許把 POST 方法改爲 GET 方法,可是大多數瀏覽器都會在 30一、302 和 303 狀態下的重定向把 POST 方法改爲 GET 方法。
304 Not Modified :若是請求報文首部包含一些條件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,若是不知足條件,則服務器會返回 304 狀態碼。
307 Temporary Redirect :臨時重定向,與 302 的含義相似,可是 307 要求瀏覽器不會把重定向請求的 POST 方法改爲 GET 方法。
400 Bad Request :請求報文中存在語法錯誤。
401 Unauthorized :該狀態碼錶示發送的請求須要有認證信息(BASIC 認證、DIGEST 認證)。若是以前已進行過一次請求,則表示用戶認證失敗。
403 Forbidden :請求被拒絕。
404 Not Found:沒有找到頁面。
500 Internal Server Error :服務器正在執行請求時發生錯誤。
503 Service Unavailable :服務器暫時處於超負載或正在進行停機維護,如今沒法處理請求。
GET 用於獲取資源,而 POST 用於傳輸實體主體。
GET 和 POST 的請求都能使用額外的參數,可是 GET 的參數是以查詢字符串出如今 URL 中,而 POST 的參數存儲在實體主體中。
不能由於 POST 參數存儲在實體主體中就認爲它的安全性更高,由於照樣能夠經過一些抓包工具(Fiddler)查看。
由於 URL 只支持 ASCII 碼,所以 GET 的參數中若是存在中文等字符就須要先進行編碼。例如 中文
會轉換爲 %E4%B8%AD%E6%96%87
,而空格會轉換爲 %20
。POST 參數支持標準字符集。
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
POST /test/demo_form.asp HTTP/1.1 Host: w3schools.com name1=value1&name2=value2
安全的 HTTP 方法不會改變服務器狀態,也就是說它只是可讀的。
GET 方法是安全的,而 POST 卻不是,由於 POST 的目的是傳送實體主體內容,這個內容多是用戶上傳的表單數據,上傳成功以後,服務器可能把這個數據存儲到數據庫中,所以狀態也就發生了改變。
安全的方法除了 GET 以外還有:HEAD、OPTIONS。
不安全的方法除了 POST 以外還有 PUT、DELETE。
冪等的 HTTP 方法,一樣的請求被執行一次與連續執行屢次的效果是同樣的,服務器的狀態也是同樣的。換句話說就是,冪等方法不該該具備反作用(統計用途除外)。
全部的安全方法也都是冪等的。
在正確實現的條件下,GET,HEAD,PUT 和 DELETE 等方法都是冪等的,而 POST 方法不是。
GET /pageX HTTP/1.1 是冪等的,連續調用屢次,客戶端接收到的結果都是同樣的:
GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1
POST /add_row HTTP/1.1 不是冪等的,若是調用屢次,就會增長多行記錄:
POST /add_row HTTP/1.1 -> Adds a 1nd row POST /add_row HTTP/1.1 -> Adds a 2nd row POST /add_row HTTP/1.1 -> Adds a 3rd row
DELETE /idX/delete HTTP/1.1 是冪等的,即便不一樣的請求接收到的狀態碼不同:
DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted DELETE /idX/delete HTTP/1.1 -> Returns 404
若是要對響應進行緩存,須要知足如下條件:
爲了闡述 POST 和 GET 的另外一個區別,須要先了解 XMLHttpRequest:
XMLHttpRequest 是一個 API,它爲客戶端提供了在客戶端和服務器之間傳輸數據的功能。它提供了一個經過 URL 來獲取數據的簡單方式,而且不會使整個頁面刷新。這使得網頁只更新一部分頁面而不會打擾到用戶。XMLHttpRequest 在 AJAX 中被大量使用。
HTTP 有如下安全性問題:
HTTPS 並非新協議,而是讓 HTTP 先和 SSL(Secure Sockets Layer)通訊,再由 SSL 和 TCP 通訊,也就是說 HTTPS 使用了隧道進行通訊。
經過使用 SSL,HTTPS 具備了加密(防竊聽)、認證(防假裝)和完整性保護(防篡改)。
對稱密鑰加密(Symmetric-Key Encryption),加密和解密使用同一密鑰。
非對稱密鑰加密,又稱公開密鑰加密(Public-Key Encryption),加密和解密使用不一樣的密鑰。
公開密鑰全部人均可以得到,通訊發送方得到接收方的公開密鑰以後,就可使用公開密鑰進行加密,接收方收到通訊內容後使用私有密鑰解密。
非對稱密鑰除了用來加密,還能夠用來進行簽名。由於私有密鑰沒法被其餘人獲取,所以通訊發送方使用其私有密鑰進行簽名,通訊接收方使用發送方的公開密鑰對簽名進行解密,就能判斷這個簽名是否正確。
HTTPS 採用混合的加密機制,使用非對稱密鑰加密用於傳輸對稱密鑰來保證傳輸過程的安全性,以後使用對稱密鑰加密進行通訊來保證通訊過程的效率。(下圖中的 Session Key 就是對稱密鑰)
經過使用 證書 來對通訊方進行認證。
數字證書認證機構(CA,Certificate Authority)是客戶端與服務器雙方均可信賴的第三方機構。
服務器的運營人員向 CA 提出公開密鑰的申請,CA 在判明提出申請者的身份以後,會對已申請的公開密鑰作數字簽名,而後分配這個已簽名的公開密鑰,並將該公開密鑰放入公開密鑰證書後綁定在一塊兒。
進行 HTTPS 通訊時,服務器會把證書發送給客戶端。客戶端取得其中的公開密鑰以後,先使用數字簽名進行驗證,若是驗證經過,就能夠開始通訊了。
SSL 提供報文摘要功能來進行完整性保護。
HTTP 也提供了 MD5 報文摘要功能,但不是安全的。例如報文內容被篡改以後,同時從新計算 MD5 的值,通訊接收方是沒法意識到發生了篡改。
HTTPS 的報文摘要功能之因此安全,是由於它結合了加密和認證這兩個操做。試想一下,加密以後的報文,遭到篡改以後,也很難從新計算報文摘要,由於沒法輕易獲取明文。