運輸層(TCP/UDP)詳解


TCP和UDP的區別:

tcp是面向連接的可靠的傳輸協議

udp是非連接的不可靠的傳輸協議

 TCP組成

可以看到雖然tcp是面向字節流的,但是其傳輸的基本單位還是報文(tcp首部和數據,ip報文和udp報文也是由首部和數據組成)

TCP的主要特點:

1.面向連接,應用程序在使用tcp之前,必須建立tcp連接,在傳輸完成之后再釋放連接

2.點對點連接(UDP可以一對多,一對一)

3.tcp連接傳輸的數據是可靠的交付服務

4.全雙工,雙方可以再任意時刻發送數據

5.面向字節流,雖然應用程序和TCP交互的是大小不等的數據塊,但是tcp只保證,發送方和接收方接到的字節流相同。

 

TCP連接:

每條tcp連接有兩個端點,連接的兩個端點稱為套接字(socket)

套接字是由ip和端口號組成的。例如 127.0.0.1:8080

 

TCP可靠傳輸的工作原理

tcp通過校驗和,重傳控制,序號標識,滑動窗口,確認應答實現可靠傳輸。如丟包時的重發機制,還可以對次序亂掉的分包進行順序控制。

 

1.停止等待協議

每發完一個分組,就等對方確認,在收到對方確認后再發送下一個分組

 

2.滑動窗口

3.超時重傳

4.基於滑動窗口的流量控制

5.擁塞控制(tcp擁塞控制的方法  慢開始,擁塞避免,快重傳,快恢復)

 

TCP的連接管理(三次握手)

服務器是處於監聽狀態的,以便及時發現客戶端建立連接的需求。
客戶端TCP進程主動發出Flag段SYN=1,報文序列號seq=x的報文段(A),請求建立連接。狀態變為SYN-SENT(同步已發送)。
服務器收到對應報文段(A)后,會發出確認報文段(B)。
該報文(B)的Flag段的SYN和ACK都是1,確認號ack
=x+1(意為對A的確認),同時設定自己的初始序列號seq=y。狀態由LISTEN(監聽)變為SYN-RCVD(同步收到)。 客戶端收到服務器的確認后,還需向服務器發送確認。報文段(C)的Flag的ACK=1,確認號ack=y+1(意為對B的確認),序列號seq=x+1。狀態變為ESTABLISHED(已建立連接)。
服務器在收到報文段后狀態也變為ESTABLISHED。 客戶端的最后確認是必要的,可以防止以失效的請求建立連接報文突然到達服務器而產生錯誤。

為什么要三次握手呢?

若建立連接只需兩次握手,客戶端並沒有太大的變化,仍然需要獲得服務端的應答后才進入ESTABLISHED狀態,而服務端在收到連接請求后就進入ESTABLISHED狀態。
此時如果網絡擁塞,客戶端發送的連接請求遲遲到不了服務端,客戶端便超時重發請求,如果服務端正確接收並確認應答,雙方便開始通信,通信結束后釋放連接。
此時,如果那個失效的連接請求抵達了服務端,由於只有兩次握手,服務端收到請求就會進入ESTABLISHED狀態,等待發送數據或主動發送數據。
但此時的客戶端早已進入CLOSED狀態,服務端將會一直等待下去,這樣浪費服務端連接資源

參考:

https://juejin.im/post/5a49d95af265da430a50ed8c

 


免責聲明!

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



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