1. 程式人生 > >tcp三次握手四次揮手詳解(與udp的區別)

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.圖片來源於網路。侵刪。