網(wǎng)絡(luò)協(xié)議以及http協(xié)議

我們平時可以上網(wǎng)通訊,是因為互聯(lián)網(wǎng)協(xié)議(TCP/IP協(xié)議族)。如何探測到通訊目標(biāo),使用什么語言進行通訊,怎樣結(jié)束不同的硬件,操作系統(tǒng)之間的通訊等都需要有一套規(guī)則來約束。我們把這種規(guī)則稱為協(xié)議。把互聯(lián)網(wǎng)相關(guān)的協(xié)議集合起來總稱為互聯(lián)網(wǎng)協(xié)議(TCP/IP協(xié)議族)。

分層

通常我們把協(xié)議分為四層。
分層的好處:每一層只需要關(guān)心自己的協(xié)議。修改一處不需要整個替換,只把該層的變動替換掉就好。并且每一層設(shè)計相對簡單。


1鏈路層

電腦通訊需要組網(wǎng)(以局域網(wǎng)為例)。這一層的作用就是用來處理網(wǎng)絡(luò)的硬件部分(包括操作系統(tǒng),設(shè)備驅(qū)動,網(wǎng)卡等)。可以用光纜、電纜、雙絞線、無線電波等方式。硬件上的范疇都屬于該層。并且規(guī)定了網(wǎng)絡(luò)的一些電氣特性,作用是負(fù)責(zé)傳送0和1的電信號。

2網(wǎng)絡(luò)層

網(wǎng)絡(luò)層的作用就是在眾多的選項中,選擇正確的傳輸路線。主要是IP協(xié)議。還有mac地址。有了 IP 地址,為什么還要用 MAC 地址?,同一個子網(wǎng)絡(luò)內(nèi)。mac地址就可以滿足查詢目標(biāo)地址。采用廣播的方式。給子網(wǎng)絡(luò)的每個計算機都發(fā)送數(shù)據(jù)。每個計算機都取出目標(biāo)mac地址與自身對比。一致的話就接受數(shù)據(jù)。那我們是怎么知道目標(biāo)計算機的mac地址呢?采用ARP協(xié)議(ARP協(xié)議會使用到IP地址)。如果兩個計算機不在統(tǒng)一子網(wǎng)絡(luò)。我們就出現(xiàn)了一個新的協(xié)議IP協(xié)議。規(guī)定網(wǎng)絡(luò)地址的協(xié)議,叫做IP協(xié)議。它所定義的地址,就被稱為IP地址。互聯(lián)網(wǎng)上的每一臺計算機,都會分配到一個IP地址。這個地址分成兩個部分,前一部分代表網(wǎng)絡(luò),后一部分代表主機。單單從IP地址,我們無法判斷網(wǎng)絡(luò)部分。還是以172.16.254.1為例,它的網(wǎng)絡(luò)部分,到底是前24位,還是前16位,甚至前28位,從IP地址上是看不出來的。
那么,怎樣才能從IP地址,判斷兩臺計算機是否屬于同一個子網(wǎng)絡(luò)呢?這就要用到另一個參數(shù)"子網(wǎng)掩碼"。知道"子網(wǎng)掩碼",我們就能判斷,任意兩個IP地址是否處在同一個子網(wǎng)絡(luò)。方法是將兩個IP地址與子網(wǎng)掩碼分別進行AND運算(兩個數(shù)位都為1,運算結(jié)果為1,否則為0),然后比較結(jié)果是否相同,如果是的話,就表明它們在同一個子網(wǎng)絡(luò)中,否則就不是。

ARP協(xié)議

