UDP協議,作為一個面試網際網路公司幾乎必問的題目,你真的有回答好嗎?
請你講一下什麼是UDP。
請你說一下TCP和UDP的區別。
請你說下UDP在哪些場景用到。
請你說下UDP的特性。
請你......
(求求你不要再問了,嗚嗚嗚)
面試的時候,UDP回答好了,並且能答到一些讓面試官覺得眼前一亮的點,會給你面試加不少分,並且作為一個基礎問題,更能看出候選人的基礎到底牢不牢固,這個問題沒有回答好,基本就與offer失之交臂。所以讓我們一起來快樂的學習下UDP吧~
推薦影片:
網路原理tcp/udp,網路程式設計epoll/reactor,面試中正經“八股文”
直播學習地址:C/C++Linux伺服器開發/後臺架構師【零聲教育】-學習影片教程-騰訊課堂
UDP它是一種使用者資料報協議,即User Datagram Protocol。UDP和TCP都屬於運輸層協議中的一種。
UDP的主要特點有:
1.UDP是無連線的,所以在傳送資料前和傳送資料後,都不需要建立連線和斷開連線,減少了開銷。
2.UDP使用盡最大努力交付,即UDP它不保證可靠交付,這個我稍後會舉一個例子,說明什麼是盡最大努力交付。
3.UDP是面向報文的,傳送方的UDP只在應用程式交下來的報文添加了首部後就交付給IP層。UDP對應用層交下來的報文,既不合並,也不拆分,也就是說應用層交給UDP多長的報文,UDP就照樣的傳送,UDP一次交付一個完整的報文。為了提高效率,應用程式必須選擇合適大小的報文,如果報文過長,那麼UDP把它交給IP層,IP層可能需要進行分片;如果報文太短,會使得IP資料報的首部相對長度較大,兩種情況都會使得IP層的效率降低。
4.UDP沒有擁塞控制,所以當網路出現擁塞的時候不會使得源主機的傳送速率降低,這非常適用於對實時性要求高的應用,比如實時視訊會議等等,它要求源主機以恆定的速率傳送資料,並且允許在網路發生擁塞的時候丟失部分資料,對時延要求較高(當很多源主機都同時向網路傳送高速率的實時影片流時,網路就有可能傳送擁塞,所以不適用擁塞控制功能的UDP是有可能會引起網路產生嚴重擁塞的問題)。
5.UDP支援一對一,一對多,多對一和多對多的互動通訊。
6.UDP的首部開銷小,只有8個位元組,相對於TCP的20位元組,要短很多。
使用者資料報UDP包含有兩個欄位,一個是首部欄位,另外一個是資料欄位。首部欄位有8個位元組,分別由四種資訊組成,每個資訊長度都是為2個位元組的。
1.源埠:源主機的傳送該資訊的埠號,如果不需要對方回信,則可以置為0。
2.目的埠:目的地的埠號,在終點交付報文的時候需要用到。
3.長度:UDP使用者資料報的長度。
4.檢驗和:檢測UDP使用者資料報在傳輸中是否有錯。
接下來我們來討論下它是如何盡最大努力交付。
【文章福利】需要C/C++ Linux伺服器架構師學習資料加群812855908(資料包括C/C++,Linux,golang技術,核心,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK,ffmpeg,大廠面試題 等)
首先在傳送方,在傳送前,會先生成一個偽首部,這個偽首部既不向下傳遞也不向上遞交,只是為了做檢驗和臨時生成的,在傳送方填完檢驗和欄位到UDP首部後,就會去除偽首部。
偽首部是12位元組大小,包括有分別都是4位元組的源IP地址,目的IP地址,1個位元組的全0,和儲存1個位元組大小的17(UDP在IP報文的協議號是17),最後2位元組儲存UDP使用者資料報的長度。
也許有人就會問了,要這個1位元組的全0有什麼用呢?因為為了做檢驗和,UDP把偽首部和UDP使用者資料報看做由許多16位的字(即兩個位元組)組成起來的。那麼偽首部有12位元組,可以分為6個字,UDP首部有8個位元組,共4個字,UDP資料部分如果是奇數個位元組,那麼就需要填入一個全零的位元組(這個位元組不會發送),籌齊16位的字。然後把這些資料透過二進位制的方式加起來,然後取它們的反碼,寫入檢驗和欄位中。需要注意的是,因為校驗和是16位大小的,即兩個位元組。我們在計算的過程中可能會發生進位的情況,這個時候需要把高位溢位的數移到最低位相加。
例子:
1111 1111 1111 1111
+0000 0000 0000 0001
——————————————————————
0000 0000 0000 0001
取反:1111 1111 1111 1110
這個時候1111 1111 1111 1110就會填入檢驗和。接收方在接收的時候,會透過獲得的UDP使用者協議報生成偽首部,然後把資料分成16位的字再次加起來,這次不取反碼了,直接和UDP首部中的檢驗和做加法,如果得到的是全1,那麼代表使用者資料報在傳輸的過程沒有丟失,如果出現的不是全1,則代表有差錯,接收方就應該丟棄這個UDP使用者資料報。
但是這也僅僅只能解決資料缺失的問題,如果這裡面16bit資料做了位置交換,那麼UDP是檢測不出來的。但是也有許多技術是使用到的UDP協議,包括有:TFTP,SNMP,NFS,DNS,BOOTP等。
這裡和大家在科普一個知識點,QQ傳送訊息使用的就是UDP協議,大家也許會驚訝說,這怎麼可能?UDP有亂序和丟包問題,使用QQ傳送訊息從來沒見過亂序的情況呀,洪爵你是不是在吹牛。
這是真的,UDP是運輸層協議,它本身不能保資料的順序性,但是QQ是在其之上的應用層去保證了它的順序性,如果大家感興趣,洪爵可以出一期影片給大家演示一下它是如何做到的。什麼?我怎麼知道大家感不感興趣?大家可以透過讚賞本篇文章...咳咳,公眾號給我發信息呀,告訴洪爵想要看(讚賞的話就更好了)。
好的,咱們繼續聊UDP,大家知道UDP資料報能傳送的最大長度嗎?
之前有說到,UDP首部中有2個位元組儲存了UDP的使用者資料報的長度,那麼2個位元組即16位,所以UDP使用者資料報最大長度不能超過2^16-1 = 65535位元組。UDP首部佔用了8個位元組,IP層首部佔用了20個位元組,那麼就只剩下65535-8-20=65507個位元組;除此之外,能限制UDP使用者資料報長度的還有UDP的緩衝區大小,所以UDP能傳送的最大長度 = min(緩衝區大小,65507),然而這就是最終結果嗎?當然不是,得出來的只是理想的最長長度,因為還有最後一層能控制UDP傳輸長度的情況,就是MTU的大小(最大傳輸單元,Maximum Transmission Unit)。乙太網資料幀的長度必須在46-1500位元組之間,這是由乙太網的物理特性決定的,這個1500位元組被稱為鏈路層的MTU。
不過鑑於Internet上的標準MTU值為576位元組,所以建議在進行Internet的UDP程式設計時,最好將UDP的資料長度控制在 (576-8-20)548位元組以內。並且Internet上許多路由器也是為576,所以為了適配,設定為500+為最理想,騰訊遊戲使用的MTU就是500+。
難道說要傳送UDP資料報只能傳送小於等於MTU大小的嗎?其實UDP並不會受到MTU的影響,MTU只會影響下層IP分片,如果你傳送數倍於MTU的資料,導致IP層大量分片,這種情況下,如果某個分片丟失了,就會導致整個UDP資料報無效。所以一般不會去傳送過大的UDP使用者資料報。
UDP,應該說UDP所在的運輸層還有一個很重要的功能:複用和分用。
同一時間可能有多個應用程式與外界程序進行互動,這個時候大家都可以透過運輸層傳送到IP層(網路層)。
接收端在接收UDP後,如果發現收到的報文中的目的埠號不正確,就會丟棄這個報文,並且透過網際控制報文協議ICMP傳送“埠不可達”差錯報文給傳送方。如果正確,則會把UDP使用者資料報透過相應的埠,上交到對應埠號的應用程序。
好啦,UDP就講到這裡了,相信大家啃完這篇文章,面試再回答UDP就能完虐面試官。