【面試系列】計(jì)算機(jī)網(wǎng)絡(luò)(一)

前言

作為【面試系列】文章的開(kāi)端,首先對(duì)計(jì)算機(jī)網(wǎng)絡(luò)相關(guān)知識(shí)進(jìn)行總結(jié),此篇文章主要講述基礎(chǔ)的網(wǎng)絡(luò)體系結(jié)構(gòu)、TCP協(xié)議、單點(diǎn)登錄等,后續(xù)會(huì)進(jìn)行更多計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)的分享,歡迎關(guān)注!

1. 網(wǎng)絡(luò)體系結(jié)構(gòu)

1.1、OSI模型

img

1.2、TCP/IP模型

img
  • OSI 的七層協(xié)議體系結(jié)構(gòu)的概念清楚,理論也較完整,但它既復(fù)雜又不實(shí)用,TCP/IP 體系結(jié)構(gòu)則不同,但它現(xiàn)在卻得到了非常廣泛的應(yīng)用

  • TCP/IP 網(wǎng)絡(luò)模型,一般是五層模型,但是也可以分為四層,就是把鏈路層和物理層都表示為網(wǎng)絡(luò)接口層

1.3、各層功能

物理層

  • 該層為上層協(xié)議提供了一個(gè)傳輸數(shù)據(jù)的可靠的物理媒體。簡(jiǎn)單的說(shuō),物理層確保原始的數(shù)據(jù)可在各種物理媒體上傳輸

數(shù)據(jù)鏈路層

  • 數(shù)據(jù)鏈路層為網(wǎng)絡(luò)層提供可靠的數(shù)據(jù)傳輸
  • 基本數(shù)據(jù)單位為幀,主要的協(xié)議為以太網(wǎng)協(xié)議
  • 兩個(gè)重要設(shè)備名稱(chēng):網(wǎng)橋和交換機(jī)

網(wǎng)絡(luò)層

  • 網(wǎng)絡(luò)層負(fù)責(zé)選擇合適的網(wǎng)間路由和交換結(jié)點(diǎn),確保計(jì)算機(jī)通信的數(shù)據(jù)及時(shí)傳送。此外,網(wǎng)絡(luò)層還可以實(shí)現(xiàn)擁塞控制、網(wǎng)際互連等功能

  • 基本數(shù)據(jù)單位為IP數(shù)據(jù)報(bào)

  • 包含的主要協(xié)議為:

    • IP協(xié)議(Internet Protocol,因特網(wǎng)互聯(lián)協(xié)議)
    • ICMP協(xié)議(Internet Control Message Protocol,因特網(wǎng)控制報(bào)文協(xié)議);
    • ARP協(xié)議(Address Resolution Protocol,地址解析協(xié)議);
    • RARP協(xié)議(Reverse Address Resolution Protocol,逆地址解析協(xié)議)。
  • 重要的設(shè)備:路由器

傳輸層

  • 傳輸層負(fù)責(zé)將上層數(shù)據(jù)分段并提供端到端的、可靠的或不可靠的傳輸以及端到端的差錯(cuò)控制和流量控制問(wèn)題

  • 包含的主要協(xié)議:

    • TCP協(xié)議(Transmission Control Protocol,傳輸控制協(xié)議)、
    • UDP協(xié)議(User Datagram Protocol,用戶(hù)數(shù)據(jù)報(bào)協(xié)議);
  • 重要設(shè)備:網(wǎng)關(guān)

應(yīng)用層

  • 應(yīng)用層通過(guò)應(yīng)用進(jìn)程間的交互來(lái)完成特定網(wǎng)絡(luò)應(yīng)用

  • 數(shù)據(jù)傳輸基本單位為報(bào)文

  • 包含的主要協(xié)議為:

    • FTP(文件傳送協(xié)議)
    • Telnet(遠(yuǎn)程登錄協(xié)議)
    • DNS(域名解析協(xié)議)
    • SMTP(郵件傳送協(xié)議)
    • POP3協(xié)議(郵局協(xié)議)
    • HTTP協(xié)議(Hyper Text Transfer Protocol)

