首页 文章

TCP碎片

提问于
浏览
2

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

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

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

我的协议定义为foolows:
4个字节 - 数据长度
数据内容 .

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

2 回答

  • 1

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

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

  • 6

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

    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);
    

相关问题