UDP套接字的作用和特點(diǎn)
在UDP協(xié)議的應(yīng)用過程中,為了更加方便對(duì)于服務(wù)器以及客戶端的接觸,我們發(fā)現(xiàn)了UDP套接字的好處。那么什么是UDP套接字呢?現(xiàn)在我們就來簡(jiǎn)要對(duì)大家進(jìn)行一下介紹。
UDP套接字
UDP協(xié)議提供了一種不同于TCP協(xié)議的端到端服務(wù)。實(shí)際上UDP協(xié)議只實(shí)現(xiàn)兩個(gè)功能:
1)在IP協(xié)議的基礎(chǔ)上添加了另一層地址(端口)
2)對(duì)數(shù)據(jù)傳輸過程中可能產(chǎn)生的數(shù)據(jù)錯(cuò)誤進(jìn)行了檢測(cè),并拋棄已經(jīng)損壞的數(shù)據(jù)。
由于其簡(jiǎn)單性,UDP套接字具有一些與我們之前所看到的TCP套接字不同的特征。
例如,UDP套接字在使用前不需要進(jìn)行連接。TCP協(xié)議與電話通信相似,而UDP協(xié)議則與郵件通信相似:你寄包裹或信件時(shí)不需要進(jìn)行"連接",但是你得為每個(gè)包裹和信件指定目的地址。類似的,每條信息(即數(shù)據(jù)報(bào)文,datagram)負(fù)載了自己的地址信息,并與其他信息相互獨(dú)立。在接收信息時(shí),UDP套接字扮演的角色就像是一個(gè)信箱,從不同地址發(fā)送來的信件和包裹都可以放到里面。一旦被創(chuàng)建,UDP套接字就可以用來連續(xù)地向不同的地址發(fā)送信息,或從任何地址接收信息。
UDP套接字與TCP套接字的另一個(gè)不同點(diǎn)在于他們對(duì)信息邊界的處理方式不同:UDP套接字將保留邊界信息。這個(gè)特性使應(yīng)用程序在接受信息時(shí),從某些方面來說比使用TCP套接字更簡(jiǎn)單。
最后一個(gè)不同點(diǎn)是,UDP協(xié)議所提供的端到端傳輸服務(wù)是盡力而為(best-effort)的,即UDP套接字將盡可能地傳送信息,但并不保證信息一定能成功到達(dá)目的地址,而且信息到達(dá)的順序與其發(fā)送順序不一定一致(就像通過郵政部門寄信一樣)。因此,使用了UDP套接字的程序必須準(zhǔn)備好處理信息的丟失和重排。(稍后我們將給出一個(gè)這樣的例子)
既然UDP協(xié)議為程序帶來了這個(gè)額外的負(fù)擔(dān),為什么還會(huì)使用它而不使用TCP協(xié)議呢?
原因之一是效率:如果應(yīng)用程序只交換非常少量的數(shù)據(jù),例如從客戶端到服務(wù)器端的簡(jiǎn)單請(qǐng)求消息,或一個(gè)反方向的響應(yīng)消息,TCP連接的建立階段就至少要傳輸其兩倍的信息量(還有兩倍的往返延遲時(shí)間)。
另一個(gè)原因是靈活性:如果除可靠的字節(jié)流服務(wù)外,還有其他的需求,UDP協(xié)議則提供了一個(gè)最小開銷的平臺(tái)來滿足任何需求的實(shí)現(xiàn)。
Java程序員通過DatagramPacket 類和 DatagramSocket類來使用UDP套接字??蛻舳撕头?wù)器端都使用DatagramSockets來發(fā)送數(shù)據(jù),使用DatagramPackets來接收數(shù)據(jù)。