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