OSI七層模型「物理層」
首先解決兩臺物理機(jī)之間的通信需求,具體就是機(jī)器A往機(jī)器B發(fā)送比特流,機(jī)器B能收到比特流。
物理層主要定義了物理設(shè)備的標(biāo)準(zhǔn),如網(wǎng)線的類型,光纖的接口類型,各種傳輸介質(zhì)的傳輸速率。
主要作用是傳輸比特流(0101二進(jìn)制數(shù)據(jù)),將比特流轉(zhuǎn)化為電流強(qiáng)弱傳輸,到達(dá)目的后再轉(zhuǎn)化為比特流,即常說的數(shù)模轉(zhuǎn)化和模數(shù)轉(zhuǎn)換。
這層數(shù)據(jù)叫做比特。「網(wǎng)卡工作在這層」。
物理層是OSI七層模型的物理基礎(chǔ),沒有它就談不上數(shù)據(jù)傳輸了
物理層就是由實(shí)物所承載的,所以作比喻的話,公路、汽車和飛機(jī)等承載貨物(數(shù)據(jù))的交通工具,就是物理層的象征
「數(shù)據(jù)鏈路層」
在傳輸比特流的過程中,會產(chǎn)生錯傳、數(shù)據(jù)傳輸不完整的可能。
數(shù)據(jù)鏈路層定義了「如何格式化數(shù)據(jù)進(jìn)行傳輸」,以及如何控制對物理介質(zhì)的訪問。通常提供錯誤檢測和糾正,以確保數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。
本層將比特數(shù)據(jù)組成幀,交換機(jī)工作在這層,對幀解碼,并根據(jù)幀中包含的信息把數(shù)據(jù)發(fā)送到正確的接收方。
該層負(fù)責(zé)物理層面上互連的節(jié)點(diǎn)之間的通信傳輸。例如與1個以太網(wǎng)相連的兩個節(jié)點(diǎn)間的通訊。
常見的協(xié)議有 HDLC、PPP、SLIP等
數(shù)據(jù)鏈路層會將0、1序列劃分為具有意義的數(shù)據(jù)幀傳送給對端(「數(shù)據(jù)幀的生成與接收」)
「網(wǎng)絡(luò)層」
隨著網(wǎng)絡(luò)節(jié)點(diǎn)的不斷增加,點(diǎn)對點(diǎn)通訊需要通過多個節(jié)點(diǎn),如何找到目標(biāo)節(jié)點(diǎn),如何選擇最佳路徑成為首要需求。
網(wǎng)絡(luò)層主要功能是將網(wǎng)絡(luò)地址轉(zhuǎn)化為對應(yīng)的物理地址,并決定如何將數(shù)據(jù)從發(fā)送方路由到接收方。
網(wǎng)絡(luò)層通過綜合考慮發(fā)送優(yōu)先權(quán)、網(wǎng)絡(luò)擁塞程度、服務(wù)質(zhì)量以及可選路由的花費(fèi)來決定從一個網(wǎng)絡(luò)中節(jié)點(diǎn)A到另一個網(wǎng)絡(luò)中節(jié)點(diǎn)B的最佳路徑。
由于網(wǎng)絡(luò)層處理并智能指導(dǎo)數(shù)據(jù)傳送,路由器連接網(wǎng)絡(luò)隔斷,所以路由器屬于網(wǎng)絡(luò)層。
此層的數(shù)據(jù)稱之為數(shù)據(jù)包。本層需要關(guān)注的協(xié)議TCP/IP協(xié)議中的IP協(xié)議。
網(wǎng)絡(luò)層負(fù)責(zé)將數(shù)據(jù)傳輸?shù)侥繕?biāo)地址。目標(biāo)地址可以使多個網(wǎng)絡(luò)通過路由器連接而成的某一個地址。因此這一層主要負(fù)責(zé)「尋址和路由選擇」。主要由 IP、ICMP 兩個協(xié)議組成
網(wǎng)絡(luò)層將數(shù)據(jù)從發(fā)送端的主機(jī)發(fā)送到接收端的主機(jī),兩臺主機(jī)間可能會存在很多數(shù)據(jù)鏈路,但網(wǎng)絡(luò)層就是負(fù)責(zé)找出一條相對順暢的通路將數(shù)據(jù)傳遞過去。傳輸?shù)牡刂肥褂玫氖荌P地址。IP地址通過不斷轉(zhuǎn)發(fā)到更近的IP地址,最終可以到達(dá)目標(biāo)地址
「傳輸層」
隨著網(wǎng)絡(luò)通信需求的進(jìn)一步擴(kuò)大,通信過程中需要發(fā)送大量的數(shù)據(jù),如海量文件傳輸,可能需要很長時間,網(wǎng)絡(luò)在通信的過程中會中斷很多次,此時為了保證傳輸大量文件時的準(zhǔn)確性,需要對發(fā)送出去的數(shù)據(jù)進(jìn)行切分,切割為一個一個的段落(Segement)發(fā)送,其中一個段落丟失是否重傳,段落是否按順序到達(dá),是傳輸層需要考慮的問題。
傳輸層解決了主機(jī)間的數(shù)據(jù)傳輸,數(shù)據(jù)間的傳輸可以是不同網(wǎng)絡(luò),并且傳輸層解決了「傳輸質(zhì)量」的問題。
傳輸層需要關(guān)注的協(xié)議有TCP/IP協(xié)議中的TCP協(xié)議和UDP協(xié)議。
「會話層」
自動收發(fā)包,自動尋址。
會話層作用是「負(fù)責(zé)建立和斷開通信連接」,何時建立,斷開連接以及保持多久的連接。常見的協(xié)議有 ADSP、RPC 等
「表示層」
Linux給WIndows發(fā)包,不同系統(tǒng)語法不一致,如exe不能在Linux下執(zhí)行,shell不能在Windows不能直接運(yùn)行。于是需要表示層。
解決「不同系統(tǒng)之間通信語法問題」,在表示層數(shù)據(jù)將按照網(wǎng)絡(luò)能理解的方案進(jìn)行格式化,格式化因所使用網(wǎng)絡(luò)的不同而不同。
它主要負(fù)責(zé)數(shù)據(jù)格式的轉(zhuǎn)換。具體來說,就是講設(shè)備固有的數(shù)據(jù)格式轉(zhuǎn)換為網(wǎng)絡(luò)標(biāo)準(zhǔn)格式。常見的協(xié)議有ASCII、SSL/TLS 等
「應(yīng)用層」
規(guī)定發(fā)送方和接收方必須使用一個固定長度的消息頭,消息頭必須使用某種固定的組成,消息頭中必須記錄消息體的長度等信息,方便接收方正確解析發(fā)送方發(fā)送的數(shù)據(jù)。
應(yīng)用層旨在更「方便應(yīng)用從網(wǎng)絡(luò)中接收的數(shù)據(jù)」,重點(diǎn)關(guān)注TCP/IP協(xié)議中的HTTP協(xié)議
四層傳輸層數(shù)據(jù)被稱作「段」(Segments);
三層網(wǎng)絡(luò)層數(shù)據(jù)被稱做「包」(Packages);
二層數(shù)據(jù)鏈路層時數(shù)據(jù)被稱為「幀」(Frames);
一層物理層時數(shù)據(jù)被稱為「比特流」(Bits)。
TCP和IP模型OSI模型注重通信協(xié)議必要的功能;TCP/IP更強(qiáng)調(diào)在計算機(jī)上實(shí)現(xiàn)協(xié)議應(yīng)該開發(fā)哪種程序
「TCP/IP劃分了四層網(wǎng)絡(luò)模型」
第一層:應(yīng)用層,主要有負(fù)責(zé)web瀏覽器的HTTP協(xié)議, 文件傳輸?shù)腇TP協(xié)議,負(fù)責(zé)電子郵件的SMTP協(xié)議,負(fù)責(zé)域名系統(tǒng)的DNS等
第二層:傳輸層,主要是有「可靠傳輸」的TCP協(xié)議,特別「高效」的UDP協(xié)議。主要負(fù)責(zé)傳輸應(yīng)用層的數(shù)據(jù)包。
第三層:網(wǎng)絡(luò)層,主要是IP協(xié)議。主要負(fù)責(zé)尋址(找到目標(biāo)設(shè)備的位置)
第四層:數(shù)據(jù)鏈路層,主要是負(fù)責(zé)轉(zhuǎn)換數(shù)字信號和物理二進(jìn)制信號。
「四層網(wǎng)絡(luò)協(xié)議的作用」
發(fā)送端是由上至下,把上層來的數(shù)據(jù)在頭部加上各層協(xié)議的數(shù)據(jù)(部首)再下發(fā)給下層。
接受端則由下而上,把從下層接受到的數(shù)據(jù)進(jìn)行解密和去掉頭部的部首后再發(fā)送給上層。
層層加密和解密后,應(yīng)用層最終拿到了需要的數(shù)據(jù)。
「舉個例子:」
我們需要發(fā)送一個「index.html」。
兩臺電腦在應(yīng)用層都使用HTTP協(xié)議(即都使用瀏覽器)。
在傳輸層,TCP協(xié)議會將HTTP協(xié)議發(fā)送的數(shù)據(jù)看作一個數(shù)據(jù)包,并在這個數(shù)據(jù)包前面加上TCP包的一部分信息(部首)
在網(wǎng)絡(luò)層,IP協(xié)議會將TCP協(xié)議要發(fā)送的數(shù)據(jù)看作一個數(shù)據(jù)包,同樣的在這個數(shù)據(jù)包前端加上IP協(xié)議的部首
在數(shù)據(jù)鏈路層,對應(yīng)的協(xié)議也會在IP數(shù)據(jù)包前端加上以太網(wǎng)的部首。
源設(shè)備和目標(biāo)設(shè)備通過網(wǎng)線連接,就可以通過物理層的二進(jìn)制傳輸數(shù)據(jù)。
數(shù)據(jù)鏈路層,會使用對應(yīng)的協(xié)議找到物理層的二進(jìn)制數(shù)據(jù),解碼得到以太網(wǎng)的部首信息和對應(yīng)的IP數(shù)據(jù)包,再將IP數(shù)據(jù)包傳給上層的網(wǎng)絡(luò)層。
數(shù)據(jù)鏈路層》網(wǎng)絡(luò)層》傳輸層》應(yīng)用層,一層層的解碼,最后就可以在瀏覽器中得到目標(biāo)設(shè)備傳送過來的「index.html」。
「TCP/IP協(xié)議族」
從字面意義上來講,TCP/IP是指「傳輸層」的TCP協(xié)議和「網(wǎng)絡(luò)層」的IP協(xié)議。
實(shí)際上,TCP/IP只是利用 IP 進(jìn)行通信時所必須用到的協(xié)議群的統(tǒng)稱。
具體來說,在網(wǎng)絡(luò)層是IP/ICMP協(xié)議、在傳輸層是TCP/UDP協(xié)議、在應(yīng)用層是SMTP、FTP、以及 HTTP 等。他們都屬于 TCP/IP 協(xié)議。
網(wǎng)絡(luò)設(shè)備交換機(jī)
交換機(jī)可以接入多臺電腦
每個電腦網(wǎng)卡的 「MAC 地址」都是不一樣的,電腦發(fā)送數(shù)據(jù)時,數(shù)據(jù)頭部攜帶網(wǎng)卡的 MAC 地址,用 MAC 地址標(biāo)識來不同的電腦
交換機(jī)就可以識別數(shù)據(jù)頭部的 MAC 地址來區(qū)分不同的電腦
交換機(jī)除了能識別不同的電腦,還需要找到電腦連接的「交換機(jī)端口」,才能順利的把數(shù)據(jù)從相應(yīng)端口發(fā)送出去
交換機(jī)通過「自學(xué)機(jī)制」,把學(xué)習(xí)到的設(shè)備 MAC 地址和交換機(jī)端口號添加到 「MAC 地址表」,并根據(jù) MAC 地址表進(jìn)行數(shù)據(jù)「轉(zhuǎn)發(fā)」
路由器
交換機(jī)需要記錄的 MAC 地址表也越來越多,需要的交換機(jī)也越來越多
但是交換機(jī)的「容量和性能有限」,MAC 地址表無法記錄全世界電腦的 MAC 地址和對應(yīng)的端口號,MAC 地址表太大也無法快速查找到對應(yīng)的 MAC 地址表項(xiàng)
于是就有了三層網(wǎng)絡(luò)設(shè)備「路由器」,路由器可以把全世界的網(wǎng)絡(luò)連接起來
局域網(wǎng)內(nèi)的網(wǎng)絡(luò)連接可以使用「交換機(jī)」,例如一個公司內(nèi)的網(wǎng)絡(luò)或者一個校園內(nèi)的網(wǎng)絡(luò)通過交換機(jī)連接
不同區(qū)域的局域網(wǎng)互聯(lián)使用「路由器」
?
那么如何區(qū)分不同的網(wǎng)絡(luò)區(qū)域呢?又是如何跨網(wǎng)絡(luò)區(qū)域進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)的呢?
?路由器有多個端口,分別連接不同的網(wǎng)絡(luò)區(qū)域,不同網(wǎng)絡(luò)區(qū)域的 IP 地址「網(wǎng)絡(luò)號不同」
它通過識別目的 IP 地址的「網(wǎng)絡(luò)號」,再根據(jù)「路由表」進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)
HTTP「請求方法」
HTTP1.0 定義了三種請求方法:GET, POST 和 HEAD方法。
HTTP1.1 新增了六種請求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序 號方法描述
1GET請求指定的頁面信息,并返回實(shí)體主體。
2HEAD類似于 GET 請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報頭
3POST向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中。POST 請求可能會導(dǎo)致新的資源的建立和/或已有資源的修改。
4PUT從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。
5DELETE請求服務(wù)器刪除指定的頁面。
6CONNECTHTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
7OPTIONS允許客戶端查看服務(wù)器的性能。
8TRACE回顯服務(wù)器收到的請求,主要用于測試或診斷。
9PATCH是對 PUT 方法的補(bǔ)充,用來對已知資源進(jìn)行局部更新 。
「GET請求和POST請求的區(qū)別」
GET 請求的請求參數(shù)是添加到 head 中,可以在 url 中可以看到;POST 請求的請求參數(shù)是添加到body中,在url 中不可見。
請求的url有長度限制,這個限制由瀏覽器和 web 服務(wù)器決定和設(shè)置的,例如IE瀏覽器對 URL的最大限制為2083個字符,如果超過這個數(shù)字,提交按鈕沒有任何反應(yīng),因?yàn)镚ET請求的參數(shù)是添加到URL中,所以GET請求的URL的長度限制需要將請求參數(shù)長度也考慮進(jìn)去。而POST請求不用考慮請求參數(shù)的長度。
GET請求產(chǎn)生一個數(shù)據(jù)包; POST請求產(chǎn)生2個數(shù)據(jù)包,在火狐瀏覽器中,產(chǎn)生一個數(shù)據(jù)包,這個區(qū)別點(diǎn)在于瀏覽器的請求機(jī)制,先發(fā)送請求頭,再發(fā)送請求體,因?yàn)镚ET沒有請求體,所以就發(fā)送一個數(shù)據(jù)包,而POST包含請求體,所以發(fā)送兩次數(shù)據(jù)包,但是由于火狐機(jī)制不同,所以發(fā)送一個數(shù)據(jù)包。
GET 請求會被瀏覽器主動緩存下來,留下歷史記錄,而 POST 默認(rèn)不會。
GET是冪等的,而POST不是(冪等表示執(zhí)行相同的操作,結(jié)果也是相同的)
GET是獲取數(shù)據(jù),POST是修改數(shù)據(jù)
狀態(tài)碼
「狀態(tài)碼由3位數(shù)字組成,第一位定義響應(yīng)的類別」
1XX:指示信息,表示請求以接收,繼續(xù)處理
2XX:成功,表示請求已經(jīng)被成功接收、理解、接受
200 OK 是最常見的成功狀態(tài)碼,表示一切正常。如果是非 HEAD 請求,服務(wù)器返回的響應(yīng)頭都會有 body 數(shù)據(jù)。
204 No Content 也是常見的成功狀態(tài)碼,與 200 OK 基本相同,但響應(yīng)頭沒有 body 數(shù)據(jù)。
206 Partial Content 是應(yīng)用于 HTTP 分塊下載或斷電續(xù)傳,表示響應(yīng)返回的 body 數(shù)據(jù)并不是資源的全部,而是其中的一部分,也是服務(wù)器處理成功的狀態(tài)。
3XX:狀態(tài)碼表示客戶端請求的資源發(fā)送了變動,需要客戶端用新的 URL 重新發(fā)送請求獲取資源,也就是「重定向」。
301 Moved Permanently 表示永久重定向,說明請求的資源已經(jīng)不存在了,需改用新的 URL 再次訪問,搜索引擎在抓取新內(nèi)容的同時也將舊的網(wǎng)址交換為重定向之后的網(wǎng)址。
302 Moved Permanently 表示臨時重定向,說明請求的資源還在,但暫時需要用另一個 URL 來訪問,搜索引擎會抓取新的內(nèi)容而保存舊的網(wǎng)址。
301 和 302 都會在響應(yīng)頭里使用字段 Location,指明后續(xù)要跳轉(zhuǎn)的 URL,瀏覽器會自動重定向新的 URL。
304 Not Modified不具有跳轉(zhuǎn)的含義,表示資源未修改,重定向已存在的緩沖文件,也稱緩存重定向,用于緩存控制。
4XX:狀態(tài)碼表示客戶端發(fā)送的「報文有誤」,服務(wù)器無法處理,也就是錯誤碼的含義。
400 Bad Request表示客戶端請求的報文有錯誤。
401 Unauthorized:缺失或錯誤的認(rèn)證,這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用。
403 Forbidden表示服務(wù)器禁止訪問資源,并不是客戶端的請求出錯。
404 Not Found表示請求的資源在服務(wù)器上不存在或未找到,所以無法提供給客戶端。
5XX:狀態(tài)碼表示客戶端請求報文正確,但是「服務(wù)器處理時內(nèi)部發(fā)生了錯誤」,屬于服務(wù)器端的錯誤碼。
501 Not Implemented 表示客戶端請求的功能還不支持。
502 Bad Gateway 通常是服務(wù)器作為網(wǎng)關(guān)或代理時返回的錯誤碼,表示服務(wù)器自身工作正常,訪問后端服務(wù)器發(fā)生了錯誤。
503 Service Unavailable 表示服務(wù)器當(dāng)前很忙,暫時無法響應(yīng)服務(wù)器。
504 Gateway Timeout:網(wǎng)關(guān)超時,由作為代理或網(wǎng)關(guān)的服務(wù)器使用,表示不能及時地從遠(yuǎn)程服務(wù)器獲得應(yīng)答。
「301和302的區(qū)別」
301重定向,指頁面永久性轉(zhuǎn)移,表示為資源或頁面永久性地轉(zhuǎn)移到了另一個位置。
301是HTTP協(xié)議中的一種狀態(tài)碼,當(dāng)用戶或搜索引擎向服務(wù)器發(fā)出瀏覽請求時,服務(wù)器返回的HTTP數(shù)據(jù)流中頭信息中包含狀態(tài)碼 301 ,表示該資源已經(jīng)永久改變了位置。
302重定向是頁面暫時性轉(zhuǎn)移,搜索引擎會抓取新的內(nèi)容而保存舊的網(wǎng)址并認(rèn)為新的網(wǎng)址只是暫時的。
HTTP1.1
「長連接」
HTTP 1.1支持長連接
HTTP 1.0規(guī)定瀏覽器與服務(wù)器只保持短暫的連接,瀏覽器的每次請求都需要與服務(wù)器建立一個TCP連接,服務(wù)器完成請求處理后立即斷開TCP連接,服務(wù)器不跟蹤每個客戶也不記錄過去的請求。
HTTP 1.1則支持持久連接Persistent Connection,并且默認(rèn)使用,在同一個TCP的連接中可以傳送多個HTTP請求和響應(yīng),多個請求和響應(yīng)可以重疊,多個請求和響應(yīng)可以同時進(jìn)行,更加多的請求頭和響應(yīng)頭
HTTP 1.1的持續(xù)連接,也需要增加新的請求頭來幫助實(shí)現(xiàn),例如,Connection請求頭的值為Keep-Alive時,客戶端通知服務(wù)器返回本次請求結(jié)果后保持連接;Connection請求頭的值為Close時,客戶端通知服務(wù)器返回本次請求結(jié)果后關(guān)閉連接。
「管道網(wǎng)絡(luò)傳輸」
HTTP/1.1 采用了長連接的方式,這使得管道網(wǎng)絡(luò)傳輸成為了可能。
即可在同一個 TCP 連接里面,客戶端可以發(fā)起多個請求,只要第一個請求發(fā)出去了,不必等其回來,就可以發(fā)第二個請求出去,可以「減少整體的響應(yīng)時間。」
舉例來說,客戶端需要請求兩個資源。以前的做法是,在同一個TCP連接里面,先發(fā)送 A 請求,然后等待服務(wù)器做出回應(yīng),收到后再發(fā)出 B 請求,管道機(jī)制則是允許瀏覽器同時發(fā)出 A 請求和 B 請求。
但是服務(wù)器還是按照「順序」,先回應(yīng) A 請求,完成后再回應(yīng) B 請求,要是 前面的回應(yīng)特別慢,后面就會有許多請求排隊等著。
「Host字段」
在HTTP1.0中認(rèn)為每臺服務(wù)器都綁定一個唯一的IP地址,因此,請求消息中的URL并沒有傳遞主機(jī)名,但隨著虛擬主機(jī)技術(shù)的發(fā)展,在一臺物理服務(wù)器上可以存在多個虛擬主機(jī),并且它們共享一個IP地址。
HTTP1.1的請求消息和響應(yīng)消息都應(yīng)支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。
此外,服務(wù)器應(yīng)該接受以絕對路徑標(biāo)記的資源請求。
「100Status」
HTTP/1.1加入了一個新的狀態(tài)碼100。
客戶端事先發(fā)送一個只帶頭域的請求,如果服務(wù)器因?yàn)闄?quán)限拒絕了請求,就回送響應(yīng)碼401(Unauthorized);
如果服務(wù)器接收此請求就回送響應(yīng)碼100,客戶端就可以繼續(xù)發(fā)送帶實(shí)體的完整請求了。
100狀態(tài)代碼的使用,允許客戶端在發(fā)request消息body之前先用request header試探一下server,看server要不要接收request body,再決定要不要發(fā)request body。
「Chunked Transfer Coding」
HTTP/1.1將發(fā)送方將消息分割成若干個任意大小的數(shù)據(jù)塊,每個數(shù)據(jù)塊在發(fā)送時都會附上塊的長度,最后用一個零長度的塊作為消息結(jié)束的標(biāo)志。
這種方法允許發(fā)送方只緩沖消息的一個片段,避免緩沖整個消息帶來的過載。
「Cache」
HTTP/1.1在1.0的基礎(chǔ)上加入了一些Cache的新特性,當(dāng)緩存對象的Age超過Expire時變?yōu)镾table對象,Cache不需要直接拋棄Stable對象,而是與源服務(wù)器進(jìn)行重新激活。
HTTP2.0
「HTTP2.0和HTTP1.X相比的新特性」
新的二進(jìn)制格式,HTTP1.x的解析是基于文本
多路復(fù)用,即連接共享,即每一個request都是是用作連接共享機(jī)制的,一個request對應(yīng)一個id,這樣一個連接上可以有多個request,每個連接的request可以隨機(jī)的混雜在一起,接收方可以根據(jù)request的 id將request再歸屬到各自不同的服務(wù)端請求里面
header壓縮,HTTP1.x的header帶有大量信息,而且每次都要重復(fù)發(fā)送,HTTP2.0使用encoder來減少需要傳輸?shù)膆eader大小,通訊雙方各自cache一份header fields表,既避免了重復(fù)header的傳輸,又減小了需要傳輸?shù)拇笮?/p>
服務(wù)端推送
HTTP/2 還在一定程度上改善了傳統(tǒng)的請求 - 應(yīng)答工作模式,服務(wù)不再是被動地響應(yīng),也可以「主動」向客戶端發(fā)送消息。
舉例來說,在瀏覽器剛請求 HTML 的時候,就提前把可能會用到的 JS、CSS 文件等靜態(tài)資源主動發(fā)給客戶端,「減少延時的等待」,也就是服務(wù)器推送。
「數(shù)據(jù)流」
HTTP/2 的數(shù)據(jù)包不是按順序發(fā)送的,同一個連接里面連續(xù)的數(shù)據(jù)包,可能屬于不同的回應(yīng)。
因此,必須要對數(shù)據(jù)包做標(biāo)記,指出它屬于哪個回應(yīng)。
每個請求或回應(yīng)的所有數(shù)據(jù)包,稱為一個數(shù)據(jù)流(Stream)。
每個數(shù)據(jù)流都標(biāo)記著一個獨(dú)一無二的編號,其中規(guī)定客戶端發(fā)出的數(shù)據(jù)流編號為奇數(shù), 服務(wù)器發(fā)出的數(shù)據(jù)流編號為偶數(shù)
客戶端還可以「指定數(shù)據(jù)流的優(yōu)先級」。優(yōu)先級高的請求,服務(wù)器就先響應(yīng)該請求。
「HTTP2.0的多路復(fù)用和HTTP1.X中的長連接復(fù)用有什么區(qū)別」
HTTP/1.1的Pipeling為若干個請求排隊串行化單線程處理,后面的請求等待前面請求的返回才能獲得執(zhí)行機(jī)會,一旦有某請求超時等,后續(xù)請求只能被阻塞,毫無辦法;
HTTP2.0多個請求可同時在一個連接上并行執(zhí)行,某個請求任務(wù)耗時嚴(yán)重,不會影響到其它連接的正常執(zhí)行
HTTP3.0
「使用UDP協(xié)議」
HTTP/2 主要的問題在于:多個 HTTP 請求在復(fù)用一個 TCP 連接,下層的 TCP 協(xié)議是不知道有多少個 HTTP 請求的。
所以一旦發(fā)生了丟包現(xiàn)象,就會觸發(fā) TCP 的重傳機(jī)制,這樣在一個 TCP 連接中的「所有的 HTTP 請求都必須等待這個丟了的包被重傳回來」。
HTTP/1.1 中的管道傳輸中如果有一個請求阻塞了,那么隊列后請求也統(tǒng)統(tǒng)被阻塞住了
HTTP/2 多請求復(fù)用一個TCP連接,一旦發(fā)生丟包,就會阻塞住所有的 HTTP 請求。
這都是基于 TCP 傳輸層的問題,所以 「HTTP/3 把 HTTP 下層的 TCP 協(xié)議改成了 UDP!」
HTTPS
「HTTP與HTTPS的區(qū)別」
HTTP 是明文傳輸協(xié)議,HTTPS 協(xié)議是由 SSL+HTTP 協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比 HTTP 協(xié)議安全
HTTPS比HTTP更加安全,對搜索引擎更友好,利于SEO,谷歌、百度優(yōu)先索引HTTPS網(wǎng)頁
HTTPS需要用到SSL證書,而HTTP不用
HTTPS標(biāo)準(zhǔn)端口443,HTTP標(biāo)準(zhǔn)端口80
HTTPS基于傳輸層,HTTP基于應(yīng)用層
HTTPS在瀏覽器顯示綠色安全鎖,HTTP沒有顯示
「工作原理」
HTTPS 協(xié)議會對傳輸?shù)臄?shù)據(jù)進(jìn)行加密,而加密過程是使用了非對稱加密實(shí)現(xiàn)
HTTPS的整體過程分為證書驗(yàn)證和數(shù)據(jù)傳輸階段,具體的交互過程如下:
Client發(fā)起一個HTTPS的請求
Server把事先配置好的公鑰證書返回給客戶端。
Client驗(yàn)證公鑰證書:比如是否在有效期內(nèi),證書的用途是不是匹配Client請求的站點(diǎn),是不是在CRL吊銷列表里面,它的上一級證書是否有效,這是一個遞歸的過程,直到驗(yàn)證到根證書(操作系統(tǒng)內(nèi)置的Root證書或者Client內(nèi)置的Root證書),如果驗(yàn)證通過則繼續(xù),不通過則顯示警告信息。
Client使用偽隨機(jī)數(shù)生成器生成加密所使用的對稱密鑰,然后用證書的公鑰加密這個對稱密鑰,發(fā)給Server。
Server使用自己的私鑰解密這個消息,得到對稱密鑰。至此,Client和Server雙方都持有了相同的對稱密鑰。
Server使用對稱密鑰加密明文內(nèi)容A,發(fā)送給Client。
Client使用對稱密鑰解密響應(yīng)的密文,得到明文內(nèi)容A。
Client再次發(fā)起HTTPS的請求,使用對稱密鑰加密請求的明文內(nèi)容B,然后Server使用對稱密鑰解密密文,得到明文內(nèi)容B。
數(shù)字證書
客戶端先向服務(wù)器端索要公鑰,然后用公鑰加密信息,服務(wù)器收到密文后,用自己的私鑰解密。
?
這就存在些問題,如何保證公鑰不被篡改和信任度?
?所以這里就需要借助第三方權(quán)威機(jī)構(gòu) CA (數(shù)字證書認(rèn)證機(jī)構(gòu)),將「服務(wù)器公鑰放在數(shù)字證書」(由數(shù)字證書認(rèn)證機(jī)構(gòu)頒發(fā))中,只要證書是可信的,公鑰就是可信的。
通過數(shù)字證書的方式保證服務(wù)器公鑰的身份,解決冒充的風(fēng)險。
請求報文
「請求頭」
HTTP 請求報文由3部分組成(請求行+請求頭+請求體)
「常見的HTTP報文頭屬性」
Accpet
告訴服務(wù)端,客戶端接收什么類型的響應(yīng)
Referer
表示這是請求是從哪個URL進(jìn)來的,比如想在網(wǎng)上購物,但是不知道選擇哪家電商平臺,你就去問度娘,說哪家電商的東西便宜啊,然后一堆東西彈出在你面前,第一給就是某寶,當(dāng)你從這里進(jìn)入某寶的時候,這個請求報文的Referer就是:www.baidu.com
Cache-Control
對緩存進(jìn)行控制,如一個請求希望響應(yīng)的內(nèi)容在客戶端緩存一年,或不被緩可以通過這個報文頭設(shè)置
Accept-Encoding
例如:Accept-Encoding:gzip, deflate(這兩種都是壓縮格式)
這個屬性是用來告訴服務(wù)器能接受什么編碼格式,包括字符編碼,壓縮形式(一般都是壓縮形式)
Host
指定要請求的資源所在的主機(jī)和端口
User-Agent:告訴服務(wù)器,客戶端使用的操作系統(tǒng)、瀏覽器版本和名稱
Connection
決定當(dāng)前事務(wù)(三次握手和四次揮手)完成后,是否關(guān)閉網(wǎng)絡(luò)連接。
持久連接,事務(wù)完成后不關(guān)閉網(wǎng)絡(luò)連接 :Connection: keep-alive非持久連接,事務(wù)完成后關(guān)閉網(wǎng)絡(luò)連接:Connection: close響應(yīng)報文
響應(yīng)報文與請求報文一樣,由三個部分組成(響應(yīng)行,響應(yīng)頭,響應(yīng)體)
「HTTP響應(yīng)報文屬性」
Cache-Control
響應(yīng)輸出到客戶端后,服務(wù)端通過該屬性告訴客戶端該怎么控制響應(yīng)內(nèi)容的緩存
ETag
表示你請求資源的版本,如果該資源發(fā)生啦變化,那么這個屬性也會跟著變
Location
在重定向中或者創(chuàng)建新資源時使用
Set-Cookie
服務(wù)端可以設(shè)置客戶端的cookie
TCPTCP是一個傳輸層協(xié)議,提供可靠傳輸,支持全雙工,是一個連接導(dǎo)向的協(xié)議。
「雙工/單工」
在任何一個時刻,如果數(shù)據(jù)只能單向發(fā)送,就是單工。
如果在某個時刻數(shù)據(jù)可以向一個方向傳輸,也可以向另一個方向反方向傳輸,而且交替進(jìn)行,叫作半雙工;半雙工需要至少 1 條線路。
如果任何時刻數(shù)據(jù)都可以雙向收發(fā),這就是全雙工,全雙工需要大于 1 條線路。
TCP 是一個雙工協(xié)議,數(shù)據(jù)任何時候都可以雙向傳輸。
這就意味著客戶端和服務(wù)端可以平等地發(fā)送、接收信息。
「TCP協(xié)議的主要特點(diǎn)」
TCP是面向連接的運(yùn)輸層協(xié)議;所謂面向連接就是雙方傳輸數(shù)據(jù)之前,必須先建立一條通道,例如三次握手就是建議通道的一個過程,而四次揮手則是結(jié)束銷毀通道的一個其中過程。
每一條TCP連接只能有兩個端點(diǎn)(即兩個套接字),只能是點(diǎn)對點(diǎn)的;
TCP提供可靠的傳輸服務(wù)。傳送的數(shù)據(jù)無差錯、不丟失、不重復(fù)、按序到達(dá);
TCP提供全雙工通信。允許通信雙方的應(yīng)用進(jìn)程在任何時候都可以發(fā)送數(shù)據(jù),因?yàn)閮啥硕荚O(shè)有發(fā)送緩存和接受緩存;
面向字節(jié)流。雖然應(yīng)用程序與TCP交互是一次一個大小不等的數(shù)據(jù)塊,但TCP把這些數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流,它不保證接收方收到的數(shù)據(jù)塊和發(fā)送方發(fā)送的數(shù)據(jù)塊具有對應(yīng)大小關(guān)系,例如,發(fā)送方應(yīng)用程序交給發(fā)送方的TCP10個數(shù)據(jù)塊,接收方的TCP可能只用收到的4個數(shù)據(jù)塊字節(jié)流交付給上層的應(yīng)用程序
「TCP的可靠性原理」
可靠傳輸有如下兩個特點(diǎn):
傳輸信道無差錯,保證傳輸數(shù)據(jù)正確;
不管發(fā)送方以多快的速度發(fā)送數(shù)據(jù),接收方總是來得及處理收到的數(shù)據(jù);
首先,采用三次握手來建立TCP連接,四次握手來釋放TCP連接,從而保證建立的傳輸信道是可靠的。
其次,TCP采用了連續(xù)ARQ協(xié)議(回退N(Go-back-N);超時自動重傳)來保證數(shù)據(jù)傳輸?shù)恼_性,使用滑動窗口協(xié)議來保證接方能夠及時處理所接收到的數(shù)據(jù),進(jìn)行流量控制。
最后,TCP使用慢開始、擁塞避免、快重傳和快恢復(fù)來進(jìn)行擁塞控制,避免網(wǎng)絡(luò)擁塞。
報文段
TCP雖面向字節(jié)流,但傳送的數(shù)據(jù)單元為報文段
報文段 = 首部 + 數(shù)據(jù)2部分
TCP的全部功能體現(xiàn)在它首部中各字段的作用
?
首部前20個字符固定、后面有4n個字節(jié)是根據(jù)需而增加的選項(xiàng)
故 TCP首部最小長度 = 20字節(jié)
?「端口」:
源端口號和目地端口各占16位兩個字節(jié),也就是端口的范圍是2^16=65535另外1024以下是系統(tǒng)保留的,從1024-65535是用戶使用的端口范圍
「seq序號」:占4字節(jié),TCP連接中傳送的字節(jié)流中的每個字節(jié)都按順序編號。
例如:一段報文的序號字段值是107,攜帶的數(shù)據(jù)是100個字段,下一個報文段序號從107+100=207開始。
「ack確認(rèn)號」:4個字節(jié),是期望收到對方下一個報文段的第一個數(shù)據(jù)字節(jié)的序號。
例如:B收到A發(fā)送的報文,其序號字段是301,數(shù)據(jù)長度是200字節(jié),表明B正確收到A發(fā)送的到序號500為止的數(shù)據(jù)(301+200-1=500),B期望收到A下一個數(shù)據(jù)序號是501,B發(fā)送給A的確認(rèn)報文段中把a(bǔ)ck確認(rèn)號置為501。
「數(shù)據(jù)偏移」:頭部有可選字段,長度不固定,指出TCP報文段的數(shù)據(jù)起始處距離報文段的起始處有多遠(yuǎn)。
「保留」:保留今后使用的,被標(biāo)為1。
「控制位」:由8個標(biāo)志位組成。每個標(biāo)志位表示一個控制功能。
其中主要的6個:
「URG緊急指針標(biāo)志」,為1表示緊急指針有效,為0忽略緊急指針。
「ACK確認(rèn)序號標(biāo)志」,為1表示確認(rèn)號有效,為0表示報文不含確認(rèn)信息,忽略確認(rèn)號字段,上面的確認(rèn)號是否有效就是通過該標(biāo)識控制的。
「PSH標(biāo)志」,為1表示帶有push標(biāo)志的數(shù)據(jù),指示接收方在接收到該報文段以后,應(yīng)盡快將該報文段交給應(yīng)用程序,而不是在緩沖區(qū)排隊。
「RST重置連接標(biāo)志」,重置因?yàn)橹鳈C(jī)崩潰或其他原因而出現(xiàn)錯誤的連接,或用于拒絕非法的報文段或非法的連接。
「SYN同步序號」,同步序號,用于建立連接過程,在連接請求中,SYN=1和ACK=0表示該數(shù)據(jù)段沒有使用捎帶的確認(rèn)域,而連接應(yīng)答捎帶一個確認(rèn),即SYN=1和ACK=1。。
「FIN終止標(biāo)志」,用于釋放連接,為1時表示發(fā)送方?jīng)]有發(fā)送了。
「窗口」:滑動窗口大小,用來告知發(fā)送端接收端緩存大小,以此控制發(fā)送端發(fā)送數(shù)據(jù)的速率,從而達(dá)到流量控制。
「校驗(yàn)和」:奇偶校驗(yàn),此校驗(yàn)和是對整個的TCP報文段(包括TCP頭部和TCP數(shù)據(jù)),以16位進(jìn)行計算所得,由發(fā)送端計算和存儲,接收端進(jìn)行驗(yàn)證。
「緊急指針」:只有控制位中的URG為1時才有效,指出本報文段中的緊急數(shù)據(jù)的字節(jié)數(shù)。
「選項(xiàng)」:其長度可變,定義其他的可選參數(shù)。
粘包與拆包
TCP是面向字節(jié)流的協(xié)議,把上層應(yīng)用層的數(shù)據(jù)看成字節(jié)流,所以它發(fā)送的不是固定大小的數(shù)據(jù)包,TCP協(xié)議也沒有字段說明發(fā)送數(shù)據(jù)包的大小。
而且TCP不保證接受方應(yīng)用程序收到的數(shù)據(jù)塊和發(fā)送應(yīng)用程序發(fā)送的數(shù)據(jù)塊具有對應(yīng)的大小關(guān)系
比如發(fā)送方應(yīng)用程序交給發(fā)送方TCP 10個數(shù)據(jù)塊,接受方TCP可能只用了4個數(shù)據(jù)塊就完整的把接受到的字節(jié)流交給了上層應(yīng)用程序。
TCP底層并不了解上層業(yè)務(wù)數(shù)據(jù)的具體含義,它會根據(jù)TCP緩沖區(qū)的實(shí)際情況進(jìn)行包的劃分,所以在業(yè)務(wù)上認(rèn)為,一個完整的包可能會被TCP拆分成多個包進(jìn)行發(fā)送,也有可能把多個小的包封裝成一個大的數(shù)據(jù)包發(fā)送,這就是所謂的TCP粘包和拆包問題
「TCP粘包/拆包解決策略」
由于TCP無法理解上一層的業(yè)務(wù)數(shù)據(jù)特點(diǎn),所以TCP是無法保證發(fā)送的數(shù)據(jù)包不發(fā)生粘包和拆包,這個問題只能通過上層的協(xié)議棧設(shè)計來解決,解決思路有一下幾種:
消息定長:每個發(fā)送的數(shù)據(jù)包大小固定,比如100字節(jié),不足100字節(jié)的用空格補(bǔ)充,接受方取數(shù)據(jù)的時候根據(jù)這個長度來讀取數(shù)據(jù)
消息末尾增加換行符來表示一條完整的消息:接收方讀取的時候根據(jù)換行符來判斷是否是一條完整的消息,如果消息的內(nèi)容也包含換行符,那么這種方式就不合適了。
將消息分為消息頭和消息尾兩部分,消息頭指定數(shù)據(jù)長度,根據(jù)消息長度來讀取完整的消息,例如UDP協(xié)議是這么設(shè)計的,用兩個字節(jié)來表示消息長度,所以UDP不存在粘包和拆包問題。
三次握手
「第一次握手」:
客戶端將TCP報文標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個序號值seq=J,保存在TCP首部的序列號字段里,指明客戶端打算連接的服務(wù)器的端口,并將該數(shù)據(jù)包發(fā)送給服務(wù)器端,發(fā)送完畢后,客戶端進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器端確認(rèn)。
「第二次握手」:
服務(wù)器端收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道客戶端請求建立連接,服務(wù)器端將TCP報文標(biāo)志位SYN和ACK都置為1,ack=J+1,隨機(jī)產(chǎn)生一個序號值seq=K,并將該數(shù)據(jù)包發(fā)送給客戶端以確認(rèn)連接請求,服務(wù)器端進(jìn)入SYN_RCVD狀態(tài)。
「第三次握手」:
客戶端收到確認(rèn)后,檢查ack是否為J+1,ACK是否為1,如果正確則將標(biāo)志位ACK置為1,ack=K+1,并將該數(shù)據(jù)包發(fā)送給服務(wù)器端,服務(wù)器端檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,客戶端和服務(wù)器端進(jìn)入ESTABLISHED狀態(tài),完成三次握手,隨后客戶端與服務(wù)器端之間可以開始傳輸數(shù)據(jù)了。
「上面寫的ack和ACK,不是同一個概念:」
小寫的ack代表的是頭部的確認(rèn)號Acknowledge number, 縮寫ack,是對上一個包的序號進(jìn)行確認(rèn)的號,ack=seq+1。
大寫的ACK,則是我們上面說的TCP首部的標(biāo)志位,用于標(biāo)志的TCP包是否對上一個包進(jìn)行了確認(rèn)操作,如果確認(rèn)了,則把ACK標(biāo)志位設(shè)置成1。
「TCP為什么三次握手而不是兩次握手」
為了實(shí)現(xiàn)可靠數(shù)據(jù)傳輸, TCP 協(xié)議的通信雙方, 都必須維護(hù)一個序列號, 以標(biāo)識發(fā)送出去的數(shù)據(jù)包中, 哪些是已經(jīng)被對方收到的。三次握手的過程即是通信雙方相互告知序列號起始值, 并確認(rèn)對方已經(jīng)收到了序列號起始值的必經(jīng)步驟
如果只是兩次握手, 至多只有連接發(fā)起方的起始序列號能被確認(rèn), 另一方選擇的序列號則得不到確認(rèn)
「《計算機(jī)網(wǎng)絡(luò)》中是這樣說的:」
為了防止已失效的連接請求報文段突然又傳送到了服務(wù)端,因而產(chǎn)生錯誤。
?
在書中同時舉了一個例子,如下:
?假如client發(fā)出的第一個連接請求報文段并沒有丟失,而是在某個網(wǎng)絡(luò)結(jié)點(diǎn)長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達(dá)server,本來這是一個早已失效的報文段,但server收到此失效的連接請求報文段后,就誤認(rèn)為是client再次發(fā)出的一個新的連接請求。
于是就向client發(fā)出確認(rèn)報文段,同意建立連接,假設(shè)不采用「三次握手」,那么只要server發(fā)出確認(rèn),新的連接就建立了,由于現(xiàn)在client并沒有發(fā)出建立連接的請求,因此不會理睬server的確認(rèn),也不會向server發(fā)送數(shù)據(jù)。
但server卻以為新的連接已經(jīng)建立,并一直等待client發(fā)來數(shù)據(jù),這樣,server的很多資源就白白浪費(fèi)掉了。
采用「三次握手」的辦法可以防止上述現(xiàn)象發(fā)生,例如剛才那種情況,client不會向server的確認(rèn)發(fā)出確認(rèn),server由于收不到確認(rèn),就知道client并沒有要求建立連接。
「什么是半連接隊列」
服務(wù)器第一次收到客戶端的 SYN 之后,就會處于 SYN_RCVD狀態(tài),此時雙方還沒有完全建立其連接,服務(wù)器會把此種狀態(tài)下請求連接放在一個隊列里,我們把這種隊列稱之為「半連接隊列」。
當(dāng)然還有一個「全連接隊列」,就是已經(jīng)完成三次握手,建立起連接的就會放在全連接隊列中。如果隊列滿了就有可能會出現(xiàn)丟包現(xiàn)象。
補(bǔ)充一點(diǎn)關(guān)于「SYN-ACK 重傳次數(shù)」的問題:
服務(wù)器發(fā)送完SYN-ACK包,如果未收到客戶確認(rèn)包,服務(wù)器進(jìn)行首次重傳,等待一段時間仍未收到客戶確認(rèn)包,進(jìn)行第二次重傳,如果重傳次數(shù)超過系統(tǒng)規(guī)定的最大重傳次數(shù),系統(tǒng)將該連接信息從半連接隊列中刪除。
「三次握手過程中可以攜帶數(shù)據(jù)嗎」
其實(shí)第三次握手的時候,是可以攜帶數(shù)據(jù)的,也就是說,第一次、第二次握手不可以攜帶數(shù)據(jù),而第三次握手是可以攜帶數(shù)據(jù)的。
假如第一次握手可以攜帶數(shù)據(jù)的話,如果有人要惡意攻擊服務(wù)器,那他每次都在第一次握手中的 SYN 報文中放入大量的數(shù)據(jù),因?yàn)楣粽吒揪筒焕矸?wù)器的接收、發(fā)送能力是否正常,然后瘋狂著重復(fù)發(fā) SYN 報文的話,這會讓服務(wù)器花費(fèi)很多時間、內(nèi)存空間來接收這些報文。也就是說,第一次握手可以放數(shù)據(jù)的話,其中一個簡單的原因就是會讓服務(wù)器更加容易受到攻擊了。
而對于第三次的話,此時客戶端已經(jīng)處于 established 狀態(tài),也就是說,對于客戶端來說,他已經(jīng)建立起連接了,并且也已經(jīng)知道服務(wù)器的接收、發(fā)送能力是正常的了,所以能攜帶數(shù)據(jù)沒啥毛病。
四次揮手
揮手請求可以是Client端,也可以是Server端發(fā)起的,我們假設(shè)是Client端發(fā)起:
第一次揮手:Client端發(fā)起揮手請求,向Server端發(fā)送標(biāo)志位是FIN報文段,設(shè)置序列號seq,此時,Client端進(jìn)入FIN_WAIT_1狀態(tài),這表示Client端沒有數(shù)據(jù)要發(fā)送給Server端了。
第二次揮手:Server端收到了Client端發(fā)送的FIN報文段,向Client端返回一個標(biāo)志位是ACK的報文段,ack設(shè)為seq加1,Client端進(jìn)入FIN_WAIT_2狀態(tài),Server端告訴Client端,我確認(rèn)并同意你的關(guān)閉請求。
第三次揮手:Server端向Client端發(fā)送標(biāo)志位是FIN的報文段,請求關(guān)閉連接,同時Client端進(jìn)入LAST_ACK狀態(tài)。
第四次揮手 :Client端收到Server端發(fā)送的FIN報文段,向Server端發(fā)送標(biāo)志位是ACK的報文段,然后Client端進(jìn)入TIME_WAIT狀態(tài),Server端收到Client端的ACK報文段以后,就關(guān)閉連接,此時,Client端等待2MSL的時間后依然沒有收到回復(fù),則證明Server端已正常關(guān)閉,那好,Client端也可以關(guān)閉連接了。
「為什么連接的時候是三次握手,關(guān)閉的時候卻是四次握手?」
建立連接時因?yàn)楫?dāng)Server端收到Client端的SYN連接請求報文后,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應(yīng)答的,SYN報文是用來同步的。所以建立連接只需要三次握手。
由于TCP協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的運(yùn)輸層通信協(xié)議,TCP是全雙工模式。
這就意味著,關(guān)閉連接時,當(dāng)Client端發(fā)出FIN報文段時,只是表示Client端告訴Server端數(shù)據(jù)已經(jīng)發(fā)送完畢了。當(dāng)Server端收到FIN報文并返回ACK報文段,表示它已經(jīng)知道Client端沒有數(shù)據(jù)發(fā)送了,但是Server端還是可以發(fā)送數(shù)據(jù)到Client端的,所以Server很可能并不會立即關(guān)閉SOCKET,直到Server端把數(shù)據(jù)也發(fā)送完畢。
當(dāng)Server端也發(fā)送了FIN報文段時,這個時候就表示Server端也沒有數(shù)據(jù)要發(fā)送了,就會告訴Client端,我也沒有數(shù)據(jù)要發(fā)送了,之后彼此就會愉快的中斷這次TCP連接。
「為什么TIME_WAIT要等待2MSL?」
MSL:報文段最大生存時間,它是任何報文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長時間。
有以下兩個原因:
第一點(diǎn):保證TCP協(xié)議的全雙工連接能夠可靠關(guān)閉:由于IP協(xié)議的不可靠性或者是其它網(wǎng)絡(luò)原因,導(dǎo)致了Server端沒有收到Client端的ACK報文,那么Server端就會在超時之后重新發(fā)送FIN,如果此時Client端的連接已經(jīng)關(guān)閉處于CLOESD狀態(tài),那么重發(fā)的FIN就找不到對應(yīng)的連接了,從而導(dǎo)致連接錯亂,所以,Client端發(fā)送完最后的ACK不能直接進(jìn)入CLOSED狀態(tài),而要保持TIME_WAIT,當(dāng)再次收到FIN的時候,能夠保證對方收到ACK,最后正確關(guān)閉連接。
第二點(diǎn):保證這次連接的重復(fù)數(shù)據(jù)段從網(wǎng)絡(luò)中消失如果Client端發(fā)送最后的ACK直接進(jìn)入CLOSED狀態(tài),然后又再向Server端發(fā)起一個新連接,這時不能保證新連接的與剛關(guān)閉的連接的端口號是不同的,也就是新連接和老連接的端口號可能一樣了,那么就可能出現(xiàn)問題:如果前一次的連接某些數(shù)據(jù)滯留在網(wǎng)絡(luò)中,這些延遲數(shù)據(jù)在建立新連接后到達(dá)Client端,由于新老連接的端口號和IP都一樣,TCP協(xié)議就認(rèn)為延遲數(shù)據(jù)是屬于新連接的,新連接就會接收到臟數(shù)據(jù),這樣就會導(dǎo)致數(shù)據(jù)包混亂,所以TCP連接需要在TIME_WAIT狀態(tài)等待2倍MSL,才能保證本次連接的所有數(shù)據(jù)在網(wǎng)絡(luò)中消失。
流量控制
「RTT和RTO」
RTT:發(fā)送一個數(shù)據(jù)包到收到對應(yīng)的ACK,所花費(fèi)的時間
RTO:重傳時間間隔(TCP在發(fā)送一個數(shù)據(jù)包后會啟動一個重傳定時器,RTO即定時器的重傳時間)
開始預(yù)先算一個定時器時間,如果回復(fù)ACK,重傳定時器就自動失效,即不需要重傳;如果沒有回復(fù)ACK,RTO定時器時間就到了,重傳。
RTO是本次發(fā)送當(dāng)前數(shù)據(jù)包所預(yù)估的超時時間,RTO不是固定寫死的配置,是經(jīng)過RTT計算出來的。
「滑動窗口」
TCP的滑動窗口主要有兩個作用:
保證TCP的可靠性
保證TCP的流控特性
TCP報文頭有個字段叫Window,用于接收方通知發(fā)送方自己還有多少緩存區(qū)可以接收數(shù)據(jù),發(fā)送方根據(jù)接收方的處理能力來發(fā)送數(shù)據(jù),不會導(dǎo)致接收方處理不過來,這便是流量控制。
發(fā)送方都維持了一個連續(xù)的允許發(fā)送的幀的序號,稱為發(fā)送窗口;同時,接收方也維持了一個連續(xù)的允許接收的幀的序號,稱為接收窗口。
發(fā)送窗口和接收窗口的序號的上下界不一定要一樣,甚至大小也可以不同。
不同的滑動窗口協(xié)議窗口大小一般不同。
發(fā)送方窗口內(nèi)的序列號代表了那些已經(jīng)被發(fā)送,但是還沒有被確認(rèn)的幀,或者是那些可以被發(fā)送的幀
滑動窗口由四部分組成每個字節(jié)的數(shù)據(jù)都有唯一順序的編碼,隨著時間發(fā)展,未確認(rèn)部分與可以發(fā)送數(shù)據(jù)包編碼部分向右移動,形式滑動窗口
綠色:發(fā)送成功并已經(jīng)ACK確認(rèn)的數(shù)據(jù)
黃色:發(fā)送成功等待ACK確認(rèn)的數(shù)據(jù)(占用滑動窗口大?。?/p>
紫色:滑動窗口剩余大小可以發(fā)送的字節(jié)數(shù)量(滑動窗口可用大小)
灰色:后續(xù)數(shù)據(jù)編碼
接收窗口的大小就是滑動窗口的最大值,數(shù)據(jù)傳輸過程中滑動窗口的可用大小是動態(tài)變化的。
但是還有這么一點(diǎn),滑動窗口的設(shè)計僅僅是考慮到了處理方的處理能力,但是沒有考慮到道路的通暢問題
就好像服務(wù)端可以處理100M數(shù)據(jù),但是傳輸?shù)臄?shù)據(jù)99M都堵在路上了,這不就是導(dǎo)致道路阻塞了么?這就需要另外一個設(shè)計「擁塞避免」
「流量控制的目的」
如果發(fā)送者發(fā)送數(shù)據(jù)過快,接收者來不及接收,那么就會有分組丟失。
為了避免分組丟失,控制發(fā)送者的發(fā)送速度,使得接收者來得及接收,這就是流量控制。
流量控制根本目的是防止分組丟失,它是構(gòu)成TCP可靠性的一方面。
「如何實(shí)現(xiàn)流量控制」
由滑動窗口協(xié)議(連續(xù)ARQ協(xié)議)實(shí)現(xiàn)?;瑒哟翱趨f(xié)議既保證了分組無差錯、有序接收,也實(shí)現(xiàn)了流量控制。
主要的方式就是接收方返回的 ACK 中會包含自己的接收窗口的大小,并且利用大小來控制發(fā)送方的數(shù)據(jù)發(fā)送。
「流量控制引發(fā)的死鎖」
當(dāng)發(fā)送者收到了一個窗口為0的應(yīng)答,發(fā)送者便停止發(fā)送,等待接收者的下一個應(yīng)答。
但是如果這個窗口不為0的應(yīng)答在傳輸過程丟失,發(fā)送者一直等待下去,而接收者以為發(fā)送者已經(jīng)收到該應(yīng)答,等待接收新數(shù)據(jù),這樣雙方就相互等待,從而產(chǎn)生死鎖。
為了避免流量控制引發(fā)的死鎖,TCP使用了「持續(xù)計時器」。每當(dāng)發(fā)送者收到一個零窗口的應(yīng)答后就啟動該計時器。時間一到便主動發(fā)送報文詢問接收者的窗口大小。若接收者仍然返回零窗口,則重置該計時器繼續(xù)等待;若窗口不為0,則表示應(yīng)答報文丟失了,此時重置發(fā)送窗口后開始發(fā)送,這樣就避免了死鎖的產(chǎn)生。
擁塞控制
「為什么要進(jìn)行擁塞控制」
假設(shè)網(wǎng)絡(luò)已經(jīng)出現(xiàn)擁塞,如果不處理擁塞,那么延時增加,出現(xiàn)更多丟包,觸發(fā)發(fā)送方重傳數(shù)據(jù),加劇擁塞情況,繼續(xù)惡性循環(huán)直至網(wǎng)絡(luò)癱瘓。
擁塞控制與流量控制的適應(yīng)場景和目的均不同。
擁塞發(fā)生前,可避免流量過快增長拖垮網(wǎng)絡(luò);擁塞發(fā)生時,唯一的選擇就是降低流量。
主要使用4種算法完成擁塞控制:
慢啟動
擁塞避免
快重傳算法
快速恢復(fù)算法
算法1、2適用于擁塞發(fā)生前,算法3適用于擁塞發(fā)生時,算法4適用于擁塞解決后(相當(dāng)于擁塞發(fā)生前)。
「rwnd與cwnd」
rwnd(Receiver Window,接收者窗口)與cwnd(Congestion Window,擁塞窗口):
rwnd是用于流量控制的窗口大小,主要取決于接收方的處理速度,由接收方通知發(fā)送方被動調(diào)整。
cwnd是用于擁塞處理的窗口大小,取決于網(wǎng)絡(luò)狀況,由發(fā)送方探查網(wǎng)絡(luò)主動調(diào)整。
同時考慮流量控制與擁塞處理,則發(fā)送方窗口的大小不超過min{rwnd, cwnd}。
「慢啟動算法」
慢開始算法的思路就是,不要一開始就發(fā)送大量的數(shù)據(jù),先探測一下網(wǎng)絡(luò)的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小。
這里用報文段的個數(shù)作為擁塞窗口的大小舉例說明慢開始算法,實(shí)際的擁塞窗口大小是以字節(jié)為單位的。
一個傳輸輪次所經(jīng)歷的時間其實(shí)就是往返時間RTT,而且每經(jīng)過一個傳輸輪次,擁塞窗口cwnd就加倍。
為了防止cwnd增長過大引起網(wǎng)絡(luò)擁塞,還需設(shè)置一個慢開始門限ssthresh狀態(tài)變量。
?
ssthresh的用法如下:
?cwnd《ssthresh時,使用慢開始算法。
當(dāng)cwnd》ssthresh時,改用擁塞避免算法。
當(dāng)cwnd=ssthresh時,慢開始與擁塞避免算法任意
注意,這里的慢并不是指cwnd的增長速率慢,而是指在TCP開始發(fā)送報文段時先設(shè)置cwnd=1,然后逐漸增大,這當(dāng)然比按照大的cwnd一下子把許多報文段突然注入到網(wǎng)絡(luò)中要慢得多。
「擁塞避免算法」
讓擁塞窗口cwnd緩慢地增大,即每經(jīng)過一個往返時間RTT就把發(fā)送方的擁塞窗口cwnd加1,而不是加倍。
這樣擁塞窗口cwnd按線性規(guī)律緩慢增長,比慢開始算法的擁塞窗口增長速率緩慢得多
無論是在慢開始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒有按時收到確認(rèn),雖然沒有收到確認(rèn)可能是其他原因的分組丟失,但是因?yàn)闊o法判定,所以都當(dāng)做擁塞來處理),就把慢開始門限ssthresh設(shè)置為出現(xiàn)擁塞時的發(fā)送窗口大小的一半(但不能小于2)。
然后把擁塞窗口cwnd重新設(shè)置為1,執(zhí)行慢開始算法。
這樣做的目的就是要迅速減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù),使得發(fā)生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。
「整個擁塞控制的流程:」
假定cwnd=24時,網(wǎng)絡(luò)出現(xiàn)超時(擁塞),則更新后的ssthresh=12,cwnd重新設(shè)置為1,并執(zhí)行慢開始算法。
當(dāng)cwnd=12=ssthresh時,改為執(zhí)行擁塞避免算法
注意:擁塞避免并非完全能夠避免了阻塞,而是使網(wǎng)絡(luò)比較不容易出現(xiàn)擁塞。
「快重傳算法」
快重傳要求接收方在收到一個失序的報文段后就立即發(fā)出重復(fù)確認(rèn)(為的是使發(fā)送方及早知道有報文段沒有到達(dá)對方,可提高網(wǎng)絡(luò)吞吐量約20%)而不要等到自己發(fā)送數(shù)據(jù)時捎帶確認(rèn)。
快重傳算法規(guī)定,發(fā)送方只要一連收到三個重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對方尚未收到的報文段,而不必繼續(xù)等待設(shè)置的重傳計時器時間到期
「快恢復(fù)算法」
快重傳配合使用的還有快恢復(fù)算法,有以下兩個要點(diǎn):
當(dāng)發(fā)送方連續(xù)收到三個重復(fù)確認(rèn)時,就把ssthresh門限減半(為了預(yù)防網(wǎng)絡(luò)發(fā)生擁塞)。
但是接下去并不執(zhí)行慢開始算法
考慮到如果網(wǎng)絡(luò)出現(xiàn)擁塞的話就不會收到好幾個重復(fù)的確認(rèn),所以發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)可能沒有出現(xiàn)擁塞。
所以此時不執(zhí)行慢開始算法,而是將cwnd設(shè)置為ssthresh減半后的值,然后執(zhí)行擁塞避免算法,使cwnd緩慢增大。
Socket
即套接字,是應(yīng)用層 與 TCP/IP 協(xié)議族通信的中間軟件抽象層,表現(xiàn)為一個封裝了 TCP / IP協(xié)議族 的編程接口(API)
Socket不是一種協(xié)議,而是一個編程調(diào)用接口(API),屬于傳輸層(主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸)
對用戶來說,只需調(diào)用Socket去組織數(shù)據(jù),以符合指定的協(xié)議,即可通信
UDP「UDP協(xié)議特點(diǎn)」
UDP是無連接的傳輸層協(xié)議;
UDP使用盡最大努力交付,不保證可靠交付;
UDP是面向報文的,對應(yīng)用層交下來的報文,不合并,不拆分,保留原報文的邊界;
UDP沒有擁塞控制,因此即使網(wǎng)絡(luò)出現(xiàn)擁塞也不會降低發(fā)送速率;
UDP支持一對一一對多多對多的交互通信;
UDP的首部開銷小,只有8字節(jié)
「TCP和UDP的區(qū)別」
TCP是可靠傳輸,UDP是不可靠傳輸;
TCP面向連接,UDP無連接;
TCP傳輸數(shù)據(jù)有序,UDP不保證數(shù)據(jù)的有序性;
TCP不保存數(shù)據(jù)邊界,UDP保留數(shù)據(jù)邊界;
TCP傳輸速度相對UDP較慢;
TCP有流量控制和擁塞控制,UDP沒有;
TCP是重量級協(xié)議,UDP是輕量級協(xié)議;
TCP首部較長20字節(jié),UDP首部較短8字節(jié);
「基于TCP和UDP的常用協(xié)議」
HTTP、HTTPS、FTP、TELNET、SMTP(簡單郵件傳輸協(xié)議)協(xié)議基于可靠的TCP協(xié)議。
TFTP、DNS、DHCP、TFTP、SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)、RIP基于不可靠的UDP協(xié)議
報文段
UDP的報文段共有2個字段:數(shù)據(jù)字段 + 首部字段
「UDP報文中每個字段的含義如下:
源端口:這個字段占據(jù) UDP 報文頭的前 16 位,通常包含發(fā)送數(shù)據(jù)報的應(yīng)用程序所使用的 UDP 端口,接收端的應(yīng)用程序利用這個字段的值作為發(fā)送響應(yīng)的目的地址,這個字段是可選的,所以發(fā)送端的應(yīng)用程序不一定會把自己的端口號寫入該字段中,如果不寫入端口號,則把這個字段設(shè)置為 0,這樣,接收端的應(yīng)用程序就不能發(fā)送響應(yīng)了。
目的端口:接收端計算機(jī)上 UDP 軟件使用的端口,占據(jù) 16 位。
長度:該字段占據(jù) 16 位,表示 UDP 數(shù)據(jù)報長度,包含 UDP 報文頭和 UDP 數(shù)據(jù)長度,因?yàn)?UDP 報文頭長度是 8 個字節(jié),所以這個值最小為 8。
校驗(yàn)值:該字段占據(jù) 16 位,可以檢驗(yàn)數(shù)據(jù)在傳輸過程中是否被損壞。
網(wǎng)絡(luò)層MAC地址
MAC稱為物理地址,也叫硬件地址,用來定義網(wǎng)絡(luò)設(shè)備的位置,MAC地址是網(wǎng)卡出廠時設(shè)定的,是固定的(但可以通過在設(shè)備管理器中或注冊表等方式修改,同一網(wǎng)段內(nèi)的MAC地址必須唯一)。
MAC地址采用十六進(jìn)制數(shù)表示,長度是6個字節(jié)(48位),分為前24位和后24位。
?
MAC地址對應(yīng)于OSI參考模型的第二層數(shù)據(jù)鏈路層,工作在數(shù)據(jù)鏈路層的交換機(jī)維護(hù)著計算機(jī)MAC地址和自身端口的數(shù)據(jù)庫,交換機(jī)根據(jù)收到的數(shù)據(jù)幀中的目的MAC地址字段來轉(zhuǎn)發(fā)數(shù)據(jù)幀。
?IP地址
常見的IP地址分為IPv4與IPv6兩大類,當(dāng)前廣泛應(yīng)用的是IPv4,目前IPv4幾乎耗盡,下一階段必然會進(jìn)行版本升級到IPv6;
IP地址是以網(wǎng)絡(luò)號和主機(jī)號來標(biāo)示網(wǎng)絡(luò)上的主機(jī)的,我們把網(wǎng)絡(luò)號相同的主機(jī)稱之為本地網(wǎng)絡(luò),網(wǎng)絡(luò)號不相同的主機(jī)稱之為遠(yuǎn)程網(wǎng)絡(luò)主機(jī)
本地網(wǎng)絡(luò)中的主機(jī)可以直接相互通信;遠(yuǎn)程網(wǎng)絡(luò)中的主機(jī)要相互通信必須通過本地網(wǎng)關(guān)(Gateway)來傳遞轉(zhuǎn)發(fā)數(shù)據(jù)。
IP地址對應(yīng)于OSI參考模型的第三層網(wǎng)絡(luò)層,工作在網(wǎng)絡(luò)層的路由器根據(jù)目標(biāo)IP和源IP來判斷是否屬于同一網(wǎng)段,如果是不同網(wǎng)段,則轉(zhuǎn)發(fā)數(shù)據(jù)包。
「IP地址格式和表示」
IP地址(IPv4)由32位二進(jìn)制數(shù)組成,分為4段(4個字節(jié)),每一段為8位二進(jìn)制數(shù)(1個字節(jié))
每一段8位二進(jìn)制,中間使用英文的標(biāo)點(diǎn)符號。隔開
由于二進(jìn)制數(shù)太長,為了便于記憶和識別,把每一段8位二進(jìn)制數(shù)轉(zhuǎn)成十進(jìn)制,大小為0至255。
IP地址的這種表示法叫做「點(diǎn)分十進(jìn)制表示法」。
IP地址表示為:xxx.xxx.xxx.xxx舉個栗子:210.21.196.6就是一個IP地址的表示。
計算機(jī)的IP地址由兩部分組成,一部分為網(wǎng)絡(luò)標(biāo)識,一部分為主機(jī)標(biāo)識,同一網(wǎng)段內(nèi)的計算機(jī)網(wǎng)絡(luò)部分相同,主機(jī)部分不能同時重復(fù)出現(xiàn)。
「路由器」連接不同網(wǎng)段,負(fù)責(zé)不同網(wǎng)段之間的數(shù)據(jù)轉(zhuǎn)發(fā),「交換機(jī)」連接的是同一網(wǎng)段的計算機(jī)。
通過設(shè)置網(wǎng)絡(luò)地址和主機(jī)地址,在互相連接的整個網(wǎng)絡(luò)中保證每臺主機(jī)的IP地址不會互相重疊,即IP地址具有了唯一性。
「IP地址分類詳解」
IP地址分A、B、C、D、E五類,其中A、B、C這三類是比較常用的IP地址,D、E類為特殊地址。
子網(wǎng)掩碼
「子網(wǎng)掩碼的概念及作用」
通過子網(wǎng)掩碼,才能表明一臺主機(jī)所在的子網(wǎng)與其他子網(wǎng)的關(guān)系,使網(wǎng)絡(luò)正常工作。
子網(wǎng)掩碼和IP地址做與運(yùn)算,分離出IP地址中的網(wǎng)絡(luò)地址和主機(jī)地址,用于判斷該IP地址是在本地網(wǎng)絡(luò)上,還是在遠(yuǎn)程網(wǎng)絡(luò)網(wǎng)上。
子網(wǎng)掩碼還用于將網(wǎng)絡(luò)進(jìn)一步劃分為若干子網(wǎng),以避免主機(jī)過多而擁堵或過少而IP浪費(fèi)。
「子網(wǎng)掩碼的組成」
同IP地址一樣,子網(wǎng)掩碼是由長度為32位二進(jìn)制數(shù)組成的一個地址。
子網(wǎng)掩碼32位與IP地址32位相對應(yīng),IP地址如果某位是網(wǎng)絡(luò)地址,則子網(wǎng)掩碼為1,否則為0。
舉個栗子:如:11111111.11111111.11111111.00000000?
左邊連續(xù)的1的個數(shù)代表網(wǎng)絡(luò)號的長度,(使用時必須是連續(xù)的,理論上也可以不連續(xù)),右邊連續(xù)的0的個數(shù)代表主機(jī)號的長度。
?「為什么要使用子網(wǎng)掩碼」
兩臺主機(jī)要通信,首先要判斷是否處于同一網(wǎng)段,即網(wǎng)絡(luò)地址是否相同。
如果相同,那么可以把數(shù)據(jù)包直接發(fā)送到目標(biāo)主機(jī),否則就需要路由網(wǎng)關(guān)將數(shù)據(jù)包轉(zhuǎn)發(fā)送到目的地。
?
可以這么簡單的理解:A主機(jī)要與B主機(jī)通信,A和B各自的IP地址與A主機(jī)的子網(wǎng)掩碼進(jìn)行And與運(yùn)算,看得出的結(jié)果:
1、結(jié)果如果相同,則說明這兩臺主機(jī)是處于同一個網(wǎng)段,這樣A可以通過ARP廣播發(fā)現(xiàn)B的MAC地址,B也可以發(fā)現(xiàn)A的MAC地址來實(shí)現(xiàn)正常通信。
2、如果結(jié)果不同,ARP廣播會在本地網(wǎng)關(guān)終結(jié),這時候A會把發(fā)給B的數(shù)據(jù)包先發(fā)給本地網(wǎng)關(guān),網(wǎng)關(guān)再根據(jù)B主機(jī)的IP地址來查詢路由表,再將數(shù)據(jù)包繼續(xù)傳遞轉(zhuǎn)發(fā),最終送達(dá)到目的地B。
?
?
計算機(jī)的網(wǎng)關(guān)(Gateway)就是到其他網(wǎng)段的出口,也就是路由器接口IP地址。
路由器接口使用的IP地址可以是本網(wǎng)段中任何一個地址,不過通常使用該網(wǎng)段的第一個可用的地址或最后一個可用的地址,這是為了盡可能避免和本網(wǎng)段中的主機(jī)地址沖突。
?在如下拓?fù)鋱D示例中,A與B,C與D,都可以直接相互通信(都是屬于各自同一網(wǎng)段,不用經(jīng)過路由器)
但是A與C,A與D,B與C,B與D它們之間不屬于同一網(wǎng)段,所以它們通信是要經(jīng)過本地網(wǎng)關(guān),然后路由器根據(jù)對方IP地址,在路由表中查找恰好有匹配到對方IP地址的直連路由,于是從另一邊網(wǎng)關(guān)接口轉(zhuǎn)發(fā)出去實(shí)現(xiàn)互連
「子網(wǎng)掩碼和IP地址的關(guān)系」
子網(wǎng)掩碼是用來判斷任意兩臺主機(jī)的IP地址是否屬于同一網(wǎng)絡(luò)的依據(jù)
拿雙方主機(jī)的IP地址和自己主機(jī)的子網(wǎng)掩碼做與運(yùn)算,如結(jié)果為同一網(wǎng)絡(luò),就可以直接通信
「如何根據(jù)IP地址和子網(wǎng)掩碼,計算網(wǎng)絡(luò)地址:」
將IP地址與子網(wǎng)掩碼轉(zhuǎn)換成二進(jìn)制數(shù)。
將二進(jìn)制形式的 IP 地址與子網(wǎng)掩碼做與運(yùn)算。
將得出的結(jié)果轉(zhuǎn)化為十進(jìn)制,便得到網(wǎng)絡(luò)地址。
網(wǎng)關(guān)
網(wǎng)關(guān)實(shí)質(zhì)上是一個網(wǎng)絡(luò)通向其他網(wǎng)絡(luò)的IP地址。
比如有網(wǎng)絡(luò)A和網(wǎng)絡(luò)B,網(wǎng)絡(luò)A的IP地址范圍為192.168.1.1~192. 168.1.254,子網(wǎng)掩碼為255.255.255.0;
網(wǎng)絡(luò)B的IP地址范圍為192.168.2.1~192.168.2.254,子網(wǎng)掩碼為255.255.255.0。
在沒有路由器的情況下,兩個網(wǎng)絡(luò)之間是不能進(jìn)行TCP/IP通信的,即使是兩個網(wǎng)絡(luò)連接在同一臺交換機(jī)(或集線器)上,TCP/IP協(xié)議也會根據(jù)子網(wǎng)掩碼(255.255.255.0)判定兩個網(wǎng)絡(luò)中的主機(jī)處在不同的網(wǎng)絡(luò)里。
而要實(shí)現(xiàn)這兩個網(wǎng)絡(luò)之間的通信,則必須通過網(wǎng)關(guān)。
如果網(wǎng)絡(luò)A中的主機(jī)發(fā)現(xiàn)數(shù)據(jù)包的目的主機(jī)不在本地網(wǎng)絡(luò)中,就把數(shù)據(jù)包轉(zhuǎn)發(fā)給它自己的網(wǎng)關(guān),再由網(wǎng)關(guān)轉(zhuǎn)發(fā)給網(wǎng)絡(luò)B的網(wǎng)關(guān),網(wǎng)絡(luò)B的網(wǎng)關(guān)再轉(zhuǎn)發(fā)給網(wǎng)絡(luò)B的某個主機(jī)。網(wǎng)絡(luò)B向網(wǎng)絡(luò)A轉(zhuǎn)發(fā)數(shù)據(jù)包的過程。
「所以說,只有設(shè)置好網(wǎng)關(guān)的IP地址,TCP/IP協(xié)議才能實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的相互通信?!?/p>
?
那么這個IP地址是哪臺機(jī)器的IP地址呢?
?網(wǎng)關(guān)的IP地址是具有路由功能的設(shè)備的IP地址,具有路由功能的設(shè)備有路由器、啟用了路由協(xié)議的服務(wù)器(實(shí)質(zhì)上相當(dāng)于一臺路由器)、代理服務(wù)器(也相當(dāng)于一臺路由器)。
Ping
Ping是我們測試網(wǎng)絡(luò)連接的常用指令。
它利用ICMP報文檢測網(wǎng)絡(luò)連接。
「假設(shè)A ping B」
ping通知系統(tǒng)建立一個固定格式的ICMP請求數(shù)據(jù)包。
ICMP協(xié)議打包這個數(shù)據(jù)包和B的IP地址轉(zhuǎn)交給IP協(xié)議層
IP層協(xié)議將機(jī)器B的IP地址為目的地址,本機(jī)的IP地址為源地址,加上一些頭部必要的控制信息,構(gòu)建一個IP數(shù)據(jù)包
獲取B的MAC地址,做這個操作首先機(jī)器A會判斷B是否在同一網(wǎng)段內(nèi),若IP層協(xié)議通過B的IP地址和自己的子網(wǎng)掩碼,發(fā)現(xiàn)它跟自己屬于同一網(wǎng)絡(luò),就直接在本網(wǎng)絡(luò)查找這臺機(jī)器的MAC,否則則通過路由器進(jìn)行類似查找。
?
接下來是ARP協(xié)議根據(jù)IP地址查找MAC地址的過程:
?若兩臺機(jī)器之前有過通信,在機(jī)器A的ARP緩存表里應(yīng)該存有B的IP與其MAC地址的映射關(guān)系。
若沒有,則通過發(fā)送ARP請求廣播,得到回應(yīng)的B機(jī)器MAC地址,并交給數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層構(gòu)建一個數(shù)據(jù)幀,目的地址是IP層傳過來的MAC地址,源地址是本機(jī)的MAC地址,再附加一些必要的控制信息,依據(jù)以太網(wǎng)的介質(zhì)訪問規(guī)則將他們傳送出去
機(jī)器B收到這個數(shù)據(jù)幀后,先檢查目的地址,和本機(jī)MAC地址對比:
符合,接受,接收后檢查該數(shù)據(jù)幀,將IP數(shù)據(jù)包從幀中提取出來,交給本機(jī)的的IP地址協(xié)議層協(xié)議,IP協(xié)議層檢查之后,將有用的信息提取給ICMP協(xié)議,后者處理,馬上構(gòu)建一個ICMP應(yīng)答包,發(fā)送給A,其過程和主機(jī)A發(fā)送ICMP請求包到B的過程類似,但不用ARP廣播收取A的信息,因?yàn)檎埱蟀幸呀?jīng)有足夠的信息用于B回應(yīng)A。
若不符合,丟棄。
可以知道PING的過程即一段發(fā)送報文和接受確認(rèn)報文的過程,在來回直接可以計算時延。
DNS
DNS通過主機(jī)名,最終得到該主機(jī)名對應(yīng)的IP地址的過程叫做域名解析(或主機(jī)名解析)。
「通俗的講」,我們更習(xí)慣于記住一個網(wǎng)站的名字,www.baidu.com,而不是記住它的ip地址,比如:167.23.10.2
「工作原理」
將主機(jī)域名轉(zhuǎn)換為ip地址,屬于應(yīng)用層協(xié)議,使用UDP傳輸。
第一步,客戶端向本地DNS服務(wù)器發(fā)送解析請求
第二步,本地DNS如有相應(yīng)記錄會直接返回結(jié)果給客戶端,如沒有就向DNS根服務(wù)器發(fā)送請求
第三步,DSN根服務(wù)器接收到請求,返回給本地服務(wù)器一個所查詢域的主域名服務(wù)器的地址
第四步,本地dns服務(wù)器再向返回的主域名服務(wù)器地址發(fā)送查詢請求
第五步,主域名服務(wù)器如有記錄就返回結(jié)果,沒有的話返回相關(guān)的下級域名服務(wù)器地址
第六步,本地DNS服務(wù)器繼續(xù)向接收到的地址進(jìn)行查詢請求
第七步,下級域名服務(wù)器有相應(yīng)記錄,返回結(jié)果
第八步,本地dns服務(wù)器將收到的返回地址發(fā)給客戶端,同時寫入自己的緩存,以便下次查詢
DNS域名查詢實(shí)際上就是個不斷遞歸查詢的過程,直到查找到相應(yīng)結(jié)果,需要注意的時,當(dāng)找不到相應(yīng)記錄,會返回空結(jié)果,而不是超時信息
DNS記錄
?
A記錄
?定義www.example.com的ip地址
www.example.com. IN A 139.18.28.5;
上面的就是一條 DNS 記錄,純文本即可。
www.example.com 是要解析的域名。
A 是記錄的類型,A 記錄代表著這是一條用于解析 IPv4 地址的記錄。
從這條記錄可知,www.example.com的 IP 地址是 139.18.28.5。
?
CNAME
?CNAME用于定義域名的別名,如下面這條 DNS 記錄:
定義www.example.com的別名
a.example.com. IN CNAME b.example.com.
這條 DNS 記錄定義了 a.example.com 是 b.example.com 的別名。
用戶在瀏覽器中輸入 a.example.com 時候,通過 DNS 查詢會知道 a.example.com 是 b.example.com 的別名,因此需要實(shí)際 IP 的時候,會去拿 b.example.com 的 A 記錄。
當(dāng)你想把一個網(wǎng)站遷移到新域名,舊域名仍然保留的時候;還有當(dāng)你想將自己的靜態(tài)資源放到 CDN 上的時候,CNAME 就非常有用。
?
AAAA 記錄
?A 記錄是域名和 IPv4 地址的映射關(guān)系。和 A 記錄類似,AAAA 記錄則是域名和 IPv6 地址的映射關(guān)系。
?
MX記錄
?MX 記錄是郵件記錄,用來描述郵件服務(wù)器的域名。
在工作中,我們經(jīng)常會發(fā)郵件到某個同事的郵箱。
比如說,發(fā)送一封郵件到 xiaoming@xiaoflyfish.com,那么如何知道哪個 IP 地址是郵件服務(wù)器呢?
這個時候就可以用到下面這條 MX 記錄:
IN MX mail.xiaoflyfish.com
mail.xiaoflyfish.com 的 IP 地址可以通過查詢 mail.xiaoflyfishcom的 A 記錄和 AAAA 記錄獲得。
?
NS 記錄
?NS記錄是描述 DNS 服務(wù)器網(wǎng)址。從 DNS 的存儲結(jié)構(gòu)上說,Name Server 中含有權(quán)威 DNS 服務(wù)的目錄。
也就是說,NS 記錄指定哪臺 Server 是回答 DNS 查詢的權(quán)威域名服務(wù)器。
當(dāng)一個 DNS 查詢看到 NS 記錄的時候,會再去 NS 記錄配置的 DNS 服務(wù)器查詢,得到最終的記錄。如下面這個例子:
a.com. IN NS ns1.a.com.
a.com. IN NS ns2.a.com.
當(dāng)解析 a.com 地址時,我們看到 a.com 有兩個 NS 記錄,所以確定最終 a.com 的記錄在 ns1.a.com 和 ns2.a.com 上。
從設(shè)計上看,ns1 和 ns2 是網(wǎng)站 a.com 提供的智能 DNS 服務(wù)器,可以提供負(fù)載均衡、分布式 Sharding 等服務(wù)。
比如當(dāng)一個北京的用戶想要訪問 a.com 的時候,ns1 看到這是一個北京的 IP 就返回一個離北京最近的機(jī)房 IP。
上面代碼中 a.com 配置了兩個 NS 記錄。
通常 NS 不會只有一個,這是為了保證高可用,一個掛了另一個還能繼續(xù)服務(wù)。
通常數(shù)字小的 NS 記錄優(yōu)先級更高,也就是 ns1 會優(yōu)先于 ns2 響應(yīng)。
配置了上面的 NS 記錄后,如果還配置了 a.com 的 A 記錄,那么這個 A 記錄會被 NS 記錄覆蓋。
ARP協(xié)議
ARP即地址解析協(xié)議, 用于實(shí)現(xiàn)從 IP 地址到 MAC 地址的映射,即詢問目標(biāo)IP對應(yīng)的MAC地址。
「ARP協(xié)議的工作過程」
首先,每個主機(jī)都會有自己的ARP緩存區(qū)中建立一個ARP列表,以表示IP地址和MAC地址之間的對應(yīng)關(guān)系
當(dāng)源主機(jī)要發(fā)送數(shù)據(jù)時,首先檢測ARP列表中是否對應(yīng)IP地址的目的主機(jī)的MAC地址,如果有,則直接發(fā)送數(shù)據(jù),如果沒有,就向本網(wǎng)段的所有主機(jī)發(fā)送ARP數(shù)據(jù)包
當(dāng)本網(wǎng)絡(luò)的所有主機(jī)收到該ARP數(shù)據(jù)包時,首先檢查數(shù)據(jù)包中的IP地址是否是自己的IP地址,如果不是,則忽略該數(shù)據(jù)包,如果是,則首先從數(shù)據(jù)包中取出源主機(jī)的IP和MAC地址寫入到ARP列表中,如果存在,則覆蓋然后將自己的MAC地址寫入ARP響應(yīng)包中,告訴源主機(jī)自己是它想要找的MAC地址
源主機(jī)收到ARP響應(yīng)包后,將目的主機(jī)的IP和MAC地址寫入ARP列表,并利用此信息發(fā)送數(shù)據(jù),如果源主機(jī)一直沒有收到ARP響應(yīng)數(shù)據(jù)包,表示ARP查詢失敗。
數(shù)字簽名網(wǎng)絡(luò)傳輸過程中需要經(jīng)過很多中間節(jié)點(diǎn),雖然數(shù)據(jù)無法被解密,但可能被篡改
數(shù)字簽名校驗(yàn)數(shù)據(jù)的完整性
「數(shù)字簽名有兩種功效」:
能確定消息確實(shí)是由發(fā)送方簽名并發(fā)出來的,因?yàn)閯e人假冒不了發(fā)送方的簽名。
數(shù)字簽名能確定消息的完整性,證明數(shù)據(jù)是否未被篡改過。
將一段文本先用Hash函數(shù)生成消息摘要,然后用發(fā)送者的私鑰加密生成數(shù)字簽名,與原文文一起傳送給接收者
接收者只有用發(fā)送者的公鑰才能解密被加密的摘要信息,然后用HASH函數(shù)對收到的原文產(chǎn)生一個摘要信息,與上一步得到的摘要信息對比。
如果相同,則說明收到的信息是完整的,在傳輸過程中沒有被修改,否則說明信息被修改過,因此數(shù)字簽名能夠驗(yàn)證信息的完整性。
SQL注入SQL注入的原理是將SQL代碼偽裝到輸入?yún)?shù)中,傳遞到服務(wù)器解析并執(zhí)行的一種攻擊手法。
「SQL注入攻擊實(shí)例」
比如,在一個登錄界面,要求輸入用戶名和密碼,可以這樣輸入實(shí)現(xiàn)免帳號登錄:
用戶名: ‘or 1 = 1 --
密 碼:
用戶一旦點(diǎn)擊登錄,如若沒有做特殊處理,那么這個非法用戶就很得意的登陸進(jìn)去了。
下面我們分析一下:從理論上說,后臺認(rèn)證程序中會有如下的SQL語句:
String sql = “select * from user_table where username=’ “+userName+” ’ and password=’ “+password+” ‘”;
因此,當(dāng)輸入了上面的用戶名和密碼,上面的SQL語句變成:
SELECT * FROM user_table WHERE username=’’or 1 = 1 –- and password=’’
分析上述SQL語句我們知道,username=‘ or 1=1 這個語句一定會成功;然后后面加兩個 -,這意味著注釋,它將后面的語句注釋,讓他們不起作用,這樣,上述語句永遠(yuǎn)都能正確執(zhí)行,用戶輕易騙過系統(tǒng),獲取合法身份。
「應(yīng)對方法」
?
預(yù)編譯
?使用預(yù)編譯手段,綁定參數(shù)是最好的防SQL注入的方法。
目前許多的ORM框架及JDBC等都實(shí)現(xiàn)了SQL預(yù)編譯和參數(shù)綁定功能,攻擊者的惡意SQL會被當(dāng)做SQL的參數(shù)而不是SQL命令被執(zhí)行。
在mybatis的mapper文件中,對于傳遞的參數(shù)我們一般是使用 # 和$來獲取參數(shù)值。
當(dāng)使用#時,變量是占位符,就是一般我們使用java的jdbc的PrepareStatement時的占位符,所有可以防止sql注入;
當(dāng)使用$時,變量就是直接追加在sql中,一般會有sql注入問題。
?
使用正則表達(dá)式過濾傳入的參數(shù)
??
過濾參數(shù)中含有的一些數(shù)據(jù)庫關(guān)鍵詞
?加密算法加密算法分「對稱加密」 和 「非對稱加密」,其中對稱加密算法的加密與解密密鑰相同,非對稱加密算法的加密密鑰與解密密鑰不同,此外,還有一類不需要密鑰的「散列算法」。
常見的 「對稱加密」 算法主要有 DES、3DES、AES 等,常見的 「非對稱算法」 主要有 RSA、DSA 等,「散列算法」 主要有 SHA-1、MD5 等。
對稱加密
在 「對稱加密算法」 中,使用的密鑰只有一個,發(fā)送和接收雙方都使用這個密鑰對數(shù)據(jù)進(jìn)行 「加密」 和 「解密」。
數(shù)據(jù)加密過程:在對稱加密算法中,數(shù)據(jù)發(fā)送方 將 「明文」 (原始數(shù)據(jù)) 和 「加密密鑰」 一起經(jīng)過特殊 「加密處理」,生成復(fù)雜的 「加密密文」 進(jìn)行發(fā)送。
數(shù)據(jù)解密過程:「數(shù)據(jù)接收方」 收到密文后,若想讀取原數(shù)據(jù),則需要使用 「加密使用的密鑰」 及相同算法的 「逆算法」 對加密的密文進(jìn)行解密,才能使其恢復(fù)成 「可讀明文」。
非對稱加密
「非對稱加密算法」,它需要兩個密鑰,一個稱為 「公開密鑰」 (public key),即 「公鑰」,另一個稱為 「私有密鑰」 (private key),即 「私鑰」。
因?yàn)?「加密」 和 「解密」 使用的是兩個不同的密鑰,所以這種算法稱為 「非對稱加密算法」。
如果使用 「公鑰」 對數(shù)據(jù) 「進(jìn)行加密」,只有用對應(yīng)的 「私鑰」 才能 「進(jìn)行解密」。
如果使用 「私鑰」 對數(shù)據(jù) 「進(jìn)行加密」,只有用對應(yīng)的 「公鑰」 才能 「進(jìn)行解密」。
「例子」:甲方生成 「一對密鑰」 并將其中的一把作為 「公鑰」 向其它人公開,得到該公鑰的 「乙方」 使用該密鑰對機(jī)密信息 「進(jìn)行加密」 后再發(fā)送給甲方,甲方再使用自己保存的另一把 「專用密鑰」 (「私鑰」),對 「加密」 后的信息 「進(jìn)行解密」。
網(wǎng)絡(luò)攻擊CSRF和XSS
「XSS:」
跨站腳本是一種網(wǎng)站應(yīng)用程序的安全漏洞攻擊,是代碼注入的一種。
它允許惡意用戶將代碼注入到網(wǎng)頁上,其他用戶在觀看網(wǎng)頁時就會受到影響,這類攻擊通常包含了HTML以及用戶端腳本語言。
比如通過客戶端腳本語言(最常見如:JavaScript)
在一個論壇發(fā)帖中發(fā)布一段惡意的JavaScript代碼就是腳本注入,如果這個代碼內(nèi)容有請求外部服務(wù)器,那么就叫做XSS
「XSS攻擊分類」
?
反射性XSS攻擊 (非持久性XSS攻擊)
?例如,正常發(fā)送消息:
http://www.test.com/message.php?send=Hello,World!
接收者將會接收信息并顯示HelloWorld;但是,非正常發(fā)送消息:
http://www.test.com/message.php?send=《script》alert(‘foolish!’)《/script》!
接收者接收消息顯示的時候?qū)棾鼍娲翱冢?/p>
?
持久性XSS攻擊 (留言板場景)
?一般指XSS攻擊代碼存儲在網(wǎng)站數(shù)據(jù)庫,當(dāng)一個頁面被用戶打開的時候執(zhí)行。
也就是說,每當(dāng)用戶使用瀏覽器打開指定頁面時,腳本便執(zhí)行。
與非持久性XSS攻擊相比,持久性XSS攻擊危害性更大。
從名字就可以了解到,持久性XSS攻擊就是將攻擊代碼存入數(shù)據(jù)庫中,然后客戶端打開時就執(zhí)行這些攻擊代碼。
例如,留言板表單中的表單域:
《input type=“text” name=“content” value=“這里是用戶填寫的數(shù)據(jù)”》
正常操作流程是:用戶是提交相應(yīng)留言信息 — 將數(shù)據(jù)存儲到數(shù)據(jù)庫 — 其他用戶訪問留言板,應(yīng)用去數(shù)據(jù)并顯示;
而非正常操作流程是攻擊者在value填寫:
《script》alert(‘foolish!’);《/script》 《!--或者h(yuǎn)tml其他標(biāo)簽(破壞樣式。。。)、一段攻擊型代碼--》
并將數(shù)據(jù)提交、存儲到數(shù)據(jù)庫中;當(dāng)其他用戶取出數(shù)據(jù)顯示的時候,將會執(zhí)行這些攻擊性代碼
「CSRF:」
跨站請求偽造,是一種挾制用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。
比如冒充用戶發(fā)起請求(在用戶不知情的情況下),完成一些違背用戶意愿的請求(如惡意發(fā)帖,刪帖,改密碼,發(fā)郵件等)。
DOS攻擊
DOS:中文名稱是拒絕服務(wù),該攻擊的效果是使得計算機(jī)或網(wǎng)絡(luò)無法提供正常的服務(wù)
「DOS攻擊的原理:」
首先攻擊者向被攻擊的服務(wù)器發(fā)送大量的虛假IP請求,被攻擊者在收到請求后返回確認(rèn)信息,等待攻擊者進(jìn)行確認(rèn),該過程需要TCP的三次握手,由于攻擊者發(fā)送的請求信息是虛假的,所以服務(wù)器接收不到返回的確認(rèn)信息,在一段時間內(nèi)服務(wù)器會處與等待狀態(tài),而分配給這次請求的資源卻被有被釋放
當(dāng)被攻擊者等待一定的時間后,會因連接超時而斷開,這時攻擊者在次發(fā)送新的虛假信息請求,這樣最終服務(wù)器資源被耗盡,直到癱瘓
「DDOS:中文名稱是分布式拒絕服務(wù)攻擊」
指的是攻擊者控制多臺主機(jī)同時向同一主機(jī)或網(wǎng)絡(luò)發(fā)起DOS攻擊
DRDoS分布反射式拒絕服務(wù)攻擊這是DDoS攻擊的變形
「DDOS究竟如何攻擊」
目前最流行也是最好用的攻擊方法就是使用SYN-Flood進(jìn)行攻擊,SYN-Flood也就是SYN洪水攻擊
SYN-Flood不會完成TCP三次握手的第三步,也就是不發(fā)送確認(rèn)連接的信息給服務(wù)器,這樣,服務(wù)器無法完成第三次握手,但服務(wù)器不會立即放棄,服務(wù)器會不停的重試并等待一定的時間后放棄這個未完成的連接,這段時間叫做SYN timeout,這段時間大約30秒-2分鐘左右。
若是一個用戶在連接時出現(xiàn)問題導(dǎo)致服務(wù)器的一個線程等待1分鐘并不是什么大不了的問題,但是若有人用特殊的軟件大量模擬這種情況,那后果就可想而知了。一個服務(wù)器若是處理這些大量的半連接信息而消耗大量的系統(tǒng)資源和網(wǎng)絡(luò)帶寬,這樣服務(wù)器就不會再有空余去處理普通用戶的正常請求(因?yàn)榭蛻舻恼U埱蟊嚷屎苄。?,這樣這個服務(wù)器就無法工作了,這種攻擊就叫做SYN-Flood攻擊
到目前為止,進(jìn)行DDoS攻擊的防御還是比較困難的
首先,這種攻擊的特點(diǎn)是它利用了TCP/IP協(xié)議的漏洞,除非你不用TCP/IP,才有可能完全抵御住DDoS攻擊
不過這不等于我們就沒有辦法阻擋DDoS攻擊,我們可以盡力來減少DDoS的攻擊
「下面就是一些防御方法:」
關(guān)閉不必要的服務(wù)
限制同時打開的SYN半連接數(shù)目
縮短SYN半連接的time out 時間
正確設(shè)置防火墻
禁止對主機(jī)的非開放服務(wù)的訪問
限制特定IP地址的訪問
啟用防火墻的防DDoS的屬性
Cookie和SessionSession 是「基于Cookie 實(shí)現(xiàn)」的另一種記錄服務(wù)端和客戶端會話狀態(tài)的機(jī)制。
Session 是存儲在服務(wù)端,而 SessionId 會被存儲在客戶端的 Cookie 中。
Session 的「認(rèn)證過程」:
客戶端第一次發(fā)送請求到服務(wù)端,服務(wù)端根據(jù)信息創(chuàng)建對應(yīng)的 Session,并在響應(yīng)頭返回 SessionID
客戶端接收到服務(wù)端返回的 SessionID 后,會將此信息存儲在 Cookie 上,同時會記錄這個 SessionID 屬于哪個域名
當(dāng)客戶端再次訪問服務(wù)端時,請求會自動判斷該域名下是否存在 Cookie 信息,如果有則發(fā)送給服務(wù)端,服務(wù)端會從 Cookie 中拿到 SessionID,再根據(jù) SessionID 找到對應(yīng)的 Session,如果有對應(yīng)的 Session 則通過,繼續(xù)執(zhí)行請求,否則就中斷
「Cookie和Session的區(qū)別」
安全性,因?yàn)?Cookie 可以通過客戶端修改,而 Session 只能在服務(wù)端設(shè)置,所以安全性比 Cookie 高,一般會用于驗(yàn)證用戶登錄狀態(tài)
適用性,Cookie 只能存儲字符串?dāng)?shù)據(jù),而 Session 可以存儲任意類型數(shù)據(jù)
有效期,Cookie 可以設(shè)置任意時間有效,而 Session 一般失效時間短
常見面試題「在瀏覽器地址欄鍵入URL」
1.DNS解析:瀏覽器會依據(jù)URL逐層查詢DNS服務(wù)器緩存,解析URL中的域名對應(yīng)的IP地址,DNS緩存從近到遠(yuǎn)依次是瀏覽器緩存、系統(tǒng)緩存、路由器緩存、IPS服務(wù)器緩存、域名服務(wù)器緩存、頂級域名服務(wù)器緩存。
從哪個緩存找到對應(yīng)的IP直接返回,不再查詢后面的緩存。
2.TCP連接:結(jié)合三次握手
3.發(fā)送HTTP請求:瀏覽器發(fā)出讀取文件的HTTP請求,該請求發(fā)送給服務(wù)器
4.服務(wù)器處理請求并返回HTTP報文:服務(wù)器對瀏覽器請求做出響應(yīng),把對應(yīng)的帶有HTML文本的HTTP響應(yīng)報文發(fā)送給瀏覽器
5.瀏覽器解析渲染頁面
6.連接結(jié)束:瀏覽器釋放TCP連接,該步驟即四次揮手。
第5步和第6步可以認(rèn)為是同時發(fā)生的,哪一步在前沒有特別的要求
責(zé)任編輯:haq
-
計算機(jī)
+關(guān)注
關(guān)注
19文章
7663瀏覽量
90806 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7815瀏覽量
90963
原文標(biāo)題:計算機(jī)網(wǎng)絡(luò)常用知識總結(jié)!
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
網(wǎng)絡(luò)中為什么要部署NTP時鐘服務(wù)器?
計算機(jī)網(wǎng)絡(luò)入門指南

計算機(jī)網(wǎng)絡(luò)協(xié)議介紹

計算機(jī)網(wǎng)絡(luò)架構(gòu)的演進(jìn)
云端超級計算機(jī)使用教程
網(wǎng)線的功能都有哪些
量子計算機(jī)與普通計算機(jī)工作原理的區(qū)別

評論