網(wǎng)絡(luò)五層模型
應(yīng)用層:通過(guò)應(yīng)用進(jìn)程間的交互來(lái)完成特定網(wǎng)絡(luò)應(yīng)用,指的是遵循 http,ftp等協(xié)議運(yùn)行的應(yīng)用進(jìn)程
傳輸層:兩臺(tái)主機(jī)中進(jìn)程之間的通信提供通用的數(shù)據(jù)傳輸服務(wù),指的是將應(yīng)用層的數(shù)據(jù)通過(guò)tcp或者udp協(xié)議進(jìn)行傳輸,tcp傳輸過(guò)程就是遵循socket接口(套字節(jié))
網(wǎng)絡(luò)層:網(wǎng)絡(luò)層負(fù)責(zé)為分組交換網(wǎng)上的不同主機(jī)提供通信服務(wù),指的是將傳輸層的數(shù)據(jù)進(jìn)行分組打包,通過(guò)IP協(xié)議,選擇適合的路由進(jìn)行傳遞
數(shù)據(jù)鏈路層:指的是網(wǎng)絡(luò)層傳輸數(shù)據(jù)的過(guò)程中的步驟,因?yàn)閭鬏敂?shù)據(jù)是在一段一段鏈路上傳送的,所以這里也遵循鏈路層協(xié)議來(lái)保證傳輸信息的可靠性
物理層:通過(guò)路由選擇算法,為報(bào)文或分組通過(guò)通信子網(wǎng)選擇最適當(dāng)?shù)穆窂?。該層控制?shù)據(jù)鏈路層與傳輸層之間的信息轉(zhuǎn)發(fā),建立、維持和終止網(wǎng)絡(luò)的連接。具體地說(shuō),數(shù)據(jù)鏈路層的數(shù)據(jù)在這一層被轉(zhuǎn)換為數(shù)據(jù)包,然后通過(guò)路徑選擇、分段組合、順序、進(jìn)/出路由等控制,將信息從一個(gè)網(wǎng)絡(luò)設(shè)備傳送到另一個(gè)網(wǎng)絡(luò)設(shè)備
HTTP
http超文本傳輸協(xié)議 包含請(qǐng)求行(方法 路徑 協(xié)議)、請(qǐng)求頭(key-vaule)、請(qǐng)求主體(數(shù)據(jù))、響應(yīng)行(協(xié)議版本 狀態(tài)碼 狀態(tài)說(shuō)明)、響應(yīng)頭、響應(yīng)主體
HTTP 協(xié)議:超文本傳輸協(xié)議,對(duì)應(yīng)于應(yīng)用層,用于如何封裝數(shù)據(jù).
TCP/UDP 協(xié)議:傳輸控制協(xié)議,對(duì)應(yīng)于傳輸層,主要解決數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸。
IP 協(xié)議:對(duì)應(yīng)于網(wǎng)絡(luò)層,同樣解決數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸。
傳輸數(shù)據(jù)的時(shí)候只使用 TCP/IP 協(xié)議(傳輸層),如果沒(méi)有應(yīng)用層來(lái)識(shí)別數(shù)據(jù)內(nèi)容,傳輸后的協(xié)議都是無(wú)用的。
應(yīng)用層協(xié)議很多 FTP,HTTP,TELNET等,可以自己定義應(yīng)用層協(xié)議。
web 使用 HTTP 作傳輸層協(xié)議,以封裝 HTTP 文本信息,然后使用 TCP/IP 做傳輸層協(xié)議,將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上
1、http keep-alive
在一次tcp連接中可以連續(xù)發(fā)送多次數(shù)據(jù),即可以保持一段時(shí)間的tcp連接,在這個(gè)保持的通道上有多個(gè)request、多個(gè)response。而不用每發(fā)一次數(shù)據(jù)就要重新進(jìn)行三次握手連接,發(fā)完一次數(shù)據(jù)就要立即進(jìn)行四次揮手釋放連接。 這樣可以提高性能和吞吐率。
2、tcp keep-alive
為了檢測(cè)tcp的連接狀況。經(jīng)過(guò)設(shè)定的時(shí)間之后,服務(wù)器會(huì)發(fā)出檢測(cè)包去確認(rèn)tcp連接是否還在。如果出現(xiàn)了問(wèn)題就關(guān)閉連接。
http和websocket
http協(xié)議決定了瀏覽器端總是主動(dòng)發(fā)起方,http的服務(wù)端總是被動(dòng)的接受、響應(yīng)請(qǐng)求。http提供的長(zhǎng)連接服務(wù)器可以不接受。而websocket協(xié)議,在連接之后,客戶(hù)端、服務(wù)端是完全平等的。websocket是真正的長(zhǎng)連接。
TCP三次握手
標(biāo)記位標(biāo)記狀態(tài) 序號(hào)用來(lái)標(biāo)記順序 確認(rèn)好用來(lái)確認(rèn)
第一次握手客戶(hù)端向服務(wù)端發(fā)送報(bào)文包含標(biāo)記位、序號(hào)(請(qǐng)求建立新連接)
第二次握手服務(wù)端接收到客戶(hù)端的TCP報(bào)文后,向客戶(hù)端發(fā)送報(bào)文包含序號(hào)、確認(rèn)號(hào)、標(biāo)記位(表示同意創(chuàng)建新連接)
第三次握手客戶(hù)端接收了來(lái)自服務(wù)端的TCP報(bào)文,向服務(wù)端發(fā)送報(bào)文包含序號(hào)標(biāo)記位確認(rèn)號(hào)(確認(rèn)收到服務(wù)器端同意連接的信號(hào))
至此完成三次握手
四次揮手
第一次客戶(hù)端想釋放連接,向服務(wù)端發(fā)送了一段TCP報(bào)文,其中包含標(biāo)記位,序號(hào),隨后客戶(hù)端停止了向服務(wù)端發(fā)送數(shù)據(jù),等待服務(wù)端回應(yīng)(表示請(qǐng)求釋放連接)
第二次服務(wù)端接收了來(lái)自服務(wù)端的TCP報(bào)文,確認(rèn)了客戶(hù)段想釋放連接,并返回了一段報(bào)文包含標(biāo)記位、序號(hào)、確認(rèn)號(hào)(表示收到)隨后服務(wù)端開(kāi)始準(zhǔn)備釋放到服務(wù)端的連接
第三次服務(wù)端發(fā)送萬(wàn)確認(rèn)報(bào)文之后,做好了釋放服務(wù)端到客戶(hù)端的連接,再一次向客戶(hù)端發(fā)送了報(bào)文包含標(biāo)記位、序號(hào)、確認(rèn)號(hào)(表示已經(jīng)準(zhǔn)備好了釋放)
第四次客戶(hù)端收到服務(wù)端發(fā)送的報(bào)文,確認(rèn)了服務(wù)端已經(jīng)做好釋放的準(zhǔn)備,并向服務(wù)端發(fā)送了一段報(bào)文包含標(biāo)記位、序號(hào)、確認(rèn)號(hào),隨后客戶(hù)端開(kāi)始等待2msl后結(jié)束了連接
至此完成四次揮手
注:后“兩次揮手”既讓客戶(hù)端知道了服務(wù)器端準(zhǔn)備好釋放連接了,也讓服務(wù)器端知道了客戶(hù)端了解了自己準(zhǔn)備好釋放連接了。于是,可以確認(rèn)關(guān)閉服務(wù)器端到客戶(hù)端方向上的連接了,由此完成“四次揮手”
與“三次揮手”一樣,在客戶(hù)端與服務(wù)器端傳輸?shù)腡CP報(bào)文中,雙方的確認(rèn)號(hào)Ack和序號(hào)Seq的值,都是在彼此Ack和Seq值的基礎(chǔ)上進(jìn)行計(jì)算的,這樣做保證了TCP報(bào)文傳輸?shù)倪B貫性,一旦出現(xiàn)某一方發(fā)出的TCP報(bào)文丟失,便無(wú)法繼續(xù)"揮手",以此確保了"四次揮手"的順利完成。
問(wèn):為什么客戶(hù)端要等待一段時(shí)間?
當(dāng)客戶(hù)端發(fā)出報(bào)文時(shí)候不確定服務(wù)端有沒(méi)有收到,所以會(huì)設(shè)置2msl時(shí)間來(lái)計(jì)時(shí),正好服務(wù)端和客戶(hù)端發(fā)送確認(rèn)報(bào)文的最大時(shí)長(zhǎng)是2msl,如果在這個(gè)1msl里沒(méi)有收到和客戶(hù)端的報(bào)文就回再次詢(xún)問(wèn),否則認(rèn)為已確認(rèn)則斷開(kāi)連接
問(wèn):為什么握手是三次揮手是四次?
答:因?yàn)槲帐质钦?qǐng)求建立連接,沒(méi)存在數(shù)據(jù)傳輸?shù)臓顟B(tài)準(zhǔn)備,而揮手是斷開(kāi)連接屬于數(shù)據(jù)傳輸中則需要各自確認(rèn)數(shù)據(jù)傳輸狀態(tài),已達(dá)到傳送數(shù)據(jù)安全和完整