簡體   English   中英

如何通過 tcp 套接字傳輸大數據

[英]how can I transfer large data over tcp socket

如何在不拆分的情況下傳輸大數據。 我正在使用 tcp 套接字。 它的游戲。 我不能使用 udp,數組中可能有 1200 個值。 我正在以 json 格式發送數組。 但是服務器接收它就像分裂一樣。

還有什么選項可以像tcp一樣發送http請求? 我需要按順序回復。 它也應該更快。

謝謝,

你不能。

  • HTTP 可能會將其分塊
  • TCP 將它分段
  • IP 會將其打包
  • 路由器會將它分段...
  • TCP 將在另一端重新組裝它。

這里沒有問題需要解決。

您對拆分數據包/數據報沒有太多控制權。 網絡決定了這一點。

在 IP 的情況下,您有 DF(不分段)標志,但我懷疑它在這里會有多大幫助。 如果您通過以太網進行通信,那么 1200 個元素的陣列可能不適合以太網幀(有效負載大小高達 1500 個八位字節的 MTU)。

為什么您的應用程序依賴於整個數據必須在單個單元中而不是在單個連接(可能由多個單元組成)中到達這一事實?

考慮問題可能出在其他地方或您可能發送過多不必要數據的想法。 在 PHP 示例中,有isset()函數。 如果您正在創建基於互聯網的回合制游戲,則不需要(每次都需要來回發送所有 1,200 個變量。只需發送更改的內容,當其他玩家收到該數據時,僅更改設置的變量。

如何在不拆分的情況下傳輸大數據。

我將上述解釋大致等同於“如何使用盡可能少的 TCP 數據包通過 TCP 連接傳輸我的數據”。 正如其他人所指出的,無法保證您的數據將被放入單個 TCP 數據包中——但您可以做一些事情來使其更有可能。 以下是我會做的一些事情:

  1. 保持單個 TCP 連接打開。 (HTTP 傳統上為每個請求打開一個單獨的 TCP 連接,但對於低延遲,您不能這樣做。相反,您需要打開一個 TCP 連接,保持打開狀態,並繼續在其上發送/接收數據作為必要時)。
  2. 減少需要發送的數據量。 (即,您發送的內容是否是接收程序已經知道的?如果是,請不要發送它們)
  3. 減少需要發送的字節數。 (最簡單的方法是在發送之前對您的消息數據進行zlib壓縮,並讓接收程序在收到消息后解壓縮消息。這可以使您的大小減少 50-90%,具體取決於您的數據內容)
  4. 關閉 TCP 套接字上的Nagle 算法 這會將延遲減少 200 毫秒,並阻止 TCP 堆棧使用您的數據玩不必要的游戲。
  5. 使用單個 send() 調用發送每個數據包(如果這意味着在調用 send() 之前手動將所有數據項復制到單獨的內存緩沖區中,那么就這樣吧)。

請注意,即使在您完成上述所有操作之后,TCP 層有時仍會將您的消息傳播到多個數據包等中——這就是 TCP 的工作方式。 即使您的本地 TCP 堆棧從未這樣做,接收計算機的 TCP 堆棧有時仍會將來自連續 TCP 數據包的數據合並到其接收緩沖區中。 所以接收程序有時總是會“像拆分一樣接收”,因為 TCP 是基於流的協議,不維護消息邊界。 (如果你想要消息邊界,你必須自己做幀——最簡單的方法通常是在每條消息之前發送一個固定大小(例如 1、2 或 4 字節)的整數字節計數字段,所以接收方知道在解析完整消息之前需要讀入多少字節)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM