客户端和服务器的不同套接字缓冲区大小

时间:2016-02-09 10:12:47

标签: sockets tcp serversocket

我有一个问题:

我们可以为客户端和服务器设置不同的套接字缓冲区大小吗?例如 将发送和接收缓冲区设置为2048在服务器和13312在客户端将有任何问题(服务器上的缓冲区大小比clent小)?如果是,那么问题是什么?

1 个答案:

答案 0 :(得分:2)

我认为您在询问应用程序中的缓冲区。操作系统使用的缓冲区是另一回事。

在客户端和服务器上使用不同长度的缓冲区是合法的。实际上它必须是合法的,因为例如Web浏览器在Web服务器中没有信息缓冲区大小,Web服务器也不知道客户端缓冲区。

但是你必须记住,TCP是一种面向流的协议,它不会保留消息边界。

例如,让客户端有一个大小为10个字节的缓冲区并发送3个数据:

send(sock1, "0123456789", 10, 0);
send(sock1, "ABCDEFGHIJ", 10, 0);
send(sock1, "abcdefghij", 10, 0);

数据以流方式传输,如果它们将通过3个IP数据包传输,则由底层TCP堆栈传输:

0123456789      ABCDEFGHIJ      abcdefghij

或一个大包:

0123456789ABCDEFGHIJabcdefghij

甚至更奇怪的事情:

0123456789A    BCDEFGHIJab     cdefghij

接收方的OS在接收到数据时将所有接收到的数据存储在其内部缓冲区中。应用程序调用{​​{1}}时,OS将数据复制到应用程序缓冲区。如果接收应用程序的缓冲区大于已接收数据的大小,则将所有数据复制到应用程序缓冲区。如果应用程序缓冲区较小,则OS仅复制适合缓冲区的数据,剩余数据将在下一次receive调用中复制。