睿文小說 > 電子郵件係統 > UDP

UDP

⬅ 上一章 📋 目錄 ⚠ 報錯 下一章 ➡
⭐ 加入書籤
推薦閱讀: 花都風流第一兵王 代嫁寵妻是替身 天鋒戰神 穿越古代賺錢養娃 我覺醒了神龍血脈 我的老婆國色天香 隱婚嬌妻別想跑 遲遲也歡喜 全職獵人之佔蔔師

{

\"code\": 200,

\"title\": \"\",

\"content\": \"UDP是UserDatagramProtocol的簡稱,中文名是使用者資料包協議,是OSI參考模型中一種無連線的傳輸層協議,提供麵向事務的簡單不可靠資訊傳送服務。它是IETFRFC768是UDP的正式規範。\\n\\nUDP是OSI參考模型中一種無連線的傳輸層協議,提供麵向事務的簡單不可靠資訊傳送服務。UDP協議基本上是IP協議與上層協議的介麵。UDP協議適用分彆執行在同一台裝置上的多個應用程式。\\n\\n簡介\\n\\nUDP協議的全稱是使用者資料包協議,在網路中它與TCP協議一樣用於處理\\n\\nUDP\\n\\nUDP資料包,是一種無連線的協議。在OSI模型中,在第四層——傳輸層,\\n\\n處於IP協議的上一層。UDP有不提供資料包分組、組裝和不能對資料包進行排序的缺點,也就是說,當報文傳送之後,是無法得知其是否安全完整到達的。UDP用來支援那些需要在計算機之間傳輸資料的網路應用。包括網路視訊會議係統在內的眾多的客戶\\/伺服器模式的網路應用都需要使用UDP協議。UDP協議從問世至今已經被使用了很多年,雖然其最初的光彩已經被一些類似協議所掩蓋,但是即使是在今天,UDP仍然不失為一項非常實用和可行的網路傳輸層協議。\\n\\n與所熟知的TCP(傳輸控製協議)協議一樣,UDP協議直接位於IP(網際協議)協議的頂層。根據OSI(開放係統互連)參考模型,UDP和TCP都屬於傳輸層協議。\\n\\nUDP協議的主要作用是將網路資料流量壓縮成資料包的形式。一個典型的資料包就是一個二進製資料的傳輸單位。每一個資料包的前8個位元組用來包含報頭資訊,剩餘位元組則用來包含具體的傳輸資料。\\n\\n使用UDP\\n\\n在選擇使用協議的時候,選擇UDP必須要謹慎。在網路質量令人不十分滿意的環境下,UDP協議資料包丟失會比較嚴重。但是由於UDP的特性:它不屬於連線型協議,因而具有資源消耗小,處理速度快的優點,所以通常音訊、視訊和普通資料在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個資料包,也不會對接收結果產生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協議。\\n\\nUDP報頭\\n\\nUDP\\n\\nUDP報頭由4個域組成,其中每個域各占用2個位元組,具體如下:\\n\\nUDP源\\n\\n號\\n\\n目標號\\n\\n資料包長度\\n\\n校驗值\\n\\nUDP協議使用號為不同的應用保留其各自的資料傳輸通道。UDP和TCP協議正是采用這一機製實現對同一時刻內多項應用同時傳送和接收資料的支援。資料傳送一方(可以是客戶端或伺服器端)將UDP資料包通過源傳送出去,而資料接收一方則通過目標接收資料。有的網路應用隻能使用預先為其預留或註冊的靜態;而另外一些網路應用則可以使用未被註冊的動態。因為UDP報頭使用兩個位元組存放號,所以號的有效範圍是從0到65535。一般來說,大於49151的號都代表動態。\\n\\n資料包的長度是指包括報頭和資料部分在內的總位元組數。因為報頭的長度是固定的,所以該域主要被用來計算可變長度的資料部分(又稱為資料負載)。資料包的最大長度根據操作環境的不同而各異。從理論上說,包含報頭在內的資料包的最大長度為65535位元組。不過,一些實際應用往往會限製資料包的大小,有時會降低到8192位元組。\\n\\nUDP協議使用報頭中的校驗值來保證資料的安全。校驗值首先在資料傳送方通過特殊的演演算法計算得出,在傳遞到接收方之後,還需要再重新計算。如果某個資料包在傳輸過程中被第三方篡改或者由於線路噪音等原因受到損壞,傳送和接收方的校驗計算值將不會相符,由此UDP協議可以檢測是否出錯。這與TCP協議是不同的,後者要求必須具有校驗值。\\n\\n許多鏈路層協議都提供錯誤檢查,包括流行的乙太網協議,也許想知道為什麼UDP也要提供檢查和。其原因是鏈路層以下的協議在源端和終端之間的某些通道可能不提供錯誤檢測。雖然UDP提供有錯誤檢測,但檢測到錯誤時,UDP不做錯誤校正,隻是簡單地把損壞的訊息段扔掉,或者給應用程式提供警告資訊。\\n\\nUDP協議的幾個特性\\n\\nUDP\\n\\n(1)UDP是一個無連線協議,傳輸資料之前源端和終端不建立連線,當\\n\\nUDP它想傳送時就簡單地去抓取來自應\\n\\n用程式的資料,並儘可能快地把它扔到網路上。在傳送端,UDP傳送資料的速度僅僅是受應用程式生成資料的速度、計算機的能力和傳輸頻寬的限製;在接收端,UDP把每個訊息段放在佇列中,應用程式每次從佇列中讀一個訊息段。\\n\\n(2)由於傳輸資料不建立連線,因此也就不需要維護連線狀態,包括收髮狀態等,因此一台服務機可同時向多個客戶機傳輸相同的訊息。\\n\\n(3)UDP資訊包的標題很短,隻有8個位元組,相對於TCP的20個位元組資訊包的額外開銷很小。\\n\\n(4)吞吐量不受擁擠控製演演算法的調節,隻受應用軟體生成資料的速率、傳輸頻寬、源端和終端主機效能的限製。\\n\\n(5)UDP使用儘最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連結狀態表(這裡麵有許多引數)。\\n\\n(6)UDP是麵向報文的。傳送方的UDP對應用程式交下來的報文,在新增首部後就向下交付給IP層。既不拆分,也不合併,而是保留這些報文的邊界,因此,應用程式需要選擇合適的報文大小。\\n\\n雖然UDP是一個不可靠的協議,但它是分發資訊的一個理想協議。例如,在螢幕上報告股票市場、在螢幕上顯示航空資訊等等。UDP也用在路由資訊協議RIP(RoutingInformationProtocol)中修改路由表。在這些應用場合下,如果有一個訊息丟失,在幾秒之後另一個新的訊息就會替換它。UDP廣泛用在多媒體應用中,例如,ProgressiveNetworks公司開發的RealAudio軟體,它是在因特網上把預先錄製的或者現場音樂實時傳送給客戶機的一種軟體,該軟體使用的RealAudioaudio-on-demandprotocol協議就是執行在UDP之上的協議,大多數因特網電話軟體產品也都執行在UDP之上。\\n\\n化學中的UDP\\n\\nUDP=uridinediphosphate,尿苷二磷酸,一種嘧啶核苷酸,由堿基、尿嘧啶與核糖組成,主要用途是RNA合成(轉錄)時的原料。另外UDP也是DTP能量消耗後產物,功能類似ADP,但較ADP少見。參與微生物肽聚糖等的合成。\\n\\nUDPvsTCP\\n\\nUDP\\n\\nUDP和TCP協議的主要區彆是兩者在如何實現資訊的可靠傳遞方麵不同。\\n\\nUDPTCP協議中包含了專門的傳遞保證\\n\\n機製,當資料接收方收到傳送方傳來的資訊時,會自動向傳送方發出確認訊息;傳送方隻有在接收到該確認訊息之後才繼續傳送其它資訊,否則將一直等待直到收到確認資訊為止。與TCP不同,UDP協議並不提供資料傳送的保證機製。如果在從傳送方到接收方的傳遞過程中出現資料包的丟失,協議本身並不能做出任何檢測或提示。因此,通常人們把UDP協議稱為不可靠的傳輸協議。\\n\\n相對於TCP協議,UDP協議的另外一個不同之處在於如何接收突發性的多個資料包。不同於TCP,UDP並不能確保資料的傳送和接收順序。例如,一個位於客戶端的應用程式向伺服器發出了以下4個資料包\\n\\nD1\\n\\nD22\\n\\nD333\\n\\nD4444\\n\\n但是UDP有可能按照以下順序將所接收的資料提交到服務端的應用:\\n\\nD333\\n\\nD1\\n\\nD4444\\n\\nD22\\n\\n事實上,UDP協議的這種亂序性基本上很少出現,通常隻會在網路非常擁擠的情況下纔有可能發生。\\n\\nUDP協議的應用\\n\\n既然UDP是一種不可靠的網路協議,那麼還有什麼使用價值或必要呢?其實不然,在有些情況下UDP協議可能會變得非常有用。因為UDP具有TCP所望塵莫及的速度優勢。雖然TCP協議中植入了各種安全保障功能,但是在實際執行的過程中會占用大量的係統開銷,無疑使速度受到嚴重的影響。反觀UDP由於排除了資訊可靠傳遞機製,將安全和排序等功能移交給上層應用來完成,極大降低了執行時間,使速度得到了保證。\\n\\n關於UDP協議的最早規範是RFC768,1980年釋出。儘管時間已經很長,但是UDP協議仍然繼續在主流應用中發揮著作用。包括視訊電話會議係統在內的許多應用都證明瞭UDP協議的存在價值。因為相對於可靠性來說,這些應用更加註重實際效能,所以為了獲得更好的使用效果(例如,更高的畫麵幀重新整理速率)往往可以犧牲一定的可靠性(例如,畫麵質量)。這就是UDP和TCP兩種協議的權衡之處。根據不同的環境和特點,兩種傳輸協議都將在今後的網路世界中發揮更加重要的作用。\\n\\nUDP程式設計\\n\\nUDPServer程式\\n\\n1、編寫UDPServer程式的步驟\\n\\n(1)使用socket()來建立一個UDPsocket,第二個引數為SOCK_DGRAM。\\n\\n(2)初始化sockaddr_in結構的變數,並賦值。sockaddr_in結構定義:\\n\\nstructsockaddr_in{\\n\\nuint8_tsin_len;\\n\\nsa_family_tsin_family;\\n\\nin_port_tsin_port;\\n\\nstructin_addrsin_addr;\\n\\ncharsin_zero[8];\\n\\n};\\n\\n這裡使用“08”作為服務程式的,使用“INADDR_ANY”作為繫結的IP地址即任何主機上的地址。\\n\\n(3)使用bind()把上麵的socket和定義的IP地址和繫結。這裡檢查bind()是否執行成功,如果有錯誤就退出。這樣可以防止服務程式重複執行的問題。\\n\\n(4)進入無限迴圈程式,使用recvfrom()進入等待狀態,直到接收到客戶程式傳送的資料,就處理收到的資料,並向客戶程式傳送反饋。這裡是直接把收到的資料發回給客戶程式。\\n\\n2、udpserv.c程式內容\\n\\n#include\\n\\n#include\\n\\n#include\\n\\n#include\\n\\n#include\\n\\n#include\\n\\n#defineMAXLINE80\\n\\n#defineSERV_PORT8888\\n\\nvoiddo_echo(intsockfd,structsockaddr*pcliaddr,socklen_tclilen)\\n\\n{\\n\\nintn;\\n\\nsocklen_tlen;\\n\\ncharmesg[MAXLINE];\\n\\nfor(;;)\\n\\n{\\n\\nlen=clilen;\\n\\n\\/*waitingforreceivedata*\\/\\n\\nn=recvfrom(sockfd,mesg,MAXLINE,0,pcliaddr,&len);\\n\\n\\/*sentdatabacktoclient*\\/\\n\\nsendto(sockfd,mesg,n,0,pcliaddr,len);\\n\\n}\\n\\n}\\n\\nintmain(void)\\n\\n{\\n\\nintsockfd;\\n\\nstructsockaddr_inservaddr,cliaddr;\\n\\nsockfd=socket(AF_INET,SOCK_DGRAM,0);\\/*createasocket*\\/\\n\\n\\/*initservaddr*\\/\\n\\nbzero(&servaddr,sizeof(servaddr));\\n\\nservaddr.sin_family=AF_INET;\\n\\nservaddr.sin_addr.s_addr=htonl(INADDR_ANY);\\n\\nservaddr.sin_port=htons(SERV_PORT);\\n\\n\\/*bindaddressandporttosocket*\\/\\n\\nif(bind(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))==-1)\\n\\n{\\n\\nperror(\\\"binderror\\\");\\n\\nexit(1);\\n\\n}\\n\\ndo_echo(sockfd,(structsockaddr*)&cliaddr,sizeof(cliaddr));\\n\\nreturn0;\\n\\n}\\n\\nUDPClient程式\\n\\n1、編寫UDPClient程式的步驟\\n\\n(1)初始化sockaddr_in結構的變數,並賦值。這裡使用“8888”作為連線的服務程式的,從命令列引數讀取IP地址,並且判斷IP地址是否符合要求。\\n\\n(2)使用socket()來建立一個UDPsocket,第二個引數為SOCK_DGRAM。\\n\\n(3)使用connect()來建立與服務程式的連線。與TCP協議不同,UDP的connect()並冇有與服務程式三次握手。上麵說了UDP是非連線的,實際上也可以是連線的。使用連線的UDP,kernel可以直接返回錯誤資訊給使用者程式,從而避免由於冇有接收到資料而導致呼叫recvfrom()一直等待下去,看上去好像客戶程式冇有反應一樣。\\n\\n(4)向服務程式傳送資料,因為使用連線的UDP,所以使用write()來替代sendto()。這裡的資料直接從標準輸入讀取使用者輸入。\\n\\n(5)接收服務程式發回的資料,同樣使用read()來替代recvfrom()。\\n\\n(6)處理接收到的資料,這裡是直接輸出到標準輸出上。\\n\\nudpclient.c程式內容:\\n\\n#include\\n\\n#include\\n\\n#include\\n\\n#include\\n\\n#include\\n\\n#include\\n\\n#defineMAXLINE80\\n\\n#defineSERV_PORT8888\\n\\nvoiddo_cli(FILE*fp,intsockfd,structsockaddr*pservaddr,socklen_tservlen)\\n\\n{\\n\\nintn;\\n\\ncharsendline[MAXLINE],recvline[MAXLINE 1];\\n\\n\\/*connecttoserver*\\/\\n\\nif(connect(sockfd,(structsockaddr*)pservaddr,servlen)==-1)\\n\\n{\\n\\nperror(\\\"connecterror\\\");\\n\\nexit(1);\\n\\n}\\n\\nwhile(fgets(sendline,MAXLINE,fp)!=NULL)\\n\\n{\\n\\n\\/*readalineandsendtoserver*\\/\\n\\nwrite(sockfd,sendline,strlen(sendline));\\n\\n\\/*receivedatafromserver*\\/\\n\\nn=read(sockfd,recvline,MAXLINE);\\n\\nif(n==-1)\\n\\n{\\n\\nperror(\\\"readerror\\\");\\n\\nexit(1);\\n\\n}\\n\\nrecvline[n]=0;\\/*terminatestring*\\/\\n\\nfputs(recvline,stdout);\\n\\n}\\n\\n}\\n\\nintmain(intargc,char**argv)\\n\\n{\\n\\nintsockfd;\\n\\nstructsockaddr_insrvaddr;\\n\\n\\/*checkargs*\\/\\n\\nif(argc!=2)\\n\\n{\\n\\nprintf(\\\"usage:udpclient\\\\n\\\");\\n\\nexit(1);\\n\\n}\\n\\n\\/*initservaddr*\\/\\n\\nbzero(&servaddr,sizeof(servaddr));\\n\\nservaddr.sin_family=AF_INET;\\n\\nservaddr.sin_port=htons(SERV_PORT);\\n\\nif(inet_pton(AF_INET,argv,&servaddr.sin_addr)

第 1 頁
⬅ 上一章 📋 目錄 ⚠ 報錯 下一章 ➡
升級 VIP · 無廣告 + VIP 章節全解鎖
👑 VIP 特權 全站去廣告清爽閱讀 · VIP 章節無限暢讀,月卡僅 $5
報錯獎勵 發現文字亂碼、缺章、內容重複?點上方「章節報錯」回報,審核通過立獲 3天VIP
書單獎勵 前往 個人中心 投稿你的私藏書單,審核通過立獲 7天VIP
⭐ 立即升級 VIP · 月卡僅 $5
還沒有帳號? 免費註冊 | 登入後購買