2011-10-12 99 views
-1

只是想問什麼應該是數據從服務器和客戶端來回發送時的字節數限制,以及偉大的反饋我已經去我明白這一點,所以現在的問題是什麼大小通過連接發送的分段字節?一般? - 使用TCP協議通過連接發送的最大分段/分割字節數?

因此,如果我設置從客戶端發送到服務器的3072個字節的緩衝區大小,並且在從服務器發送數據到客戶端時相同,這些字節如何分段?通過連接發送的最大字節數是多少,以便字節不會被分割?

+0

啓用或禁用內格爾? –

+2

是哪*字節數依賴於這些東西?你在關心單個數據包嗎?你真的需要嗎? –

+0

@MarcGravell,我如何在java中啓用或禁用nagle? – redoc01

回答

2

TCP不保證在客戶端中使用一個發送命令發送的字節數與使用一個接收命令在服務器中收到的字節數相同。 TCP是基於流的,意味着它將連接視爲字節流而不是消息流。

發送此(雙發):

  1. 「你好」
  2. 「世界」

可以被接收爲:

  1. 的 「HelloWorld」

要麼。

  1. 「他」
  2. 「LLO」
  3. 「世界」

或任何其他組合。

因此,您需要能夠檢測何時一條消息結束和下一條消息開始。最常見的兩種方法是使用包含長度或後綴(如換行符)的消息頭來檢測消息的結束。

更新

TCP不應該被用於音頻流恕我直言。原因是TCP保證發送所有發送的數據包。因此,如果TCP檢測到數據包沒有到達,它將阻塞所有排隊的數據包,直到失敗的數據包到達。

當流式傳輸音頻時,所有數據包到達並不重要,一個丟失的數據包不會對聲音造成太大影響。由於網絡協議試圖傳送所有數據包,因此最好稍微有些音頻丟失,而不是讓音頻流完全停止。

+0

在堆棧溢出和在線文章的幫助下,我開發了一個實時音頻廣播。由於音頻格式產生的字節數爲174600,因此需要通過服務器發送並返回。所以我所做的就是分割數據併發送字節這樣,我將這些分割字節設置爲3072.我之所以問這個問題的原因是,當我將數據發送到分段時,我設置的字節越多,音頻質量越好產生。是的,當字節段完成時,我會發送一條消息。感謝回覆讚賞。 – redoc01

+0

查看我的更新回答。 – jgauffin

+0

酷,我會嘗試UDP,我會嘗試這種方法,但是當我瀏覽示例時,其中一篇文章提出了TCP,但我相信你是正確的。 – redoc01

1

將有關於所述一個端部和連接的另一隻手,並根據該尺寸和協議之間的MTU大小握手WICH被沿着與TCP使用。有大量數據將與一個數據包一起發送。

但是,如果您不使用低級別的API,則將數據拆分/合併到數據包中是由協議棧完成的。

0

除非你正在編寫一個TCP協議包裝器,否則你問這個問題的事實是一個很好的跡象表明你正在接近你試圖解決錯誤的任何問題。您指定的語言中的TCP實現充當抽象概念,應該使這個問題的答案完全無關緊要。

在這裏看到我的回答對數據包重組類似的問題: What's the best way to monitor a socket for new data and then process that data?

1

如果你寫3000個字節到一個TCP套接字,你會在接收方收到3000個字節。 TCP上面的協議沒有最大數量的字節。從TCP到IP將堆棧下載到下面的協議,是的,但有限制,但您的應用程序不必擔心這一點。將以太網幀分段並重新分配到ip數據報等等將會照顧你的背後。

但是,您必須擔心在應用程序級別上的協議,這是在TCP之上的。雖然TCP將提供全部3000個字節,但沒有任何一個recv調用(或任何java/php語言等價物)會一次返回全部3000個字節。在從套接字讀取所有3000個字節之前,您可能需要多次調用它。

這裏看到更多的信息:

How to know when you finish receiving a TCP stream?