1. 程式人生 > >【TCP/IP】UDP

【TCP/IP】UDP

UDP介紹:


UDP是一個簡單的面向資料報的傳輸層協議:程序的每個輸出操作都正好產生一個UDP資料報,並組裝成一份待發送的IP資料包

這與面向流字元的協議不同,如TCP,應用程式產生的全體資料與真正傳送的單個IP資料報可能沒有什麼聯絡

       UDP不提供可靠性

應用程式必須關係IP資料報的長度,如果它超過了網路的MTU,那麼就要對IP資料報進行分片。

UDP首部:

 

埠號:傳送程序和接收程序

UDP長度:UDP首部和UDP資料

校驗和:UDP首部和UDP資料校驗

TCP埠號與UDP埠號時相互獨立的。rsh和syslog=514

儘管相互獨立,如果TCP和UDP同時提供某種知名服務,兩個協議通常選擇相同的埠號。這純粹是為了使用方便,而不是協議本身的要求。如

TCP:53,UDP:53 都是DNS)

UDP校驗和:

UDP校驗和覆蓋UDP首部和UDP資料,IP的首部的校驗和,它只能覆蓋IP的首部

UDP的校驗和是可選的,而TCP的校驗和是必須的

UDP資料報的長度可以為奇數字節,但是如果要校驗的話就要填充位元組0,補齊16bit倍數,填充欄位只會用來計算效驗和而不會被髮走

UDP的校驗和包含UDP偽首部、UDP首部、和資料部分。在TCP裡面也一樣都加入了偽首部。

UDP資料報和TCP資料報都包含一個12位元組長的偽首部(實際不佔用地址空間),目的是讓UDP兩次檢查資料是否以及正確到達目的地

Tcpdump輸出:

三個系統中有兩個打開了UDP校驗和選項(第1和第2行)

由此可以看出UDP校驗和是可選的

送出的資料報與收到的資料報具有相同的校驗和值第3和第4行、第5和第6行),傳送的包和收到的包,源目IP地址和源目埠那怕掉換過,校驗和也還是一樣,說明UDP校驗和是一個簡單的16bit和,16bit校驗和校驗資料的個數的總數是一樣的,位置被換過,那麼校驗和就是一樣的

UDP在傳送資料報之前,不會與目的端之間協商什麼,而是直接傳送

UDP的應用

1.    查詢類(DNS

2.    實時流量(語音、視訊)

3.    傳輸資料(TFTP

UDP在查詢類裡面是非常靠譜的,效率高,不用像TCP那樣還要先建立三次握手,在實時流量的應用中也是很靠譜的,如果使用TCP會造成明明是在3S前出現的畫面在現在或者以後出現了,會使體驗效果變差。在傳輸資料時使不靠譜的,TFTP是一個停止等待傳輸協議,服務端發了512K,客戶端必須跟伺服器確認,確認後,服務端才會繼續傳送資料,然後又等待客戶端的確認,再發送。

最大UDP資料包長度:

  理論上說,最大UDP資料包長度應該為:65535-IP資料報首部-UDP頭部。也就是IP資料報的資料部分-UDP頭部,其實不然。第一,應用程式可能會受到其程式介面的限制。應用程式通過API介面來呼叫網路,可能API介面最大隻支援8192。所以API限制了應用程式不可能一下子發很多。第二,有可能在TCP/IP的核心裡面也對UDP最大的資料包進行限制。

資料報截斷:

 發的時候有限制,在接收的時候也可能收不了這麼多,當發過去一個8192位元組的資料,對端接收的API最大隻支援4096,根據作業系統的不同處理的方法也會不同,有的會只接收前4096個位元組,後面的就直接丟棄了。有的會先接收4096個位元組,然後等下再接收4096個位元組。

TCP就不會發生這種情況,TCP大了就會拆小,小了就會補充大。

最大UDP資料包長度詳解:

ICMP的源站抑制:

  源端一直在傳送資料,如果中間裝置路由器的快取滿了,它就會向源傳送一個ICMP源站抑制的差錯資訊,RFC提出建議:其實路由不應該產生這種差錯報文,由於以及擁塞了,路由器還要傳送這個差錯報文,佔用網路資源,可能讓網路擁塞更加嚴重,而且對於UDP而言,可能一口氣就把要發的資料報全發出去了,就算中間路由器返回給源端差錯報文,要求源端抑制,但是源端已經發送完了,沒有可抑制的資料報了。這時候就相當於白白浪費頻寬。TCP接收源站抑制差錯報文後,會將放慢在該連線上的資料報傳輸速度。總體上說是不建議傳送這個源站抑制差錯的。