協議的那些事兒——TCP和UDP

TCP(Transmission Control Protocol)傳輸控制協議,TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,採用三次握手確認建立連接。

一、TCP的三次握手和四次揮手

(一)三次握手

第一次握手:客戶端TCP首先向服務器端的TCP發送一個特殊的TCP報文段
(SYN報文段),該報文段不包含應用層數據。其中SYN標誌位被置爲1,客戶機隨機選擇一個初始序號(client_isn)作爲報文段序號,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到SYN報文段,並向客戶端發送允許連接的報文段(SYNACK報文段),該報文段不包含應用層數據。其中SYN=1,確認號ack=client_isn+1,並且服務器會選擇字節的初始序號server_isn作爲序號seq,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到SYNACK報文段,向服務器發送確認包ACK,其中SYN=0,ack=server_isn+1,seq=client_isn+1,這樣客戶端和服務器都進入ESTABLISHED狀態。
完成三次握手,兩臺主機開始傳輸數據
在這裏插入圖片描述
握手過程傳送的包是不包含數據的,但是握手的第三個階段可以在報文段攜帶客戶到服務器的數據。三次握手完畢,客戶和服務器才正式開始傳送數據,TCP一旦建立連接,將一直被保持下去,直到通信雙方中的任意一方主動關閉連接,斷開的過程需要經過“四次揮手”。
由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉,這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接,收到一個FIN只意味這這個方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據,首先進行關閉的一方執行主動關閉,而另一方進行被動關閉。主動關閉的一方稱爲client,被動關閉的一方稱爲server。

(二)四次揮手

第一次揮手:客戶TCP向服務器發送一個特殊TCP報文段,首部標誌位FIN=1。客戶端進入FIN_WAIT_1狀態
第二次揮手:服務器收到報文段,向客戶端發送一個確認報文段ACK,服務器進入CLOSE_WAIT狀態
客戶機收到ACK,不發送任何信息,客戶TCP進入FIN_WAIT_2狀態。
第三次揮手:緊接着服務器發送自己的終止報文段,其中FIN=1,服務器進入LAST_ACK
第四次揮手:客戶端收到報文段,向服務器發送確認報文ACK,,客戶進入TIME_WAIT狀態。
最後兩臺主機上用於連接的所有資源都被釋放,進入CLOSE狀態。
在這裏插入圖片描述
TCP的6種標誌位:
SYN(synchronous建立連接)
ACK(acknowledgement確認)
PSH(push傳送)
FIN(finish結束)
RST(reset重置)
URG(urgent緊急)
客戶端的TCP狀態遷移:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服務器狀態遷移:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSE
在這裏插入圖片描述

(三)思考

1)爲什麼連接的時候是三次握手,關閉的時候是四次揮手
答:這是因爲服務器在LISTEN狀態下收到建立連接的請求的SYN報文後,將SYN和ACK放在一個報文裏發送給客戶端,所以是三次,其中SYN是用來同步的,ACK是用來應答的,。但是關閉連接的時候server端收到FIN報文時,僅僅表示對方不再發送數據了但還是可以接收數據,而且server自己也可能有待發送數據,所以server可以立即close,也可以先發送數據給client,再發送FIN給client表示自己同意關閉連接,因此ACK和FIN分開發送所以是四次。

2)爲什麼不能用兩次握手進行連接
答:三次握手的目的是爲了防止已經失效的連接請求報文端突然又傳到了服務端,因而產生錯誤,也可以說是爲了解決網絡中存在延遲的重複分組問題。

情況1:假如client發出一個連接請求,這個請求報文段沒有丟失但因爲某種原因在網絡節點長時間滯留,導致server端在規定時間內沒有收到,無法發送確認ACK,此時連接不成功,如果client不再建立連接,過一段時間後,那個延遲的報文段被server接收,server會誤認爲是client發出的新的請求,這樣server就會發出確認,在二次握手模式下,只要server發出確認新的連接就建立了,但是client實際並沒有發出請求連接是處於一個CLOSED的狀態,不會理會server的確認,不會發送數據給server,那麼server就會一直處於等待狀態,這樣就浪費了大量的資源。

情況2:將情況1改變=一下,假如server接收到延遲失效的請求報文的時候client發出了一個新的請求,但是server會丟棄這個新的請求包,server接收到的SYN序號和client發送的SYN不一致。

3)爲什麼TIME_WAIT狀態需要經過2MSL(最大報文生存時間)才能返回CLOSE狀態
答:雖然雙方都同意關閉連接了,揮手的4個報文也發送完畢,按理是可以直接回到CLOSED狀態了,但是我們要考慮網絡不可靠狀態,我們無法保證最後發送的ACK報文一定能被對方接收到,所以在對方處於LAST_ACK狀態下的SOCKET可能因爲超時未收到ACK而重發FIN報文,TIME_WAIT狀態的作用就是用來重發可能丟失的報文。

二、TCP協議的實現

接下來從三個方面具體講解TCP的協議的實現

  1. TCP如何實現可靠數據傳輸
  2. TCP如何實現流量控制
  3. TCP如何處理網絡擁塞

(一)TCP如何實現可靠傳輸

