udp是傳輸層協議,和tcp協議處於乙個分層中,但是與tcp協議不同,udp協議並不提供超時重傳,出錯重傳等功能,也就是說其是不可靠的協議。
2.1.udp埠號
由於很多軟體需要用到udp協議,所以udp協議必須通過某個標誌用以區分不同的程式所需要的資料報。埠號的功能就在於此,例如某乙個udp程式a在系統中註冊了3000埠,那麼,以後從外面傳進來的目的埠號為3000的udp包都會交給該程式。埠號理論上可以有2^16這麼多。因為它的長度是16個bit
2.2.udp檢驗和
這是乙個可選的選項,並不是所有的系統都對udp資料報加以檢驗和資料(相對tcp協議的必須來說),但是rfc中標準要求,傳送端應該計算檢驗和。
udp檢驗和覆蓋udp協議頭和資料,這和ip的檢驗和是不同的,ip協議的檢驗和只是覆蓋ip資料頭,並不覆蓋所有的資料。udp和tcp都包含乙個偽首部,這是為了計算檢驗和而攝製的。偽首部甚至還包含ip位址這樣的ip協議裡面都有的資訊,目的是讓udp兩次檢查資料是否已經正確到達目的地。如果傳送端沒有開啟檢驗和選項,而接收端計算檢驗和有差錯,那麼udp資料將會被悄悄的丟掉(不保證送達),而不產生任何差錯報文。
2.3.udp長度
udp可以很長很長,可以有65535位元組那麼長。但是一般網路在傳送的時候,一次一般傳送不了那麼長的協議(涉及到mtu的問題),就只好對資料分片,當然,這些是對udp等上級協議透明的,udp不需要關心ip協議層對資料如何分片,下乙個章節將會稍微討論一些分片的策略。
ip在從上層接到資料以後,要根據ip位址來判斷從那個介面傳送資料(通過選路),並進行mtu的查詢,如果資料大小超過mtu就進行資料分片。資料的分片是對上層和下層透明,而資料也只是到達目的地還會被重新組裝,不過不用擔心,ip層提供了足夠的資訊進行資料的再組裝。
在ip頭裡面,16bit識別號唯一記錄了乙個ip包的id,具有同乙個id的ip片將會被重新組裝;而13位片偏移則記錄了某ip片相對整個包的位置;而這兩個表示中間的3bit標誌則標示著該分片後面是否還有新的分片。這三個標示就組成了ip分片的所有資訊,接受方就可以利用這些資訊對ip資料進行重新組織(就算是後面的分片比前面的分片先到,這些資訊也是足夠了)。
因為分片技術在網路上被經常的使用,所以偽造ip分片包進行流氓攻擊的軟體和人也就層出不窮。
可以用trancdroute程式來進行簡單的mtu偵測。請參看教材。
這是不常被人注意到的乙個細節,這是針對一些系統地實現來說的。當arp快取還是空的時候。udp在被傳送之前一定要傳送乙個arp請求來獲得目的主機的mac位址,如果這個udp的資料報足夠大,大到ip層一定要對其進行分片的時候,想象中,該udp資料報的第乙個分片會發出乙個arp查詢請求,所有的分片都輝等到這個查詢完成以後再傳送。事實上是這樣嗎?
結果是,某些系統會讓每乙個分片都傳送乙個arp查詢,所有的分片都在等待,但是接受到第乙個回應的時候,主機卻只傳送了最後乙個資料片而拋棄了其他,這實在是讓人匪夷所思。這樣,因為分片的資料不能被及時組裝,接受主機將會在一段時間內將永遠無法組裝的ip資料報拋棄,並且傳送組裝超時的icmp報文(其實很多系統不產生這個差錯),以保證接受主機自己的接收端快取不被那些永遠得不到組裝的分片充滿。
當目標主機的處理速度趕不上資料接收的速度,因為接受主機的ip層快取會被佔滿,所以主機就會發出乙個「我受不了」的乙個icmp報文。
udp協議的某些特性將會影響我們的伺服器程式設計,大致總結如下:
關於資料輸入:通常伺服器系統的每乙個埠號都會和一塊輸入緩衝區對應,進來的輸入根據先來後到的原則等待伺服器的處理,所以難免會出現緩衝區溢位的問題,這種情況下,udp資料報可能會被丟棄,而應用伺服器程式本身並不知道這個問題。
伺服器應該限制本地ip位址,就是說它應該可以把自己繫結到某乙個網路介面的某乙個埠上。
**
UDP協議與UDP通訊
1 udp協議 udp是無連線通訊協議,即在資料傳輸時,資料的傳送端和接收端不建立邏輯連線。簡單來說,當一台計算機向另外一台計算機傳送資料時,傳送端不會確認接收端是否存在,就會發出資料,同樣接收端在收到資料時,也不會向傳送端反饋是否收到資料。但是在使用udp協議傳送資料時,由於udp的面向無連線性,...
socket通訊之 udp協議2
步驟 1.建立套接字 2.繫結ip 3.讀取資料 include include see notes include include include include define srv port 9999 int main int argc,char argv bind addr struct s...
通訊協議 UDP通訊
通訊協議 通訊協議是udp tcp通訊的基礎,沒有通訊協議的 通訊 是沒有任何意義上的,通訊協議不是底層函式或者高深的原理,而是程式設計師之間的一種文字約定。資料在網路上是以位元組的形式傳送的 底層是01碼 我們在讀取到資料之後,該以怎樣的方式對它進行解碼呢?這就是我們在通訊之前需要制定的通訊協議。...