TCP網(wǎng)絡(luò)那點(diǎn)破事!三次握手、四次揮手、TIME-WAIT、HTTP 2.0 ....
大家好,我是Tom哥~
今天主要給各位分享TCP網(wǎng)絡(luò)的一些常見(jiàn)知識(shí)點(diǎn),日常工作或面試會(huì)經(jīng)常遇到。考慮內(nèi)容篇幅不小,建議先收藏,慢慢咀嚼。
如果有幫助,也請(qǐng)轉(zhuǎn)給身邊的朋友們,”獨(dú)樂(lè)樂(lè)不如眾樂(lè)樂(lè)“
首先,來(lái)個(gè)目錄,讓大家對(duì)文章內(nèi)容先有個(gè)直觀了解
網(wǎng)絡(luò)的七層模型,簡(jiǎn)單介紹每層的作用?
答案:分為7層,從下到上依次是:
- 應(yīng)用層:計(jì)算機(jī)用戶與網(wǎng)絡(luò)之間的接口,常見(jiàn)的協(xié)議有:HTTP、FTP、 SMTP、TELNET
- 表示層:數(shù)據(jù)的表示、安全、壓縮。將應(yīng)用處理的信息轉(zhuǎn)換為適合網(wǎng)絡(luò)傳輸?shù)母袷健?/li>
- 會(huì)話層:建立和管理本地主機(jī)與遠(yuǎn)程主機(jī)之間的會(huì)話。
- 傳輸層:定義傳輸數(shù)據(jù)的協(xié)議端口號(hào),以及流控和差錯(cuò)校驗(yàn),保證報(bào)文能正確傳輸。協(xié)議有TCP、UDP
- 網(wǎng)絡(luò)層:路由選擇算法,進(jìn)行邏輯地址尋址,實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的最佳路徑選擇。協(xié)議有IP、ICMP
- 數(shù)據(jù)鏈路層:接收來(lái)自物理層的位流形式的數(shù)據(jù),并封裝成幀,傳送到上一層;同樣,也將來(lái)自上層的數(shù)據(jù)幀,拆裝為位流形式的數(shù)據(jù)轉(zhuǎn)發(fā)到物理層。這一層的數(shù)據(jù)叫做幀。
- 物理層:建立、維護(hù)、斷開(kāi)物理連接。傳輸比特流(將1、0轉(zhuǎn)化為電流強(qiáng)弱來(lái)進(jìn)行傳輸,到達(dá)目的地后在轉(zhuǎn)化為1、0,也就是我們常說(shuō)的數(shù)模轉(zhuǎn)換與模數(shù)轉(zhuǎn)換)。這一層的數(shù)據(jù)叫做比特。
TCP 報(bào)文首部有哪些字段?
答案:
- 源端口、目的端口:各占2個(gè)字節(jié),表示數(shù)據(jù)從哪個(gè)進(jìn)程來(lái),去往哪個(gè)進(jìn)程
- 序號(hào)(Sequence Number):占4個(gè)字節(jié),TCP連接中傳送的數(shù)據(jù)每一個(gè)字節(jié)都會(huì)有一個(gè)序號(hào)
- 確認(rèn)號(hào)(Acknowledgement Number):占4個(gè)字節(jié),另一方發(fā)送的tcp報(bào)文段的響應(yīng)
- 數(shù)據(jù)偏移:頭部長(zhǎng)度,占4個(gè)字節(jié),表示TCP報(bào)文段的數(shù)據(jù)距離TCP報(bào)文段的起始處有多遠(yuǎn)。
- 6位標(biāo)志位:
- URG:緊急指針是否有效
- ACK:表示確認(rèn)號(hào)是否有效
- PSH:提示接收端應(yīng)用程序立刻將數(shù)據(jù)從tcp緩沖區(qū)讀走
- RST:表示要求對(duì)方重新建立連接
- SYN:這是一個(gè)連接請(qǐng)求或連接接受的報(bào)文
- FIN:告知對(duì)方本端要關(guān)閉連接
- 窗口大小:占4個(gè)字節(jié),用于TCP流量控制。告訴對(duì)方本端的TCP接收緩沖區(qū)還能容納多少字節(jié)的數(shù)據(jù),這樣對(duì)方就可以控制發(fā)送數(shù)據(jù)的速度。
- 校驗(yàn)和:占2個(gè)字節(jié),由發(fā)送端填充,接收端對(duì)TCP報(bào)文段執(zhí)行CRC算法以檢驗(yàn)TCP報(bào)文段在傳輸過(guò)程中是否損壞。檢驗(yàn)的范圍包括頭部、數(shù)據(jù)兩部分,是TCP可靠傳輸?shù)囊粋€(gè)重要保障。
- 緊急指針:占2個(gè)字節(jié),一個(gè)正的偏移量。它和序號(hào)字段的值相加表示最后一個(gè)緊急數(shù)據(jù)的下一個(gè)字節(jié)的序號(hào),用于發(fā)送端向接收端發(fā)送緊急數(shù)據(jù)。
TCP 三次握手過(guò)程?
答案:目的是同步連接雙方的序列號(hào)和確認(rèn)號(hào),并交換TCP窗口。
- 第一次握手,客戶端發(fā)送(seq=x),客戶端進(jìn)入SYN_SEND狀態(tài)
- 第二次握手,服務(wù)端響應(yīng)(Seq=y, Ack=x+1),服務(wù)器端就進(jìn)入SYN_RCV狀態(tài)。
- 第三次握手,客戶端收到服務(wù)端的確認(rèn)后,發(fā)送(Ack=y+1),客戶端進(jìn)入ESTABLISHED狀態(tài)。當(dāng)服務(wù)器端接收到這個(gè)包時(shí),也進(jìn)入ESTABLISHED狀態(tài)。
為什么是三次握手,而不是兩次或四次?
答案:
如果只有兩次握手,那么服務(wù)端向客戶端發(fā)送 SYN/ACK 報(bào)文后,就會(huì)認(rèn)為連接建立。但是如果客戶端沒(méi)有收到報(bào)文,那么客戶端是沒(méi)有建立連接的,這就導(dǎo)致服務(wù)端會(huì)浪費(fèi)資源。
使用兩次握手無(wú)法建立 TCP 連接,而使用三次握手是建立連接所需要的最小次數(shù)
TCP 四次揮手的過(guò)程?
答案:
- 第一次揮手:客戶端向服務(wù)端發(fā)送連接釋放報(bào)文
- 第二次揮手:服務(wù)端收到連接釋放報(bào)文后,立即發(fā)出確認(rèn)報(bào)文。這時(shí) TCP 連接處于半關(guān)閉狀態(tài),即客戶端到服務(wù)端的連接已經(jīng)釋放了,但是服務(wù)端到客戶端的連接還未釋放。表示客戶端已經(jīng)沒(méi)有數(shù)據(jù)發(fā)送了,但是服務(wù)端可能還要給客戶端發(fā)送數(shù)據(jù)。
- 第三次揮手:服務(wù)端向客戶端發(fā)送連接釋放報(bào)文
- 第四次揮手:客戶端收到服務(wù)端的連接釋放報(bào)文后,立即發(fā)出確認(rèn)報(bào)文。此時(shí),客戶端就進(jìn)入了 TIME-WAIT 狀態(tài)。注意此時(shí)客戶端到 TCP 連接還沒(méi)有釋放,必須經(jīng)過(guò) 2*MSL(最長(zhǎng)報(bào)文段壽命)的時(shí)間后,才進(jìn)入CLOSED 狀態(tài)。
為什么需要四次揮手?
答案:TCP 是全雙工。一方關(guān)閉連接后,另一方還可以繼續(xù)發(fā)送數(shù)據(jù)。所以四次揮手,將斷開(kāi)連接分成兩個(gè)獨(dú)立的過(guò)程。
客戶端 TIME-WAIT ,為什么要等待 2MSL 才進(jìn)入 CLOSED 狀態(tài)?
答案:MSL 是報(bào)文段在網(wǎng)絡(luò)上最大存活時(shí)間。
確保 ACK 報(bào)文能夠到達(dá)服務(wù)端,從而使服務(wù)端正常關(guān)閉連接。客戶端在發(fā)送完最后一個(gè) ACK 報(bào)文段后,再經(jīng)過(guò) 2MSL,就可以保證本連接持續(xù)的時(shí)間內(nèi)產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失。這樣就可以使下一個(gè)連接中不會(huì)出現(xiàn)這種舊的連接請(qǐng)求報(bào)文段。
一臺(tái) 8G 內(nèi)存服務(wù)器,可以同時(shí)維護(hù)多少個(gè)連接?
答案:發(fā)送、接收緩存各4k,還要考慮socket描述符,一個(gè)tcp連接需要占用的最小內(nèi)存是8k,那么最大連接數(shù)為:8*1024*1024 K / 8 K = 1048576 個(gè),即約100萬(wàn)個(gè)tcp長(zhǎng)連接。
什么是拆包?
答案:傳輸層封包不能太大,基于這個(gè)限制,往往以緩沖區(qū)大小為單位,將數(shù)據(jù)拆分成多個(gè) TCP 段(TCP Segment)傳輸。在接收數(shù)據(jù)的時(shí)候,一個(gè)個(gè) TCP 段又被重組成原來(lái)的數(shù)據(jù)。簡(jiǎn)單來(lái)講分為幾個(gè)過(guò)程:拆分——傳輸——重組。
什么是粘包?
答案:解決數(shù)據(jù)太小問(wèn)題,防止多次發(fā)送占用資源。TCP 協(xié)議將它們合并成一個(gè) TCP 段發(fā)送,在目的地再還原成多個(gè)數(shù)據(jù)。
緩沖區(qū)是做什么用?
答案:緩沖區(qū)是在內(nèi)存中開(kāi)辟的一塊區(qū)域,目的是緩沖。當(dāng)應(yīng)用頻繁地通過(guò)網(wǎng)卡收、發(fā)數(shù)據(jù),網(wǎng)卡只能一個(gè)一個(gè)處理。當(dāng)網(wǎng)卡忙不過(guò)來(lái)的時(shí)候,數(shù)據(jù)就需要排隊(duì),也就是將數(shù)據(jù)放入緩沖區(qū)。
注意:TCP Segment 的大小不能超過(guò)緩沖區(qū)大小。
TCP 協(xié)議是如何保證數(shù)據(jù)的順序?
答案:
大數(shù)據(jù)拆包成多個(gè)片段,發(fā)送可以保證有序,但是由于網(wǎng)絡(luò)環(huán)境復(fù)雜,并不能保證它們到達(dá)時(shí)也是有序的,為了解決這個(gè)問(wèn)題,對(duì)每個(gè)片段用Sequence Number編號(hào),接收數(shù)據(jù)的時(shí)候,通過(guò) Seq 進(jìn)行排序。
注意:seq是累計(jì)的發(fā)送字節(jié)數(shù)
TCP 協(xié)議如何解決丟包?
答案:丟包需要重發(fā),關(guān)鍵是如何判斷有沒(méi)有丟包!
每一個(gè)數(shù)據(jù)包,接收方都會(huì)給發(fā)送方發(fā)響應(yīng)。每個(gè) TCP 段發(fā)送時(shí),接收方已經(jīng)接收了多少數(shù)據(jù),用 Acknowledgement Number(簡(jiǎn)寫(xiě)ACK) 表示。
注意:ack是累計(jì)的接收字節(jié)數(shù),表示這個(gè)包之前的包都已經(jīng)收到了。
什么是 MSS ?
答案:MSS 全稱 Maximun Segment Size。是TCP Header 中的可選項(xiàng)(Options),控制了 TCP 段的大小,不能由單方?jīng)Q定,需要雙方協(xié)商。
TCP 協(xié)議如何控制流量傳輸速度?
答案:簡(jiǎn)單講通過(guò)滑動(dòng)窗口。發(fā)送、接收窗口的大小可以用來(lái)控制 TCP 協(xié)議的流速。窗口越大,同時(shí)可以發(fā)送、接收的數(shù)據(jù)就越多,吞吐量也就越大。但是窗口越大,如果數(shù)據(jù)發(fā)生錯(cuò)誤,損失也就越大,因?yàn)樾枰貍髟蕉嗟臄?shù)據(jù)。
TCP每個(gè)請(qǐng)求都要有響應(yīng),如果一個(gè)請(qǐng)求沒(méi)有收到響應(yīng),發(fā)送方就會(huì)認(rèn)為這次發(fā)送出現(xiàn)了故障,會(huì)觸發(fā)重發(fā)。為了提升吞吐量,一個(gè)TCP段再?zèng)]有收到響應(yīng)時(shí),可以繼續(xù)發(fā)送下一個(gè)段。
- 窗口區(qū)域包含兩類數(shù)據(jù):已發(fā)送未確認(rèn)、未發(fā)送(即將發(fā)送)
- 窗口中序號(hào)最小的分組如果收到 ACK,窗口就會(huì)向右滑動(dòng)
- 滑動(dòng)窗口的size規(guī)格可能會(huì)變化,需要從ACK數(shù)據(jù)包實(shí)時(shí)取最新值
- 如果最小序號(hào)的分組長(zhǎng)時(shí)間沒(méi)有收到 ACK,就會(huì)觸發(fā)整個(gè)窗口的數(shù)據(jù)重新發(fā)送
HTTP 1.0 、1.1 和 HTTP 2.0 有什么區(qū)別?
答案:
1、HTTP 1.0
- 默認(rèn)是短連接,每次與服務(wù)器交互,都需要新開(kāi)一個(gè)連接。
2、HTTP 1.1
- 默認(rèn)持久化連接,建立一次連接,多次請(qǐng)求均由這個(gè)連接完成。
3、HTTP 2.0
- 二進(jìn)制分幀:在應(yīng)用層和傳輸層之間加了一個(gè)二進(jìn)制分幀層,將所有傳輸?shù)男畔⒎指顬楦〉南⒑蛶?frame),并對(duì)它們采用二進(jìn)制格式的編碼。減少服務(wù)端的壓力,內(nèi)存占用更少,連接吞吐量更大
- 多路復(fù)用:允許同時(shí)通過(guò)單一的HTTP/2.0連接發(fā)起多次的請(qǐng)求-響應(yīng)消息。
- 頭部壓縮:采用了Hpack頭部壓縮算法對(duì)Header進(jìn)行壓縮,減少重復(fù)發(fā)送。
- 服務(wù)器推送:服務(wù)器主動(dòng)將一些資源推送給瀏覽器并緩存起來(lái)。
HTTP 與 HTTPS 的區(qū)別?
答案:HTTPS = HTTP + SSL/TLS
HTTP 采用明文通訊;端口 80
HTTPS 在HTTP的基礎(chǔ)上加入了SSL/TLS協(xié)議,SSL/TLS依靠證書(shū)來(lái)驗(yàn)證服務(wù)器的身份,并為瀏覽器和服務(wù)器之間的通信加密。端口 443
HTTP 協(xié)議為什么要設(shè)計(jì)成無(wú)狀態(tài)?
答案:HTTP是一種無(wú)狀態(tài)協(xié)議,每個(gè)請(qǐng)求都是獨(dú)立執(zhí)行,請(qǐng)求/響應(yīng)。這樣設(shè)計(jì)的重要原因是,降低架構(gòu)設(shè)計(jì)復(fù)雜度,畢竟服務(wù)器一旦帶上了狀態(tài),擴(kuò)容、縮容、路由都會(huì)受到制約。無(wú)狀態(tài)協(xié)議不要求服務(wù)器在多個(gè)請(qǐng)求期間保留每個(gè)用戶的信息。
但,你可能會(huì)問(wèn),如果有登錄要求的業(yè)務(wù)怎么辦?HTTP協(xié)議提供擴(kuò)展機(jī)制,Header中增加了Cookie,存儲(chǔ)在客戶端,每次請(qǐng)求時(shí)自動(dòng)攜帶,采用空間換時(shí)間機(jī)制,滿足上下請(qǐng)求關(guān)聯(lián)。雖然浪費(fèi)了些網(wǎng)絡(luò)帶寬,但是減少了復(fù)雜度。當(dāng)然為了減輕網(wǎng)絡(luò)負(fù)擔(dān),瀏覽器會(huì)限制Cookie的大小,不同瀏覽器的限制標(biāo)準(zhǔn)略有差異,如:Chrome 10,限制最多 180個(gè),每個(gè)Cookie大小不能超過(guò) 4096 bytes
HTTPS 的訪問(wèn)流程是什么?
答案:
- 客戶端發(fā)起一個(gè)http請(qǐng)求,告訴服務(wù)器自己支持哪些hash算法。
- 服務(wù)端把自己的信息以數(shù)字證書(shū)的形式返回給客戶端(公鑰在證書(shū)里面,私鑰由服務(wù)器持有)。
- 客戶端收到服務(wù)器的響應(yīng)后會(huì)先驗(yàn)證證書(shū)的合法性(證書(shū)中包含的地址與正在訪問(wèn)的地址是否一致,證書(shū)是否過(guò)期)
- 如果證書(shū)驗(yàn)證通過(guò),就會(huì)生成一個(gè)隨機(jī)的對(duì)稱密鑰,用證書(shū)的公鑰加密。
- 客戶端將證書(shū)公鑰加密后的密鑰發(fā)送給服務(wù)端
- 服務(wù)端用私鑰解密,解密之后就得到客戶端的密鑰
- 然后,客戶端與服務(wù)端就靠密鑰完成明文加密、安全通信、對(duì)稱解密
對(duì)稱加密與非對(duì)稱加密有什么區(qū)別?
答案:
- 對(duì)稱加密。加密和解密使用同一個(gè)密鑰。速度快。常用的如:AES、DES
- 非對(duì)稱加密。公鑰與私鑰配對(duì)出現(xiàn),公鑰對(duì)數(shù)據(jù)加密,私鑰對(duì)數(shù)據(jù)解密。常用的如:RSA、DSS
TCP 抓包用什么工具?
答案:Wireshark,應(yīng)用最廣泛的網(wǎng)絡(luò)協(xié)議分析器。功能非常豐富
- 支持?jǐn)?shù)百個(gè)協(xié)議
- 實(shí)時(shí)捕獲、離線分析
- 支持 Windows、Linux、macOS、Solaris、FreeBSD、NetBSD等平臺(tái);
- 界面化操作
- 支持 Gzip
- 支持 IPSec



































