tcp三次握手四次揮手詳解(與udp的區別)


tcp詳解

TCP使用固定的連接

TCP用於應用程序之間的通信
IP負責計算之間的通信
TCP負責把數據分割並裝入IP包,然后他們到達的時候重新組合他們。
IP負責將包發送至接收者。

TCP報文格式

URG:緊急標志。緊急標志位“1”標明該位有效。
ACK:確認標志。標明確認編號欄有效。大多數情況下默認該標志位是置位的。TCP報頭內的確認編號欄內包含的確認編號(w+1)為下一個預期的序列編號,同時提示遠端系統已經成功接收所有數據。
PSH:推標志。該標志置位時,接收端不該將數據進行隊列處理,而是盡可能塊的將數據轉由應用處理。
RST:復位標志。用於復位相應的TCP連接。
SYN:同步標志。表明同步序列編號欄有效。該標志僅在三次握手建立TCP連接時有效。它提示TCP連接的服務端檢查序列編號,該序列編號為TCP連接初始端(一般是客戶端)的初始序列編號。
FIN:結束標志。

三次握手

第一次握手:Client將標志位置為1,隨機產生一個seq=J,並將改數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。

第二次握手:Server收到數據包后將標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個seq=K,並將數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。

第三次握手:Client收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確將標志位ACK置為1,ack=K+1,並將數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨后Client和Server之間可以進行傳輸數據。
image

SYN攻擊

四次揮手

第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態

第二次揮手:Server收到FIN后,發送一個ACK到Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態

第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。

第四次揮手:Client收到FIN后,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。
image

對於交互性要求較高的應用

捎帶ACK的發送方式

當主機收到遠程主機的TCP數據報之后,通常不馬上發送ACK數據報,而是等上一個短暫的時間,如果這段時間里主機還有發送到遠程主機的TCP數據報,那么馬上把這個ACK數據報“捎帶”着發送出來,把本來兩個TCP數據報整合成一個發送。一般的,這個時間是200ms。

Nagle算法

當主機A給主機B發送了一個TCP數據報並進入等待主機B的ACK數據報的狀態時,TCP的輸出緩沖區里面只能有一個TCP數據報,並且,這個數據報不斷收集后來的數據,整合成一個大的數據報,等到B主機的ACK包一到,就把這些數據全部發送出去,

滑動窗口

滑動窗口本質上是描述接受方的TCP數據報緩沖區大小的數據,發送方根據這個數據來計算自己最多能夠發送多長的數據。如果發送方收到接收方的窗口大小為0的TCO數據報,那么發送方將停止發送數據,等到接收方發送窗口大小不為0的數據報的到來。
TCP就是利用這個窗口,慢慢的從數據的左邊移動到右邊,把處於窗口范圍內的數據發送出去(只有窗口內的數據可以發送)。

作用:

  1. 提供TCP的可靠性
  2. 提供TCP的流控特性

基本原理:

  1. 對於tcp會話的發送方,任何時候在其發送緩存區的數據都可以分為4類,“已經發送並得到對端ACK的”,“已經發送但還未到收到對端ack的”,“未發送但對端允許發送的”,“未發送且對端不允許發送”。“已經發送但還未收到對端ACK的”和“未發送但對端允許發送的”這兩部分數據稱之為發送窗口。
    當收到接收方新的ACK對於發送窗口后續字節的確認時,窗口滑動。
  2. 對於TCP的接收方,在某一時刻在他的接受緩存內存在三種。“已接收”,“未接收准備接受”,“未接收並為准備接受”(由於ACK直接向TCP協議棧回復,默認無應用延遲,不存在“已接收回復ACK”)。其中,“未接收准備接收”稱之為接收窗口。

發送窗口與接收窗口關系

TCP是雙工的協議,會話的雙方都可以同時接收、發送數據。TCP會話的雙方都各自維護一個“發送窗口”和一個“接收窗口”。其中各自的“接收窗口”大小取決於應用、系統、硬件的限制。各自的發送窗口則取決於對端的“接受窗口”。

滑動窗口實現面向流的可靠性

最基本的傳輸可靠性來源於“確認重傳”機制。
TCP的滑動窗口的可靠性也是建立在“確認重傳”基礎上的。
發送窗口只有收到對端對於本段發送窗口的ACK確認時,才會移動到發送窗口的左邊界。
接受窗口只有在前面所有的段都確認的情況下才會移動左邊界,擋在前面還有字節未接收但收到后面字節的情況下,窗口不會移動,並不對后續字節確認。以此確保對端會對這些數據重傳。

滑動窗口的流控特性

TCP的滑動窗口是動態的,應用根據自身的處理能力變化,通過本端TCP接收窗口大小控制來對對端的發送窗口流量控制。
應用程序在需要(如內存不足)時,通過API通知TCP協議棧縮小TCP的接收窗口。然后TCP協議棧在下個段發送時包含新的窗口大小通知給對端,對端通知的窗口來改變發送窗口,以此來到達緩減發送速率的目的。

窗口的簡單定義

  1. 窗口左邊向右邊靠近為窗口合攏。這種現象發生在數據發送和確認時。
  2. 當窗口右邊沿向右移動時將允許發送更多的數據,稱之為窗口張開。這種現象發生在另一端的接受進程讀取已經確認的數據並釋放了TCP的接受緩存時。發生在接收端處理了數據之后。
  3. 當右邊窗口左移時,稱之為窗口收縮。不常發生。

發送方打開幾號窗口表示發送方已經發送了該序列的幀,但是如果沒有得到接收方ACK確認的話,此時該序列的幀仍然在發送窗口中。接收方打開幾號窗口代表接收端收到幾號的幀,但是並沒有返回ack確認。當接收方返回該序號的ack時,該序號關閉(合攏),接收方收到ack時,該序號窗口關閉。

數據擁塞

TCP發送方首先傳送一個數據報,然后等待對方的回應,得到回應后就把這個窗口的大小加倍,然后連續發送兩個數據報,等到對方的回應后。再把這個窗口加倍(顯示2的質數倍,到一定程度后就變成現行增長,就是所謂的慢啟動),發送更多的數據報,回到出現超時錯誤,這樣,發送端就到了了解通信雙方的線路承載能力,也就是確定了擁塞窗口的大小,發送方就用這個擁塞窗口的大小發送數據。

tcp與udp的區別

  1. TCP面向連接,udp是無連接的,即發送數據之前是不需要建立連接的
  2. TCP提供可靠地服務,也就是說,通過TCP連接傳送的數據無差錯,不丟失,不重復,且按序到達,UDP盡最大努力交付。
  3. TCP面向字節流,實際是TCP把數據看成一連串無結構的字節流,UDP是面向報文的,UDP沒有擁塞控制
  4. TCP連接是點對點的,UDP支持一對一,一對多,多對一,多對多的交互通信。
  5. TCP首部開銷20字節,UDP8個字節。
  6. TCP的邏輯信道是全雙工的可靠信道,UDP是不可靠信道。
    p.s.圖片來源於網絡。侵刪。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM