引言:
前一個專題簡單介紹了TCP程式設計的一些知識,UDP與TCP地位相當的另一個傳輸層協定,它也是當下流行的很多主流網絡應用(例如QQ、MSN和Skype等一些即時通信軟體傳輸層都是應用UDP協定的)底層的傳輸基礎,是以在本專題中就簡單介紹下UDP的工作原理和UDP程式設計的隻是,希望可以對剛接觸網絡程式設計的朋友起到入門的作用。
一、UDP介紹
UDP和TCP都是建構在IP層之上傳輸層的協定,但UDP是一種簡單、面向資料報(Sock_Dgram)的無連接配接協定,提供的是不一定可靠的傳輸服務。
然而TCP是一種面向連接配接、可靠的,面向位元組流(Sock_Stream)的傳輸協定,對于“無連接配接”是指在正式通信前不必與對方先建立連接配接,不管對方狀态如何都可以直接發送過去(就如QQ中通過QQ号檢視好友後發送添加好友請求,此間不需要考慮對方的狀态如何,都照樣發送請求)。從UDP和TCP的定義中就可以看出它們兩者的差別了,(1)UDP的可靠性不如TCP,因為TCP傳輸前要首先建立連接配接,這樣就增加了TCP傳輸的可靠性,是以UDP也被稱為不可靠的傳輸協定,關于TCP的介紹可以看我上一篇部落格的介紹。
TCP和UDP還有另外一個差別。(2)UDP不能保證有序傳輸。即UDP不能確定資料的發送和接收順序。
下面就來看看UDP協定的工作原理,對UDP的工作原理有一個好的了解,對後面介紹的UDP程式設計也是一個好的基礎。
1.1 UDP的工作原理
UDP将網絡資料流量壓縮成資料報的形式,每一個資料報用8個位元組(8 X 8位=64位)描述報頭資訊,剩餘位元組包含具體的傳輸資料。UDP報頭(隻有8個位元組)相當于TCP的報頭(至少20個位元組)很短,UDP報頭由4個域組成,每個域各占2個位元組,具體為源端口、目的端口、使用者資料報長度和校驗和,
具體結構見下圖(下面也貼出了TCP封包的結構圖,與UDP資料報做一個對比的作用):
UDP協定和TCP協定都使用端口号為不同的應用保留其各自的資料傳輸通道這一機制,資料發送方将UDP資料報通過源端口發送出去,而資料接收方則通過目标端口接收資料。
1.2 UDP的優勢
前面介紹中說UDP相對于TCP是不可靠的,不能保證有序傳輸的傳輸協定,然而UDP協定相對于TCP協定的優勢在哪裡呢?,
UDP相對于TCP的優勢主要有三個方面的:
(1)UDP速度比TCP快。
由于UDP不需要先與對方建立連接配接,也不需要傳輸确認,是以其資料的傳輸速度比TCP快很多。對于一些着重傳輸性能而不是傳輸完整性的應用(網絡音頻播放、視訊點播和網絡會議等),使用UDP協定更加适合,因為它傳輸速度快,使通過網絡播放的視訊音質好、畫面清晰。
(2)UDP有消息邊界。
通過UDP協定進行傳輸的發送方對應用程式交下來的封包,在添加首部後就向下直接傳遞給IP層。既不拆分也不合并,而是保留這些封包的邊界,是以使用UDP協定不需要像TCP那樣考慮消息邊界的問題,這樣就使得UDP程式設計相對于TCP在接收到的資料處理方面要簡單的多。(對于TCP消息邊界的問題可以檢視相關的文檔,在這裡我就不列出來了)
(3)UDP可以一對多傳輸
由于傳輸資料部建立連接配接,也就不需要維護連接配接狀态,是以一台伺服器可以同時向多個用戶端發送相同的資訊。利用UDP可以使用廣播或者多點傳播的方式同時向子網的所有用戶端程序發送資訊,廣播群組播的介紹放到後面TCP程式設計中介紹。
上面介紹了UDP協定相對于TCP協定的優勢,其中速度快是UDP的最重要的優勢,也是像一些網絡會議、即時通信軟體傳輸層選擇UDP協定進行傳輸的原因所在。
二、.net平台對UDP程式設計的支援
介紹完UDP相對于TCP的優勢後,當然很希望在.net平台下開發一個基于UDP協定的一個應用了,然後.net平台下對UDP程式設計也做了很好的支援,為我們開發基于UDP協定的網絡應用提供很多友善之處,下面就簡單介紹.net平台下對UDP程式設計的支援(主要介紹提供的類來對UDP協定進行程式設計)。
三、UDP程式設計的具體實作
由于UDP程序在通信之前是不需要建立連接配接,消息接收方可能并不知道是誰給它發的消息,是以UDP程式設計分為兩種模式:一種“實名發送”,即接收方可以由收到的消息得知發送方程序端口,另外一種則為“匿名發送”,即接收方并不知道發給它資訊的遠端程序究竟來自哪個端口。下面通過一個winform 程式來示範下UDP的程式設計:
實作代碼:
運作結果:
實名發送:
在本地運作本程式的三個程序(分别為A,B,C),把程序C做為接受程序,程序A和程序B都向程序C發資訊,程序A和程序分别綁定端口号為11883和21883,發送到端口都為51883,配置界面如下:
首先不勾選“匿名”複選框,在程序C中點選“接收”按鈕開啟接受線程,在A程序和B程序中發送消息框裡分别輸入你好,我是1和你好,我是2 ,然後點選發送按鈕,此時在程序中就可以看到程序A和程序B發來的消息,如下圖:
從圖中可以看出每條消息之前都顯示了消息的準确來源(包括消息程序鎖在的Ip位址和端口号)
匿名發送:
下面把“匿名”複選框勾上後,再按照前面的步驟将得到下面的結果:
從圖中結果可以看出此時清單中顯示的消息來源的程序端口号分别為49439和49440,而不是發送消息程序的真實端口(11883和21883)
這種UDP隻能辨識消息源主機的Ip位址,而無法知道發消息的程序究竟是哪個端口稱為“匿名發送”。正如我們平時發手機短信一樣,如果我們把認識的名字和電話号碼預先存在通訊錄裡,當一發來資訊,接受方馬上就可以從來電顯示中看到是誰發來的(實名模式);但是如果是陌生人發來資訊或者廣告等資訊時,僅看來電顯示,根本不知道對方是誰(匿名模式),QQ發消息也是一樣的道理。
四、UDP廣播群組播
前面UDP的實作中發送資料使用的都是一對一(單點傳播)的通信方式,即隻将資料發送到某一個程序。前面提到UDP可以實作一對多的傳輸方式,即通過廣播群組播把資料發送給一組程序。下面就介紹下UDP廣播群組播的相關知識。
4.1 廣播群組播的基本概念
雖然利用TCP協定可以保證資料的可靠、有序的傳輸,但是TCP僅支援一對以的傳輸,而且傳輸時需要在發送端和每一個接受端之間建立單獨的資料通信通道,如果需要實作網絡會議、網絡視訊的點播等功能時要向大量主機發送相同的資料包,如果采用單點傳播方式逐個節點傳輸的話,将會給發送方帶來網絡堵塞等問題,此時可以考慮實作UDP的多點傳播方式——即廣播群組播來實作這樣的功能(一對多通信分為廣播群組播兩種形式)。
廣播是指同時向子網中的多台計算機發送消息,并且所有子網中的計算機都可以接收到發送方發來的消息,每個廣播消息包含一個特殊的IP位址,這個IP的中子網内主機标志部分的二進制都為1,例如,子網路遮罩為255.255.255.0,對于子網192.168.0,則這個IP位址為192.168.0.255.
然後廣播消息又分為本地廣播和全球廣播兩種類型, 本地廣播是指向子網中的所有計算機發送廣播消息,其他網絡不會受到本地廣播的影響。
IP位址分為兩部分——網絡标志部分和主機标志部分,這兩部分是靠子網路遮罩來區分的,主機标記部分二進制全部為1的位址成為本地廣播位址。例如:
A類網絡192.168.0.0,使用子網路遮罩255.255.0.0,則本地廣播位址為:
對于IPv4來說,全球廣播使用所有位全為1的IP位址,即255.255.255.255,這個廣播位址代表資料報的目的地是網絡上所有裝置,但是由于路由器會自動過濾全球廣播,是以使用這個位址根本就沒有任何意義。
然後當接收者分布于多個不同的子網時,廣播将不再适用,此時可以通過多點傳播的方式來實作,多點傳播也叫多路廣播,多點傳播是将資訊從一台計算機發送到本網或全網内指定的計算機上,即發送到那些加入了指定多點傳播組的計算機上,每台計算機都可以通過程式随時加入某個多點傳播組中,也可以随時退出來, 就像我們開網了會議一樣,可以随時加入會議室進行開會,會議結束和會議進行中都可以随意的退出來。
4.2 加入和退出多點傳播組
多點傳播組又稱為多路廣播組,多點傳播位址的範圍在224.0.0.0到239.255.255.255的D類IP位址(至于這個概念大家可以百度百科裡面就檢視)。任何發送到多點傳播位址的消息都會被發送到組内所有成員裝置上,組可以使永久的也可以是臨時,大多數我們使用的都是臨時的,僅在有成員的時候才存在。
使用多點傳播時,注意生命周期(TTL,Time to live)的設,TTL值表示允許路由器轉發的最大次數,當達到這個最大值時,資料包就會被丢棄,TTL的預設值為1,設定為1時表明隻能在子網中發送資料
加入多點傳播組:
UdpClient類提供了JoinMulticastGroup方法,用于将UdpClient加入到使用指定的IPAddress的多點傳播組中,調用該方法後,基礎的Socket會自動向路由器發送資料包,用于請求成為多點傳播組的成員,如果成為多點傳播組成員,就可以接收該多點傳播組的資料報。至于具體方法的時候會在後面實作UDP廣播程式中會用到,另外大家也可以檢視MSDN,是以這裡我就不再列出來了,隻是指出這個方法的作用,讓大家知道有這麼個方法來調用。
退出多點傳播組:
同樣利用UdpClient的DropMulticastGroup方法,可以退出多點傳播組,調用該方法後,基礎Socket會自動向路由器發送資料包,用于請求從指定的多點傳播組裡退出,從組中回收UdpClient對象之後,将不再接受發送到該多點傳播組的資料報。
五、總結
由于時間的關系,這篇文章就介紹到這裡的,至于實作UDP廣播的程式放在後面一個專題裡面的,前面也對廣播群組播的概念進行了簡單的介紹,相信大家也對廣播群組播有了個簡單的認識(廣播組群組播組說白了就是一個IP位址的集合,其實實作UDP廣播的程式和前面實作單點傳播的程式差不多,隻是前面綁定了一個IP位址當然也隻能發送到一個IP位址了,也就是所謂的單點傳播,多點傳播和廣播就是發送的IP位址是一個組,當然也就實作了一對多的傳輸了)。UDP廣播程式的實作就放在下一個專題和大家分享的,因為我現在要去吃飯了,吃完飯再繼續和大家介紹,希望大家如果覺得有幫助的話,也可以推薦下,這給我繼續寫下去的動力,謝謝大家的支援
本文轉自LearningHard 51CTO部落格,原文連結:http://blog.51cto.com/learninghard/1038666,如需轉載請自行聯系原作者