http 響應(yīng)常見狀態(tài)碼
- 100-199 : 表示成功接收請(qǐng)求, 要求客戶端繼續(xù)提交下一次請(qǐng)求才能完成整個(gè)處理過程
- 200-299: 表示成果接收請(qǐng)求并已完成整個(gè)處理過程. 常用 200
- 300-399: 為完成請(qǐng)求, 客戶需進(jìn)一步細(xì)化需求: 例如: 請(qǐng)求的資源已經(jīng)移動(dòng)一個(gè)新地址, 常用 302(重定向), 307 和 304(拿緩存)
- 400-499: 客戶端的請(qǐng)求有錯(cuò)誤, 包含語法錯(cuò)誤或者不能正確執(zhí)行. 常用 404(請(qǐng)求的資源在 web 服務(wù)器中沒有) 403(服務(wù)器拒絕訪問, 權(quán)限不夠)
- 500-599: 服務(wù)器端出現(xiàn)錯(cuò)誤
常用:
- 200 正常稽揭,表示一切正常, 返回的是正常請(qǐng)求結(jié)果
- 302/307 臨時(shí)重定向,指出請(qǐng)求的文檔已被臨時(shí)移動(dòng)到別處, 此文檔的新的 url 在 location 響應(yīng)頭中給出
- 304 未修改揪胃,表示客戶機(jī)緩存的版本是最新的, 客戶機(jī)應(yīng)該繼續(xù)使用它
- 403 禁止,服務(wù)器理解客戶端請(qǐng)求, 但拒絕處理它, 通常用于服務(wù)器上文件或目錄的權(quán)限設(shè)置所致
- 404 找不到骚勘,服務(wù)器上不存在客戶機(jī)所請(qǐng)求的資源
- 500 服務(wù)器內(nèi)部錯(cuò)誤俏讹,服務(wù)器端的 cgi, asp, jsp 等程序發(fā)生錯(cuò)誤
簡(jiǎn)述 http 1.1 與 http 1.0 的區(qū)別
- http 1.0 對(duì)于每個(gè)連接都得建立一次連接, 一次只能傳送一個(gè)請(qǐng)求和響應(yīng), 請(qǐng)求就會(huì)關(guān)閉, http1.0 沒有 Host 字段
- 而 http1.1 在同一個(gè)連接中可以傳送多個(gè)請(qǐng)求和響應(yīng), 多個(gè)請(qǐng)求可以重疊和同時(shí)進(jìn)行, http1.1 必須有 host 字段
- http1.1 中引入了 ETag 頭, 它的值 entity tag 可以用來唯一的描述一個(gè)資源. 請(qǐng)求消息中可以使用 If-None-Match 頭域來匹配資源的 entitytag 是否有變化
- http1.1 新增了 Cache-Control 頭域(消息請(qǐng)求和響應(yīng)請(qǐng)求都可以使用), 它支持一個(gè)可擴(kuò)展的指令子集
- http1.0 中只定義了 16 個(gè)狀態(tài)響應(yīng)碼, 對(duì)錯(cuò)誤或警告的提示不夠具體. http1.1 引入了一個(gè) Warning 頭域, 增加對(duì)錯(cuò)誤或警告信息的描述. 且新增了 24 個(gè)狀態(tài)響應(yīng)碼
說一下 TCP 三次握手和四次揮手
- 建立 TCP 連接需要三次握手:三次握手: 首先 Client 端發(fā)送連接請(qǐng)求報(bào)文定拟,Server 段接受連接后回復(fù) ACK 報(bào)文,并為這次連接分配資源驱证。Client 端接收到 ACK 報(bào)文后也向 Server 段發(fā)生 ACK 報(bào)文抹锄,并分配資源,這樣 TCP 連接就建立了吻育。
- 第一步: 客戶機(jī)的 TCP 先向服務(wù)器的 TCP 發(fā)送一個(gè)連接請(qǐng)求報(bào)文. 這個(gè)特殊的報(bào)文中不含應(yīng)用層數(shù)據(jù), 其首部中的 SYN 標(biāo)志位被置 1. 另外, 客戶機(jī)會(huì)隨機(jī)選擇一個(gè)起始序號(hào) seq=x(連接請(qǐng)求報(bào)文不攜帶數(shù)據(jù),但要消耗掉一個(gè)序號(hào))
- 第二步: 服務(wù)器端的 TCP 收到連接請(qǐng)求報(bào)文后, 若同意建立連接, 就向客戶機(jī)發(fā)送請(qǐng)求, 并為該 TCP 連接分配 TCP 緩存和變量. 在確認(rèn)報(bào)文中,SYN 和 ACK 位都被置為 1, 確認(rèn)號(hào)字段的值為 x+1, 并且服務(wù)器隨機(jī)產(chǎn)生起始序號(hào) seq=y(確認(rèn)報(bào)文不攜帶數(shù)據(jù), 但也要消耗掉一個(gè)序號(hào)). 確認(rèn)報(bào)文同樣不包含應(yīng)用層數(shù)據(jù).
- 第三步: 當(dāng)客戶機(jī)收到確認(rèn)報(bào)文后, 還要向服務(wù)器給出確認(rèn), 并且也要給該連接分配緩存和變量. 這個(gè)報(bào)文的 ACK 標(biāo)志位被置為 1, 序號(hào)字段為 x+1, 確認(rèn)號(hào)字段為 y+1
- 四次揮手
- 第一步: 客戶機(jī)打算關(guān)閉連接,就向其 TCP 發(fā)送一個(gè)連接釋放報(bào)文,并停止再發(fā)送數(shù)據(jù),主動(dòng)關(guān)閉 TCP 連接, 該報(bào)文的 FIN 標(biāo)志位被置 1, seq=u, 它等于前面已經(jīng)傳送過的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加 1(FIN 報(bào)文即使不攜帶數(shù)據(jù),也要消耗掉一個(gè)序號(hào))
- 第二步: 服務(wù)器接收連接釋放報(bào)文后即發(fā)出確認(rèn), 確認(rèn)號(hào)是 ack=u+1, 這個(gè)報(bào)文自己的序號(hào)是 v, 等于它前面已傳送過的數(shù)據(jù)的最后一個(gè)自己的序號(hào)加 1. 此時(shí), 從客戶機(jī)到服務(wù)器這個(gè)方向的連接就釋放了, TCP 連接處于半關(guān)閉狀態(tài). 但服務(wù)器若發(fā)送數(shù)據(jù), 客戶機(jī)仍要接收, 即從服務(wù)器到客戶機(jī)的連接仍未關(guān)閉.
- 第三步: 若服務(wù)器已經(jīng)沒有了要向客戶機(jī)發(fā)送的數(shù)據(jù), 就通知 TCP 釋放連接, 此時(shí)其發(fā)出 FIN=1 的連接釋放報(bào)文
- 第四步: 客戶機(jī)收到連接釋放報(bào)文后, 必須發(fā)出確認(rèn). 在確認(rèn)報(bào)文中, ACK 字段被置為 1, 確認(rèn)號(hào) ack=w+1, 序號(hào) seq=u+1. 此時(shí), TCP 連接還沒有釋放掉, 必須經(jīng)過等待計(jì)時(shí)器設(shè)置的時(shí)間 2MSL 后, A 才進(jìn)入到連接關(guān)閉狀態(tài).
計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)有哪些
[圖片上傳失敗...(image-50f618-1555410332682)]
學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)時(shí)我們一般采用折中的辦法游两,也就是中和 OSI 和 TCP/IP 的優(yōu)點(diǎn),采用一種只有五層協(xié)議的體系結(jié)構(gòu)宝踪,這樣既簡(jiǎn)潔又能將概念闡述清楚肴沫。
應(yīng)用層
應(yīng)用層(application-layer)的任務(wù)是通過應(yīng)用進(jìn)程間的交互來完成特定網(wǎng)絡(luò)應(yīng)用。應(yīng)用層協(xié)議定義的是應(yīng)用進(jìn)程(進(jìn)程:主機(jī)中正在運(yùn)行的程序)間的通信和交互的規(guī)則站蝠。對(duì)于不同的網(wǎng)絡(luò)應(yīng)用需要不同的應(yīng)用層協(xié)議吟孙。在互聯(lián)網(wǎng)中應(yīng)用層協(xié)議很多,如域名系統(tǒng) DNS碘勉,支持萬維網(wǎng)應(yīng)用的 HTTP 協(xié)議,支持電子郵件的 SMTP 協(xié)議等等胜嗓。我們把應(yīng)用層交互的數(shù)據(jù)單元稱為報(bào)文辞州。
域名系統(tǒng)
- 域名系統(tǒng)(Domain Name System 縮寫 DNS产禾,Domain Name 被譯為域名)是因特網(wǎng)的一項(xiàng)核心服務(wù),它作為可以將域名和 IP 地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù)衫生,能夠使人更方便的訪問互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的 IP 數(shù)串泪酱。(百度百科)例如:一個(gè)公司的 Web 網(wǎng)站可看作是它在網(wǎng)上的門戶拓轻,而域名就相當(dāng)于其門牌地址勿锅,通常域名都使用該公司的名稱或簡(jiǎn)稱。例如上面提到的微軟公司的域名溢十,類似的還有:IBM 公司的域名是 www.ibm.com泳叠、Oracle 公司的域名是 www.oracle.com、Cisco 公司的域名是 www.cisco.com 等茶宵。
HTTP 協(xié)議
- 超文本傳輸協(xié)議(HTTP危纫,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的 WWW(萬維網(wǎng)) 文件都必須遵守這個(gè)標(biāo)準(zhǔn)乌庶。設(shè)計(jì) HTTP 最初的目的是為了提供一種發(fā)布和接收 HTML 頁(yè)面的方法种蝶。(百度百科)
運(yùn)輸層
運(yùn)輸層(transport layer)的主要任務(wù)就是負(fù)責(zé)向兩臺(tái)主機(jī)進(jìn)程之間的通信提供通用的數(shù)據(jù)傳輸服務(wù)。應(yīng)用進(jìn)程利用該服務(wù)傳送應(yīng)用層報(bào)文撵术《“通用的”是指并不針對(duì)某一個(gè)特定的網(wǎng)絡(luò)應(yīng)用塞椎,而是多種應(yīng)用可以使用同一個(gè)運(yùn)輸層服務(wù)罩抗。由于一臺(tái)主機(jī)可同時(shí)運(yùn)行多個(gè)線程骨坑,因此運(yùn)輸層有復(fù)用和分用的功能礁遣。所謂復(fù)用就是指多個(gè)應(yīng)用層進(jìn)程可同時(shí)使用下面運(yùn)輸層的服務(wù)续语,分用和復(fù)用相反,是運(yùn)輸層把收到的信息分別交付上面應(yīng)用層中的相應(yīng)進(jìn)程帅容。
運(yùn)輸層主要使用以下兩種協(xié)議
- 傳輸控制協(xié)議 TCP(Transmisson Control Protocol)--提供面向連接的劝评,可靠的數(shù)據(jù)傳輸服務(wù)佣渴。
- 用戶數(shù)據(jù)協(xié)議 UDP(User Datagram Protocol)--提供無連接的,盡最大努力的數(shù)據(jù)傳輸服務(wù)(不保證數(shù)據(jù)傳輸?shù)目煽啃裕?/li>
UDP 的主要特點(diǎn)
- UDP 是無連接的解恰;
- UDP 使用盡最大努力交付,即不保證可靠交付,因此主機(jī)不需要維持復(fù)雜的鏈接狀態(tài)(這里面有許多參數(shù))尽爆;
- UDP 是面向報(bào)文的擎值;
- UDP 沒有擁塞控制腐巢,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會(huì)使源主機(jī)的發(fā)送速率降低(對(duì)實(shí)時(shí)應(yīng)用很有用,如 直播,實(shí)時(shí)視頻會(huì)議等)疫剃;
- UDP 支持一對(duì)一赚爵、一對(duì)多疙描、多對(duì)一和多對(duì)多的交互通信诚隙;
- UDP 的首部開銷小,只有 8 個(gè)字節(jié)起胰,比 TCP 的 20 個(gè)字節(jié)的首部要短久又。
TCP 的主要特點(diǎn)
- TCP 是面向連接的。(就好像打電話一樣,通話前需要先撥號(hào)建立連接地消,通話結(jié)束后要掛機(jī)釋放連接)炉峰;
- 每一條 TCP 連接只能有兩個(gè)端點(diǎn),每一條 TCP 連接只能是點(diǎn)對(duì)點(diǎn)的(一對(duì)一)脉执;
- TCP 提供可靠交付的服務(wù)疼阔。通過 TCP 連接傳送的數(shù)據(jù),無差錯(cuò)适瓦、不丟失竿开、不重復(fù)、并且按序到達(dá)玻熙;
- TCP 提供全雙工通信否彩。TCP 允許通信雙方的應(yīng)用進(jìn)程在任何時(shí)候都能發(fā)送數(shù)據(jù)。TCP 連接的兩端都設(shè)有發(fā)送緩存和接收緩存嗦随,用來臨時(shí)存放雙方通信的數(shù)據(jù)列荔;
- 面向字節(jié)流。TCP 中的“流”(Stream)指的是流入進(jìn)程或從進(jìn)程流出的字節(jié)序列枚尼√悖“面向字節(jié)流”的含義是:雖然應(yīng)用程序和 TCP 的交互是一次一個(gè)數(shù)據(jù)塊(大小不等),但 TCP 把應(yīng)用程序交下來的數(shù)據(jù)僅僅看成是一連串的無結(jié)構(gòu)的字節(jié)流署恍。
網(wǎng)絡(luò)層
在 計(jì)算機(jī)網(wǎng)絡(luò)中進(jìn)行通信的兩個(gè)計(jì)算機(jī)之間可能會(huì)經(jīng)過很多個(gè)數(shù)據(jù)鏈路崎溃,也可能還要經(jīng)過很多通信子網(wǎng)。網(wǎng)絡(luò)層的任務(wù)就是選擇合適的網(wǎng)間路由和交換結(jié)點(diǎn)盯质, 確保數(shù)據(jù)及時(shí)傳送袁串。 在發(fā)送數(shù)據(jù)時(shí),網(wǎng)絡(luò)層把運(yùn)輸層產(chǎn)生的報(bào)文段或用戶數(shù)據(jù)報(bào)封裝成分組和包進(jìn)行傳送呼巷。在 TCP/IP 體系結(jié)構(gòu)中囱修,由于網(wǎng)絡(luò)層使用 IP 協(xié)議,因此分組也叫 IP 數(shù)據(jù)報(bào) 王悍,簡(jiǎn)稱 數(shù)據(jù)報(bào)破镰。
這里要注意:不要把運(yùn)輸層的“用戶數(shù)據(jù)報(bào) UDP ”和網(wǎng)絡(luò)層的“ IP 數(shù)據(jù)報(bào)”弄混。另外压储,無論是哪一層的數(shù)據(jù)單元鲜漩,都可籠統(tǒng)地用“分組”來表示。
這里強(qiáng)調(diào)指出渠脉,網(wǎng)絡(luò)層中的“網(wǎng)絡(luò)”二字已經(jīng)不是我們通常談到的具體網(wǎng)絡(luò)宇整,而是指計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)模型中第三層的名稱.
互聯(lián)網(wǎng)是由大量的異構(gòu)(heterogeneous)網(wǎng)絡(luò)通過路由器(router)相互連接起來的∮蟊欤互聯(lián)網(wǎng)使用的網(wǎng)絡(luò)層協(xié)議是無連接的網(wǎng)際協(xié)議(Intert Prococol)和許多路由選擇協(xié)議,因此互聯(lián)網(wǎng)的網(wǎng)絡(luò)層也叫做網(wǎng)際層或 IP 層。
數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層(data link layer)通常簡(jiǎn)稱為鏈路層为朋。兩臺(tái)主機(jī)之間的數(shù)據(jù)傳輸臂拓,總是在一段一段的鏈路上傳送的,這就需要使用專門的鏈路層的協(xié)議习寸。 在兩個(gè)相鄰節(jié)點(diǎn)之間傳送數(shù)據(jù)時(shí)胶惰,數(shù)據(jù)鏈路層將網(wǎng)絡(luò)層交下來的 IP 數(shù)據(jù)報(bào)組裝程幀,在兩個(gè)相鄰節(jié)點(diǎn)間的鏈路上傳送幀霞溪。每一幀包括數(shù)據(jù)和必要的控制信息(如同步信息孵滞,地址信息,差錯(cuò)控制等)鸯匹。
在接收數(shù)據(jù)時(shí)坊饶,控制信息使接收端能夠知道一個(gè)幀從哪個(gè)比特開始和到哪個(gè)比特結(jié)束。這樣殴蓬,數(shù)據(jù)鏈路層在收到一個(gè)幀后匿级,就可從中提出數(shù)據(jù)部分,上交給網(wǎng)絡(luò)層染厅。 控制信息還使接收端能夠檢測(cè)到所收到的幀中有誤差錯(cuò)痘绎。如果發(fā)現(xiàn)差錯(cuò),數(shù)據(jù)鏈路層就簡(jiǎn)單地丟棄這個(gè)出了差錯(cuò)的幀肖粮,以避免繼續(xù)在網(wǎng)絡(luò)中傳送下去白白浪費(fèi)網(wǎng)絡(luò)資源孤页。如果需要改正數(shù)據(jù)在鏈路層傳輸時(shí)出現(xiàn)差錯(cuò)(這就是說,數(shù)據(jù)鏈路層不僅要檢錯(cuò)涩馆,而且還要糾錯(cuò))行施,那么就要采用可靠性傳輸協(xié)議來糾正出現(xiàn)的差錯(cuò)。這種方法會(huì)使鏈路層的協(xié)議復(fù)雜些凌净。
物理層
在物理層上所傳送的數(shù)據(jù)單位是比特悲龟。 物理層(physical layer)的作用是實(shí)現(xiàn)相鄰計(jì)算機(jī)節(jié)點(diǎn)之間比特流的透明傳送,盡可能屏蔽掉具體傳輸介質(zhì)和物理設(shè)備的差異冰寻。 使其上面的數(shù)據(jù)鏈路層不必考慮網(wǎng)絡(luò)的具體傳輸介質(zhì)是什么须教。“透明傳送比特流”表示經(jīng)實(shí)際電路傳送后的比特流沒有發(fā)生變化斩芭,對(duì)傳送的比特流來說轻腺,這個(gè)電路好像是看不見的。
在互聯(lián)網(wǎng)使用的各種協(xié)中最重要和最著名的就是 TCP/IP 兩個(gè)協(xié)議』裕現(xiàn)在人們經(jīng)常提到的 TCP/IP 并不一定單指 TCP 和 IP 這兩個(gè)具體的協(xié)議贬养,而往往表示互聯(lián)網(wǎng)所使用的整個(gè) TCP/IP 協(xié)議族。
上面我們對(duì)計(jì)算機(jī)網(wǎng)絡(luò)的五層體系結(jié)構(gòu)有了初步的了解琴庵,下面附送一張七層體系結(jié)構(gòu)圖總結(jié)一下误算。圖片來源:https://blog.csdn.net/yaopeng_2005/article/details/7064869
[圖片上傳失敗...(image-e5ed8c-1555410332682)]
Http 和 Https 的區(qū)別(逞雒溃考)
- Http 協(xié)議運(yùn)行在 TCP 之上,明文傳輸儿礼,客戶端與服務(wù)器端都無法驗(yàn)證對(duì)方的身份咖杂;Https 是身披 SSL(Secure Socket Layer)外殼的 Http,運(yùn)行于 SSL 上蚊夫,SSL 運(yùn)行于 TCP 之上诉字,是添加了加密和認(rèn)證機(jī)制的 HTTP。二者之間存在如下不同:
- 端口不同:Http 與 Http 使用不同的連接方式知纷,用的端口也不一樣壤圃,前者是 80,后者是 443琅轧;
- 資源消耗:和 HTTP 通信相比伍绳,Https 通信會(huì)由于加減密處理消耗更多的 CPU 和內(nèi)存資源;
- 開銷:Https 通信需要證書鹰晨,而證書一般需要向認(rèn)證機(jī)構(gòu)購(gòu)買墨叛;
- Https 的加密機(jī)制是一種共享密鑰加密和公開密鑰加密并用的混合加密機(jī)制。
對(duì)稱加密與非對(duì)稱加密
- 對(duì)稱密鑰加密是指加密和解密使用同一個(gè)密鑰的方式模蜡,這種方式存在的最大問題就是密鑰發(fā)送問題漠趁,即如何安全地將密鑰發(fā)給對(duì)方;而非對(duì)稱加密是指使用一對(duì)非對(duì)稱密鑰忍疾,即公鑰和私鑰闯传,公鑰可以隨意發(fā)布,但私鑰只有自己知道卤妒。發(fā)送密文的一方使用對(duì)方的公鑰進(jìn)行加密處理甥绿,對(duì)方接收到加密信息后,使用自己的私鑰進(jìn)行解密则披。
- 由于非對(duì)稱加密的方式不需要發(fā)送用來解密的私鑰共缕,所以可以保證安全性;但是和對(duì)稱加密比起來士复,它非常的慢图谷,所以我們還是要用對(duì)稱加密來傳送消息,但對(duì)稱加密所使用的密鑰我們可以通過非對(duì)稱加密的方式發(fā)送出去阱洪。
TCP 協(xié)議如何來保證傳輸?shù)目煽啃?/h3>
TCP 提供一種面向連接的便贵、可靠的字節(jié)流服務(wù)。其中冗荸,面向連接意味著兩個(gè)使用 TCP 的應(yīng)用(通常是一個(gè)客戶和一個(gè)服務(wù)器)在彼此交換數(shù)據(jù)之前必須先建立一個(gè) TCP 連接承璃。在一個(gè) TCP 連接中,僅有兩方進(jìn)行彼此通信蚌本;而字節(jié)流服務(wù)意味著兩個(gè)應(yīng)用程序通過 TCP 鏈接交換 8bit 字節(jié)構(gòu)成的字節(jié)流盔粹,TCP 不在字節(jié)流中插入記錄標(biāo)識(shí)符隘梨。
對(duì)于可靠性,TCP 通過以下方式進(jìn)行保證:
- 數(shù)據(jù)包校驗(yàn):目的是檢測(cè)數(shù)據(jù)在傳輸過程中的任何變化玻佩,若校驗(yàn)出包有錯(cuò)出嘹,則丟棄報(bào)文段并且不給出響應(yīng)席楚,這時(shí) TCP 發(fā)送數(shù)據(jù)端超時(shí)后會(huì)重發(fā)數(shù)據(jù)咬崔;
- 對(duì)失序數(shù)據(jù)包重排序:既然 TCP 報(bào)文段作為 IP 數(shù)據(jù)報(bào)來傳輸,而 IP 數(shù)據(jù)報(bào)的到達(dá)可能會(huì)失序烦秩,因此 TCP 報(bào)文段的到達(dá)也可能會(huì)失序垮斯。TCP 將對(duì)失序數(shù)據(jù)進(jìn)行重新排序,然后才交給應(yīng)用層只祠;
- 丟棄重復(fù)數(shù)據(jù):對(duì)于重復(fù)數(shù)據(jù)兜蠕,能夠丟棄重復(fù)數(shù)據(jù);
- 應(yīng)答機(jī)制:當(dāng) TCP 收到發(fā)自 TCP 連接另一端的數(shù)據(jù)抛寝,它將發(fā)送一個(gè)確認(rèn)熊杨。這個(gè)確認(rèn)不是立即發(fā)送,通常將推遲幾分之一秒盗舰;
- 超時(shí)重發(fā):當(dāng) TCP 發(fā)出一個(gè)段后晶府,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段钻趋。如果不能及時(shí)收到一個(gè)確認(rèn)川陆,將重發(fā)這個(gè)報(bào)文段;
- 流量控制:TCP 連接的每一方都有固定大小的緩沖空間蛮位。TCP 的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)较沪,這可以防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出,這就是流量控制失仁。TCP 使用的流量控制協(xié)議是可變大小的滑動(dòng)窗口協(xié)議尸曼。
參考鏈接 計(jì)算機(jī)網(wǎng)絡(luò)面試問題集錦
查找域名對(duì)應(yīng) IP 地址
這一步包括 DNS 具體的查找過程,包括:瀏覽器緩存->系統(tǒng)緩存->路由器緩存...
- 瀏覽器搜索自己的 DNS 緩存(維護(hù)一張域名與 IP 地址的對(duì)應(yīng)表)萄焦;
- 搜索操作系統(tǒng)中的 DNS 緩存(維護(hù)一張域名與 IP 地址的對(duì)應(yīng)表)控轿;
- 搜索操作系統(tǒng)的 hosts 文件( Windows 環(huán)境下,維護(hù)一張域名與 IP 地址的對(duì)應(yīng)表)楷扬;
- 操作系統(tǒng)將域名發(fā)送至 LDNS(本地區(qū)域名服務(wù)器)解幽,LDNS 查詢 自己的 DNS 緩存(一般查找成功率在 80% 左右),查找成功則返回結(jié)果烘苹,失敗則發(fā)起一個(gè)迭代 DNS 解析請(qǐng)求:
- LDNS 向 Root Name Server (根域名服務(wù)器躲株,如 com、net镣衡、org 等的解析的頂級(jí)域名服務(wù)器的地址)發(fā)起請(qǐng)求霜定,此處档悠,Root Name Server 返回 com 域的頂級(jí)域名服務(wù)器的地址;
- LDNS 向 com 域的頂級(jí)域名服務(wù)器發(fā)起請(qǐng)求望浩,返回 baidu.com 域名服務(wù)器地址辖所;
- LDNS 向 baidu.com 域名服務(wù)器發(fā)起請(qǐng)求,得到 www.baidu.com 的 IP 地址磨德;
- LDNS 將得到的 IP 地址返回給操作系統(tǒng)缘回,同時(shí)自己也將 IP 地址緩存起來懂扼;
- 操作系統(tǒng)將 IP 地址返回給瀏覽器显拳,同時(shí)自己也將 IP 地址緩存起來对湃;
從輸入 URL 到頁(yè)面加載發(fā)生了什么【必考】
總體來說分為以下幾個(gè)過程:
- DNS 解析
- TCP 連接
- 發(fā)送 HTTP 請(qǐng)求
- 服務(wù)器處理請(qǐng)求并返回 HTTP 報(bào)文
- 瀏覽器解析渲染頁(yè)面
- 連接結(jié)束
這道題的區(qū)分度很高建議大家仔細(xì)查看下面這篇文章從輸入 URL 到頁(yè)面加載發(fā)生了什么
HTTP 的幾種請(qǐng)求方法用途
- GET 方法:發(fā)送一個(gè)請(qǐng)求來取得服務(wù)器上的某一資源
- POST 方法:向 URL 指定的資源提交數(shù)據(jù)或附加新的數(shù)據(jù)
- PUT 方法:跟 POST 方法很像奈偏,也是想服務(wù)器提交數(shù)據(jù)邑退。但是楣号,它們之間有不同庐橙。PUT 指定了資源在服務(wù)器上的位置鳞上,而 POST 沒有
- HEAD 方法:只請(qǐng)求頁(yè)面的首部
- DELETE 方法:刪除服務(wù)器上的某資源
- OPTIONS 方法:它用于獲取當(dāng)前 URL 所支持的方法琳水。如果請(qǐng)求成功肆糕,會(huì)有一個(gè) Allow 的頭包含類似“GET,POST”這樣的信息
- TRACE 方法:TRACE 方法被用于激發(fā)一個(gè)遠(yuǎn)程的,應(yīng)用層的請(qǐng)求消息回路
- CONNECT 方法:把請(qǐng)求連接轉(zhuǎn)換到透明的 TCP/IP 通道
127.0.0.1 與 192.168.0.1 有什么區(qū)別【可能考】
首先明確二者沒有區(qū)別在孝!兩個(gè) IP 地址的角度不一樣诚啃,127.0.0.1 是從 IETF(因特爾工程任務(wù)組)規(guī)定看,是保留給本機(jī)使用的 IP 地址浑玛,所有的計(jì)算機(jī)默認(rèn)都是相同的绍申。而 192.168.0.1 其實(shí)只是 IETF 在 c 類網(wǎng)址中,專門留出給專用網(wǎng)絡(luò)用的一個(gè)網(wǎng)段中的一個(gè) IP 而已顾彰,該網(wǎng)段包含了 192.168.0.1 到 192.168.255.255 中所有的 IP 地址极阅。
五類 ip 地址的范圍
IP 地址分為 A,B,C,D,E 五類。
網(wǎng)絡(luò)號(hào):用于識(shí)別主機(jī)所在的網(wǎng)絡(luò)涨享;
主機(jī)號(hào):用于識(shí)別該網(wǎng)絡(luò)中的主機(jī)筋搏。
其中 A 類分配給政府機(jī)關(guān)使用,B 類地址給大中型企業(yè)使用厕隧,C 類地址給個(gè)人使用奔脐。這三種是主要的。
IP 地址分為五類吁讨,A 類保留給政府機(jī)構(gòu)髓迎,B 類分配給中等規(guī)模的公司,C 類分配給任何需要的人排龄,D 類用于組播,E 類用于實(shí)驗(yàn)翎朱,各類可容納的地址數(shù)目不同橄维。
其中 A 類、B 類凛忿、和 C 類這三類地址用于 TCP/IP 節(jié)點(diǎn),其它兩類 D 類和 E 類被用于特殊用途竞川。
A店溢、B、C 三類 IP 地址的特征:當(dāng)將 IP 地址寫成二進(jìn)制形式時(shí)流译,A 類地址的第一位總是 O逞怨,B 類地址的前兩位總是 10,C 類地址的前三位總是 110福澡。
A 類地址
- ⑴ A 類地址第 1 字節(jié)為網(wǎng)絡(luò)地址,其它 3 個(gè)字節(jié)為主機(jī)地址驹马。
- ⑵ A 類地址范圍:1.0.0.1—126.155.255.254
- ⑶ A 類地址中的私有地址和保留地址:
- ① 10.X.X.X 是私有地址(所謂的私有地址就是在互聯(lián)網(wǎng)上不使用革砸,而被用在局域網(wǎng)絡(luò)中的地址)。
- ② 127.X.X.X 是保留地址糯累,用做循環(huán)測(cè)試用的算利。
B 類地址
- ⑴ B 類地址第 1 字節(jié)和第 2 字節(jié)為網(wǎng)絡(luò)地址,其它 2 個(gè)字節(jié)為主機(jī)地址泳姐。
- ⑵ B 類地址范圍:128.0.0.1—191.255.255.254效拭。
- ⑶ B 類地址的私有地址和保留地址
- ① 172.16.0.0—172.31.255.255 是私有地址
- ② 169.254.X.X 是保留地址。如果你的 IP 地址是自動(dòng)獲取 IP 地址胖秒,而你在網(wǎng)絡(luò)上又沒有找到可用的 DHCP 服務(wù)器缎患。就會(huì)得到其中一個(gè) IP。
C 類地址
- ⑴ C 類地址第 1 字節(jié)阎肝、第 2 字節(jié)和第 3 個(gè)字節(jié)為網(wǎng)絡(luò)地址挤渔,第 4 個(gè)個(gè)字節(jié)為主機(jī)地址。另外第 1 個(gè)字節(jié)的前三位固定為 110风题。
- ⑵ C 類地址范圍:192.0.0.1—223.255.255.254判导。
- ⑶ C 類地址中的私有地址:
- 192.168.X.X 是私有地址。
D 類地址
- ⑴ D 類地址不分網(wǎng)絡(luò)地址和主機(jī)地址沛硅,它的第 1 個(gè)字節(jié)的前四位固定為 1110眼刃。
- ⑵ D 類地址范圍:224.0.0.1—239.255.255.254
E 類地址
- ⑴ E 類地址也不分網(wǎng)絡(luò)地址和主機(jī)地址,它的第 1 個(gè)字節(jié)的前五位固定為 11110摇肌。
- ⑵ E 類地址范圍:240.0.0.1—255.255.255.254
HTTP 長(zhǎng)連接擂红、短連接
在 HTTP/1.0 中默認(rèn)使用短連接。也就是說朦蕴,客戶端和服務(wù)器每進(jìn)行一次 HTTP 操作篮条,就建立一次連接弟头,任務(wù)結(jié)束就中斷連接。當(dāng)客戶端瀏覽器訪問的某個(gè) HTML 或其他類型的 Web 頁(yè)中包含有其他的 Web 資源(如 JavaScript 文件涉茧、圖像文件赴恨、CSS 文件等),每遇到這樣一個(gè) Web 資源伴栓,瀏覽器就會(huì)重新建立一個(gè) HTTP 會(huì)話伦连。
而從 HTTP/1.1 起,默認(rèn)使用長(zhǎng)連接钳垮,用以保持連接特性惑淳。使用長(zhǎng)連接的 HTTP 協(xié)議,會(huì)在響應(yīng)頭加入這行代碼:
Connection:keep-alive
在使用長(zhǎng)連接的情況下饺窿,當(dāng)一個(gè)網(wǎng)頁(yè)打開完成后歧焦,客戶端和服務(wù)器之間用于傳輸 HTTP 數(shù)據(jù)的 TCP 連接不會(huì)關(guān)閉,客戶端再次訪問這個(gè)服務(wù)器時(shí)肚医,會(huì)繼續(xù)使用這一條已經(jīng)建立的連接绢馍。Keep-Alive 不會(huì)永久保持連接,它有一個(gè)保持時(shí)間肠套,可以在不同的服務(wù)器軟件(如 Apache)中設(shè)定這個(gè)時(shí)間舰涌。實(shí)現(xiàn)長(zhǎng)連接需要客戶端和服務(wù)端都支持長(zhǎng)連接。
HTTP 協(xié)議的長(zhǎng)連接和短連接你稚,實(shí)質(zhì)上是 TCP 協(xié)議的長(zhǎng)連接和短連接瓷耙。
如何理解 HTTP 協(xié)議是無狀態(tài)的【掣橥矗考】
HTTP 協(xié)議是無狀態(tài)的,指的是協(xié)議對(duì)于事務(wù)處理沒有記憶能力乾闰,服務(wù)器不知道客戶端是什么狀態(tài)落追。也就是說,打開一個(gè)服務(wù)器上的網(wǎng)頁(yè)和上一次打開這個(gè)服務(wù)器上的網(wǎng)頁(yè)之間沒有任何聯(lián)系涯肩。HTTP 是一個(gè)無狀態(tài)的面向連接的協(xié)議轿钠,無狀態(tài)不代表 HTTP 不能保持 TCP 連接,更不能代表 HTTP 使用的是 UDP 協(xié)議(無連接)病苗。
各種協(xié)議與 HTTP 協(xié)議之間的關(guān)系
一般面試官會(huì)通過這樣的問題來考察你對(duì)計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)體系的理解疗垛。
[圖片上傳失敗...(image-87da7-1555410332682)]
Socket 連接與 HTTP 連接的聯(lián)系與區(qū)別(需了解)
由于通常情況下 Socket 連接就是 TCP 連接,因此 Socket 連接一旦建立硫朦,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容贷腕,直到雙方連接斷開。但在實(shí)際網(wǎng)絡(luò)應(yīng)用中,客戶端到服務(wù)器之間的通信往往需要穿越多個(gè)中間節(jié)點(diǎn)泽裳,例如路由器瞒斩、網(wǎng)關(guān)、防火墻等涮总,大部分防火墻默認(rèn)會(huì)關(guān)閉長(zhǎng)時(shí)間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連胸囱,因此需要通過輪詢告訴網(wǎng)絡(luò),該連接處于活躍狀態(tài)瀑梗。
而 HTTP 連接使用的是“請(qǐng)求—響應(yīng)”的方式烹笔,不僅在請(qǐng)求時(shí)需要先建立連接,而且需要客戶端向服務(wù)器發(fā)出請(qǐng)求后抛丽,服務(wù)器端才能回復(fù)數(shù)據(jù)谤职。
很多情況下,需要服務(wù)器端主動(dòng)向客戶端推送數(shù)據(jù)亿鲜,保持客戶端與服務(wù)器數(shù)據(jù)的實(shí)時(shí)與同步允蜈。此時(shí)若雙方建立的是 Socket 連接,服務(wù)器就可以直接將數(shù)據(jù)傳送給客戶端;若雙方建立的是 HTTP 連接狡门,則服務(wù)器需要等到客戶端發(fā)送一次請(qǐng)求后才能將數(shù)據(jù)傳回給客戶端陷寝,因此,客戶端定時(shí)向服務(wù)器端發(fā)送連接請(qǐng)求其馏,不僅可以保持在線,同時(shí)也是在“詢問”服務(wù)器是否有新的數(shù)據(jù)爆安,如果有就將數(shù)據(jù)傳給客戶端叛复。
http 報(bào)文大小限制
如前所述,一個(gè) HTTP 報(bào)文包含起始行扔仓,頭域和消息體褐奥,HTTP 協(xié)議本身并沒有對(duì)報(bào)文中任一部分的長(zhǎng)度做限制,也就是說翘簇,理論上一個(gè)請(qǐng)求 URI 可以無限長(zhǎng)撬码,頭域可以無限多,請(qǐng)求體可以無限大版保。但在實(shí)際場(chǎng)景下呜笑,請(qǐng)求 URI 的長(zhǎng)度會(huì)受到瀏覽器的限制,如果在瀏覽器中輸入過長(zhǎng)的 URL彻犁,那么瀏覽器會(huì)自動(dòng)進(jìn)行截?cái)嘟行病6?wù)器出于安全性和效率的考慮,也會(huì)對(duì)頭域和消息體的大小作出一定的限制汞幢。
http(tcp) 報(bào)文結(jié)構(gòu)(必考)
例如一個(gè) 100kb 的 HTML 文檔需要傳送到另外一臺(tái)計(jì)算機(jī)驼鹅,并不會(huì)整個(gè)文檔直接傳送過去,可能會(huì)切割成幾個(gè)部分,比如四個(gè)分別為 25kb 的數(shù)據(jù)段输钩。而每個(gè)數(shù)據(jù)段再加上一個(gè) TCP 首部豺型,就組成了 TCP 報(bào)文。
TCP 報(bào)文 (Segment)买乃,包括首部和數(shù)據(jù)部分姻氨。
[圖片上傳失敗...(image-a67a3-1555410332682)]
首部:
- 源端口 source port
- 目的端口 destination port
- 序號(hào) sequence number
- 確認(rèn)號(hào) acknowledgment number
- 數(shù)據(jù)偏移 offset
- 保留 reserved
- 標(biāo)志位 tcp flags
- 窗口大小 window size
- 檢驗(yàn)和 checksum
- 緊急指針 urgent pointer
- 選項(xiàng) tcp options
HTTP 的緩存機(jī)制(常考)
Http 的緩存主要利用 header 里的兩個(gè)字段來控制:
-
Cache-control
主要包含以及幾個(gè)字段:- private:則只有客戶端可以緩存
- public:客戶端和代理服務(wù)器都可以緩存
- max-age:緩存的過期時(shí)間
- no-cache:需要使用對(duì)比緩存來驗(yàn)證緩存數(shù)據(jù)
- no-store:所有內(nèi)存都不會(huì)進(jìn)行緩存
-
ETag
:即用來進(jìn)行對(duì)比緩存为牍,Etag 是服務(wù)端資源的一個(gè)標(biāo)識(shí)碼- 當(dāng)客戶端發(fā)送第一次請(qǐng)求時(shí)服務(wù)端會(huì)下發(fā)當(dāng)前請(qǐng)求資源的標(biāo)識(shí)碼 Etag哼绑,下次再請(qǐng)求時(shí),客戶端則會(huì)通過 header 里的 If-None-Match 將這個(gè)標(biāo)識(shí)碼 Etag 帶上碉咆,服務(wù)端將客戶端傳來的 Etag 與最新的資源 Etag 做對(duì)比抖韩,如果一樣,則表示資源沒有更新疫铜,返回 304茂浮。
通過 Cache-control 和 Etag 的配合來實(shí)現(xiàn) Http 的緩存機(jī)制。
Cookie
Cookie 就是用來在本地緩存記住一些狀態(tài)的壳咕,一個(gè) Cookie 一般都包含 domin(所屬域)席揽、path、Expires(過期時(shí)間)等幾個(gè)屬性谓厘。服務(wù)端可以通過在響應(yīng)頭里的 set-cookies 來將狀態(tài)寫入客戶端的 Cookie 里幌羞。下次客戶端發(fā)起請(qǐng)求時(shí)可以將 Co
Http 2.0 與 http1.x 相比有什么優(yōu)點(diǎn)(常考)
- 二進(jìn)制格式:http1.x 是文本協(xié)議竟稳,而 http2.0 是二進(jìn)制以幀為基本單位属桦,是一個(gè)二進(jìn)制協(xié)議,一幀中除了包含數(shù)據(jù)外同時(shí)還包含該幀的標(biāo)識(shí):Stream Identifier他爸,即標(biāo)識(shí)了該幀屬于哪個(gè) request,使得網(wǎng)絡(luò)傳輸變得十分靈活聂宾。
-
多路復(fù)用: 一個(gè)很大的改進(jìn),原先 http1.x 一個(gè)連接一個(gè)請(qǐng)求的情況有比較大的局限性诊笤,也引發(fā)了很多問題系谐,如建立多個(gè)連接的消耗以及效率問題。
- http1.x 為了解決效率問題讨跟,可能會(huì)盡量多的發(fā)起并發(fā)的請(qǐng)求去加載資源纪他,然而瀏覽器對(duì)于同一域名下的并發(fā)請(qǐng)求有限制,而優(yōu)化的手段一般是將請(qǐng)求的資源放到不同的域名下來突破這種限制许赃。
- 而 http2.0 支持的多路復(fù)用可以很好的解決這個(gè)問題止喷,多個(gè)請(qǐng)求共用一個(gè) TCP 連接,多個(gè)請(qǐng)求可以同時(shí)在這個(gè) TCP 連接上并發(fā)混聊,一個(gè)是解決了建立多個(gè) TCP 連接的消耗問題弹谁,一個(gè)也解決了效率的問題乾巧。那么是什么原理支撐多個(gè)請(qǐng)求可以在一個(gè) TCP 連接上并發(fā)呢?基本原理就是上面的二進(jìn)制分幀预愤,因?yàn)槊恳粠加幸粋€(gè)身份標(biāo)識(shí)沟于,所以多個(gè)請(qǐng)求的不同幀可以并發(fā)的無序發(fā)送出去,在服務(wù)端會(huì)根據(jù)每一幀的身份標(biāo)識(shí)植康,將其整理到對(duì)應(yīng)的 request 中旷太。
- header 頭部壓縮:主要是通過壓縮 header 來減少請(qǐng)求的大小,減少流量消耗销睁,提高效率供璧。因?yàn)橹按嬖谝粋€(gè)問題是,每次請(qǐng)求都要帶上 header冻记,而這個(gè) header 中的數(shù)據(jù)通常是一層不變的睡毒。
- 支持服務(wù)端推送
流量控制
流量控制是對(duì)一條通信路徑上的流量進(jìn)行控制,就是發(fā)送方通過獲取接收方的回饋來動(dòng)態(tài)調(diào)整發(fā)送的速率冗栗,來達(dá)到控制流量的效果演顾,其目的是保證發(fā)送者的發(fā)送速度不超過接收者的接收速度。
擁塞控制
擁塞控制是對(duì)整個(gè)通信子網(wǎng)的流量進(jìn)行控制隅居,屬于全局控制钠至。
慢開始+擁塞避免 先來看一張經(jīng)典的圖:
[圖片上傳失敗...(image-3d5548-1555410332682)]
一開始使用慢啟動(dòng),即擁塞窗口設(shè)為 1胎源,然后擁塞窗口指數(shù)增長(zhǎng)到慢開始的門限值(ssthresh=16),則切換為擁塞避免,即加法增長(zhǎng)棉钧,這樣增長(zhǎng)到一定程度,導(dǎo)致網(wǎng)絡(luò)擁塞涕蚤,則此時(shí)會(huì)把擁塞窗口重新降為 1掰盘,即重新慢開始,同時(shí)調(diào)整新的慢開始門限值為 12赞季,之后以此類推。快重傳+快恢復(fù)
- 快重傳:上面我們說的重傳機(jī)制都是等到超時(shí)還未收到接收方的回復(fù)奢驯,才開始進(jìn)行重傳申钩。而快重傳的設(shè)計(jì)思路是:如果發(fā)送方收到 3 個(gè)重復(fù)的接收方的 ACK,就可以判斷有報(bào)文段丟失瘪阁,此時(shí)就可以立即重傳丟失的報(bào)文段撒遣,而不用等到設(shè)置的超時(shí)時(shí)間到了才開始重傳,提高了重傳的效率管跺。
-
快恢復(fù):上面的擁塞控制會(huì)在網(wǎng)絡(luò)擁塞時(shí)將擁塞窗口降為 1义黎,重新慢開始,這樣存在的一個(gè)問題就是網(wǎng)絡(luò)無法很快恢復(fù)到正常狀態(tài)豁跑×椋快恢復(fù)就是來優(yōu)化這個(gè)問題的,使用快恢復(fù),則出現(xiàn)擁塞時(shí)狐蜕,擁塞窗口只會(huì)降低到新的慢開始門閥值(即 12)宠纯,而不會(huì)降為 1,然后直接開始進(jìn)入擁塞避免加法增長(zhǎng)层释,如下圖所示:
[圖片上傳失敗...(image-da7063-1555410332682)]
感謝:Android 網(wǎng)絡(luò)系列(一):關(guān)于計(jì)算機(jī)網(wǎng)絡(luò)的一些基礎(chǔ) -
舒大飛