概念
在tcp中,當傳送端的資料到達資料接收主機時,接收端主機會返回乙個已收到訊息的通知,這個訊息叫做確認應答(ack);
序列號
tcp資料報中的序列號(sequence number)不是以報文段來進行編號的,而是將連線生存週期內傳輸的所有資料當作乙個位元組流,序列號就是整個位元組流中每個位元組的編號。一個tcp資料報中包含多個位元組流的資料(即資料段),而且每個tcp資料報中的資料大小不一定相同。在建立tcp連線的三次握手過程中,通訊雙方各自已確定了初始的序號x和y。
序列號的初始值並不為0,而是在建立連線時由隨機數生成。而後面的計算則是對每個位元組加一。
序列號也指位元組與位元組之間的舉例。
1)正常的資料傳輸
當傳送端將資料發出後,會等待對端的確認應答,如有確認應答,說明資料已經到達對端。則可以繼續傳送下乙個資料報。
如在圖中,第一次傳送乙個初始序列號為1,長度為1000位元組的資料報,當接收端收到資料報,查詢資料報tcp首部中的序列號和資料長度,將自己的下一步應該接受的序列號作為確認應答(ack)返回。就這樣可以通過序列號和ack實現可靠性傳輸。
tcp資料長度並沒有直接寫入tcp首部。而是利用公式計算。
tcp資料長度=ip首部中資料報長度-ip首部長度-tcp首部長度。
2)資料報丟失情況
當資料報由主機a發出後,由於網路擁塞等原因丟失的話。 當資料報無法到達接收端主機b;
此時ack就開始起作用了。
如果傳送端主機a在乙個特定的時間沒有收到接收端主機b發來的確認應答。就會進行重發。就解決了資料報丟失問題。
3)確認應答(ack)丟失
未接收到ack並不全意味著資料報丟失,還有可能是資料報傳送過去了,但是ack丟失了。這種情況也會導致傳送端因為沒有收到ack而認為資料沒有到達對端。
由於主機b返回的確認應答因為網路擁塞等原因丟失了。主機a會等待一段時間。若在特定時間沒有收到始終沒有收到這個確認應答ack。主機a就會對此資料報進行重發。此時,主機b將第二次傳送已收 此資料的確認應答。由於主機b已經收到過1~1000的資料,當再有相同資料送達時,主機b就會丟棄。
重複資料報識別和處理
主機b會收到很多重複資料. 那麼tcp協議需要能夠識別出那些包是重複的包, 並且把重複的丟棄掉. 這時候我們可以利用前面提到的序列號, 就可以很容易做到去重的效果.。
序列號即可以識別已經接受的資料,又可以判定是否需要接受。
接收方如果收到了重複的報文,將會丟棄重複的報文,但是必須發回確認資訊,否則對方會再次傳送。
亂序處理
tcp協議應當保證資料報按序到達接收方。如果接收方收到的資料報文沒有錯誤,只是未按序號,這種現象如何處理呢?
tcp協議本身沒有規定,而是由tcp協議的實現者自己去確定。通常有兩種方法進行處理:一是對沒有按序號到達的報文直接丟棄。二是將未按序號到達的資料報先放於緩衝區內,等待它前面的序號包到達後,再將它交給應用程序。
後一種方法將會提高系統的效率。例如,傳送方連續傳送了每個報文中100個位元組的tcp資料報,其序號分別是1,101,201,…,701。假如其它7個資料報都收到了,而201這個資料報沒有收到,則接收端應當對1和101這兩個資料報進行確認,並將資料遞交給相關的應用程序,301至701這5個資料報則應當放於緩衝區,等到201這個資料報到達後,然後按序將201至701這些資料報遞交給相關應用程序,並對701資料報進行確認,確保了應用程序級的tcp資料的按序到達。
超時時間確認
超時是指在重發資料之前,等待確認應答到來的那個特定時間間隔。如果在超過這個時間間隔仍未收到ack,傳送端就進行資料報重發。
那麼, 超時的時間如何確定?
最理想的情況下, 找到乙個最小的時間, 保證 「確認應答一定能在這個時間內返回」.但是這個時間的長短, 隨著網路環境的不同, 是有差異的。如果超時時間設的太長, 會影響整體的重傳效率;如果超時時間設的太短, 有可能會頻繁傳送重複的包。
tcp為了保證無論在任何環境下都能比較高效能的通訊, 因此會動態計算這個最大超時時間。
linux中(bsd unix和windows也是如此), 超時以500ms為乙個單位進行控制, 每次判定超時重發的超時時間都是500ms的整數倍。如果重發一次之後, 仍然得不到應答, 等待 2*500ms 後再進行重傳.如果仍然得不到應答, 等待 4*500ms 進行重傳. 依次類推,
以指數形式遞增.累計到一定的重傳次數, tcp認為網路或者對端主機出現異常, 強制關閉連線。並且通知應用通訊異常強行終止。
傳輸層 TCP協議
1 序號 在乙個tcp連線中傳送的位元組流中的每乙個位元組都按順序編號,本欄位表示本報文段所傳送資料的第乙個位元組的序號。2 確認號 期望收到對方下乙個報文段的第乙個資料位元組的序號。若確認號為n,則證明到序號n 1為止的所有資料都已正確收到。即採用累計確認 3 資料偏移 首部長度 tcp 報文段的...
傳輸層TCP協議
面向連線,可靠傳輸,面向位元組流 tcp協議 面向連線 accept 獲取新連線 1.當呼叫accept之後,核心就會為新連線建立乙個套接字描述符,服務端使用該套接字描述符進行和客戶端進行資料通訊 2.連線建立之後,雙方都可以傳送資料 確認msg1 確認的行為是傳輸層tcp協議的行為,不是應用層的行...
傳輸層協議TCP
部分埠號 第二次握手 伺服器應用程序被動開啟。若同意客戶端的請求,則發回確認報文,其首部中 syn 1,ack 1,ack x 1,seq y。第三次握手 客戶端收到確認報文之後,通知上層應用程序連線已建立,並向伺服器發出確認報文,其首部 ack 1,ack y 1。當伺服器收到客戶端的確認報文之後...