眾所周知,TCP是可靠數(shù)據(jù)傳輸協(xié)議,其是基于不可靠的IP層傳輸之上,建立自身的數(shù)據(jù)傳輸控制協(xié)議,由控制算法實現(xiàn)了可靠的數(shù)據(jù)傳輸。參照TCP協(xié)議以及若干版本的TCP堆棧實現(xiàn)過程,我們可以實現(xiàn)任意基于IP的可靠數(shù)據(jù)傳輸堆棧。實現(xiàn)可靠以及高效的可靠數(shù)據(jù)傳輸,主要涉及到邏輯端口、滑動窗口、慢啟動、RTT、快速重傳、delay ack以及亂序丟包處理。
一、 邏輯端口
數(shù)據(jù)傳輸端口是傳輸建立對應關系的鍵值,其是網(wǎng)絡數(shù)據(jù)傳輸堆棧的邏輯數(shù)據(jù),而并不是物理存在的單元。為了提高由端口查找對應邏輯數(shù)據(jù)控制塊的效率,一般實現(xiàn)方法是建立二叉樹結(jié)構(gòu)保存端口和邏輯數(shù)據(jù)控制塊,同時為了接近二叉樹最高的查找效率,端口分配一般是采用遞增回繞的分配方式。
二、 滑動窗口
對于發(fā)送方在發(fā)送IP數(shù)據(jù)包的過程中,如何使傳輸既能高效,同時又不會因為發(fā)送過快導致接收方處理慢而使接收緩沖區(qū)溢出丟失后面的數(shù)據(jù),tcp堆棧采用滑動窗口的機制。窗口大小由接收方通告發(fā)送方,發(fā)送方發(fā)送數(shù)據(jù)后右移可用窗口左邊框減少滑動窗口大小,接收方收到數(shù)據(jù)包發(fā)送確認,發(fā)送方收到確認后,首先提取窗口大小并更新,然后右移可用窗口右邊框增大滑動窗口大小。當接收方收到發(fā)送方發(fā)送的數(shù)據(jù),會在確認的同時把數(shù)據(jù)放入接收緩沖區(qū),當緩沖區(qū)可用空間大小小于窗口大小時,會更新窗口大小。當上層從接收緩沖區(qū)取出數(shù)據(jù),緩沖區(qū)可用空間增大時,也會更新窗口大小。
三、 慢啟動
在實際的可靠網(wǎng)絡傳輸中,并不是數(shù)據(jù)傳輸雙方建立可靠連接后,發(fā)送方就直接發(fā)送接收方通告窗口大小的數(shù)據(jù),這是為了避免在廣域網(wǎng)的多級路由環(huán)境下路由緩存限制造成的丟包問題。發(fā)送方增加一個窗口,稱為擁塞窗口,發(fā)送方發(fā)送數(shù)據(jù)時窗口大小會取通告窗口大小和擁塞窗口大小的最小值。當連接建立時,擁塞窗口大小初始化為一個報文段的大小,在傳輸過程中,每收到一個確認數(shù)據(jù)包,擁塞窗口大小會增加一個報文段大小,需要說明的是有些堆棧是指數(shù)級增加。
四、 超時時間rtt
發(fā)送端向接收端發(fā)送數(shù)據(jù)包之后,會把未確認的數(shù)據(jù)包放入未確認隊列,等待接收端的確認,如果數(shù)據(jù)包在鏈路中被丟失,發(fā)送端在收不到確認的情況下,需要進行重發(fā)。進行重發(fā)的條件為一個閥值時間內(nèi)沒有收到確認,則重發(fā)。這個閥值時間我們成為RTT。發(fā)送一個數(shù)據(jù)包時,取當前時鐘的值,當該數(shù)據(jù)包的確認返回時,再取時鐘值,兩次時鐘偏差為本次的RTT值, 記為M。傳輸模型為了處理真實環(huán)境變化起伏較大的情況,引入均值和方差來計算RTT。
Err = M – A
A <- A + gErr
D <- D + h(| Err| - D)
RTT = A + 4D
其中A 為均值 D 為方差 Jacob模型中g(shù) = 1/8 h = 1/4
五、 快速重傳
在實際傳輸環(huán)境中,發(fā)送方向接收方連續(xù)發(fā)送了n(n< 滑動窗口大小)個IP包,由于網(wǎng)絡原因,接收方有可能收到n – 1個包,其中第j個包沒有收到,當接收方收到第j+1, j + 2 , ..n個包后,立即返回確認(ack), ackno為第j – 1 個包的確認號。
發(fā)送方收到重復ackno的確認后,記錄該確認號的重復次數(shù),當達到閥值后,則進入快速重傳流程。由于重新排序處理只可能產(chǎn)生1-2個重復的ACK,所以這個閥值設定為3?焖僦貍鞯牧鞒虨椋
1、 重傳第j個數(shù)據(jù)包,把擁塞窗口設置為當前擁塞窗口的一半加3個報文段大小。
2、 后面每收到一個重復的確認,則把擁塞窗口大小加一個報文段大小,并發(fā)送一個數(shù)據(jù)包。
3、 當收到正常的確認,即 第J或j + 包的確認,再把擁塞窗口大小設置為之前的一半,進入正常的傳輸流程。
快速重傳恢復算法是處理正?焖俚木W(wǎng)絡環(huán)境中,網(wǎng)絡設備偶然發(fā)生的丟包亂序現(xiàn)象,因為網(wǎng)絡環(huán)境并沒有惡化,所以沒有必要走慢啟動流程,而只是把發(fā)送速度減半,進行快速恢復。
六、 Delay [...] |