我想統計一下,TCP/IP 尤其是TCP協議,能搜到的常見的問題,整理起來,關鍵詞添加在目錄中,便于以后查閱。
目前預計整理共3篇:
[TCP] TCP/IP 基礎知識問答 :基礎知識
[TCP] TCP/IP 基礎知識問答(2) :TCP協議相關知識
[TCP] TCP/IP 基礎知識問答(3) :UDP協議相關知識
文章目錄
- UDP協議相關知識
- 什么是UDP
- UDP的頭
- UDP可以發送多長的報文
- TCP 和 UDP 的區別
- UDP的應用層協議
UDP協議相關知識
什么是UDP
UDP(User Datagram Protocol),是無連接的、不可靠的傳輸層協議。
UDP的頭
源port(16位),目標port(16位),總長度(16位),校驗和(16位)
UDP可以發送多長的報文
根據MTU的大小來判斷。
MTU是數據鏈路層數據的最大長度,超出MTU大小的數據會被分片。
比如以太網的MTU大小是1500,IP層的頭大小是20字節,UDP頭8字節,那UDP的數據長度應該是:
1500 -20 -8 = 1472 字節以下。
windows中可以用ping 命令測試mtu,可以通過-l 指定發送的數據包大小,例如 ping -l 1500 IP地址,
如果提示需要拆分,則MTU比這個值小。
ping 命令基于ICMP協議,是網絡層協議。而MTU 實際上就是網絡層包的大小。
TCP 和 UDP 的區別
1.TCP是面向連接的,UDP是無連接的。
TCP需要三次握手建立連接,四次揮手斷開連接。
UDP沒有這個過程。
2.TCP是字節流形式,UDP是數據報的形式。
字節流形式的特點:
TCP的應用層send幾次和recv幾次是沒有關系的。有可能send了一次100字節,recv 10次。
也可能send了10次,結果對端一次recv就全收到了。
這是由于TCP是面向連接的,連接很穩定,TCP可以通過流量控制來控制協議棧中數據具體如何發送。
但是無邊界的字節流傳輸,也就有沾包的問題,就是本來是兩段數據,結果對端是連在一起收到的。
需要考慮沾包的問題。
數據報形式的特點:
UDP sendto一次,對端就要recvfrom一次,如果發送的報文過長,超出了接收端緩沖區的大小,超出部分將被放棄。
這是由于UDP是無連接的,所以一次就把整個報文發出去。所以應用層需要控制UDP發送的數據大小
3.UDP可以廣播、組播
TCP是面向連接的,所以只能一對一。
UDP無連接,可以一對一發送,也可以一對多發送,進行廣播和組播。
4.TCP是可靠的,UDP是不可靠的
TCP通過seq num 和ack num保證數據包是有序的、通過重傳機制保證數據包不丟失、通過流量控制和擁塞控制確保網絡傳輸,
所以TCP是可靠的,TCP數據報不重復、不丟失、不亂序。
但是UDP本身沒有這些機制,他只是把報文發出去,不保證對端能收到。
5.TCP是全雙工可靠通道,UDP是不可靠通道
TCP是全雙工的通信,即連接的雙方可以同時發送數據。
但是TCP是傳輸層協議,它支持全雙工,其上的應用層未必支持全雙工,例如http 1.0 是半雙工,http 2.0是全雙工。
UDP沒有建立穩定的連接,所以我認為他是不是雙工通信。
6.TCP頭和UDP頭的大小不一樣
TCP的頭大小為 20 - 60 字節之間,由于TCP頭中有一個選項字段,他的大小是可變的。
UDP的頭大小為固定的8字節。
7.socket編程流程不同
TCP socket編程,一般 創建socket (SOCK_STREAM)、bind、listen、accept(connect),send / recv, close socket。
UDP socket編程,一般 創建socket (SOCK_DGRAM)、sendto(recvfrom, close socket。//可選bind
UDP的應用層協議
SNMP (port 161、162)
DNS 53 (DNS在域名解析時使用UDP協議,在區域傳送時使用TCP協議)