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粘包、拆包發生原因
- 要發送的數據 > 發送緩衝區剩餘空間大小,將會拆包。
- 待發送數據 > 最大報文長度,將會拆包。
- 要發送的數據 < TCP發送緩衝區的大小,TCP會啓用Nagle算法,對多次的數據流進行合併,寫入緩衝區的數據一次發送出去,將會發生粘包。
- 接收數據端的應用層沒有及時讀取緩衝區中的數據,服務器下次發送將會發生粘包。
再説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報文,由於不能一起發送,所以是四次握手。