關(guān)于"網(wǎng)絡(luò)層",還有最后一點需要說明。
因為IP數(shù)據(jù)包是放在以太網(wǎng)數(shù)據(jù)包里發(fā)送的,所以我們必須同時知道兩個地址,一個是對方的MAC地址,另一個是對方的IP地址。通常情況下,對方的IP地址是已知的(后文會解釋),但是我們不知道它的MAC地址。
所以,我們需要一種機制,能夠從IP地址得到MAC地址。
這里又可以分成兩種情況。第一種情況,如果兩臺主機不在同一個子網(wǎng)絡(luò),那么事實上沒有辦法得到對方的MAC地址,只能把數(shù)據(jù)包傳送到兩個子網(wǎng)絡(luò)連接處的"網(wǎng)關(guān)"(gateway),讓網(wǎng)關(guān)去處理。
第二種情況,如果兩臺主機在同一個子網(wǎng)絡(luò),那么我們可以用ARP協(xié)議,得到對方的MAC地址。ARP協(xié)議也是發(fā)出一個數(shù)據(jù)包(包含在以太網(wǎng)數(shù)據(jù)包中),其中包含它所要查詢主機的IP地址,在對方的MAC地址這一欄,填的是FF:FF:FF:FF:FF:FF,表示這是一個"廣播"地址。它所在子網(wǎng)絡(luò)的每一臺主機,都會收到這個數(shù)據(jù)包,從中取出IP地址,與自身的IP地址進行比較。如果兩者相同,都做出回復(fù),向?qū)Ψ綀蟾孀约旱腗AC地址,否則就丟棄這個包。
總之,有了ARP協(xié)議之后,我們就可以得到同一個子網(wǎng)絡(luò)內(nèi)的主機MAC地址,可以把數(shù)據(jù)包發(fā)送到任意一臺主機之上了。

3傳輸層

"傳輸層"的功能,就是建立"端口到端口"的通信。相比之下,"網(wǎng)絡(luò)層"的功能是建立"主機到主機"的通信。只要確定主機和端口,我們就能實現(xiàn)程序之間的交流。這一層涉及到的就是UDP和TCP協(xié)議。UDP就是在之前的數(shù)據(jù)前面加上端口號。UDP協(xié)議的優(yōu)點是比較簡單,容易實現(xiàn),但是缺點是可靠性較差,一旦數(shù)據(jù)包發(fā)出,無法知道對方是否收到。
為了解決這個問題,提高網(wǎng)絡(luò)可靠性,TCP協(xié)議就誕生了。

4應(yīng)用層

TCP協(xié)議可以為各種各樣的程序傳遞數(shù)據(jù),比如Email、WWW、FTP等等。那么,必須有不同協(xié)議規(guī)定電子郵件、網(wǎng)頁、FTP數(shù)據(jù)的格式,這些應(yīng)用程序協(xié)議就構(gòu)成了"應(yīng)用層"。HTTP協(xié)議處于該層。



各個協(xié)議協(xié)作的關(guān)系圖:


URL和URI的區(qū)別?
URI:統(tǒng)一資源標(biāo)志符就是在某一規(guī)則下能把一個資源獨一無二地標(biāo)識出來。
URL:那統(tǒng)一資源定位符。
URL 是 URI 的子集。任何東西,只要能夠唯一地標(biāo)識出來,都可以說這個標(biāo)識是 URI 。如果這個標(biāo)識是一個可獲取到上述對象的路徑,那么同時它也可以是一個 URL ;但如果這個標(biāo)識不提供獲取到對象的路徑,那么它就必然不是 URL 。
post put 區(qū)別?
二者實質(zhì)的區(qū)別在于冪等性。
冪等是數(shù)學(xué)的一個用語,對于單個輸入或者無輸入的運算方法,如果每次都是同樣的結(jié)果,則稱其是冪等的。
POST方法往往作用于某個資源的類型,比方說要創(chuàng)建一個資源,發(fā)了一遍就是創(chuàng)建一個,發(fā)了兩遍就是創(chuàng)建了兩個。
而PUT是作用于資源的具體記錄,對它作更新實際上發(fā)一遍和發(fā)若干遍的效果是一樣的。也就是說資源的URI由客戶端確定的話就用PUT,由服務(wù)端確定的話就用POST,比如很多資源使用的是數(shù)據(jù)庫自增主鍵標(biāo)志,那么這個時候資源的創(chuàng)建就必須用POST

