TCP碎片

时间:2010-12-29 09:19:30

标签: c++ sockets tcp

我知道TCP提供类似流的数据传输,但主要问题是 - 通过TCP发送数据时会出现什么情况?
1.可以将消息拆分为N个块以适合MTU大小 2.在1次recv调用中可以读取两条消息。

有下一种情况吗?
MTU例如1500字节 客户端调用以1498字节数据发送 客户端调用以100字节数据发送 服务器调用recv并接收1500字节数据 服务器调用recv并接收98字节数据。

因此,当第一个服务器recv中将收到来自第二个客户端发送的2个字节时,它最终会出现这种情况。

我的协议定义为傻瓜:
4个字节 - 数据长度
数据内容。

我想知道当4个字节(数据长度)被分成2个块时我能想出什么情况吗?

2 个答案:

答案 0 :(得分:7)

是的,可以在任何字节边界上拆分字节流。你当然可以用8种不同的方式分割你的4字节数据长度标题:

4
1-3
2-2
3-1
1-1-2
1-2-1
2-1-1
1-1-1-1

其中一些比其他人更容易发生,但你必须考虑到这些。可以处理此问题的代码可能如下所示:

unsigned char buf[4];
size_t len = 0;
while (len < sizeof(buf)) {
    ssize_t n = recv(s, buf+len, sizeof(buf)-len, 0);
    if (n < 0) {
        // error handling here
    }
    len += n;
}
length = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);

答案 1 :(得分:1)

我总是以一种期望数据碎片以某种方式的方式编写我的应用程序。一旦你想出一个好的设计,这并不难。

What's the best way to monitor a socket for new data and then process that data?