一般? - 使用TCP协议通过连接发送的最大分段/分割字节数?

问题描述:

只是想问什么应该是数据从服务器和客户端来回发送时的字节数限制,以及伟大的反馈我已经去我明白这一点,所以现在的问题是什么大小通过连接发送的分段字节?一般? - 使用TCP协议通过连接发送的最大分段/分割字节数?

因此,如果我设置从客户端发送到服务器的3072个字节的缓冲区大小,并且在从服务器发送数据到客户端时相同,这些字节如何分段?通过连接发送的最大字节数是多少,以便字节不会被分割?

+0

启用或禁用内格尔? –

+2

是哪*字节数依赖于这些东西?你在关心单个数据包吗?你真的需要吗? –

+0

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

TCP不保证在客户端中使用一个发送命令发送的字节数与使用一个接收命令在服务器中收到的字节数相同。 TCP是基于流的,意味着它将连接视为字节流而不是消息流。

发送此(双发):

  1. “你好”
  2. “世界”

可以被接收为:

  1. 的 “HelloWorld”

要么。

  1. “他”
  2. “LLO”
  3. “世界”

或任何其他组合。

因此,您需要能够检测何时一条消息结束和下一条消息开始。最常见的两种方法是使用包含长度或后缀(如换行符)的消息头来检测消息的结束。

更新

TCP不应该被用于音频流恕我直言。原因是TCP保证发送所有发送的数据包。因此,如果TCP检测到数据包没有到达,它将阻塞所有排队的数据包,直到失败的数据包到达。

当流式传输音频时,所有数据包到达并不重要,一个丢失的数据包不会对声音造成太大影响。由于网络协议试图传送所有数据包,因此最好稍微有些音频丢失,而不是让音频流完全停止。

+0

在堆栈溢出和在线文章的帮助下,我开发了一个实时音频广播。由于音频格式产生的字节数为174600,因此需要通过服务器发送并返回。所以我所做的就是分割数据并发送字节这样,我将这些分割字节设置为3072.我之所以问这个问题的原因是,当我将数据发送到分段时,我设置的字节越多,音频质量越好产生。是的,当字节段完成时,我会发送一条消息。感谢回复赞赏。 – redoc01

+0

查看我的更新回答。 – jgauffin

+0

酷,我会尝试UDP,我会尝试这种方法,但是当我浏览示例时,其中一篇文章提出了TCP,但我相信你是正确的。 – redoc01

将有关于所述一个端部和连接的另一只手,并根据该尺寸和协议之间的MTU大小握手WICH被沿着与TCP使用。有大量数据将与一个数据包一起发送。

但是,如果您不使用低级别的API,则将数据拆分/合并到数据包中是由协议栈完成的。

除非你正在编写一个TCP协议包装器,否则你问这个问题的事实是一个很好的迹象表明你正在接近你试图解决错误的任何问题。您指定的语言中的TCP实现充当抽象概念,应该使这个问题的答案完全无关紧要。

在这里看到我的回答对数据包重组类似的问题: What's the best way to monitor a socket for new data and then process that data?

如果你写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?