2. 單點(diǎn)登錄

單點(diǎn)登錄全稱(chēng)Single Sign On(簡(jiǎn)稱(chēng)SSO),是指在多系統(tǒng)應(yīng)用群中登錄一個(gè)系統(tǒng),便可在其他所有系統(tǒng)中得到授權(quán)而無(wú)需再次登錄,包括單點(diǎn)登錄與單點(diǎn)注銷(xiāo)兩部分

單點(diǎn)登錄

  • 相比于單系統(tǒng)登錄,sso需要一個(gè)獨(dú)立的認(rèn)證中心,只有認(rèn)證中心能接受用戶(hù)的用戶(hù)名密碼等安全信息,其他系統(tǒng)不提供登錄入口,只接受認(rèn)證中心的間接授權(quán)。間接授權(quán)通過(guò)令牌實(shí)現(xiàn),sso認(rèn)證中心驗(yàn)證用戶(hù)的用戶(hù)名密碼沒(méi)問(wèn)題,創(chuàng)建授權(quán)令牌,
  • 在接下來(lái)的跳轉(zhuǎn)過(guò)程中,授權(quán)令牌作為參數(shù)發(fā)送給各個(gè)子系統(tǒng),子系統(tǒng)拿到令牌,即得到了授權(quán),可以借此創(chuàng)建局部會(huì)話,局部會(huì)話登錄方式與單系統(tǒng)的登錄方式相同。這個(gè)過(guò)程,也就是單點(diǎn)登錄的原理

單點(diǎn)注銷(xiāo)

單點(diǎn)登錄自然也要單點(diǎn)注銷(xiāo),在一個(gè)子系統(tǒng)中注銷(xiāo),所有子系統(tǒng)的會(huì)話都將被銷(xiāo)毀。用戶(hù)登錄成功之后,會(huì)與sso認(rèn)證中心及各個(gè)子系統(tǒng)建立會(huì)話,用戶(hù)與sso認(rèn)證中心建立的會(huì)話稱(chēng)為全局會(huì)話,用戶(hù)與各個(gè)子系統(tǒng)建立的會(huì)話稱(chēng)為局部會(huì)話,局部會(huì)話建立之后,用戶(hù)訪問(wèn)子系統(tǒng)受保護(hù)資源將不再通過(guò)sso認(rèn)證中心,全局會(huì)話與局部會(huì)話有如下約束關(guān)系

  1. 局部會(huì)話存在,全局會(huì)話一定存在
  2. 全局會(huì)話存在,局部會(huì)話不一定存在
  3. 全局會(huì)話銷(xiāo)毀,局部會(huì)話必須銷(xiāo)毀

sso認(rèn)證中心一直監(jiān)聽(tīng)全局會(huì)話的狀態(tài),一旦全局會(huì)話銷(xiāo)毀,監(jiān)聽(tīng)器將通知所有注冊(cè)系統(tǒng)執(zhí)行注銷(xiāo)操作

JWT

JWT (json web token)機(jī)制是能夠讓你的瀏覽器具有記憶能力的一種機(jī)制。與 Cookie 不同,JWT 是保存在客戶(hù)端的信息,它廣泛的應(yīng)用于單點(diǎn)登錄的情況。JWT 具有兩個(gè)特點(diǎn):

  • JWT 的 Cookie 信息存儲(chǔ)在客戶(hù)端,而不是服務(wù)端內(nèi)存中。也就是說(shuō),JWT 直接本地進(jìn)行驗(yàn)證就可以,驗(yàn)證完畢后,這個(gè) Token 就會(huì)在 Session 中隨請(qǐng)求一起發(fā)送到服務(wù)器,通過(guò)這種方式,可以節(jié)省服務(wù)器資源,并且 token 可以進(jìn)行多次驗(yàn)證。

  • JWT 支持跨域認(rèn)證,Cookies 只能用在單個(gè)節(jié)點(diǎn)的域或者它的子域中有效。如果它們嘗試通過(guò)第三個(gè)節(jié)點(diǎn)訪問(wèn),就會(huì)被禁止。使用 JWT 可以解決這個(gè)問(wèn)題,使用 JWT 能夠通過(guò)多個(gè)節(jié)點(diǎn)進(jìn)行用戶(hù)認(rèn)證,也就是我們常說(shuō)的跨域認(rèn)證。

