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