Reference

  • jianshu
  • easemob

TCP UDP

  • TCP(Transmission Control Protocol):傳輸控制協議
  • UDP(User Datagram Protocol):用户數據報協議
  • TCP UDP 都是傳輸層協議

目錄


  • TCP UDP
  • 目錄
  • TCP / UDP的區別
  • TCP是面向連接的協議,UDP是無連接協議
  • TCP可靠,UDP不可靠
  • TCP有序,UDP無序
  • UDP程序結構較簡單
  • TCP和UDP的使用場景
  • 為什麼TCP會粘包、拆包,而UDP不會
  • TCP粘包、拆包發生原因
  • 再説UDP不會粘包、拆包原因
  • TCP粘包與分包的處理方法
  • TCP的三次握手
  • 為什麼連接的時候是三次握手,關閉的時候卻是四次揮手?

TCP / UDP的區別

  • TCP 是面向連接的協議,UDP 是無連接協議
  • TCP 是字節流模式,UDP 是數據報模式
  • TCP無界,UDP有界
  • TCP有序,UDP無序
  • TCP可靠,UDP不可靠
  • TCP有流量控制(擁塞控制),UDP沒有
  • UDP程序結構較簡單

TCP是面向連接的協議,UDP是無連接協議

TCP是面向連接的,在連接持續的過程中,socket中收到的數據都是由同一台主機發出的,因此,知道保證數據是有序的到達就行了,至於每次讀取多少數據自己看着辦。

UDP是無連接的協議,只要知道接收端的IP和端口,且網絡是可達的,任何主機都可以向接收端發送數據。客户端一次讀取超過一個報文的數據,則會數據錯亂

TCP可靠,UDP不可靠

由於TCP有重傳機制,UDP不會進行重傳。

TCP有序,UDP無序

消息在傳輸過程中可能會亂序,後發送的消息可能會先到達,TCP會對其進行重排序,UDP不會。

UDP程序結構較簡單

TCP報頭是20字節 > UDP報頭是8字節。

TCP和UDP的使用場景

  • UDP適用於對傳輸效率要求高,但準確率要求低的應用場景:
  • 包總量較少的通信(DNS、SNMP等)
  • 視頻、音頻等多媒體通信(即時通信)
  • 廣播通信
  • DNS:用於域名解析服務,53號端口。
  • SNMP:簡單網絡管理協議,使用161號端口,是用來管理網絡設備的。由於網絡設備很多,無連接的服務就體現出其優勢。
  • TFTP(Trival File Transfer Protocal),簡單文件傳輸協議,該協議在熟知端口69上使用UDP服務。
  • TCP適合對傳輸效率要求低,但準確率要求高的應用場景:
  • HTTP:萬維網協議,是從Web服務器傳輸超文本到本地瀏覽器的傳送協議。
  • FTP:文件傳輸協議,使用21端口。
  • Telnet:一種用於遠程登陸的端口,使用23端口
  • SMTP:郵件傳送協議,用於發送郵件,使用25號端口。
  • POP3:接收郵件,使用110端口。

為什麼TCP會粘包、拆包,而UDP不會

TCP粘包、拆包發生原因

  1. 要發送的數據 > 發送緩衝區剩餘空間大小,將會拆包。
  2. 待發送數據 > 最大報文長度,將會拆包。
  3. 要發送的數據 < TCP發送緩衝區的大小,TCP會啓用Nagle算法,對多次的數據流進行合併,寫入緩衝區的數據一次發送出去,將會發生粘包。
  4. 接收數據端的應用層沒有及時讀取緩衝區中的數據,服務器下次發送將會發生粘包。

再説UDP不會粘包、拆包原因

他不會對數據包進行合併發送,每一個數據包都是完整的(數據+UDP頭+IP頭等等封裝一次)也就沒有粘包一説了。

TCP粘包與分包的處理方法

客户端在數據包固定位置添加包的長度信息,服務器接收到數據後,先解析包長度,然後根據包長度截取數據包(客户端有自動重發機制,故而在應用層不會導致數據的不完整性)

TCP的三次握手

• 第一次握手:客户端發送一個同步標誌SYN=1,ACK=0標誌的數據包給接收端,請求進行連接;
• 第二次握手:接收端收到請求並且允許連接的話,就會發送一個SYN=1,ACK=1標誌的數據包給發送端,可以通訊了,並且讓發送端發送一個確認數據包
• 第三次握手:發送端發送一個SYN=0,ACK=1的數據包給接收端,確認連接建立,可以通訊。
• 中斷連接端可以是Client端,也可以是Server端。

為什麼連接的時候是三次握手,關閉的時候卻是四次揮手?

• 因為三次握手中Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。
• 但是關閉連接時,當Server端收到FIN報文時,並不會立即關閉SOCKET,先應答Client端一個ACK報文,等確認所有的數據都發送完了,才能發送FIN報文,由於不能一起發送,所以是四次握手。