TCP/IP 通訊傳輸流html
cookieweb
url和URI算法
get和post跨域
跨域緩存
網絡安全安全
http緩存bash
HTTP是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫。服務器
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它可使瀏覽器更加高效,使網絡傳輸減小。它不只保證計算機正確快速地傳輸超文本文檔,還肯定傳輸文檔中的哪一部分,以及哪部份內容首先顯示(如文本先於圖形)等。cookie
HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。HTTP是一個無狀態的協議。
HTTP協議一般承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了咱們常說的HTTPS。以下圖所示:
首先,糾正一下我之前一直誤解的概念,我一直覺得Http和Tcp是兩種不一樣的,可是地位對等的協議,雖然知道TCP是傳輸層,而http是應用層。今天學習了下,知道了 http是要基於TCP鏈接基礎上的,簡單的說,TCP就是單純創建鏈接,不涉及任何咱們須要請求的實際數據,簡單的傳輸。http是用來收發數據,即實際應用上來的。
默認HTTP的端口號爲80,HTTPS的端口號爲443。
HTTP協議永遠都是客戶端發起請求,服務器回送響應。見下圖:
這樣就限制了使用HTTP協議,沒法實如今客戶端沒有發起請求的時候,服務器將消息推送給客戶端。
HTTP協議是一個無狀態的協議,同一個客戶端的此次請求和上次請求是沒有對應關係。
注意:客戶端與服務器的角色不是固定的,一端充當客戶端,也可能在某次請求中充當服務器。這取決與請求的發起端。HTTP協議屬於應用層,創建在傳輸層協議TCP之上。客戶端經過與服務器創建TCP鏈接,以後發送HTTP請求與接收HTTP響應都是經過訪問Socket接口來調用TCP協議實現
一次HTTP操做稱爲一個事務,其工做過程可分爲四步:
1)首先客戶機與服務器須要創建鏈接。只要單擊某個超級連接,HTTP的工做開始。
2)創建鏈接後,客戶機發送一個請求給服務器,請求方式的格式爲:統一資源標識符(URL)、協議版本號,後邊是MIME信息包括請求修飾符、客戶機信息和可能的內容。
3)服務器接到請求後,給予相應的響應信息,其格式爲一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,後邊是MIME信息包括服務器信息、實體信息和可能的內容。
4)客戶端接收服務器所返回的信息經過瀏覽器顯示在用戶的顯示屏上,而後客戶機與服務器斷開鏈接。
若是在以上過程當中的某一步出現錯誤,那麼產生錯誤的信息將返回到客戶端,有顯示屏輸出。對於用戶來講,這些過程是由HTTP本身完成的,用戶只要用鼠標點擊,等待信息顯示就能夠了。
HTTP/1.0 標準於 1996 年 5 月做爲第一份標準被公佈,它被記載於 RFC1945 - Hypertext Transfer Protocol -- HTTP/1.0
HTTP/1.1 標準於 1999 年 6 月被公佈,截止到目前它應該是最主流的 HTTP 協議版本,它被記載於 RFC2616 - Hypertext Transfer Protocol -- HTTP/1.1
HTTP/2 標準於 2015 年 5 月被正式發佈,它被記載於 RFC7540 - Hypertext Transfer Protocol -- HTTP/2
它的特色是
① 採用二進制而非明文來打包,
② 多路複用,
③ 修復隊頭堵塞,
④ 容許設置設定請求優先級,
⑤ 服務器推送,
⑥ WebSocket 等等。
HTTP/2爲何是二進制?
比起像HTTP/1.x這樣的文本協議,二進制協議解析起來更高效、「線上」更緊湊,更重要的是錯誤更少。
爲何 HTTP/2 須要多路傳輸?
HTTP/1.x 有個問題叫線端阻塞(head-of-line blocking), 它是指一個鏈接(connection)一次只提交一個請求的效率比較高, 多了就會變慢。 HTTP/1.1 試過用流水線(pipelining)來解決這個問題, 可是效果並不理想(數據量較大或者速度較慢的響應, 會阻礙排在他後面的請求). 此外, 因爲網絡媒介(intermediary )和服務器不能很好的支持流水線, 致使部署起來困難重重。而多路傳輸(Multiplexing)能很好的解決這些問題, 由於它能同時處理多個消息的請求和響應; 甚至能夠在傳輸過程當中將一個消息跟另一個摻雜在一塊兒。因此客戶端只須要一個鏈接就能加載一個頁面。
消息頭爲何須要壓縮?
假定一個頁面有80個資源須要加載(這個數量對於今天的Web而言仍是挺保守的), 而每一次請求都有1400字節的消息頭(着一樣也並很多見,由於Cookie和引用等東西的存在), 至少要7到8個來回去「在線」得到這些消息頭。這還不包括響應時間——那只是從客戶端那裏獲取到它們所花的時間而已。這全都因爲TCP的慢啓動機制,它會基於對已知有多少個包,來肯定還要來回去獲取哪些包 – 這很明顯的限制了最初的幾個來回能夠發送的數據包的數量。相比之下,即便是頭部輕微的壓縮也能夠是讓那些請求只需一個來回就能搞定——有時候甚至一個包就能夠了。這種開銷是能夠被節省下來的,特別是當你考慮移動客戶端應用的時候,即便是良好條件下,通常也會看到幾百毫秒的來回延遲。
服務器推送的好處是什麼?
當瀏覽器請求一個網頁時,服務器將會發回HTML,在服務器開始發送JavaScript、圖片和CSS前,服務器須要等待瀏覽器解析HTML和發送全部內嵌資源的請求。服務器推送服務經過「推送」那些它認爲客戶端將會須要的內容到客戶端的緩存中,以此來避免往返的延遲。
下圖是在網上找的一張圖,以爲能很好的表達HTTP請求的所發送的數據格式。
由上圖能夠看到,http請求由請求行,消息報頭,請求正文三部分構成。
請求行由請求Method, URL 字段和HTTP Version三部分構成, 總的來講請求行就是定義了本次請求的請求方式, 請求的地址, 以及所遵循的HTTP協議版本例如:
GET /example.html HTTP/1.1 (CRLF)
複製代碼
非持久鏈接和持久鏈接
在實際的應用中,客戶端每每會發出一系列請求,接着服務器端對每一個請求進行響應。對於這些請求|響應,若是每次都通過一個單獨的TCP鏈接發送,稱爲非持久鏈接。反之,若是每次都通過相同的TCP鏈接進行發送,稱爲持久鏈接
非持久鏈接在每次請求|響應以後都要斷開鏈接,下次再創建新的TCP鏈接,這樣就形成了大量的通訊開銷。例如前面提到的往返時間(RTT) 就是在創建TCP鏈接的過程當中的代價。
非持久鏈接給服務器帶來了沉重的負擔,每臺服務器可能同時面對數以百計甚至更多的請求。持久鏈接就是爲了解決這些問題,其特色是一直保持TCP鏈接狀態,直到遇到明確的中斷要求以後再中斷鏈接。持久鏈接減小了通訊開銷,節省了通訊量。
HTTP 協議中沒有加密機制,但能夠經過SSL(Secure Socket Layer, 安全套接層 )或 TLS(Transport Layer Security, 安全層傳輸協議)的組合使用,加密 HTTP 的通訊內容。屬於通訊加密,即在整個通訊線路中加密。
HTTP + 加密 + 認證 + 完整性保護 = HTTPS(HTTP Secure )
複製代碼
HTTPS 採用共享密鑰加密(對稱)和公開密鑰加密(非對稱)二者並用的混合加密機制。若密鑰可以實現安全交換,那麼有可能會考慮僅使用公開密鑰加密來通訊。可是公開密鑰加密與共享密鑰加密相比,其處理速度要慢。
因此應充分利用二者各自的優點, 將多種方法組合起來用於通訊。 在交換密鑰階段使用公開密鑰加密方式,以後的創建通訊交換報文階段 則使用共享密鑰加密方式。
1,瀏覽器將本身支持的一套加密規則發送給網站。
服務器得到瀏覽器公鑰
2,網站從中選出一組加密算法與HASH算法,並將本身的身份信息以證書的形式發回給瀏覽器。證書裏面包含了網站地址,加密公鑰,以及證書的頒發機構等信息。
瀏覽器得到服務器公鑰
3,得到網站證書以後瀏覽器要作如下工做:
4,網站接收瀏覽器發來的數據以後要作如下的操做:
加密解密過程複雜,致使訪問速度慢
加密須要認向證機構付費
整個頁面的請求都要使用HTTPS