TCP \ UDP \ TCP 三次握手和四次揮手
什么是 TCP ?
TCP 是面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。
- 面向連接:一定是「一對(duì)一」才能連接,不能像 UDP 協(xié)議可以一個(gè)主機(jī)同時(shí)向多個(gè)主機(jī)發(fā)送消息,也就是一對(duì)多是無(wú)法做到的;
- 可靠的:無(wú)論的網(wǎng)絡(luò)鏈路中出現(xiàn)了怎樣的鏈路變化,TCP 都可以保證一個(gè)報(bào)文一定能夠到達(dá)接收端;
- 字節(jié)流:用戶消息通過(guò) TCP 協(xié)議傳輸時(shí),消息可能會(huì)被操作系統(tǒng)「分組」成多個(gè)的 TCP 報(bào)文,如果接收方的程序如果不知道「消息的邊界」,是無(wú)法讀出一個(gè)有效的用戶消息的。并且 TCP 報(bào)文是「有序的」,當(dāng)「前一個(gè)」TCP 報(bào)文沒(méi)有收到的時(shí)候,即使它先收到了后面的 TCP 報(bào)文,那么也不能扔給應(yīng)用層去處理,同時(shí)對(duì)「重復(fù)」的 TCP 報(bào)文會(huì)自動(dòng)丟棄。
UDP 和 TCP 的區(qū)別
1. 連接
- TCP 是面向連接的傳輸層協(xié)議,傳輸數(shù)據(jù)前先要建立連接。
- UDP 是不需要連接,即刻傳輸數(shù)據(jù)。
2. 服務(wù)對(duì)象
- TCP 是一對(duì)一的兩點(diǎn)服務(wù),即一條連接只有兩個(gè)端點(diǎn)。
- UDP 支持一對(duì)一、一對(duì)多、多對(duì)多的交互通信
3. 可靠性
- TCP 是可靠交付數(shù)據(jù)的,數(shù)據(jù)可以無(wú)差錯(cuò)、不丟失、不重復(fù)、按需到達(dá)。
- UDP 是盡最大努力交付,不保證可靠交付數(shù)據(jù)。
4. 擁塞控制、流量控制
- TCP 有擁塞控制和流量控制機(jī)制,保證數(shù)據(jù)傳輸?shù)陌踩浴?/span>
- UDP 則沒(méi)有,即使網(wǎng)絡(luò)非常擁堵了,也不會(huì)影響 UDP 的發(fā)送速率。
5. 首部開(kāi)銷(xiāo)
- TCP 首部長(zhǎng)度較長(zhǎng),會(huì)有一定的開(kāi)銷(xiāo),首部在沒(méi)有使用「選項(xiàng)」字段時(shí)是 20 個(gè)字節(jié),如果使用了「選項(xiàng)」字段則會(huì)變長(zhǎng)的。
- UDP 首部只有 8 個(gè)字節(jié),并且是固定不變的,開(kāi)銷(xiāo)較小。
6. 傳輸方式
- TCP 是流式傳輸,沒(méi)有邊界,但保證順序和可靠。
- UDP 是一個(gè)包一個(gè)包的發(fā)送,是有邊界的,但可能會(huì)丟包和亂序。
7. 分片不同
- TCP 的數(shù)據(jù)大小如果大于 MSS 大小,則會(huì)在傳輸層進(jìn)行分片,目標(biāo)主機(jī)收到后,也同樣在傳輸層組裝 TCP 數(shù)據(jù)包,如果中途丟失了一個(gè)分片,只需要傳輸丟失的這個(gè)分片。
- UDP 的數(shù)據(jù)大小如果大于 MTU 大小,則會(huì)在 IP 層進(jìn)行分片,目標(biāo)主機(jī)收到后,在 IP 層組裝完數(shù)據(jù),接著再傳給傳輸層。
TCP 和 UDP 應(yīng)用場(chǎng)景:
由于 TCP 是面向連接,能保證數(shù)據(jù)的可靠性交付,因此經(jīng)常用于:
- FTP 文件傳輸;
- HTTP / HTTPS;
由于 UDP 面向無(wú)連接,它可以隨時(shí)發(fā)送數(shù)據(jù),再加上UDP本身的處理既簡(jiǎn)單又高效,因此經(jīng)常用于:
- 包總量較少的通信,如 DNS 、SNMP 等;
- 視頻、音頻等多媒體通信;
- 廣播通信;
TCP 三次握手和四次揮手
TCP 三次握手和四次揮手也是面試題的熱門(mén)考點(diǎn),它們分別對(duì)應(yīng) TCP 的連接和釋放過(guò)程。下面就來(lái)簡(jiǎn)單認(rèn)識(shí)一下這兩個(gè)過(guò)程
TCP 三次握手
在了解具體的流程前,我們需要先認(rèn)識(shí)幾個(gè)概念
- SYN:它的全稱(chēng)是 Synchronize Sequence Numbers,同步序列編號(hào)。是 TCP/IP 建立連接時(shí)使用的握手信號(hào)。在客戶機(jī)和服務(wù)器之間建立 TCP 連接時(shí),首先會(huì)發(fā)送的一個(gè)信號(hào)??蛻舳嗽诮邮艿?SYN 消息時(shí),就會(huì)在自己的段內(nèi)生成一個(gè)隨機(jī)值 X。
- SYN-ACK:服務(wù)器收到 SYN 后,打開(kāi)客戶端連接,發(fā)送一個(gè) SYN-ACK 作為答復(fù)。確認(rèn)號(hào)設(shè)置為比接收到的序列號(hào)多一個(gè),即 X + 1,服務(wù)器為數(shù)據(jù)包選擇的序列號(hào)是另一個(gè)隨機(jī)數(shù) Y。
- ACK:Acknowledge character, 確認(rèn)字符,表示發(fā)來(lái)的數(shù)據(jù)已確認(rèn)接收無(wú)誤。最后,客戶端將 ACK 發(fā)送給服務(wù)器。序列號(hào)被設(shè)置為所接收的確認(rèn)值即 Y + 1。
如果用現(xiàn)實(shí)生活來(lái)舉例的話就是
小明 - 客戶端 小紅 - 服務(wù)端
- 小明給小紅打電話,接通了后,小明說(shuō)喂,能聽(tīng)到嗎,這就相當(dāng)于是連接建立。
- 小紅給小明回應(yīng),能聽(tīng)到,你能聽(tīng)到我說(shuō)的話嗎,這就相當(dāng)于是請(qǐng)求響應(yīng)。
- 小明聽(tīng)到小紅的回應(yīng)后,好的,這相當(dāng)于是連接確認(rèn)。在這之后小明和小紅就可以通話/交換信息了。
TCP 四次揮手
在連接終止階段使用四次揮手,連接的每一端都會(huì)獨(dú)立的終止。下面我們來(lái)描述一下這個(gè)過(guò)程。
- 首先,客戶端應(yīng)用程序決定要終止連接(這里服務(wù)端也可以選擇斷開(kāi)連接)。這會(huì)使客戶端將 FIN 發(fā)送到服務(wù)器,并進(jìn)入 FIN_WAIT_1 狀態(tài)。當(dāng)客戶端處于 FIN_WAIT_1 狀態(tài)時(shí),它會(huì)等待來(lái)自服務(wù)器的 ACK 響應(yīng)。
- 然后第二步,當(dāng)服務(wù)器收到 FIN 消息時(shí),服務(wù)器會(huì)立刻向客戶端發(fā)送 ACK 確認(rèn)消息。
- 當(dāng)客戶端收到服務(wù)器發(fā)送的 ACK 響應(yīng)后,客戶端就進(jìn)入 FIN_WAIT_2 狀態(tài),然后等待來(lái)自服務(wù)器的 FIN 消息
- 服務(wù)器發(fā)送 ACK 確認(rèn)消息后,一段時(shí)間(可以進(jìn)行關(guān)閉后)會(huì)發(fā)送 FIN 消息給客戶端,告知客戶端可以進(jìn)行關(guān)閉。
- 當(dāng)客戶端收到從服務(wù)端發(fā)送的 FIN 消息時(shí),客戶端就會(huì)由 FIN_WAIT_2 狀態(tài)變?yōu)?TIME_WAIT 狀態(tài)。處于 TIME_WAIT 狀態(tài)的客戶端允許重新發(fā)送 ACK 到服務(wù)器為了防止信息丟失??蛻舳嗽?TIME_WAIT 狀態(tài)下花費(fèi)的時(shí)間取決于它的實(shí)現(xiàn),在等待一段時(shí)間后,連接關(guān)閉,客戶端上所有的資源(包括端口號(hào)和緩沖區(qū)數(shù)據(jù))都被釋放。
還是可以用上面那個(gè)通話的例子來(lái)進(jìn)行描述
- 小明對(duì)小紅說(shuō),我所有的東西都說(shuō)完了,我要掛電話了。
- 小紅說(shuō),收到,我這邊還有一些東西沒(méi)說(shuō)。
- 經(jīng)過(guò)若干秒后,小紅也說(shuō)完了,小紅說(shuō),我說(shuō)完了,現(xiàn)在可以掛斷了
- 小明收到消息后,又等了若干時(shí)間后,掛斷了電話。