用戶(hù)登錄鑒權(quán)流程

  1. 用戶(hù)使用用戶(hù)名密碼請(qǐng)求服務(wù)器
  2. 服務(wù)器進(jìn)行驗(yàn)證用戶(hù)信息
  3. 服務(wù)器通過(guò)驗(yàn)證后發(fā)送給用戶(hù)一個(gè)token
  4. 客戶(hù)端存儲(chǔ)token,并在每次請(qǐng)求時(shí)附送上這個(gè)token值
  5. 服務(wù)端驗(yàn)證token值,并返回?cái)?shù)據(jù)

3. TCP協(xié)議

  • TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,在發(fā)送數(shù)據(jù)前,通信雙方必須在彼此間建立一條連接。所謂的“連接”,其實(shí)是客戶(hù)端和服務(wù)端保存的一份關(guān)于對(duì)方的信息,如ip地址、端口號(hào)等。

  • TCP可以看成是一種字節(jié)流,它會(huì)處理IP層或以下的層的丟包、重復(fù)以及錯(cuò)誤問(wèn)題。在連接的建立過(guò)程中,雙方需要交換一些連接的參數(shù)。這些參數(shù)可以放在TCP頭部。

  • 一個(gè)TCP連接由一個(gè)4元組構(gòu)成,分別是兩個(gè)IP地址和兩個(gè)端口號(hào)。一個(gè)TCP連接通常分為三個(gè)階段:連接、數(shù)據(jù)傳輸、退出(關(guān)閉)。通過(guò)三次握手建立一個(gè)鏈接,通過(guò)四次揮手來(lái)關(guān)閉一個(gè)連接。

  • 當(dāng)一個(gè)連接被建立或被終止時(shí),交換的報(bào)文段只包含TCP頭部,而沒(méi)有數(shù)據(jù)

3.1、TCP報(bào)文頭部結(jié)構(gòu)

2

<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 14px;">2</figcaption>

上圖中有幾個(gè)字段需要重點(diǎn)介紹下:

(1)序號(hào):seq序號(hào),占32位,用來(lái)標(biāo)識(shí)從TCP源端向目的端發(fā)送的字節(jié)流,發(fā)起方發(fā)送數(shù)據(jù)時(shí)對(duì)此進(jìn)行標(biāo)記。

(2)確認(rèn)序號(hào):ack序號(hào),占32位只有ACK標(biāo)志位為1時(shí),確認(rèn)序號(hào)字段才有效,ack=seq+1。

(3)標(biāo)志位共6個(gè),即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:

  • ACK:確認(rèn)序號(hào)有效。

  • FIN:釋放一個(gè)連接。

  • PSH:接收方應(yīng)該盡快將這個(gè)報(bào)文交給應(yīng)用層。

  • RST:重置連接。

  • SYN:發(fā)起一個(gè)新連接。

  • URG:緊急指針(urgent pointer)有效。 需要注意的是:

  • 不要將確認(rèn)序號(hào)ack與標(biāo)志位中的ACK搞混了。

  • 確認(rèn)方ack=發(fā)起方seq+1,兩端配對(duì)。