http 持久化。
在http1.1默認(rèn)客戶端通過請求頭Connection為keep-alive。意思為長連接??紤]一個問題。tcp是在http的下一層。也就是先http請求,在tcp連接。如果是長連接就是tcp請求不會主動斷開。那么下一個http請求的下一層是直接使用上一層請求建立的tcp連接嗎? 嗯。是的。舉個例子。HTTP 是比 TCP 更高層次的應(yīng)用層協(xié)議,根據(jù)規(guī)則,只有低層協(xié)議建立之后,才能進行高層協(xié)議的連接,因此,首先要建立 TCP 連接。而不是你想的,先http建立完成后tcp再建立。就好比打電話,A給B打電話。A撥出手機號碼,這就是http請求。這時候電話機把號碼傳給電信局交換機,中間經(jīng)過若干交換機,最終到達B電話機,電話鈴響。這時能通話嗎?不能,因為連接還沒有完成!在朱麗葉拿起話機的那一刻,電話機發(fā)送off-hook(摘機)消息給電信局交換機,意思是接收電話連接,這個消息原路返回,到達羅密歐話機,羅密歐的話機接收到這個確認(rèn)消息。之后才能進行通話。這里的電話機連接就相當(dāng)于tcp的三次握手。長連接就相當(dāng)于。A與B發(fā)完消息后,電話不掛斷繼續(xù)保持。C再與B通話就不用電話機再去連接了。直接復(fù)用就好了。模擬TCP/HTTP關(guān)系
http1.1性能優(yōu)化
詳解 HTTP 協(xié)議
網(wǎng)關(guān)代理的區(qū)別
Cache-COntrol為no catch 是什么含義

http緩存

比如數(shù)據(jù)庫緩存、代理服務(wù)器緩存、還有我們熟悉的CDN緩存,以及瀏覽器緩存。我們來看看代理服務(wù)器的緩存。


緩存服務(wù)器是一種代理服務(wù)器。
瀏覽器緩存:是瀏覽器在本地磁盤對用戶最近請求過的文檔進行存儲,當(dāng)訪問者再次訪問同一頁面時,瀏覽器就可以直接從本地磁盤加載文檔。
那什么時候是瀏覽器緩存什么時候是代理服務(wù)器緩存呢?
Cache-Control:
-public:可以被所有的用戶緩存,包括終端用戶和CDN等中間代理服務(wù)器。

-private:只能被終端用戶的瀏覽器緩存,不允許CDN等中繼緩存服務(wù)器對其緩存。
默認(rèn)Cache-Control為public。
那么一個請求的數(shù)據(jù)在瀏覽器和緩存服務(wù)器中都被緩存了。我們?yōu)g覽器會先看本地的是否過期。那么緩存服務(wù)器什么時候起作用呢?
不是說有了緩存之后,瀏覽器的每次請求都會請求本地緩存。主要看重新請的的方式是什么
瀏覽器緩存刷新

  1. 在地址欄中輸入網(wǎng)址后按回車或點擊轉(zhuǎn)到按鈕
    瀏覽器以最少的請求來獲取網(wǎng)頁的數(shù)據(jù),瀏覽器會對所有沒有過期的內(nèi)容直接使用本地緩存,從而減少了對瀏覽器的請求。所以,Expires,max-age標(biāo)記只對這種方式有效。

  2. 按F5或瀏覽器刷新按鈕
    瀏覽器會在請求中附加必要的緩存協(xié)商,但不允許瀏覽器直接使用本地緩存,它能夠讓 Last-Modified、ETag發(fā)揮效果,但是對Expires無效。

  3. 按Ctrl+F5或按Ctrl并點擊刷新按鈕
    這種方式就是強制刷新,總會發(fā)起一個全新的請求,不使用任何緩存。

