update time :2020年3月6日 12:41:23
一、OSI模型恕刘、TCP/IP模型
1.OSI
OSI(Open System Interconnection甜攀,開放系統(tǒng)互連)七層網(wǎng)絡(luò)模型稱為開放式系統(tǒng)互聯(lián)參考模型 ,是一個(gè)邏輯上的定義香伴,一個(gè)規(guī)范荧嵌,它把網(wǎng)絡(luò)從邏輯上分為了7層呛踊。OSI 七層模型是一種框架性的設(shè)計(jì)方法 ,建立七層模型的主要目的是為解決異種網(wǎng)絡(luò)互連時(shí)所遇到的兼容性問題啦撮,其最主要的功能使就是幫助不同類型的主機(jī)實(shí)現(xiàn)數(shù)據(jù)傳輸谭网。它的最大優(yōu)點(diǎn)是將服務(wù)、接口和協(xié)議這三個(gè)概念明確地區(qū)分開來赃春,通過七個(gè)層次化的結(jié)構(gòu)模型使不同的系統(tǒng)不同的網(wǎng)絡(luò)之間實(shí)現(xiàn)可靠的通訊愉择。
1.物理層:主要定義物理設(shè)備標(biāo)準(zhǔn),如網(wǎng)線的接口類型织中、光纖的接口類型锥涕、各種傳輸介質(zhì)的傳輸速率等。它的主要作用是傳輸比特流(就是由1狭吼、0轉(zhuǎn)化為電流強(qiáng)弱來進(jìn)行傳輸,到達(dá)目的地后在轉(zhuǎn)化為1站楚、0,也就是我們常說的數(shù)模轉(zhuǎn)換與模數(shù)轉(zhuǎn)換)搏嗡。這一層的數(shù)據(jù)叫做比特。
2.數(shù)據(jù)鏈路層:定義了如何讓格式化數(shù)據(jù)以進(jìn)行傳輸,以及如何讓控制對物理介質(zhì)的訪問采盒。這一層通常還提供錯(cuò)誤檢測和糾正旧乞,以確保數(shù)據(jù)的可靠傳輸。
3.網(wǎng)絡(luò)層:在位于不同地理位置的網(wǎng)絡(luò)中的兩個(gè)主機(jī)系統(tǒng)之間提供連接和路徑選擇磅氨。Internet的發(fā)展使得從世界各站點(diǎn)訪問信息的用戶數(shù)大大增加尺栖,而網(wǎng)絡(luò)層正是管理這種連接的層。
4.傳輸層:定義了一些傳輸數(shù)據(jù)的協(xié)議和端口號(WWW端口80等)烦租,如:TCP(傳輸控制協(xié)議延赌,傳輸效率低,可靠性強(qiáng)叉橱,用于傳輸可靠性要求高挫以,數(shù)據(jù)量大的數(shù)據(jù)),UDP(用戶數(shù)據(jù)報(bào)協(xié)議窃祝,與TCP特性恰恰相反掐松,用于傳輸可靠性要求不高,數(shù)據(jù)量小的數(shù)據(jù)粪小,如QQ聊天數(shù)據(jù)就是通過這種方式傳輸?shù)模?主要是將從下層接收的數(shù)據(jù)進(jìn)行分段和傳輸大磺,到達(dá)目的地址后再進(jìn)行重組。常常把這一層數(shù)據(jù)叫做段探膊。
5.會話層:通過傳輸層(端口號:傳輸端口與接收端口)建立數(shù)據(jù)傳輸?shù)耐犯芾ⅰV饕谀愕南到y(tǒng)之間發(fā)起會話或者接受會話請求(設(shè)備之間需要互相認(rèn)識可以是IP也可以是MAC或者是主機(jī)名)
6.表示層:可確保一個(gè)系統(tǒng)的應(yīng)用層所發(fā)送的信息可以被另一個(gè)系統(tǒng)的應(yīng)用層讀取。例如逞壁,PC程序與另一臺計(jì)算機(jī)進(jìn)行通信流济,其中一臺計(jì)算機(jī)使用擴(kuò)展二一十進(jìn)制交換碼(EBCDIC),而另一臺則使用美國信息交換標(biāo)準(zhǔn)碼(ASCII)來表示相同的字符猾担。如有必要袭灯,表示層會通過使用一種通格式來實(shí)現(xiàn)多種數(shù)據(jù)格式之間的轉(zhuǎn)換。
7.應(yīng)用層: 是最靠近用戶的OSI層绑嘹。這一層為用戶的應(yīng)用程序(例如電子郵件稽荧、文件傳輸和終端仿真)提供網(wǎng)絡(luò)服務(wù)。
2.對比圖
3.五層協(xié)議
1.應(yīng)用層:如http協(xié)議工腋,它實(shí)際上是定義了如何包裝和解析數(shù)據(jù)姨丈,應(yīng)用層是http協(xié)議的話,則會按照協(xié)議規(guī)定包裝數(shù)據(jù)擅腰,如按照請求行蟋恬、請求頭、請求體包裝趁冈,包裝好數(shù)據(jù)后將數(shù)據(jù)傳至運(yùn)輸層歼争。
2.運(yùn)輸層:運(yùn)輸層有TCP和UDP兩種協(xié)議拜马,分別對應(yīng)可靠的運(yùn)輸和不可靠的運(yùn)輸,如TCP因?yàn)橐峁┛煽康膫鬏斻迦蓿詢?nèi)部要解決如何建立連接俩莽、如何保證傳輸是可靠的不丟數(shù)據(jù)、如何調(diào)節(jié)流量控制和擁塞控制乔遮。關(guān)于這一層扮超,我們平常一般都是和Socket打交道,Socket是一組封裝的編程調(diào)用接口蹋肮,通過它出刷,我們就能操作TCP、UDP進(jìn)行連接的建立等坯辩。我們平常使用Socket進(jìn)行連接建立的時(shí)候馁龟,一般都要指定端口號,所以這一層指定了把數(shù)據(jù)送到對應(yīng)的端口號。
3.網(wǎng)絡(luò)層:這一層IP協(xié)議濒翻,以及一些路由選擇協(xié)議等等屁柏,所以這一層的指定了數(shù)據(jù)要傳輸?shù)侥膫€(gè)IP地址。中間涉及到一些最優(yōu)線路有送,路由選擇算法等等淌喻。
4.數(shù)據(jù)鏈路層:印象比較深的就是ARP協(xié)議,負(fù)責(zé)把IP地址解析為MAC地址雀摘,即硬件地址裸删,這樣就找到了對應(yīng)的唯一的機(jī)器。
5.物理層:這一層就是最底層了阵赠,提供二進(jìn)制流傳輸服務(wù)涯塔,也就是也就是真正開始通過傳輸介質(zhì)(有線、無線)開始進(jìn)行數(shù)據(jù)的傳輸了清蚀。
所以通過上面五層的各司其職匕荸,實(shí)現(xiàn)物理傳輸介質(zhì)--MAC地址--IP地址--端口號--獲取到數(shù)據(jù)根據(jù)應(yīng)用層協(xié)議解析數(shù)據(jù)最終實(shí)現(xiàn)了網(wǎng)絡(luò)通信和數(shù)據(jù)傳輸。
二枷邪、tcp/udp/http/https/http2/WebSocket /socket
1.TCP/UDP
TCP和UDP使用IP協(xié)議從一個(gè)網(wǎng)絡(luò)傳送數(shù)據(jù)包到另一個(gè)網(wǎng)絡(luò)榛搔。
TCP和UDP是FTP,HTTP和SMTP之類使用的傳輸層協(xié)議东揣。
雖然TCP和UDP都是用來傳輸其他協(xié)議的践惑,它們卻有一個(gè)顯著的不同:TCP提供有保證的數(shù)據(jù)傳輸,而UDP不提供嘶卧。這意味著TCP有一個(gè)特殊的機(jī)制來確保數(shù)據(jù)安全的不出錯(cuò)的從一個(gè)端點(diǎn)傳到另一個(gè)端點(diǎn)尔觉,而UDP不提供任何這樣的保證。
2.http/https/http2
1.http
Http 是在應(yīng)用層上的傳輸協(xié)議,底層是 TCP 協(xié)議實(shí)現(xiàn)的诸狭,
它一種面向無狀態(tài)的連接,短連接辆憔,
狀態(tài)钉稍,是因?yàn)樵诿恳淮握埱笸瓿芍笈渖睿紩堰B接關(guān)了,不會記住是哪一個(gè)客戶端連接嫁盲。
2.http1.0 1.1 2.0
http 2.0采用二進(jìn)制的格式傳送數(shù)據(jù),不再使用文本格式傳送數(shù)據(jù)
http2.0對消息頭采用hpack壓縮算法烈掠,http1.x的版本消息頭帶有大量的冗余消息
http2.0 采用多路復(fù)用羞秤,即用一個(gè)tcp連接處理所有的請求,真正意義上做到了并發(fā)請求左敌,流還支持優(yōu)先級和流量控制
http2.0支持server push瘾蛋,服務(wù)端可以主動把css,jsp文件主動推送到客戶端矫限,不需要客戶端解析HTML哺哼,再發(fā)送請求,當(dāng)客戶端需要的時(shí)候叼风,它已經(jīng)在客戶端了取董。
Http1.0一次只能處理一個(gè)請求和響應(yīng),Http1.1一次能處理多個(gè)請求和響應(yīng)
多個(gè)請求和響應(yīng)過程可以重疊
增加了更多的請求頭和響應(yīng)頭无宿,比如Host茵汰、If-Unmodified-Since請求頭等.
3.https
我們都知道Https保證了我們數(shù)據(jù)傳輸?shù)陌踩琀ttps=Http+Ssl孽鸡,之所以能保證安全主要的原理就是利用了非對稱加密算法蹂午,平常用的對稱加密算法之所以不安全,是因?yàn)殡p方是用統(tǒng)一的密匙進(jìn)行加密解密的彬碱,只要雙方任意一方泄漏了密匙豆胸,那么其他人就可以利用密匙解密數(shù)據(jù)。
而非對稱加密算法之所以能實(shí)現(xiàn)安全傳輸?shù)暮诵木A就是:
公鑰加密的信息只能用私鑰解開巷疼,私鑰加密的信息只能被公鑰解開
3WebSocket /socket
WebSocket /socket 兩者沒有關(guān)系晚胡,
Socket是一組操作TCP/UDP的API,像HttpURLConnection和Okhttp這種涉及到比較底層的網(wǎng)絡(luò)請求發(fā)送的皮迟,最終當(dāng)然也都是通過Socket來進(jìn)行網(wǎng)絡(luò)請求連接發(fā)送搬泥,而像Volley、Retrofit則是更上層的封裝伏尼,
WebSocket 是 HTML5 開始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議忿檩。
WebSocket的出現(xiàn)是用來彌補(bǔ)HTTP協(xié)議在持久通信能力上的不足,它的握手是以HTTP的形式發(fā)起的爆阶,通過第一個(gè)request建立連接燥透,之后交換的數(shù)據(jù)都不需要發(fā)送HTTP header就能交換數(shù)據(jù)沙咏。
三、tcp 3次/4次握手
1三次握手
三次握手的目的是建立可靠的通信信道班套,說到通訊肢藐,簡單來說就是數(shù)據(jù)的發(fā)送與接收,而三次握手最主要的目的就是雙方確認(rèn)自己與對方的發(fā)送與接收是正常的吱韭。為了確边罕客戶端和服務(wù)器雙方都收發(fā)正常,另外客戶端第3次握手是為了防止前面的已失效連接請求報(bào)文段發(fā)送給服務(wù)端
第一次握手:Client 什么都不能確認(rèn)理盆;Server 確認(rèn)了對方發(fā)送正常
第二次握手:Client 確認(rèn)了:自己發(fā)送痘煤、接收正常,對方發(fā)送猿规、接收正常衷快;Server 確認(rèn)了:自己接收正常,對方發(fā)送正常
第三次握手:Client 確認(rèn)了:自己發(fā)送姨俩、接收正常蘸拔,對方發(fā)送、接收正常环葵;Server 確認(rèn)了:自己發(fā)送调窍、接收正常,對方發(fā)送接收正常
所以三次握手就能確認(rèn)雙發(fā)收發(fā)功能都正常积担,缺一不可陨晶。
2.四次握手
四次揮手:是因?yàn)榭赡芊?wù)器的數(shù)據(jù)未傳輸完成,所以只能先回復(fù)一個(gè)ACK帝璧,等待傳輸完成再關(guān)閉先誉,斷開一個(gè) TCP 連接則需要“四次揮手”:
客戶端-發(fā)送一個(gè) FIN,用來關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送 服務(wù)器-收到這個(gè) FIN的烁,它發(fā)回一 個(gè) ACK褐耳,確認(rèn)序號為收到的序號加1 。和 SYN 一樣渴庆,一個(gè) FIN 將占用一個(gè)序號 服務(wù)器-關(guān)閉與客戶端的連接铃芦,發(fā)送一個(gè)FIN給客戶端 客戶端-發(fā)回 ACK 報(bào)文確認(rèn),并將確認(rèn)序號設(shè)置為收到序號加1
為什么要四次揮手
任何一方都可以在數(shù)據(jù)傳送結(jié)束后發(fā)出連接釋放的通知襟雷,待對方確認(rèn)后進(jìn)入半關(guān)閉狀態(tài)刃滓。當(dāng)另一方也沒有數(shù)據(jù)再發(fā)送的時(shí)候,則發(fā)出連接釋放通知耸弄,對方確認(rèn)后就完全關(guān)閉了TCP連接咧虎。
四、其他
1.描述下網(wǎng)絡(luò)請求過程
域名解析----TCP的三次握手---建立TCP連接后發(fā)起HTTP請求--服務(wù)器響應(yīng)HTTP請求----瀏覽器解析html代碼计呈,同時(shí)請求html代碼中的資源(如js砰诵、css征唬、圖片等)
瀏覽器對頁面進(jìn)行渲染并呈現(xiàn)給用戶
2.TCP/UDP 差別
UDP 的主要特點(diǎn)
UDP 是無連接的;
UDP 使用盡最大努力交付茁彭,即不保證可靠交付总寒,因此主機(jī)不需要維持復(fù)雜的鏈接狀態(tài)(這里面有許多參數(shù));
UDP 是面向報(bào)文的理肺;
UDP 沒有擁塞控制摄闸,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機(jī)的發(fā)送速率降低(對實(shí)時(shí)應(yīng)用很有用,如 直播妹萨,實(shí)時(shí)視頻會議等)贪薪;
UDP 支持一對一、一對多眠副、多對一和多對多的交互通信;
UDP 的首部開銷小竣稽,只有8個(gè)字節(jié)囱怕,比TCP的20個(gè)字節(jié)的首部要短。
TCP 的主要特點(diǎn)
TCP 是面向連接的毫别。(就好像打電話一樣娃弓,通話前需要先撥號建立連接,通話結(jié)束后要掛機(jī)釋放連接)岛宦;
每一條 TCP 連接只能有兩個(gè)端點(diǎn)台丛,每一條TCP連接只能是點(diǎn)對點(diǎn)的(一對一);
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é)流
3.長連接 短鏈接
在HTTP/1.0中默認(rèn)使用短連接。也就是說近顷,客戶端和服務(wù)器每進(jìn)行一次HTTP操作生音,就建立一次連接宁否,任務(wù)結(jié)束就中斷連接。當(dāng)客戶端瀏覽器訪問的某個(gè)HTML或其他類型的Web頁中包含有其他的Web資源(如JavaScript文件缀遍、圖像文件慕匠、CSS文件等),每遇到這樣一個(gè)Web資源域醇,瀏覽器就會重新建立一個(gè)HTTP會話台谊。
而從HTTP/1.1起,默認(rèn)使用長連接譬挚,用以保持連接特性锅铅。使用長連接的HTTP協(xié)議,會在響應(yīng)頭加入這行代碼:
Connection:keep-alive
在使用長連接的情況下减宣,當(dāng)一個(gè)網(wǎng)頁打開完成后盐须,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉,客戶端再次訪問這個(gè)服務(wù)器時(shí)漆腌,會繼續(xù)使用這一條已經(jīng)建立的連接贼邓。Keep-Alive不會永久保持連接,它有一個(gè)保持時(shí)間闷尿,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個(gè)時(shí)間塑径。實(shí)現(xiàn)長連接需要客戶端和服務(wù)端都支持長連接。
HTTP協(xié)議的長連接和短連接填具,實(shí)質(zhì)上是TCP協(xié)議的長連接和短連接
4.上傳視頻的時(shí)候?yàn)槭裁床挥?Http 協(xié)議统舀?
因?yàn)樯蟼饕曨l的時(shí)候文件一般比較長,如果我們采用 post 請求的話劳景,寫到輸出流中誉简,它并不會直接寫到服務(wù)器中,而是會緩存在內(nèi)存中盟广,會影響我們的執(zhí)行效率