只是想问一下当从服务器和客户端来回发送数据时应该是什么字节数限制,有了很好的反馈我已经了解了这一点,所以现在的问题是什么是通过连接发送的分段字节的大小?
因此,如果我将一个3072字节的缓冲区大小设置为从客户端发送到服务器,并且在从服务器向客户端发送数据时相同,那么这些字节如何分段?什么是通过连接发送的最大字节数,以便字节不被分段?
答案 0 :(得分:2)
TCP不保证客户端中使用一个发送命令发送的字节数与使用一个接收命令的服务器中接收的字节数相同。 TCP是基于流的,意味着它将连接视为字节流而不是消息流。
发送此信息(两个发送):
可以收到:
或
或任何其他组合。
因此,您需要能够检测到一条消息何时结束以及下一条消息何时开始。两种最常见的方法是使用包含长度的邮件头或后缀(如换行符)来检测邮件的结尾。
<强>更新强>
TCP不应该用于音频流imho。原因是TCP保证传送所有发送的数据包。因此,如果TCP检测到数据包没有到达,它将阻止所有排队的数据包,直到失败的数据包到达。
当流式传输音频时,所有数据包到达并不重要,一个丢失的数据包不会对声音造成太大影响。因为网络协议试图传送所有数据包,所以最好让音频丢失比让音频流完全停止。
答案 1 :(得分:1)
根据此大小以及与MTU
一起使用的协议,将在连接的一端和另一只手之间进行TCP
大小的握手。有一些数据将通过一个数据包发送。
但是,如果不使用低级API,则将数据拆分/合并到数据包中是由协议栈完成的。
答案 2 :(得分:1)
如果将3000字节写入TCP套接字,则接收对等体将收到3000个字节。 TCP上面的协议没有最大字节数。从TCP到堆栈的IP到下面的协议,是的,有限制,但您的应用程序不必担心这一点。将以太网帧分割和重新组装成ip数据报等......将在你背后进行处理。
但是,您必须担心应用程序级别的协议,即TCP之上的协议。虽然TCP将提供所有3000个字节,但是没有任何一个调用recv(或者任何java / php语言等价物)将同时返回所有3000个字节的保证。在从套接字读取所有3000个字节之前,您可能需要多次调用它。
有关详细信息,请参阅此处:
答案 3 :(得分:0)
除非您正在编写TCP协议包装器,否则您提出这个问题的事实很好地表明您正在接近您正在尝试解决的任何问题。您指定的语言中的TCP实现充当抽象,应该使这个问题的答案完全无关。
请参阅此处以获取有关数据包重组的类似问题的答案: What's the best way to monitor a socket for new data and then process that data?