2011-09-22 79 views
2

我有一個很大的1GB文件,我試圖發送到另一個節點。在發送者發送200個數據包(在發送完整文件之前)之後,代碼跳出。說「Sendto no send space available」。可能是什麼問題以及如何照顧它。通過UDP套接字發送的限制

除此之外,我們需要在此傳輸中獲得最大吞吐量。那麼我們應該使用哪種發送緩衝區大小來提高效率?

什麼是我們可以用來傳輸文件而沒有碎片的最大MTU?

感謝 日圖


謝謝你的答案。實際上,我們的項目指定使用UDP,然後使用一些額外的代碼來處理丟失的數據包。

現在我可以使用阻塞UDP套接字發送完整文件。

我正在emulab環境中運行整個設置,名爲deter。我將鏈路丟失設置爲0,但仍然有一些數據包丟失。這背後可能的原因是什麼?即使我在發送每個數據包之後添加延遲(假設接收方在緩衝區滿時丟棄數據包),仍然會丟失數據包。

+0

需要更多細節。套接字是否無阻塞? –

+5

我認爲TCP將是文件傳輸的更好選擇。你有使用UDP的理由嗎?如果是這樣,你有什麼樣的糾錯? – feathj

回答

2

也同意@jonfen。沒有用於高速文件傳輸的UDP。

UDP會產生較少的協議開銷。但是,在最大傳輸速率下,傳輸錯誤是不可避免的(如丟包)。所以必須引入TCP一樣的糾錯方案。最終結果低於TCP性能。

5

使用UDP進行高速數據傳輸是可能的,但是您必須確保不將數據發送出去的速度比網卡能夠將其傳輸到網絡上的速度要快。在實踐中,這意味着要麼使用阻塞I/O,要麼在select()上阻塞,而在select()時只發送下一個數據包表示套接字已準備好寫入。 (理想情況下,您也不會發送數據的速度超過接收設備可以接收數據的速度,但現代CPU速度通常比現代網絡I/O速度快得多),但這不是什麼問題

一旦您有該邏輯工作正常,發送緩衝區的大小並不是非常重要。 (也就是說,你的發送緩衝區永遠不會佔用1GB的文件,所以確保你的程序不會溢出發送緩衝區是發送緩衝區是大還是小的關鍵問題)接收緩衝區的大小打開接收器很重要,儘管...最好儘可能地做到這一點,因此如果接收過程被另一個程序從CPU中斷開,接收計算機不會丟棄數據包。

關於MTU,如果您想要避免數據包分段(並假設您的數據包在以太網上傳輸),則不應在每個UDP數據包中放置超過1468個字節(如果使用IPv6,則不應超過1452個字節) 。 (通過從以太網的1500字節幀大小減去必要的IP和UDP頭部的大小來計算)