SOCKET UDP通信要點

1. 建立socket時要指定socket類型爲 SOCK_DGRAM編程

2. UDP通信一樣採用server/client架構,server端負責監聽(經過receivefrom)client發送過來的數據,並應答(若是須要的話)。網絡

3. 由於是無鏈接方式通信,發送方調用sendto時須要指定接收主機的IP地址和端口(注:接收方調用receivefrom時不須要指定發送主機的信息架構

4. 接收主機調用receivefrom可接收到任何發送到該主機指定端口的udp數據,而且同時獲取到發送方的sokect地址信息(包括IP地址和端口號);socket

5. UDP通信是有長度限制的,具體參考下文:spa

在進行UDP編程的時候,咱們最容易想到的問題就是,一次發送多少bytes好?    
固然,這個沒有惟一答案,相對於不一樣的系統,不一樣的要求,其獲得的答案是不同的,我這裏僅對    
像ICQ一類的發送聊天消息的狀況做分析,對於其餘狀況,你或許也能獲得一點幫助:    
首先,咱們知道,TCP/IP一般被認爲是一個四層協議系統,包括鏈路層,網絡層,運輸層,應用層.    
UDP屬於運輸層,下面咱們由下至上一步一步來看:    
以太網(Ethernet)數據幀的長度必須在46-1500字節之間,這是由以太網的物理特性決定的.    
這個1500字節被稱爲鏈路層的MTU(最大傳輸單元).    
但這並非指鏈路層的長度被限制在1500字節,其實這這個MTU指的是鏈路層的數據區.    
並不包括鏈路層的首部和尾部的18個字節.    
因此,事實上,這個1500字節就是網絡層IP數據報的長度限制.    
由於IP數據報的首部爲20字節,因此IP數據報的數據區長度最大爲1480字節.    
而這個1480字節就是用來放TCP傳來的TCP報文段或UDP傳來的UDP數據報的.    
又由於UDP數據報的首部8字節,因此UDP數據報的數據區最大長度爲1472字節.    
這個1472字節就是咱們可使用的字節數。    
   
當咱們發送的UDP數據大於1472的時候會怎樣呢?    
這也就是說IP數據報大於1500字節,大於MTU.這個時候發送方IP層就須要分片(fragmentation).    
把數據報分紅若干片,使每一片都小於MTU.而接收方IP層則須要進行數據報的重組.    
這樣就會多作許多事情,而更嚴重的是,因爲UDP的特性,當某一片數據傳送中丟失時,接收方便    
沒法重組數據報.將致使丟棄整個UDP數據報。    
   
所以,在普通的局域網環境下,我建議將UDP的數據控制在1472字節如下爲好.    
   
進行Internet編程時則不一樣,由於Internet上的路由器可能會將MTU設爲不一樣的值.    
若是咱們假定MTU爲1500來發送數據的,而途經的某個網絡的MTU值小於1500字節,那麼系統將會使用一系列的機    
制來調整MTU值,使數據報可以順利到達目的地,這樣就會作許多沒必要要的操做.    
   
鑑於Internet上的標準MTU值爲576字節,因此我建議在進行Internet的UDP編程時.    
最好將UDP的數據長度控件在548字節(576-8-20)之內. server

相關文章
相關標籤/搜索