㈠ 請教lwip udp數據接收緩存大小如何設置
本來就是每個SOCKET有一個緩沖區的
㈡ C# udp是什麼意思啊,是干什麼的啊
最普遍的介紹:
UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據包協議,是一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。UDP是與TCP相對應的協議,它是面向非連接的協議,它不與對方連接,而直接把數據包發送過去。「面向非連接」就是正式通信前不必與對方建立連接,不管對方狀態就直接發送。
特點是什麼:
(1)UDP是一個無連接協議,傳輸數據之前,源端和終端不建立連接,當它想傳送時就簡單的抓取來自應用程序的數據,並盡可能快的把他扔到網路上。在發送端UDP傳送的速度僅僅是受應用程序數據生成的速度、計算機能力和傳輸帶寬限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀取一個消息段。
(2)由於傳輸數據不建立連接,因此也就不需要維護連接狀態,包括收發狀態等,因此一台服務機可同時向多台客戶機傳輸相同的信息。
(3)UDP信息包的標題很短,只有8個位元組,相對於TCP的20個位元組信息包的額外開銷很小。
(4)吞吐量不受擁擠控制演算法的調節,只受應用軟體生成數據的速率、傳輸寬頻、源端和終端主機性能的限制。
(5)UDP使用盡量最大努力交付,即不保證可靠交付,因此主機不需要維持復雜的鏈接狀態表(該表中有許多參數)。
(6)UDP是面向報文的。發送方對應用程序交下來的報文,在添加首部後就向下交付個IP層。既不拆分,也不合並,而是保留這些報文的邊界,因此,應用程序需要選擇合適的報文大小。
舉例說明應用場景:
一般用於實時視頻通訊,例如QQ
實時音視頻是可以而且應該用 UDP 的,一方面因為它常常涉及到網路穿透,另外一方面它不需要重傳。——我需要實時的看到你的圖像跟聲音,至於中間丟一幀什麼的完全不重要。而為了重傳往往會造成延遲與不同步,考慮一下,某一幀因為重傳,導致0.5秒以後才到,那麼整個音視頻就延遲了0.5秒。
考慮一下接收方看視頻,如果使用 TCP 導致視頻的中間延遲了0.5秒,只要我不按「快進」鍵,那麼後續的視頻全都會比發送方延遲0.5秒。這種延遲是累加的,隨著持續丟幀,延遲會越來越大,達到數秒,甚至分鍾級,這會嚴重影響實時音視頻的用戶體驗。
因此「實時音視頻聊天」功能通常都會使用 UDP 實現。
其它含義:
註:UDP比TCP更容易穿越路由器防火牆。
註:在互聯網技術中,UDP常用在緩存讀取,保存;用在監控或終端上報。
註:在選擇使用協議的時候,選擇UDP必須要謹慎。在網路質量令人十分不滿意的環境下,UDP協議數據包丟失會比較嚴重。但是由於UDP的特性:它不屬於連接型協議,因而具有資源消耗小,處理速度快的優點,所以通常音頻、視頻和普通數據在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協議。
㈢ UDP/TS碼流丟包問題解決思路
在有UDP傳輸視頻的業務,可以從以下角度去思考:
1 網路擁塞。這是很關鍵的原因,開發過程中由於涉及到不同庫/組件的協同開發,往往會把注意力集中到介面層面,而忽視了網路頃指環境本身。視頻業務需要帶寬較寬,調試過程可以單獨組網以及使用千兆交換機。
2 recv-Q。recv-Q是度量socket接收緩沖擁塞情況的一個指標。可以使用netstat -anu 觀察socket介面緩沖的擁塞情況。
3 增加socket緩沖大小。可以修改 /proc/sys/net/core/rmem_default 和/proc/sys/net/core/rmem_max 調整內核默認分配給每個介面的緩沖大小。亦可在調用socket介面時設帶檔置緩沖大小,須知用戶設置的緩沖大小不應該比rmem_max大。
4 優化業務流程。UDP接收業務中,若數據處理的速度小於數據接收的速度,則可能造成socket介面緩沖堆積。緩沖滿了,便會丟包。若下游的業務速度無法優化,則可以非同步接收和處理流程,通常是在接收和處理流程之間雀行配增加一個緩存。
5 TS流分析工具。可以通過wireshark將需要分析的TS碼流過濾出來,右鍵Follow選UDP,show and save data as raw,把TS碼流保存下來,可以在VLC上播放。可以把TS碼流 文件拖到Elecard StreamAnalyzer 工具,點擊Report按鈕,即可分析TS碼流丟包情況。
㈣ 請教lwip udp數據接收緩存大小如何設置
在VB中利用UDP協議編寫聊天程序UDP 協議是一種無連接協議,兩台計算機之間的數據傳輸類似於傳遞郵件:消息從一台計算機發送到另一台計算機,但是兩者之間沒有明確的連接。 由於UDP 協議不需要顯式的連接,就需要在兩個Winsock控制項中間發送數據
㈤ 現在一般網路視頻用的什麼傳輸方式,是TCP還是UDP,播放是否有受損怎麼把客戶端的視頻保存
視頻一般是用UDP,比如聊天軟體的視頻,既然是UDP肯定就要有損賣枝喊,比如損失質中野量等,保存?你是要保存視頻?那直接找個錄像軟體錄下來不就搭亮可以了
㈥ c#udpclient發送多次緩存不足
驅動安裝錯誤。c#udpclient發送多次神梁緩存慶叢不足是因為驅動安裝錯誤,需要重新安裝驅動。UDP是一個非連接的協議,傳輸數據之前源端和終端不建立連接,當想傳送時就簡單地去抓取來自應游差運用程序的數據。
㈦ 視頻緩存么意思
緩沖就是先讀取文件的一部分,然後再播放出來,這個就是緩沖.在欣賞和觀看在線的音頻和視頻時候都是有緩沖現象出現的.如果你的網路速度不穩定,就會出現聽一會就緩沖一會的問題.如果你網路穩定,那麼就不會有這個問題出現了.
一般對於音頻來說,建議你使用http協議.如果是視頻,建議使用UDP協議.緩沖是為了保證你畫面的流暢,就要先進行緩沖把數據下載到本地硬碟或者內存上然後再播放,這樣就相當於從本地硬碟上讀取數據來播放,以免網路鏈接狀況的不穩定給你的觀看帶來負面影響
滿意請好評!
㈧ ehcache rmi 的udp方式同步緩存,他的廣播地址怎麼確認
Ehcache緩存同步有幾種方式:(1)RMI (2)Terrocotta (3)JMS (4)JGroups
先介紹下,利用RMI進行緩存同步。
測試類1:在sampleDistributedCache2緩存中查找是否存在ehcache鍵,如果沒找到,則列印NotFound;如果找到了,則列印相應值
[java] view plain
package my.test.ehcache1;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import net.sf.ehcache.management.ManagementService;
public class EHCacheTest {
public static void main(String[] args) {
InputStream is = EHCacheTest.class
.getResourceAsStream("/my/test/ehcache1/ehcache.xml");
//讀入配置
CacheManager cacheManager = new CacheManager(is);
//列印初始緩存
String[] cacheNames = cacheManager.getCacheNames();
printNames(cacheNames);
//移除緩存
cacheManager.removeCache("sampleDistributedCache1");
cacheNames = cacheManager.getCacheNames();
printNames(cacheNames);
//新建緩存
Cache cache = new Cache("Test1", 100, true, false, 10, 10);
cacheManager.addCache(cache);
cacheNames = cacheManager.getCacheNames();
printNames(cacheNames);
cache.put(new Element("test1", "value1"));
//得到緩存並插入值(這里監聽器被調用)
cache = cacheManager.getCache("sampleCache3");
for (int i = 0; i < 20; i++) {
cache.put(new Element("key" + i, "value" + i));
}
cache.get("key10");
// distributed -- rmi同步
cache = cacheManager.getCache("sampleDistributedCache2");
for (int i = 0; i < 100; i++) {
cache.put(new Element("key" + i , "value" + i));
}
//注冊被管理的Bean
// JMX -- jconsole(MBeanServer)
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ManagementService.registerMBeans(cacheManager, mBeanServer, true, true,
true, true);
for (int i = 0; i < 10; i++) {
Element temp = cache.get("ehcache");
if (temp != null) {
System.out.println(temp.getValue());
} else {
System.out.println("NotFound");
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// distributed cache using RMI
// 1.Peer Discovery --
// 2.CacheManager --
// 3.cache replication -- cacheEventListenerFactory
// 4.Bootstrap -- 啟動後同步
}
private static void printNames(String[] names) {
System.out.println("=======================");
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
}
}
配置文件1:將官方樣例文件中相應位置替換即可
(1)其他JVM提供緩存的rmiUrl地址
[java] view plain
<
class="net.sf.ehcache.distribution."
properties="peerDiscovery=manual,
rmiUrls=//localhost:40002/sampleDistributedCache2"
propertySeparator=","
/>
(2)監聽來自於其他復制節點消息的本JVM的host,port
[xhtml] view plain
<
class="net.sf.ehcache.distribution."
properties="hostName=localhost, port=40001, socketTimeoutMillis=2000"
/>
(3)配置復制選項,啟動時同步等
[xhtml] view plain
<cache name="sampleDistributedCache2"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
overflowToDisk="false">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true,
replicatePutsViaCopy=true, replicateUpdates=true,
replicateUpdatesViaCopy=true, replicateRemovals=true,
=200"/>
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution."/>
</cache>
測試類2:向sampleDistributedCache2緩存中添加ehcache鍵
[java] view plain
package my.test.ehcache2;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import net.sf.ehcache.Statistics;
import net.sf.ehcache.management.ManagementService;
import net.sf.ehcache.statistics.LiveCacheStatistics;
public class EHCacheTest {
public static void main(String[] args) {
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//讀入配置
InputStream is = EHCacheTest.class.getResourceAsStream("/my/test/ehcache2/ehcache.xml");
CacheManager cacheManager = new CacheManager(is);
//列印初始緩存
String[] cacheNames = cacheManager.getCacheNames();
printNames(cacheNames);
//注冊管理Bean
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ManagementService.registerMBeans(cacheManager, mBeanServer, true, true, true, true);
//distributed
Cache cache = cacheManager.getCache("sampleDistributedCache2");
printCache(cache);
//添加值後另一個虛擬機的緩存通過RMI會同步緩存,並讀到這個值
cache.put(new Element("ehcache", "newaddvalue"));
}
private static void printNames(String[] names) {
System.out.println("=======================");
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
}
private static void printCache(Cache cache) {
int size = cache.getSize();
long memSize = cache.getMemoryStoreSize();
long diskSize = cache.getDiskStoreSize();
Statistics stat = cache.getStatistics();
LiveCacheStatistics liveStat = cache.getLiveCacheStatistics();
long hits = stat.getCacheHits();
long missed = stat.getCacheMisses();
long hitsOnDisk = stat.getOnDiskHits();
long liveHits = liveStat.getCacheHitCount();
long liveMissed = liveStat.getCacheMissCount();
StringBuilder sb = new StringBuilder();
sb.append("size=" + size + ";memsize=" + memSize);
sb.append(";diskSize=" + diskSize + ";hits=" + hits);
sb.append(";missed=" + missed + ";liveHits=" + liveHits);
sb.append(";liveMissed=" + liveMissed + ";hitsOnDisk=" + hitsOnDisk);
System.out.println(sb.toString());
}
}
配置文件:將官方樣例文件中相應位置替換即可
[xhtml] view plain
<
class="net.sf.ehcache.distribution."
properties="peerDiscovery=manual,
rmiUrls=//localhost:40001/sampleDistributedCache2"
propertySeparator=","
/>
[xhtml] view plain
<
class="net.sf.ehcache.distribution."
properties="hostName=localhost, port=40002, socketTimeoutMillis=2000"
/>
[xhtml] view plain
<cache name="sampleDistributedCache2"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
overflowToDisk="false">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true,
replicatePutsViaCopy=true, replicateUpdates=true,
replicateUpdatesViaCopy=true, replicateRemovals=true,
=200"/>
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution."/>
</cache>
㈨ java使用UDP 如果我定義了一個1024byte的緩存,而接收到的只有16個byte剩餘的怎麼處理
byte[] b = new byte[1024];
int len = 輸入流.read(b)://從輸入流中讀取數據裝填到數組b中,len保存的是讀到的有效位元組數
while( len != - 1 ){ //為-1表示沒有數據可讀
String str = new String(b, 0, len); //把裝數字的數組中本次讀到的數據new成string
或者
輸出流.write( b, 0, len); //向輸出流中寫len個位元組數據。剩下的你不用管它。
}
記住,len記錄了每次讀到的有效位元組個數,如果接收的只有16個,那麼你只用取16個拿出來用,就是准確的數據。
㈩ UDP是什麼它有什麼用
UDP是User Datagram Protocol的簡稱,中文名是用戶數據報協議,是OSI參考模型中的傳輸層協議,它是一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。
UDP的正式規范是IETF RFC768。UDP在IP報文的協議號是17。
在這里插入圖片描述
在OSI模型中,UDP在第四層——傳輸層,處於IP協議的上一層。UDP有不提供數據包分組、組裝和不能對數據包進行排序的缺點,也就是說,當報文發送之後,是無法得知其是否安全完整到達的。UDP用來支持那些需要在計算機之間傳輸數據的網路應用。包括網路視頻會議系統在內的眾多的客戶/伺服器模式的網路應用都需要使用UDP協議。UDP協議從問世至今已經被使用了很多年,雖然其最初的光彩已經被一些類似協議所掩蓋,但是即使是在今天UDP仍然不失為一項非常實用和可行的網路傳輸層協議。
與所熟知的 TCP(傳輸控制協議)協議一樣,UDP 協議直接位於 IP(網際協議)協議
的頂層。根據 OSI(開放系統互連)參考模型,UDP 和 TCP 都屬於傳輸層協議。 UDP 協議
的主要作用是將網路數據流量壓縮成數據包的形式。一個典型的數據包就是一個二進制數據
的傳輸單位。每一個數據包的前 8 個位元組用來包含報頭信息,剩餘位元組則用來包含具體的傳
輸數據。
UDP報頭
在這里插入圖片描述
UDP報頭包括4個欄位,每個欄位佔用2個位元組(即16個二進制位)。
在IP4v中,「來源連接埠」和「校驗和」是可選欄位(粉色背景標出)。
在IPv6中,只有來源連接埠是可選欄位。
UDP數據報格式有首部和數據兩個部分。首部很簡單,共8位元組。包括:
源埠(Source Port):2位元組,源埠號。
目的埠(Destination Port):2位元組,目的埠號。
長度(Length):2位元組,用於校驗UDP數據報的數據欄位和包含UDP數據報首部的「偽首部」。其校驗方法用IP分組首部中的首部校驗和。
偽首部,又稱為偽包頭(Pseudo Header):是指在TCP的分段或UDP的數據報格式中,在數據報首部前面增加源IP地址、目的IP地址、IP分組和協議欄位、TCP或UDP數據報的總長度等共12位元組,所構成的擴展首部結構。此偽首部是一個臨時的結構,它既不向上也不向下傳遞,僅僅只是為了保證可以校驗套接字的正確性。
在這里插入圖片描述
TCP和UDP區別
特徵點 TCP UDP
傳輸可靠性 面向連接 面向非連接
應用場景 傳輸數據量大 傳輸量小
速度 慢 快
TCP(傳輸控制協議)提供的是面向連接、可靠的位元組流服務。當客戶端和伺服器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之後才能傳輸數據。TCP提供超時重發,丟棄重復數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。
UDP(用戶數據協議)是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP咋傳輸數據前不用在客戶和伺服器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。
由於UDP缺乏擁塞控制(congestion control),需要基於網路的機制來減少因失控和高速UDP流量負荷而導致的擁塞崩潰效應。換句話說,因為UDP發送者不能夠檢測擁塞,所以像使用包隊列和丟棄技術的路由器這樣的網路基本設備往往就成為降低UDP過大通信量的有效工具。數據報擁塞控制協議(DCCP)設計成通過在諸如流媒體類型的高速率UDP流中,增加主機擁塞控制,來減小這個潛在的問題。
UDP方式傳輸數據
發送時:先把數據放到報文,寫到緩沖區位元組數組再傳送。
接收時:從緩沖器數組讀取,打包到報文。
UDP的應用場景
在選擇使用協議的時候,選擇UDP必須要謹慎。由於缺乏可靠性且屬於非連接導向協議,UDP一般必須允許一定量的數據包丟失、出錯和復制粘貼。但有些應用,比如TFTP,需要可靠性保證,則必須在應用層增加根本的可靠機制。但是絕大多數UDP應用都不需要可靠機制,甚至可能因為引入可靠機制而降低性能。流媒體、即時多媒體游戲和IP電話(VoIP)就是典型的UDP應用。如果某個應用需要很高的可靠性,那麼可以用傳輸控制協議(及TCP協議)來代替UDP。