2012-12-24 52 views
2

我通過asio::tcp::socket發送TCP數據包。什麼決定了boost :: asio中TCP數據包的數量?

我的問題是每次雖然我發送數據是關於800字節和最大分組大小爲1500字節數據在超過5個分組發送。

(我檢查包和sniffsmart軟件中的數據的數量)

這是爲什麼?

我應該如何解決或追蹤此問題?

回答

4

編輯:TCP等流媒體協議中的數據包數量取決於您的網絡配置。但是,這個答案優化了套接字的使用,因此程序根據傳輸數據包的數量不增加任何開銷。

如果您試圖獲得更大的數據包,您應該嘗試將所有數據一次放入套接字。你可能自己把它分成多個包。由於TCP的Nagle's算法,TCP堆棧會立即向對等方發送可用數據。因此,如果您在多個場合將數據放在套接字上,其餘數據將轉到下一個數據包。

或者,你可以關閉Nagle算法是這樣的:

m_socket.set_option(tcp::no_delay(true)); 
+1

無論如何,這並不能保證1500包的長度。 – PSIAlt

+0

我的問題是,比最大數據包大小小的數據被髮送到多個數據包中,在這種情況下,這個答案是合適的。 – Shohreh

+1

雖然這個答案在某種意義上是正確的,但TCP仍然是一個基於流的協議,並且您不應該在send()到1-1的recv()調用中進行中繼。 – Chad

0

TCP是一種流數據。 send()只將數據放入發送緩衝區,系統TCP棧實現決定如何將數據放入網絡。這就是爲什麼通過嗅探看到的數據包與您的send()調用不匹配的原因。如果你真的想發送數據包以匹配send(),我記得有一個TCP選項。你可以檢查一下,我現在不記得它。

+0

我發送的數據是大約500字節,800字節是網絡上的數據的大小,但它仍然發送多個數據包 – Shohreh

+0

應該先解決地址並獲得物理地址,不是建立TCP連接等。連接是TCP中最繁重的操作。連接建立後你是否測量了這個? – Lazin

+0

是的,我正在接收另一端的數據 – Shohreh

1

TCP是一個流。你無法控制某些數據包將包含什麼。您可以打開/關閉Nagle算法,這會影響傳輸速度,但您無法控制數據包的大小。更多的,這些數據包可以被路由器上的任何路由器分割/連接。因此,它的性質,你不能改變這一點。

相關問題