提升1.55.0 asio,TCP,TCP_MAXSEG,在哪里?

时间:2014-02-27 08:24:05

标签: tcp boost-asio

我正在调查boost 1.55.0 asio库。 我正试图找出增加TCP套接字的MSS(最大段大小)的方法。

我想这个选项应该通过acceptor.set_option(...)方法或类似方法设置,但我找不到,如何根据asio调用此选项。

我通过以下查询在boost文件夹中查找:

grep -ircl --include=*.{c,cpp,h,hpp} "MSS"

grep -ircl --include=*.{c,cpp,h,hpp} "TCP_MAXSEG"

但发现并非如此。其他搜索也没有成功。

有可能吗?

谢谢。

更新:

似乎我现在更加困惑了。这是另一个问题,但与此有关。

据我所知,MSS参数负责最大段大小。因此,如果MSS = 1460,则不应重新组装IP包(至少达到最小MTU大小)。

在我的情况下,我有简单的echo客户端服务器应用程序。

void ProcessClientConnection(tcp::socket& clientSocket)
{
    const int SIZE = 4096;
    char data[SIZE];
    boost::system::error_code error;


    size_t readBytes;
    while ((readBytes = clientSocket.read_some(boost::asio::buffer(data), error)) > 0)
    {
        if (boost::asio::error::eof == error) {
            exit(0);
        }

        cout << data << "[" << readBytes << "]" << endl;

        boost::asio::write(clientSocket, boost::asio::buffer(data, strlen(data) ));
    }
}

和客户

char pTest[2000];
for(int i = 0; i < 2000; i++) {
    pTest[i] = 'A';
}
cout << pTest << endl;
boost::asio::write(s, boost::asio::buffer(pTest, strlen(pTest)));

因此,您可以看到我正在尝试一次发送2000个字节。我原以为这个数据会被重新组装成2个软件包(第一个到1460个,第二个到40个字节,因为我不算TCP和IP标题,所以我大概有4个软件包) 。首先是576个字节,最后一个是272.这个问题我在这里缺少什么?

tcpdump输出(握手),你可以看到MSS是65495(我想因为客户端和服务器运行在一个environemnt并且以太网MTU没有使用)

17:44:37.913419 IP 10.0.2.15.36725 > 10.0.2.15.9999: Flags [S], seq 47119026, win 43690, options [mss 65495,sackOK,TS val 23401141 ecr 0,nop,wscale 7], length 0 17:44:37.913431 IP 10.0.2.15.9999 > 10.0.2.15.36725: Flags [S.], seq 2495807352, ack 47119027, win 1152, options [mss 65495,sackOK,TS val 23401141 ecr 23401141,nop,wscale 0], length 0 17:44:37.913441 IP 10.0.2.15.36725 > 10.0.2.15.9999: Flags [.], ack 1, win 342, options [nop,nop,TS val 23401141 ecr 23401141], length 0

这是通讯包:

17:44:37.914768 IP 10.0.2.15.36725 > 10.0.2.15.9999: Flags [.], seq 1:577, ack 1, win 342, options [nop,nop,TS val 23401141 ecr 23401141], length 576 17:44:37.914811 IP 10.0.2.15.9999 > 10.0.2.15.36725: Flags [.], ack 577, win 1152, options [nop,nop,TS val 23401141 ecr 23401141], length 0 17:44:37.914840 IP 10.0.2.15.9999 > 10.0.2.15.36725: Flags [P.], seq 1:577, ack 577, win 1152, options [nop,nop,TS val 23401141 ecr 23401141], length 576 17:44:37.914895 IP 10.0.2.15.36725 > 10.0.2.15.9999: Flags [P.], seq 577:1153, ack 1, win 342, options [nop,nop,TS val 23401141 ecr 23401141], length 576 17:44:37.914914 IP 10.0.2.15.9999 > 10.0.2.15.36725: Flags [.], ack 1153, win 1152, options [nop,nop,TS val 23401141 ecr 23401141], length 0 17:44:37.914972 IP 10.0.2.15.36725 > 10.0.2.15.9999: Flags [.], seq 1153:1729, ack 1, win 342, options [nop,nop,TS val 23401141 ecr 23401141], length 576 17:44:37.914990 IP 10.0.2.15.9999 > 10.0.2.15.36725: Flags [.], ack 1729, win 1152, options [nop,nop,TS val 23401141 ecr 23401141], length 0 17:44:37.915040 IP 10.0.2.15.36725 > 10.0.2.15.9999: Flags [.], ack 577, win 351, options [nop,nop,TS val 23401141 ecr 23401141], length 0 17:44:37.915047 IP 10.0.2.15.9999 > 10.0.2.15.36725: Flags [P.], seq 577:1729, ack 1729, win 1152, options [nop,nop,TS val 23401141 ecr 23401141], length 1152 17:44:37.915065 IP 10.0.2.15.36725 > 10.0.2.15.9999: Flags [P.], seq 1729:2001, ack 577, win 351, options [nop,nop,TS val 23401141 ecr 23401141], length 272 17:44:37.915128 IP 10.0.2.15.36725 > 10.0.2.15.9999: Flags [.], ack 1729, win 1024, options [nop,nop,TS val 23401141 ecr 23401141], length 0

1 个答案:

答案 0 :(得分:0)

asio很棒,但它缺少一些设置套接字选项的功能,这似乎就是其中之一。请参阅:can you set SO_RCVTIMEO and SO_SNDTIMEO socket options in boost asio?为另一个。

但是,由于这是一个整数选项,您应该可以使用asio::set_option,如下所示:

int size(1460);
socket.set_option(boost::asio::detail::socket_option::integer<SOL_SOCKET, TCP_MAXSEG>(size));