當(dāng)瀏覽器本地緩存失效后,瀏覽器會向CDN邊緣節(jié)點(緩存服務(wù)器)發(fā)起請求。類似瀏覽器緩存,CDN邊緣節(jié)點也存在著一套緩存機制。所以瀏覽器緩存和代理服務(wù)器緩存不是等同的。
從瀏覽器本地緩存讀取響應(yīng)為200。還需要請求服務(wù)器的返回304。
待解決問題,掃一掃登錄長輪詢,瀏覽器并發(fā)限制鏈接個數(shù)

瀏覽器并發(fā)限制

瀏覽器做并發(fā)限制的原因:

  1. 以前服務(wù)器的負(fù)載能力差,稍微流量大一點服務(wù)器就容易崩潰。所以為了保護服務(wù)器不被強暴到崩潰,瀏覽器要對最大并發(fā)數(shù)進行限制。如果每一個用戶的最大并發(fā)數(shù)不限制的話,服務(wù)器的負(fù)載能力就會大幅度下降。

  2. 防止DDOS攻擊。最基本的DDOS攻擊就是利用合理的服務(wù)請求來占用過多的服務(wù)資源,從而使合法用戶無法得到服務(wù)的相應(yīng)。

pc一般盡量分多個域,因為DNS域名解析解析很快。但是移動端的dns很慢。
分發(fā)限制

長輪詢,輪詢,長連接

Connection:keep-alive 這個是持久連接的意思,和長連接,長輪詢沒有關(guān)系。
輪詢:客戶端定時向服務(wù)器發(fā)送Ajax請求,服務(wù)器接到請求后馬上返回響應(yīng)信息并關(guān)閉連接。
優(yōu)點:后端程序編寫比較容易。
缺點:請求中有大半是無用,浪費帶寬和服務(wù)器資源。
實例:適于小型應(yīng)用。

長輪詢:客戶端向服務(wù)器發(fā)送Ajax請求,服務(wù)器接到請求后hold住連接,直到有新消息才返回響應(yīng)信息并關(guān)閉連接,客戶端處理完響應(yīng)信息后再向服務(wù)器發(fā)送新的請求。
優(yōu)點:在無消息的情況下不會頻繁的請求,耗費資源小。
缺點:服務(wù)器hold連接會消耗資源,返回數(shù)據(jù)順序無保證,難于管理維護。
實例:WebQQ、Hi網(wǎng)頁版、Facebook IM。

長連接:在頁面里嵌入一個隱蔵iframe,將這個隱蔵iframe的src屬性設(shè)為對一個長連接的請求或是采用xhr請求,服務(wù)器端就能源源不斷地往客戶端輸入數(shù)據(jù)。
優(yōu)點:消息即時到達,不發(fā)無用請求;管理起來也相對方便。
缺點:服務(wù)器維護一個長連接會增加開銷。
實例:Gmail聊天
而持久連接的意思是tcp的連接是持久的。上面都是http的連接。如果沒有,客戶端收到響應(yīng)數(shù)據(jù)后tcp連接就會關(guān)閉連接
輪詢和持久連接
掃一掃如何實現(xiàn)
Websocket
WebSocket和Socket的區(qū)別

post和get的區(qū)別

get回退是無害的,而post會再次提交請。因為get是冪等的。post是非冪等的冪等是什么 form表單不使用ajax提交,并且跳轉(zhuǎn)到表單頁面。則刷新一次提交一次數(shù)據(jù)??梢允褂?a target="_blank" rel="nofollow">301重定向解決

content-Type和accept

ContentType:屬于實體頭。所以不是屬于請求頭的。用于定義網(wǎng)絡(luò)文件的類型和網(wǎng)頁的編碼,決定文件接收方將以什么形式、什么編碼讀取這個文件。
在請求時候是描述參數(shù)的類型,響應(yīng)時候就是描述返回文件的類型。所以我認(rèn)為客戶端和服務(wù)端都是接收方。
Accept屬于請求頭,代表客戶端希望接受的數(shù)據(jù)類型。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容