A向B發送數據包
停止等待協議:
1.無差錯無丟包情況A未收到B的確認信息就一直等待,直到A收到確認信息
2.超時重傳:超過時間(大於等於一個往返時間)未收到確認消息,A默認重新發送是自動的,無需B告知
3.確認丟失:會丟棄重複的消息
4.確認遲到:會收下遲到的消息,但什麼也不做
在這裏插入圖片描述
在這裏插入圖片描述
上面的圖顯示的是一種確認-重傳機制,這種可靠的協議被稱爲自動重傳請求ARQ,通過這種協議實現了在不可靠的網絡上實現可靠的通信。
停止等待機制雖然簡單但是信道利用率太低,A給B發送信息,只花了TD的時間,其他時間都在等待,這樣效率十分低下
在這裏插入圖片描述
顯然我們可以讓A持續發送而不必沒發完一個分組就等待對方確認,這種機制稱爲流水線傳輸

在這裏插入圖片描述
流水線傳輸——連續的ARQ協議
假設發送窗口是5,即代表當A持續發送數據包到5就不能再發送,需要等待,如果收到1的確認,那麼窗口移動到6,可以繼續發送6這個數據包
在這裏插入圖片描述
累積確認:當B收到數據包1的時候不會馬上給A發送確認信息,,而是等待連續收到一組數據包在確認,比如收到1,2,3,4,那麼B就會只發送確認信息4。
缺點:如果發送1,2,3,4的時候數據包3缺失,那麼3和4都需要重傳

以字節爲單位的滑動窗口
假設有一個文件有40個字節,有兩個主機A和B,A和B建立連接之前產生會話,B告訴A它的接收緩存(接收窗口)是20個字節,那麼A就會設置它的發送緩存爲20個字節(不能超過20),A第一次發送一個數據包(1,2,3字節),未等到確認繼續發送第二第三個數據包1-20,當B確認收到之後會將數據包存進接收緩存中,並返回確認信息告訴A下次繼續傳輸下一個
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
B確認收到123456,發送確認號7,A將123456刪除,並將窗口往後移動
在這裏插入圖片描述
優點:如果在傳輸過程中有數據包確實,比如78910丟失,11…20沒有缺失,那麼B會發送選擇性確認號SACK=7,讓A只需發送丟失的包,而不用再重傳1112…20的數據包了。

(二)TCP如何實現流量控制

流量控制:解決通信兩端處理速度不一致問題,如果A發送信息給B的速度大於B接受處理的信息,超過B的承載範圍,那麼B就會告訴A慢一點,讓A控制發送的速度,從而達到流量控制的目的。
方法:利用滑動窗口機制
TCP窗口單位是字節不是報文段,發送方的發送窗口不能超過接收方給出的接收窗口數值
在這裏插入圖片描述

(三) TCP如何處理網絡擁塞

擁塞控制:在某段時間,網絡中的某一資源的需求超過了該資源所能提供的可用部分,網絡的性能就要優化。
方法
1.慢啓動:發送報文段速率的確定,既要根據接收端的接收能力,又要從全局考慮不要使網絡發生擁塞,這由接收窗口和擁塞窗口兩個狀態量確定。接收端窗口(Reciver Window)又稱通知窗口(Advertised Window),是接收端根據目前的接收緩存大小所許諾的最新窗口值,是來自接收端的流量控制。擁塞窗口cwnd(Congestion Window)是發送端根據自己估計的網絡擁塞程度而設置的窗口值,是來自發送端的流量控制。
2.擁塞避免:
1)TCP連接初始化,將擁塞窗口設置爲1
2)執行慢開始算法,cwind按指數規律增長,知道cwind == ssthress開始執行擁塞避免算法,cwnd按線性規律增長
3)當網絡發生擁塞,把ssthresh值更新爲擁塞前ssthresh值的一半,cwnd重新設置爲1,按照步驟(2)執行。
3.快速恢復
1)當發送方連續收到三個重複確認時,就執行“乘法減小”算法,把慢開始門限減半,這是爲了預防網絡發生擁塞。
2)由於發送方現在認爲網絡很可能沒有發生擁塞,因此現在不執行慢開始算法,而是把cwnd值設置爲慢開始門限減半後的值,然後開始執行擁塞避免算法,是擁塞窗口的線性增大。

(四)小結

沒有擁塞控制的網絡很多容易出現死鎖,使得端到端之間很少或沒有數據能被傳輸。TCP實現的是一種端到端擁塞控制機制,即:當TCP連接的路徑判斷不擁塞時,它的傳輸速率就加性增;當出現丟包時,傳輸速率就乘性減。這種機制致力於做到每一個通過擁塞鏈路的TCP連接能平等地共享該鏈路帶寬。

TCP和UDP的區別

  1. 連接vs無連接: TCP面向連接,UDP是無連接協議
  2. 可靠性不同:TCP傳輸可靠,UDP不可靠
  3. 有序性不同:TCP保證消息的有序性,UDP不提供任何保證,消息到達可能失序
  4. 數據邊界:TCP不保存數據的邊界,UDP保證
  5. 面向對象不同:TCP面向字節流,UDP面向數據包
  6. 速度不同:TCP慢,UDP快
  7. 分組開銷不同:TCP首部20字節,開銷大;UDP只有8字節
  8. TCP具有流量控制和網絡擁塞控制,UDP不能
    注意:TCP傳輸單位稱爲TCP報文段,UDP傳輸單位稱爲用戶數據報。
  9. 實時應用通常以最小的發送速率不希望過分地延遲報文段的傳送,能容忍一些數據的丟失會選擇UDP
    10.TCP佔用資源多 ,UDP佔用資源少

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章