tcp協議是傳輸層中的一種面向連線的,提供可靠服務的傳輸協議,是基於位元組流傳輸的。與udp相比,它會在通訊的雙方通過建立一些資料結構來保證連線的建立。特點如下:
後文,再詳細說明tcp協議如何實現這些特點。
視窗大小:用作流量控制,標識自己當前能否處理的能力
如果客戶端a和伺服器b想要通過tcp協議進行通訊,首先需要建立連線,於是乎,tcp的三次握手開始了。
當然,以上的過程只是最為理想的情況,也可能存在以下幾種情況:
a在收到b的應答之後,不傳送包了,這種情況,可以採取:
三次握手中,還做了一件事情,就是確定本次連線中的起始序號。那為什麼不直接從1開始呢?
這是基於安全的考慮,可能a之前連線過,傳送了幾個包,但是呢,後面它又斷開了連線,重新連線上來,這時候,就會發生序號的混亂。序號的位數為32位,每4ms加1,就可以保證4個多小時不重複,不會發生上面的問題。
問題1:為什麼是三次握手,而不是其他握手次數?
世上沒有不散之筵席,tcp的連線終歸也是會斷開的。tcp其實是乙個全雙工的通訊方式,需要確定雙方都斷開連線,這次tcp連線才確定徹底斷開了。下面談談過程,狀態變化。
以上是正常四次揮手的狀態轉移過程,其實也可能存在異常情況,tcp定義狀態也是為了解決這些異常情況的。
為什麼在a應答b的fin包之後,a就處於了time-wait狀態,需要等待2msl(報文的最長生存時間)?
為了確保包的順序,tcp對每個包都進行了編號,而且通過應答(或者累計應答)和重傳機制來確保每個包的有序到達。
包在網路上跑,難免會發生丟包問題,進而導致到達的順序問題。所以傳送方和接收方都需要對傳送或接受的包進行快取,傳送方的快取部分包括:
接收方的快取部分包括:
那麼如何應答呢?
有兩種方式,一條一條的應答或者累計應答(當傳送方傳送的速度很快,接收方也收到了連續序號包,就可以不用一條一條的應答,只需要應答最後乙個序號就行)。
如果發生丟包,如何重傳呢?
tcp通過滑動視窗來確定接收方能夠接收的能力。在每次接收方的應答包中,還需要附上當前接收方可接收的視窗大小。
接收方可接收的視窗大小為:advertisedwindow = maxrcvbuffer – lastbytercvd – 1;
值得注意的是,流量控制的幾個問題點:
在網路環境不好的情況下,不要把網路給擠爆了。傳送端的傳送速度是由滑動視窗(流量控制)和擁塞視窗(擁塞控制)一起決定的。有乙個公式:
lastbytesent-lastbyteacked<=min
那麼擁塞控制的演算法策略有哪些呢?
快速恢復:擁塞視窗減半,ssthresh為擁塞視窗的大小
兩種恢復方式,差異如圖:
但是可能存在兩個問題:
1 裝置快取會導致延時?
假如經過裝置的包都不需要進入快取,那麼得到的速度是最快的。進入快取且等待,等待的時間就是額外的延時。bbr就是為了避免這些問題:
充分利用頻寬;降低buffer佔用率。
2 降低傳送packet的速度,為何反而提速了?
標準tcp擁塞演算法是遇到丟包的資料時快速下降傳送速度,因為演算法假設丟包都是因為過程裝置快取滿了。快速下降後重新慢啟動,整個過程對於頻寬來說是浪費的。通過packet速度-時間的圖來看,從積分上看,bbr充分利用頻寬時傳送效率才是最高的。可以說bbr比標準tcp擁塞演算法更正確地處理了資料丟包。對於網路上有一定丟包率的公網,bbr會更加智慧型一點。
回顧網路發展過程,頻寬的是極大地改進的,而最小延遲會受限與介質傳播速度,不會明顯減少。bbr可以說是應運而生。
3 bbr如何解決延時?
s1:慢啟動開始時,以前期的延遲時間為延遲最小值tmin。然後監控延遲值是否達到tmin的n倍,達到這個閥值後,判斷頻寬已經消耗盡且使用了一定的快取,進入排空階段。
s2:指數降低傳送速率,直至延遲不再降低。這個過程的原理同s1
s3:協議進入穩定執行狀態。交替探測頻寬和延遲,且大多數時間下都處於頻寬探測階段。
tcp那些事(上)–酷殼
tcp協議**(二):超時與重試
極客時間-趣談網路協議第11節
網路程式設計(TCP協議)
tcp協議,傳輸控制協議 英語 transmission control protocol,縮寫為 tcp 是一種面向連線的 可靠的 基於位元組流的傳輸層通訊協議,由ietf的rfc 793定義。tcp通訊需要經過建立連線 資料傳送 終止連線三個步驟。tcp通訊模型中,在通訊開始之前,一定要先建立相...
網路程式設計中的TCP協議的幾點總結
1 tcp協議是提供端到端資料傳輸的非常可靠的協議,其內部的重傳機制 序列號和確認號機制 滑動視窗機制等都可以保證這一點,所以丟包現象的問題不在於tcp協議,它是無辜的,否則它和udp協議又有何區別。2 tcp協議一般由作業系統實現 如 windows linux等 基於tcp協議傳輸資料時,傳送方...
網路程式設計之TCP協議整理
建立連線,形成傳輸資料的通道,在連線中進行大資料量的傳輸。需要通過三次握手完成連線,是可靠地協議。但是效率低。客戶端建立過程。1 建立tcp客戶端socket伺服器,使用的是socket物件,建立物件時明確目的地,以及要連線的主機。2 如果連線成功,說明資料傳輸通道已經建立。這個通道就是流,sock...