3.2、三次握手

  • 首先,我讓信使運(yùn)輸一份信件給對(duì)方,對(duì)方收到了,那么他就知道了我的發(fā)件能力和他的收件能力是可以的。

  • 于是他給我回信,我若收到了,我便知我的發(fā)件能力和他的收件能力是可以的,并且他的發(fā)件能力和我的收件能力是可以。

  • 然而此時(shí)他還不知道他的發(fā)件能力和我的收件能力到底可不可以,于是我最后回饋一次,他若收到了,他便清楚了他的發(fā)件能力和我的收件能力是可以的。

  • 三次握手的本質(zhì)是確認(rèn)通信雙方收發(fā)數(shù)據(jù)的能力

三次握手.png

<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 14px;">三次握手.png</figcaption>

  • 剛開(kāi)始客戶(hù)端處于Closed 的狀態(tài),服務(wù)端處于 Listen 狀態(tài)。 進(jìn)行三次握手:

    • 第一次握手:客戶(hù)端給服務(wù)端發(fā)一個(gè)SYN 報(bào)文,并指明客戶(hù)端的初始化序列號(hào)ISN(c)。此時(shí)客戶(hù)端處于 SYN_SEND 狀態(tài)。

      首部的同步位SYN=1,初始序號(hào)seq=x,SYN=1的報(bào)文段不能攜帶數(shù)據(jù),但要消耗掉一個(gè)序號(hào)。

    • 第二次握手:服務(wù)器收到客戶(hù)端的 SYN報(bào)文之后,會(huì)以自己的 SYN 報(bào)文作為應(yīng)答,并且也是指定了自己的初始化序列號(hào) ISN(s)。同時(shí)會(huì)把客戶(hù)端的 ISN + 1 作為ACK 的值,表示自己已經(jīng)收到了客戶(hù)端的 SYN,此時(shí)服務(wù)器處于 SYN_RCVD 的狀態(tài)。

      在確認(rèn)報(bào)文段中SYN=1,ACK=1,確認(rèn)號(hào)ack=x+1,初始序號(hào)seq=y

    • 第三次握手:客戶(hù)端收到 SYN 報(bào)文之后,會(huì)發(fā)送一個(gè) ACK 報(bào)文,當(dāng)然,也是一樣把服務(wù)器的ISN + 1作為 ACK的值,表示已經(jīng)收到了服務(wù)端的 SYN 報(bào)文,此時(shí)客戶(hù)端處于 ESTABLISHED態(tài)。服務(wù)器收到 ACK 報(bào)文之后,也處于 ESTABLISHED 狀態(tài),此時(shí),雙方已建立起了連接。

      確認(rèn)報(bào)文段ACK=1,確認(rèn)號(hào)ack=y+1,序號(hào)seq=x+1(初始為seq=x,第二個(gè)報(bào)文段所以要+1),ACK報(bào)文段可以攜帶數(shù)據(jù),不攜帶數(shù)據(jù)則不消耗序號(hào)。

第三次握手的時(shí)候,是可以攜帶數(shù)據(jù)的。但是,第一次、第二次握手不可以攜帶數(shù)據(jù),為了防止服務(wù)端受到惡意攻擊,如果每次握手可以攜帶數(shù)據(jù),一些惡意請(qǐng)求在握手時(shí)攜帶大量垃圾數(shù)據(jù)包,服務(wù)端解析能力有限,請(qǐng)求較多時(shí),會(huì)發(fā)生崩潰

3.3、四次揮手

四次揮手的目的是關(guān)閉一個(gè)連接

image.png

