TCP 擁塞機制、如何保證包的有序傳輸

計算機基礎知識是咱們面試時必跨的一道坎,其中又以HTTP,TCP等基礎知識居多,TCP的擁塞機制是熱門問題,下面跟你們一塊兒分享一下 TCP擁塞機制 以及 TCP如何保證包的順序傳輸面試

TCP擁塞機制

明確做用

TCP的擁塞機制解決的是網絡延時忽然增長,觸發大量的數據重傳,致使網絡負擔加劇問題算法

如何實現

擁塞窗口(cwnd)

TCP的擁塞控制主要依賴於一個 擁塞窗口(cwnd) 來控制markdown

窗口值的大小表明着可以發送出去的但尚未收到ACK(Acknowledgement確認字符)的最大數據報文段,顯然窗口越大那麼數據發送的速度也就越快,可是也越可能使得網絡出現擁塞網絡

四個核心算法

一、慢啓動ssh

當新建鏈接時,cwnd 初始化爲1個最大 報文段(MSS) 大小,發送端開始按照擁塞窗口大小發送數據,每當有一個報文段被確認,cwnd 就增長1個MSS大小。這樣 cwnd 的值就隨着網絡往返時間(Round Trip Time,RTT)呈指數級增加。 開始 ---> cwnd = 1大數據

通過1個RTT後 ---> cwnd = 2*1 = 2spa

通過2個RTT後 ---> cwnd = 2*2= 4code

通過3個RTT後 ---> cwnd = 4*2 = 8orm


二、擁塞避免ip

TCP是如何避免網絡擁塞的呢?

擁塞窗口cwnd 達到一個閾值(慢啓動門限(ssthresh))時,窗口大小再也不呈指數上升,而是以線性上升。

此時當窗口中全部的報文段都被確認時,cwnd的大小加1,cwnd的值就隨着RTT(往返時延) 開始線性增長,這樣就能夠避免增加過快致使網絡擁塞。並由此慢慢地增長調整到網絡的最佳值

TCP認爲網絡擁塞的主要依據是它重傳了一個報文段


三、快速重傳

當發送方收到3個duplicate ACK(冗餘ACK)時就開啓重傳,而不用等到 RTO(重傳定時器) 超時,具體重傳操做以下:

  • 把 ssthresh 設置爲 cwnd 的一半
  • 把 cwnd 再設置爲 ssthresh 的值
  • 從新進入擁塞避免階段

實際上,當 重傳定時器(RTO) 超時,且尚未獲得數據確認,TCP就會對該報文段進行重傳,具體重傳操做以下:

  • ssthresh 下降爲 cwnd 值的一半
  • cwnd 從新設置爲1
  • 從新進入慢啓動過程

四、快速恢復

當發送方至少收到了3個Duplicated Acks,TCP認爲網絡也不那麼糟糕,能夠快速恢復。

  • 首先,TCP會把擁塞窗口的大小設置爲 慢啓動門限閥值 + 3個報文段大小。即 cwnd = sshthresh + 3 * MSS(3的意思是確認有3個冗餘數據包被收到)
  • 若是再收到 duplicated Acks,那麼 cwnd = cwnd +1
  • 若是收到了新的Ack,那麼,cwnd = sshthresh
  • 進入了擁塞避免的算法

以上就是TCP擁塞機制總體核心內容

TCP如何保證包的順序傳輸

發送主機每次發送數據時,TCP就給每一個數據包分配一個序列號而且在一個特定的時間內等待接收主機對分配的這個序列號進行確認,

若是發送主機在一個特定時間內沒有收到接收主機的確認,則發送主機會重傳此數據包。

接收主機利用序列號對接收的數據進行確認,以便檢測對方發送的數據是否有丟失或者亂序等,接收主機一旦收到已經順序化的數據,它就將這些數據按正確的順序重組成數據流並傳遞到高層進行處理。

核心算法

  • 爲了保證數據包的可靠傳遞,發送方必須把已發送的數據包保留在緩衝區
  • 同時爲每一個已發送的數據包啓動一個超時定時器(重傳定時器RTO)
  • 如在定時器超時以前收到了對方發來的應答信息(多是對本包的應答,也能夠是對本包後續包的應答),則釋放該數據包占用的緩衝區
  • 不然,重傳該數據包,直到收到應答或重傳次數超過規定的最大次數爲止。
  • 接收方收到數據包後,先進行CRC校驗,若是正確則把數據交給上層協議,而後給發送方發送一個累計應答包,代表該數據已收到,若是接收方正好也有數據要發給發送方,應答包也可放在數據包中捎帶過去。

歡迎你們關注公衆號 「大叔說碼」 獲取更多幹貨

相關文章
相關標籤/搜索