咱們知道傳輸層提供最主要的兩種協議,TCP和UDP,其中TCP是保證可靠傳輸,爲何他要保證可靠傳輸呢,IP說:固然是我不能,我只提供盡力而爲的服務,不保證你能不能交付,不保證能不能正確的交付,不保證能不能按順序交付。要否則幹嗎要你保證呢。說的好有道理,我呵呵一笑。html
那麼可靠數據傳輸到底能保證什麼呢?前端
1.不錯:就是傳輸的數據包沒有錯誤數組
2.不丟:傳輸的數據包不丟失緩存
3.不亂:傳輸的數據包順序要保持正確的交付。htm
可靠傳輸協議憑什麼能作出這樣的保證呢?blog
1.差錯檢測:TCP將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程當中的任何變化。若是收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段(但願發端超時並重發)。定時器
2.超時重發和確認機制:當TCP發出一個報文段後,它啓動一個定時器,等待目的端確認收到這個報文段。若是不能及時收到一個確認,將重發這個報文段。當TCP收到發自TCP鏈接另外一端的數據,它將發送一個確認。方法
3.緩存機制:每一個分組都會有一個序列號,對於後一個序列號分組先到的狀況,接收端會先進行緩存,等待前一個序列號到達,而後一塊兒交付上層。數據
重點講一下流水線可靠傳輸協議,其實也就是滑動窗問題。協議
對於使用流水線可靠傳輸協議,若是出現丟包,損壞或超時會有哪些方法來解決呢?兩種方法:回退N步(Go-Back-N,GBN)和選擇重傳(Selective Repeat,SR)
GBN協議
發送端維持這一個長度爲N的滑動窗口,你也能夠理解爲一個數組。
1.窗口裏含有發送可是沒收到確認的分組,以及剩下可用的坑位,若是有可用的坑位,上層須要發送數據,則直接發送,否者緩存或返回給上層。
2.接收端實行累積確認,也就是說當接收端傳送的確認號爲100,也就是前面的序號都是收到了,
3.若是超時未收到確認,發送端會重傳全部發送但未確認的分組。只有一個定時器,用來記錄窗口的最前端,也就是最先發送的分組。
4.由於此協議是使用的累積確認,因此全部爲按序到達的分組都會被丟棄。
選擇重傳
1.發送端和接收端都會維持一個窗口,大小爲N。
2.接收端每收到一個分組就會發送一個確認,而且會緩存不是按序到達的分組
3.發送端會標記已經被確認的分組,當窗口第一個值被確認後,窗口向後滑動。每個分組爲此本身的定時器。
4.當一個分組超時了,只會重傳超時的分組。
窗口長度必須小於或等於序號空間大小的一半。
TCP的可靠傳輸協議是GBN和SR的混合的
1.他是基於累積確認的,
2.可是他是能夠緩存的,不會丟棄亂序的分組,
3.只有一個定時器,記錄發送端窗口的第一個未確認的分組的時間,超時發送第一個分組。
原文出處:https://www.cnblogs.com/daijiabao/p/10930024.html