<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 14px;">image.png</figcaption>

  • 剛開(kāi)始雙方都處于 ESTABLISHED 狀態(tài),假如是客戶(hù)端先發(fā)起關(guān)閉請(qǐng)求。四次揮手的過(guò)程如下:

    • 第一次揮手:客戶(hù)端發(fā)送一個(gè) FIN 報(bào)文,報(bào)文中會(huì)指定一個(gè)序列號(hào)。此時(shí)客戶(hù)端處于 FIN_WAIT1 狀態(tài)。 即發(fā)出連接釋放報(bào)文段(FIN=1,序號(hào)seq=u),并停止再發(fā)送數(shù)據(jù),主動(dòng)關(guān)閉TCP連接,進(jìn)入FIN_WAIT1(終止等待1)狀態(tài),等待服務(wù)端的確認(rèn)。
    • 第二次揮手:服務(wù)端收到 FIN 之后,會(huì)發(fā)送 ACK 報(bào)文,且把客戶(hù)端的序列號(hào)值 +1 作為 ACK 報(bào)文的序列號(hào)值,表明已經(jīng)收到客戶(hù)端的報(bào)文了,此時(shí)服務(wù)端處于 CLOSE_WAIT 狀態(tài)。 即服務(wù)端收到連接釋放報(bào)文段后即發(fā)出確認(rèn)報(bào)文段(ACK=1,確認(rèn)號(hào)ack=u+1,序號(hào)seq=v),服務(wù)端進(jìn)入CLOSE_WAIT(關(guān)閉等待)狀態(tài),此時(shí)的TCP處于半關(guān)閉狀態(tài),客戶(hù)端到服務(wù)端的連接釋放。客戶(hù)端收到服務(wù)端的確認(rèn)后,進(jìn)入FIN_WAIT2(終止等待2)狀態(tài),等待服務(wù)端發(fā)出的連接釋放報(bào)文段。
    • 第三次揮手:如果服務(wù)端也想斷開(kāi)連接了,和客戶(hù)端的第一次揮手一樣,發(fā)給 FIN 報(bào)文,且指定一個(gè)序列號(hào)。此時(shí)服務(wù)端處于 LAST_ACK 的狀態(tài)。 即服務(wù)端沒(méi)有要向客戶(hù)端發(fā)出的數(shù)據(jù),服務(wù)端發(fā)出連接釋放報(bào)文段(FIN=1,ACK=1,序號(hào)seq=w,確認(rèn)號(hào)ack=u+1),服務(wù)端進(jìn)入LAST_ACK(最后確認(rèn))狀態(tài),等待客戶(hù)端的確認(rèn)。
    • 第四次揮手:客戶(hù)端收到 FIN 之后,一樣發(fā)送一個(gè) ACK 報(bào)文作為應(yīng)答,且把服務(wù)端的序列號(hào)值 +1 作為自己 ACK 報(bào)文的序列號(hào)值,此時(shí)客戶(hù)端處于 TIME_WAIT 狀態(tài)。需要過(guò)一陣子以確保服務(wù)端收到自己的 ACK 報(bào)文之后才會(huì)進(jìn)入 CLOSED 狀態(tài),服務(wù)端收到 ACK 報(bào)文之后,就處于關(guān)閉連接了,處于 CLOSED 狀態(tài)。 即客戶(hù)端收到服務(wù)端的連接釋放報(bào)文段后,對(duì)此發(fā)出確認(rèn)報(bào)文段(ACK=1,seq=u+1,ack=w+1),客戶(hù)端進(jìn)入TIME_WAIT(時(shí)間等待)狀態(tài)。此時(shí)TCP未釋放掉,需要經(jīng)過(guò)時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間2MSL后,客戶(hù)端才進(jìn)入CLOSED狀態(tài)。

    收到一個(gè)FIN只意味著在這一方向上沒(méi)有數(shù)據(jù)流動(dòng)。客戶(hù)端執(zhí)行主動(dòng)關(guān)閉并進(jìn)入TIME_WAIT是正常的,服務(wù)端通常執(zhí)行被動(dòng)關(guān)閉,不會(huì)進(jìn)入TIME_WAIT狀態(tài)。

3.4、TCP/IP 協(xié)議族

TCP(傳輸控制協(xié)議)和IP(網(wǎng)際協(xié)議)是最先定義的兩個(gè)核心協(xié)議,所以才統(tǒng)稱(chēng)為T(mén)CP/IP協(xié)議族

