面試官問你 TCP/IP 協(xié)議了嗎?
本文轉(zhuǎn)載自微信公眾號「zone7」,作者zone7。轉(zhuǎn)載本文請聯(lián)系zone7公眾號。
TCP/IP 協(xié)議族
通常我說 TCP/IP 是指 TCP/IP 協(xié)議族。它是基于 TCP 和 IP 這兩個(gè)最初的協(xié)議之上的不同的通信協(xié)議的大集合。
例如:http、https、ftp、icmp、arp、rarp、smtp(簡單郵件傳輸協(xié)議)
一個(gè)網(wǎng)絡(luò)請求是怎么傳輸?shù)?
我們拿訪問瀏覽器舉個(gè)栗子,如圖所示:
TCP、UDP有什么區(qū)別?各有什么優(yōu)劣?
TCP 面向連接,提供可靠交付。通過 TCP 連接傳輸?shù)臄?shù)據(jù),無差錯(cuò)、不丟失、不重復(fù)、并且按序到達(dá)。相對 UDP 開銷大
UDP 面向無連接,不保證可靠交付。無擁塞控制,支持一對一、一對多、多對多,開銷小。
關(guān)于 TCP 協(xié)議
- 確認(rèn) ACK - ACKnowledgement 僅當(dāng)ACK = 1 時(shí),確認(rèn)才有效。簡單來說,就是確認(rèn)收到數(shù)據(jù)。
- 復(fù)位 RST - ReSet 標(biāo)明 TCP 出現(xiàn)嚴(yán)重差錯(cuò)時(shí),必須釋放連接,重新建立連接。
- 同步 SYN - SYNchronization 在建立連接時(shí),用來同步序號。當(dāng) SYN = 1,ACK = 0 時(shí),表名這是一個(gè)連接請求報(bào)文。SYN = 1,ACK = 1 表示這是一個(gè)同意請求報(bào)文。
- 終止 FNI - FINis(表示終、完)用來釋放連接。當(dāng) FNI = 1 表示此段報(bào)文發(fā)送方已發(fā)送完畢。
關(guān)于 UDP 協(xié)議
解釋三次握手
- 確認(rèn)號 ack 期望收到對方下一個(gè)報(bào)文的序列號
- 序列號 seq
- SYN = 1 請求同步序列號,A 的序列號為:x
- SYN = 1 ACK = 1,表示確認(rèn)請求。B 發(fā)送的數(shù)據(jù)的序列號為:y,期望收到 下一個(gè) A 的數(shù)據(jù)的序列號為:x + 1
- ACK = 1 ,表示確認(rèn)請求。A 發(fā)送的數(shù)據(jù)的序列號為:x + 1,期望收到下一個(gè) B 的數(shù)據(jù)的序列號為:y + 1
說說TCP三次握手?為什么不兩次?
如果發(fā)送兩次就可以建立連接話,那么只要客戶端發(fā)送一個(gè)連接請求,服務(wù)端接收到并發(fā)送了確認(rèn),就會(huì)建立一個(gè)連接。
可能出現(xiàn)的問題:如果一個(gè)連接請求在網(wǎng)絡(luò)中跑的慢,超時(shí)了,這時(shí)客戶端會(huì)從發(fā)請求,但是這個(gè)跑的慢的請求最后還是跑到了,然后服務(wù)端就接收了兩個(gè)連接請求,然后全部回應(yīng)就會(huì)創(chuàng)建兩個(gè)連接,浪費(fèi)資源!
如果加了第三次客戶端確認(rèn),客戶端在接受到一個(gè)服務(wù)端連接確認(rèn)請求后,后面再接收到的連接確認(rèn)請求就可以拋棄不管了。
說說TCP四次揮手?為什么不是三次?
據(jù)傳輸結(jié)束后,通信的雙方都可以釋放連接?,F(xiàn)在 A 和 B 都處于 ESTABLISHED 狀態(tài)。
第一次揮手:A 的應(yīng)用進(jìn)程先向其 TCP 發(fā)出連接釋放報(bào)文段,并停止再發(fā)送數(shù)據(jù),主動(dòng)關(guān)閉 TCP 連接。A 把連接釋放報(bào)文段首部的終止控制位 FIN 置 1,其序號 seq = u(等于前面已傳送過的數(shù)據(jù)的最后一個(gè)字節(jié)的序號加 1),這時(shí) A 進(jìn)入 FIN-WAIT-1(終止等待1)狀態(tài),等待 B 的確認(rèn)。請注意:TCP 規(guī)定,F(xiàn)IN 報(bào)文段即使不攜帶數(shù)據(jù),也將消耗掉一個(gè)序號。
第二次揮手:B 收到連接釋放報(bào)文段后立即發(fā)出確認(rèn),確認(rèn)號是 ack = u + 1,而這個(gè)報(bào)文段自己的序號是 v(等于 B 前面已經(jīng)傳送過的數(shù)據(jù)的最后一個(gè)字節(jié)的序號加1),然后 B 就進(jìn)入 CLOSE-WAIT(關(guān)閉等待)狀態(tài)。TCP 服務(wù)端進(jìn)程這時(shí)應(yīng)通知高層應(yīng)用進(jìn)程,因而從 A 到 B 這個(gè)方向的連接就釋放了,這時(shí)的 TCP 連接處于半關(guān)閉(half-close)狀態(tài),即 A 已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但 B 若發(fā)送數(shù)據(jù),A 仍要接收。也就是說,從 B 到 A 這個(gè)方向的連接并未關(guān)閉,這個(gè)狀態(tài)可能會(huì)持續(xù)一段時(shí)間。A 收到來自 B 的確認(rèn)后,就進(jìn)入 FIN-WAIT-2(終止等待2)狀態(tài),等待 B 發(fā)出的連接釋放報(bào)文段。
第三次揮手:若 B 已經(jīng)沒有要向 A 發(fā)送的數(shù)據(jù),其應(yīng)用進(jìn)程就通知 TCP 釋放連接。這時(shí) B 發(fā)出的連接釋放報(bào)文段必須使 FIN = 1。假定 B 的序號為 w(在半關(guān)閉狀態(tài),B 可能又發(fā)送了一些數(shù)據(jù))。B 還必須重復(fù)上次已發(fā)送過的確認(rèn)號 ack = u + 1。這時(shí) B 就進(jìn)入 LAST-ACK(最后確認(rèn))狀態(tài),等待 A 的確認(rèn)。
第四次揮手:A 在收到 B 的連接釋放報(bào)文后,必須對此發(fā)出確認(rèn)。在確認(rèn)報(bào)文段中把 ACK 置 1,確認(rèn)號 ack = w + 1,而自己的序號 seq = u + 1(前面發(fā)送的 FIN 報(bào)文段要消耗一個(gè)序號)。然后進(jìn)入 TIME-WAIT(時(shí)間等待) 狀態(tài)。請注意,現(xiàn)在 TCP 連接還沒有釋放掉。必須經(jīng)過時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間 2MSL(MSL:最長報(bào)文段壽命)后,A 才能進(jìn)入到 CLOSED 狀態(tài),然后撤銷傳輸控制塊,結(jié)束這次 TCP 連接。當(dāng)然如果 B 一收到 A 的確認(rèn)就進(jìn)入 CLOSED 狀態(tài),然后撤銷傳輸控制塊。所以在釋放連接時(shí),B 結(jié)束 TCP 連接的時(shí)間要早于 A。
什么是擁塞控制?
簡單來說,就是通過網(wǎng)絡(luò)的擁塞情況來調(diào)整 TCP 發(fā)送端發(fā)送的數(shù)據(jù)量。發(fā)送量先由 1 指數(shù)級遞增,到一定量時(shí)(65535 個(gè)字節(jié))開始慢下來,這個(gè)時(shí)候還是遞增的。等到開始丟包時(shí),又開始降低發(fā)送速度。
什么是流量控制?
簡單來說,就是 TCP 的接受端處理不過來,讓 TCP 的發(fā)送端發(fā)送慢一點(diǎn)。接收端會(huì)維護(hù)一個(gè)處理窗口,即是接收端所能處理數(shù)據(jù)的能力。接收端將這個(gè)處理能力不斷反饋給發(fā)送端,以此來讓發(fā)送端調(diào)整發(fā)送的數(shù)據(jù)量的多少。