我通過asio::tcp::socket
發送TCP數據包。什麼決定了boost :: asio中TCP數據包的數量?
我的問題是每次雖然我發送數據是關於800字節和最大分組大小爲1500字節數據在超過5個分組發送。
(我檢查包和sniffsmart軟件中的數據的數量)
這是爲什麼?
我應該如何解決或追蹤此問題?
我通過asio::tcp::socket
發送TCP數據包。什麼決定了boost :: asio中TCP數據包的數量?
我的問題是每次雖然我發送數據是關於800字節和最大分組大小爲1500字節數據在超過5個分組發送。
(我檢查包和sniffsmart軟件中的數據的數量)
這是爲什麼?
我應該如何解決或追蹤此問題?
編輯:TCP等流媒體協議中的數據包數量取決於您的網絡配置。但是,這個答案優化了套接字的使用,因此程序根據傳輸數據包的數量不增加任何開銷。
如果您試圖獲得更大的數據包,您應該嘗試將所有數據一次放入套接字。你可能自己把它分成多個包。由於TCP的Nagle's算法,TCP堆棧會立即向對等方發送可用數據。因此,如果您在多個場合將數據放在套接字上,其餘數據將轉到下一個數據包。
或者,你可以關閉Nagle算法是這樣的:
m_socket.set_option(tcp::no_delay(true));
TCP是一個流。你無法控制某些數據包將包含什麼。您可以打開/關閉Nagle算法,這會影響傳輸速度,但您無法控制數據包的大小。更多的,這些數據包可以被路由器上的任何路由器分割/連接。因此,它的性質,你不能改變這一點。
無論如何,這並不能保證1500包的長度。 – PSIAlt
我的問題是,比最大數據包大小小的數據被髮送到多個數據包中,在這種情況下,這個答案是合適的。 – Shohreh
雖然這個答案在某種意義上是正確的,但TCP仍然是一個基於流的協議,並且您不應該在send()到1-1的recv()調用中進行中繼。 – Chad