TCP是面向連接的通信協(xié)議,通過(guò)三次握手建立連接,通訊完成時(shí)要拆除連接,由于TCP是面向連接的所以只能用于端到端的通訊。TCP提供的是一種可靠的數(shù)據(jù)流服務(wù),采用“帶重傳的肯定確認(rèn)”技術(shù)來(lái)實(shí)現(xiàn)傳輸?shù)目煽啃?。TCP還采用一種稱(chēng)為“滑動(dòng)窗口”的方式進(jìn)行流量控制,所謂窗口實(shí)際表示接收能力,用以限制發(fā)送方的發(fā)送速度。

  • TCP是傳輸控制協(xié)議,提供面向連接的,基于字節(jié)流的,可靠的數(shù)據(jù)傳輸服務(wù),只能進(jìn)行一對(duì)一通信,首部最小20字節(jié),最大60字節(jié),適用于要求可靠傳輸?shù)膽?yīng)用,比如文件傳輸、發(fā)送和接收郵件等場(chǎng)景。
  • UDP是用戶(hù)數(shù)據(jù)協(xié)議,提供無(wú)連接的,基于報(bào)文的數(shù)據(jù)傳輸服務(wù),不保證數(shù)據(jù)傳輸?shù)目煽啃浴VС忠粚?duì)一,一對(duì)多,多對(duì)多等交互通信方式,首部開(kāi)銷(xiāo)小,僅8字節(jié),適用于實(shí)時(shí)應(yīng)用,比如視頻會(huì)議、直播等。
TCP/IP協(xié)議群

4. TCP可靠性傳輸

TCP如何保證可靠性傳輸,是面試中常被問(wèn)到的問(wèn)題,回答的時(shí)候一定要保證自己的條理性,先說(shuō)清主要方式,然后再由點(diǎn)及面,一步一步擴(kuò)寬廣度!

  1. 應(yīng)用數(shù)據(jù)被分割成 TCP 認(rèn)為最適合發(fā)送的數(shù)據(jù)塊。
  2. TCP 給發(fā)送的每一個(gè)包進(jìn)行編號(hào),接收方對(duì)數(shù)據(jù)包進(jìn)行排序,把有序數(shù)據(jù)傳送給應(yīng)用層。
  3. 校驗(yàn)和: TCP 將保持它首部和數(shù)據(jù)的檢驗(yàn)和。這是一個(gè)端到端的檢驗(yàn)和,目的是檢測(cè)數(shù)據(jù)在傳輸過(guò)程中的任何變化。如果收到段的檢驗(yàn)和有差錯(cuò),TCP 將丟棄這個(gè)報(bào)文段和不確認(rèn)收到此報(bào)文段。
  4. TCP 的接收端會(huì)丟棄重復(fù)的數(shù)據(jù)。
  5. 流量控制: TCP 連接的每一方都有固定大小的緩沖空間,TCP的接收端只允許發(fā)送端發(fā)送接收端緩沖區(qū)能接納的數(shù)據(jù)。當(dāng)接收方來(lái)不及處理發(fā)送方的數(shù)據(jù),能提示發(fā)送方降低發(fā)送的速率,防止包丟失。TCP 使用的流量控制協(xié)議是可變大小的滑動(dòng)窗口協(xié)議。 (TCP 利用滑動(dòng)窗口實(shí)現(xiàn)流量控制)
  6. 擁塞控制: 當(dāng)網(wǎng)絡(luò)擁塞時(shí),減少數(shù)據(jù)的發(fā)送。
  7. ARQ協(xié)議: 也是為了實(shí)現(xiàn)可靠傳輸?shù)模幕驹砭褪敲堪l(fā)完一個(gè)分組就停止發(fā)送,等待對(duì)方確認(rèn)。在收到確認(rèn)后再發(fā)下一個(gè)分組。
  8. 超時(shí)重傳: 當(dāng) TCP 發(fā)出一個(gè)段后,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能及時(shí)收到一個(gè)確認(rèn),將重發(fā)這個(gè)報(bào)文段。

