当前位置:网站首页>[面試時]——我如何講清楚TCP實現可靠傳輸的機制
[面試時]——我如何講清楚TCP實現可靠傳輸的機制
2022-07-06 13:34:00 【李孛歡】
一.概述
所謂可靠傳輸是指信息在發送方和接收方准確、精確的傳輸。TCP主要提供了檢驗和、序列號/確認應答、超時重傳、滑動窗口、擁塞控制和 流量控制等方法實現了可 靠性傳輸。
- 檢驗和:通過檢驗和的方式,接收端可以檢測出來數據是否有差錯和异常,假如有差錯就會直接丟 弃TCP段,重新發送。
- 序列號/確認應答: 序列號的作用不僅僅是應答的作用,有了序列號能够將接收到的數據根據序列號排序,並且去掉重 複序列號的數據。 TCP傳輸的過程中,每次接收方收到數據後,都會對傳輸方進行確認應答。也就是發送ACK報文, 這個ACK報文當中帶有對應的確認序列號,告訴發送方,接收到了哪些數據,下一次的數據從哪裏開始發。
- 滑動窗口:滑動窗口既提高了報文傳輸的效率,也避免了發送方發送過多的數據而導致接收方無法正常處理的异常。
- 超時重傳:超時重傳是指發送出去的數據包到接收到確認包之間的時間,如果超過了這個時間會被 認為是丟包了,需要重傳。最大超時時間是動態計算的。
- 擁塞控制:在數據傳輸過程中,可能由於網絡狀態的問題,造成網絡擁堵,此時引入擁塞控制機制,在保證TCP可靠性的同時,提高性能。
- 流量控制:如果主機A 一直向主機B發送數據,不考慮主機B的接受能力,則可能導致主機B的接受 緩沖區滿了而無法再接受數據,從而會導致大量的數據丟包,引發重傳機制。而在重傳的過程中, 若主機B的接收緩沖區情况仍未好轉,則會將大量的時間浪費在重傳數據上,降低傳送數據的效率。所以引入流量控制機制,主機B通過告訴主機A自己接收緩沖區的大小,來使主機A控制發送的 數據量。流量控制與TCP協議報頭中的窗口大小有關。
二.細節
一個TCP報文段由首部和數據載荷兩個部分構成,TCP的全部功能都體現在它首部各個字段的作用,首先我們來看TCP報文段的首部格式(最小20字節,最大60字節):
各字段的含義如下:
(1) 源端口和目的端口:各占2個字節。源端口用來標識發送該TCP報文段的應用進程,目的端口用來標識接收該TCP報文段的應用進程。運輸層的複用和分用功能都要通過端口才能實現。
(2) 序號:占4個字節。TCP是面向字節流的,所以TCP連接中傳送的數據流中的每一個字節都編上一個序號(並非內容)。序號字段用來指出本TCP報文段數據載荷第一個字節的序號,如下圖所示,序號字段的值為166。
(3) 確認號:占4個字節,是期望收到對方的下一個報文段的數據載荷的第一個字節的序號,同時也是對之前收到的所有數據的確認。若確認號為N,錶明前N-1的所有數據都已經正確接收,並且期望序號為N的數據,只有當ACK = 1確認字段才有效,否則無效。
(4) 數據偏移量:占4個比特,並以4字節為單比特,它指出TCP報文段的數據載荷的起始處距離TCP報文段的起始處有多遠,實際上指出了錶示首部長度。首部固定長度為20字節,最長為60字節,二進制錶示為0101和1111。
(5) 保留:占6比特,目前不使用,所以置為0。
(6) 緊急比特 URG:當其值為1時,錶明緊急指針字段有效。它會告訴系統此報文段中有緊急數據,應該盡快傳送。但是URG需要和緊急指針配套使用,即從第一個字節到緊急指針所指字節就是緊急數據。
(7) 確認比特 ACK:只有當ACK=1時,確認號字段才有效。TCP規定,在連接建立後所有傳送的報文段都必須把ACK置為1。
(8) 推送比特 PSH:TCP收到PSH=1的報文段,就盡快的交付接收應用進程,而不再等到整個緩存都填滿了後再向上交付。
(9) 複比特比特 RST:當RST=1時,錶明TCP連接中出現了嚴重的錯誤,必須釋放連接,然後再重新建立運輸連接。
(10) 同步比特 SYN:SYN=1錶示這是一個連接請求或連接接收報文。SYN = 1 以及 ACK = 1為TCP連接請求確認報文段。
(11) 終止比特 FIN:用來釋放一個連接。FIN=1錶明此報文段的發送方的數據已經發送完畢,並要求釋放傳輸連接。
(12) 窗口:占2個字節。它指出發送本報文段的一方的接收窗口,接收方的數據緩存空間是有限的,所以使用窗口值作為接收方讓發送方設置其發送窗口的依據,這是以接收方的接收能力來控制發送方的發送能力,稱為流量控制。發送窗口的大小為擁塞窗口和接收窗口的最小值。
(13) 校驗和:占2個字節。它的檢驗範圍包括首部和數據部分。計算時要在TCP報文段前面加上12字節的偽首部。
(14) 緊急指針:占16比特,指出在本報文段中緊急數據共有多少個字節。
(15) 選項:長度可變。TCP最初只規定了一種選項,即最大報文段長度(MSS)。
(16) 填充:這是為了使整個首部長度是4字節的整數倍。
超時重傳時間如何確定?
超時重傳時間RTO確定時TCP最複雜的問題之一,設定的過小會出現不必要的重傳使得網絡負荷增大,而過大又會降低傳輸速率,如下面兩張圖所示
針對於上述兩種情况,我們可以得到下面這個結論,超時重傳時間RTO的值應該略大於往返時間RTT的值。然而往返時間RTT由於網絡的複雜性會波動較大。這樣我們就需要計算一個有代錶性的往返時間RTT,也稱平滑的往返時間,計算公式就不貼了,大家可以自行查找,記住上述概念即可。
詳細說一下滑動窗口:
在進行數據傳輸時,如果傳輸的數據比較大,就需要拆分為多個數據包進行發送。TCP 協議需要對數據進行確認後,才可以發送下一個數據包(一問一答)。這樣一來,就會在等待確認應答包環節浪費時間。 為了避免這種情况,TCP引入了窗口概念。窗口大小指的是不需要等待確認應答包而可以繼續發送數據包的最大值(多問多答)。
從上面的圖可以看到滑動窗口左邊的是已發送並且被確認的分組,滑動窗口右邊是還沒有輪到的分組。 滑動窗口裏面也分為兩塊,一塊是已經發送但是未被確認的分組,另一塊是窗口內等待發送的分組。隨著已發送的分組不斷被確認,窗口內等待發送的分組也會不斷被發送。整個窗口就會往右移動,讓還沒 輪到的分組進入窗口內。 可以看到滑動窗口起到了一個限流的作用,也就是說當前滑動窗口的大小决定了當前 TCP 發送包的速率,而滑動窗口的大小取决於擁塞控制窗口和流量控制窗口的兩者間的最小值。
詳細說一下擁塞控制:
- 若網絡中有許多資源同時出現供應不足,網絡性能就要明顯變化,整個網絡的吞吐量將隨著輸入負荷的增大而下降,這就是擁塞。
- 擁塞控制就是防止過多的數據注入到網絡中,這樣可以使網絡中的路由器或鏈路不至於過載。
TCP 一共使用了四種算法來實現擁塞控制:
- 慢開始 (slow-start);
- 擁塞避免 (congestion avoidance);
- 快速重傳 (fast retransmit);
- 快速恢複 (fast recovery)。
發送方維持一個擁塞窗口(cwnd)的狀態變量。其大小取决於網絡的擁塞程度,並且動態的在變化。發送方讓自己的發送窗口小於或等於擁塞窗口。
慢開始的算法思路是:
- 發送窗口先設置cwnd = 1,發送第一個報文段,以後每收到一個報文段確認,cwnd加1
- 每經過一個傳輸輪次,擁塞窗口cwnd就加倍(即呈指數增長)
- 當cwnd大於ssthresh閥值時,改用擁塞避免算法1(加法增大)
- 假設增長到某值(如24),網絡出現超時,此時將ssthresh值變為值的一半(如12)(乘法减小),讓後將cwnd置1,重新采用慢開始算法,重複如上步驟。
擁塞避免算法的思路是:讓擁塞窗口cwnd線性緩慢增長
快重傳的算法思路是:
- 要求接收方每收到一個時序的報文段後就立即發出重複確認,而不是等待發送數據時才進行捎帶確認
- 發送方只要一連收到三個重複確認,就應當立即重傳對方尚未收到的報文段,而不必等待設置的重傳計時器到期
快恢複的算法思路是:
- 當發送方連續收到三個重複確認時,就執行“乘法减小”算法,把慢開始閥值ssthresh减半
- 接著不執行慢開始,而是從新閥值ssthresh開始執行擁塞避免算法(加法增大)
边栏推荐
- Mortal immortal cultivation pointer-2
- Conceptual model design of the 2022 database of tyut Taiyuan University of Technology
- string
- 【九阳神功】2019复旦大学应用统计真题+解析
- 编写程序,模拟现实生活中的交通信号灯。
- Network layer 7 protocol
- List set map queue deque stack
- Summary of multiple choice questions in the 2022 database of tyut Taiyuan University of Technology
- 【九阳神功】2022复旦大学应用统计真题+解析
- Data manipulation language (DML)
猜你喜欢
C language to achieve mine sweeping game (full version)
System design learning (III) design Amazon's sales rank by category feature
仿牛客技术博客项目常见问题及解答(二)
Database operation of tyut Taiyuan University of technology 2022 database
5. Download and use of MSDN
Cookie和Session的区别
7. Relationship between array, pointer and array
优先队列PriorityQueue (大根堆/小根堆/TopK问题)
9. Pointer (upper)
arduino+水位传感器+led显示+蜂鸣器报警
随机推荐
[while your roommate plays games, let's see a problem]
JS interview questions (I)
Leetcode.3 无重复字符的最长子串——超过100%的解法
最新坦克大战2022-全程开发笔记-2
MySQL中count(*)的实现方式
Arduino+ds18b20 temperature sensor (buzzer alarm) +lcd1602 display (IIC drive)
Inheritance and polymorphism (I)
1.C语言初阶练习题(1)
8.C语言——位操作符与位移操作符
仿牛客技术博客项目常见问题及解答(二)
7. Relationship between array, pointer and array
Implement queue with stack
优先队列PriorityQueue (大根堆/小根堆/TopK问题)
ArrayList的自动扩容机制实现原理
View UI plus released version 1.3.1 to enhance the experience of typescript
E-R graph to relational model of the 2022 database of tyut Taiyuan University of Technology
Network layer 7 protocol
4.分支语句和循环语句
Tyut Taiyuan University of technology 2022 "Mao Gai" must be recited
Redis的两种持久化机制RDB和AOF的原理和优缺点