12.1 引言
UDP協(xié)議能夠檢測接收到的數(shù)據(jù)是否有差錯忿偷,但是不能糾正
糾正的意思是恢復(fù)接受道德錯誤數(shù)據(jù),第二就是重新發(fā)送
主要是香農(nóng)的差錯校驗碼,和更為簡單的嘗試重新發(fā)送臊泌。
12.1.1 ARQ和重傳
分組重新排序鲤桥,分組復(fù)制,分組泯滅(丟失)
構(gòu)造一個可靠的傳輸方式渠概,主要要考慮:
- 對方是否已經(jīng)接受到分組
接收方茶凳,接收到數(shù)據(jù)包后,發(fā)送ACK確認 - 接收到的分組是否是所需要的
判斷是否重復(fù)播揪,判斷分組中的數(shù)據(jù)是否有錯誤贮喧。
所以,需要對每個分組編號猪狈,然后數(shù)據(jù)報中添加校驗和 - 如何控制發(fā)送速率
避免接收端丟棄數(shù)據(jù)
因此引出的問題時:
- 發(fā)送方應(yīng)該等待一個ACK多長時間
- ACK丟失怎么辦
ACK本身不會被重傳 - 分組里面有錯誤怎么辦
直接丟失箱沦,不發(fā)送ACK,也沒有ICMP - 發(fā)送速率如何控制
滑動窗口協(xié)議
每次發(fā)送出多少雇庙?發(fā)送速度
是這個樣子的:
每個TCP分組到達目的主機以后谓形,目的主機發(fā)送一個ACK確認。除了ACK確認不需要再返回ACK確認外疆前,其他的TCP分組都需要這個確認寒跳。
源主機收到該ACK確認以后才繼續(xù)發(fā)送一下個分組。
這樣很慢竹椒。大部分源主機都在等待ACK冯袍。
在接收方接受速度太慢時,會強迫發(fā)送方速度慢下來碾牌。成為流量控制康愤。
有兩種方式:基于速率(發(fā)送方發(fā)送速率不超過該速率)
另一個就是基于窗口,也就是本協(xié)議舶吗。
接收方通知發(fā)送方使用多大的窗口征冷,成為窗口通知。一般和ACK由同一分組攜帶誓琼。也就是在窗口滑動的同時检激,更新窗口大小肴捉。
所以采用這樣一種方式,源主機突突突排隊發(fā)送好幾個分組叔收,然后等待ACK齿穗。同時沒有收到ACK的分組將會保存這些分組。
而收到ACK的分組副本就拋棄饺律。然后發(fā)送下一個分組窃页。
也就是永遠有那么幾個分組是被發(fā)送但是沒收到ack的。這幾個分組可以想象為在窗口中复濒,前面的分組ack收到以后脖卖,窗口向后滑動一個分組,同時進入窗口的分組被發(fā)送出去巧颈。而窗口前面的都是收到ACK的分組畦木,窗口之后的分組都是沒有發(fā)送的分組。窗口之中的分組都是已發(fā)送但是還沒有收到ACK的分組砸泛,同時分組的副本也被保存著十籍。
而這種類型的協(xié)議就是滑動窗口協(xié)議。
12.1.3
擁塞控制涉及發(fā)送方降低速度以不至于壓垮發(fā)送方和接收方之間的網(wǎng)絡(luò)唇礁。接收方發(fā)送一個窗口通告高速發(fā)送方減慢速度妓雾。稱為明確發(fā)信。另一種方法是垒迂,發(fā)送方猜測接收方的速度械姻,然后減慢發(fā)送速度。
12.1.4 重傳超時時間
發(fā)送方重發(fā)一個分組之前要等待的時間總量為:發(fā)送分組所用時間+接收方處理時間+發(fā)送一個ACK所用時間+ACK返回到發(fā)送方的時間
協(xié)議估計這段時間的長短稱為往返時間估計RTT机断,而這個值隨著時間變化楷拳。
12.2 TCP
TCP提供一種面向連接的可靠地字節(jié)流服務(wù)。
字節(jié)流
不包含邊界數(shù)據(jù)的連續(xù)流吏奸!
TCP提供一種字節(jié)流抽象概念給應(yīng)用程序使用欢揖。這種設(shè)計方案的結(jié)果是,沒有由TCP自動插人的記錄標(biāo)志或消息邊界。一個記錄標(biāo)志對應(yīng)著一個應(yīng)用程序的寫范圍指示奋蔚。如果應(yīng)用程序在一端寫人10字節(jié),隨后寫人20字節(jié),再隨后寫人50字節(jié),那么在連接的另一端的應(yīng)用程序是不知道每次寫人的字節(jié)是多少的她混。例如,另一端可能會以每次20字節(jié)分四次讀人這80字節(jié)或以其他一些方式讀人。一端給TCP輸人字節(jié)流,同樣的字節(jié)流會出現(xiàn)在另一端泊碑。每個端點獨立選擇自己的讀和寫大小坤按。
12.2.2 TCP中的可靠性
TCP提供了可靠性:
tcp把發(fā)送的字節(jié)流轉(zhuǎn)化為一組ip可攜帶的分組,稱為組包馒过。
這些分組包含序列號臭脓,序列號代表了每個分組中第一個字節(jié),在整個字節(jié)流中的字節(jié)偏移腹忽。這允許分組在傳送中是可變大小的来累,并且允許重新組包砚作。
應(yīng)用程序發(fā)送出去的數(shù)據(jù),被協(xié)議打散成tcp認為最佳的大小塊來發(fā)送嘹锁。
TCP維持了一個強制的校驗和葫录,涉及到頭部,數(shù)據(jù)和ip頭部的所有段领猾。(也是一個偽頭部)
當(dāng)TCP發(fā)送一組報文的時候米同,設(shè)置一個重傳計時器,等待對方的確認接收瘤运。而且只設(shè)置一個計時器(upd分片的時候窍霞,每個分片設(shè)置一個)匠题,當(dāng)ACK到達的時候拯坟,計時器被重置。
接收端接收到數(shù)據(jù)的時候韭山,發(fā)送ACK郁季,TCP使用積累ACK,也就是ACK不會馬上發(fā)送钱磅,回合其他后面的一起梦裂。
如果一個ACK丟失,而后續(xù)序號大的ACK被接收端接收到盖淡,那么后續(xù)的ACK可以確認前面的報文段年柠。
TCP報文
- 兩個端口號,各16bit
- 序列號 32bit
自己發(fā)送的數(shù)據(jù)褪迟,的偏移 - 確認號 32bit
用來確認對方發(fā)送數(shù)據(jù)最后一個字節(jié)+1冗恨,同時也是接收端期望收到的下一個數(shù)據(jù)包的序列號 - 頭部長度 4bit
這個長度不是以bit為單位,而是以4B為單位味赃,也就是這個字段中的數(shù)組掀抹,表明頭部的長度是幾個32bit(4B)
這個字段最大2^4-1=15,所以15*4=60字節(jié)心俗。也就是TCP的頭部最大60字節(jié)
這個字段不是多余的傲武,因為TCP頭部會包含可選字段。 - 保留4bit
- CWR 擁塞窗口
接收方發(fā)送給發(fā)送方城榛,請求發(fā)送方降低發(fā)送速率 - ECE
在數(shù)據(jù)報途徑的路徑中揪利,某個路由器阻塞,就會設(shè)置這個位狠持。被接收方或者發(fā)送方看到土童。 - URG 緊急
很少使用 - ACK
指明這個數(shù)據(jù)包是一個ACK包。是指明這個包含ACK工坊,也可能包含數(shù)據(jù)的献汗。 - PSH 推送
接收方應(yīng)盡快給應(yīng)用程序傳送這個數(shù)據(jù)莉恼。
沒有被很好的實現(xiàn) - RST 重置數(shù)據(jù)包
嗯泌类,用來終止一個連接的。 - SYN 初始畫一個連接的同步序列號
這個位指明,這個數(shù)據(jù)報是建立連接的數(shù)據(jù)報 - FIN
該報文段的發(fā)送方已經(jīng)結(jié)束向?qū)Ψ桨l(fā)送數(shù)據(jù)玫锋。 - 窗口大小
TCP流量控制由每個端使用窗口大小來通告一個窗口大小來完成。
這個窗口是字節(jié)數(shù)券腔,從ACK號指定窄刘,也是接收方想要接收到的那個字節(jié)開始。
也就是ACK前面的都是連續(xù)的就谜。 - TCP校驗和
和CRC的校驗機制一樣怪蔑。 - 緊急指針
這個字段只有URG 字段被設(shè)置時才有效。
這個指針時一個必要時加到報文段的序列號上的偏移丧荐,可以產(chǎn)生緊急數(shù)據(jù)的最后一個字節(jié)的序列號
目的是:讓發(fā)送方給另一端提供特殊標(biāo)志數(shù)據(jù)的方式缆瓣。
選項
最常見的選項是最大段大小MSS。
連接的每個端一般在她發(fā)送的第一個報文段上指明這個選項虹统,指明發(fā)送方在希望接收到的數(shù)據(jù)段的最大值弓坞。