4.1、重傳機(jī)制

TCP 針對(duì)數(shù)據(jù)包丟失的情況,會(huì)用重傳機(jī)制解決。下面為幾種常見(jiàn)的重傳機(jī)制:

  • 超時(shí)重傳
  • 快速重傳
  • SACK
  • D-SACK

超時(shí)重傳

重傳機(jī)制的其中一個(gè)方式,就是在發(fā)送數(shù)據(jù)時(shí),設(shè)定一個(gè)定時(shí)器,當(dāng)超過(guò)指定的時(shí)間后,沒(méi)有收到對(duì)方的 ACK 確認(rèn)應(yīng)答報(bào)文,就會(huì)重發(fā)該數(shù)據(jù),也就是我們常說(shuō)的超時(shí)重傳。

超時(shí)觸發(fā)重傳存在的問(wèn)題是,超時(shí)周期可能相對(duì)較長(zhǎng)。于是就可以用「快速重傳」機(jī)制來(lái)解決超時(shí)重發(fā)的時(shí)間等待。

快速重傳

快速重傳(Fast Retransmit)機(jī)制,它不以時(shí)間為驅(qū)動(dòng),而是以數(shù)據(jù)驅(qū)動(dòng)重傳。

img

快速重傳的工作方式是當(dāng)收到三個(gè)相同的 ACK 報(bào)文時(shí),會(huì)在定時(shí)器過(guò)期之前,重傳丟失的報(bào)文段。

快速重傳機(jī)制只解決了一個(gè)問(wèn)題,就是超時(shí)時(shí)間的問(wèn)題,但是它依然面臨著另外一個(gè)問(wèn)題。就是重傳的時(shí)候,是重傳之前的一個(gè),還是重傳所有的問(wèn)題。為了解決不知道該重傳哪些 TCP 報(bào)文,于是就有 SACK 方法

SACK

還有一種實(shí)現(xiàn)重傳機(jī)制的方式叫:SACK( Selective Acknowledgment 選擇性確認(rèn))。

這種方式需要在 TCP 頭部「選項(xiàng)」字段里加一個(gè) SACK 的東西,它可以將緩存的地圖發(fā)送給發(fā)送方,這樣發(fā)送方就可以知道哪些數(shù)據(jù)收到了,哪些數(shù)據(jù)沒(méi)收到,知道了這些信息,就可以只重傳丟失的數(shù)據(jù)。

D-sack

Duplicate SACK 又稱(chēng) D-SACK,其主要使用了 SACK 來(lái)告訴「發(fā)送方」有哪些數(shù)據(jù)被重復(fù)接收了。

4.2、滑動(dòng)窗口和流量控制

TCP 利用滑動(dòng)窗口實(shí)現(xiàn)流量控制。流量控制是為了控制發(fā)送方發(fā)送速率,保證接收方來(lái)得及接收。 接收方發(fā)送的確認(rèn)報(bào)文中的窗口字段可以用來(lái)控制發(fā)送方窗口大小,從而影響發(fā)送方的發(fā)送速率。將窗口字段設(shè)置為 0,則發(fā)送方不能發(fā)送數(shù)據(jù)。

4.3、擁塞控制

在某段時(shí)間,若對(duì)網(wǎng)絡(luò)中某一資源的需求超過(guò)了該資源所能提供的可用部分==,網(wǎng)絡(luò)的性能就要變壞。這種情況就叫擁塞。擁塞控制就是為了防止過(guò)多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣就可以使網(wǎng)絡(luò)中的路由器或鏈路不致過(guò)載。擁塞控制所要做的都有一個(gè)前提,就是網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷。

為了進(jìn)行擁塞控制,TCP 發(fā)送方要維持一個(gè) 擁塞窗口(cwnd) 的狀態(tài)變量。擁塞控制窗口的大小取決于網(wǎng)絡(luò)的擁塞程度,并且動(dòng)態(tài)變化。發(fā)送方讓自己的發(fā)送窗口取為擁塞窗口和接收方的接受窗口中較小的一個(gè)。

TCP的擁塞控制采用了四種算法,即 慢啟動(dòng) 、 擁塞避免 、快重傳快恢復(fù)。在網(wǎng)絡(luò)層也可以使路由器采用適當(dāng)?shù)姆纸M丟棄策略(如主動(dòng)隊(duì)列管理 AQM),以減少網(wǎng)絡(luò)擁塞的發(fā)生。

  • 慢啟動(dòng): 慢啟動(dòng)算法的思路是當(dāng)主機(jī)開(kāi)始發(fā)送數(shù)據(jù)時(shí),如果立即把大量數(shù)據(jù)字節(jié)注入到網(wǎng)絡(luò),那么可能會(huì)引起網(wǎng)絡(luò)阻塞,因?yàn)楝F(xiàn)在還不知道網(wǎng)絡(luò)的符合情況。經(jīng)驗(yàn)表明,較好的方法是先探測(cè)一下,即由小到大逐漸增大發(fā)送窗口,也就是由小到大逐漸增大擁塞窗口數(shù)值。cwnd初始值為1,每經(jīng)過(guò)一個(gè)傳播輪次,cwnd加倍。
  • 擁塞避免: 從慢啟動(dòng)可以看到,cwnd可以比較快的增長(zhǎng),但是不能一直無(wú)限增長(zhǎng),需要某個(gè)限制,TCP使用了ssthresh的變量,當(dāng)cwnd超過(guò)這個(gè)值后,慢啟動(dòng)過(guò)程結(jié)束,進(jìn)入擁塞避免階段。擁塞避免的主要思想是加法增大,也就是讓cwnd的值線性增加,cwnd的值隨著RTT線性增加,這樣就可以避免增長(zhǎng)過(guò)快導(dǎo)致網(wǎng)絡(luò)擁塞,慢慢的增加到網(wǎng)絡(luò)的最佳值。
  • 快重傳與快恢復(fù): 在 TCP/IP 中,快速重傳和恢復(fù)(fast retransmit and recovery,F(xiàn)RR)是一種擁塞控制算法,它能快速恢復(fù)丟失的數(shù)據(jù)包。沒(méi)有 FRR,如果數(shù)據(jù)包丟失了,TCP 將會(huì)使用定時(shí)器來(lái)要求傳輸暫停。在暫停的這段時(shí)間內(nèi),沒(méi)有新的或復(fù)制的數(shù)據(jù)包被發(fā)送。有了 FRR,如果接收機(jī)接收到一個(gè)不按順序的數(shù)據(jù)段,它會(huì)立即給發(fā)送機(jī)發(fā)送一個(gè)重復(fù)確認(rèn)。如果發(fā)送機(jī)接收到三個(gè)重復(fù)確認(rèn),它會(huì)假定確認(rèn)件指出的數(shù)據(jù)段丟失了,并立即重傳這些丟失的數(shù)據(jù)段。有了 FRR,就不會(huì)因?yàn)橹貍鲿r(shí)要求的暫停被耽誤。  當(dāng)有單獨(dú)的數(shù)據(jù)包丟失時(shí),快速重傳和恢復(fù)(FRR)能最有效地工作。當(dāng)有多個(gè)數(shù)據(jù)信息包在某一段很短的時(shí)間內(nèi)丟失時(shí),它則不能很有效地工作。

計(jì)算機(jī)網(wǎng)絡(luò)涉及知識(shí)較多較雜,我會(huì)加緊更新【面試系列】文章,希望各位大哥大姐能點(diǎn)個(gè)再看啊,歡迎持續(xù)關(guān)注!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容