gpt4 book ai didi

tcp - boost 1.55.0 asio,TCP,TCP_MAXSEG,在哪里?

转载 作者:可可西里 更新时间:2023-11-01 02:54:36 58 4
gpt4 key购买 nike

我正在研究 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 header ),但我总共有 4 个包。第一个是 576 个字节,最后一个是 272 个字节。问题是我在这里遗漏了什么?

tcpdump 输出(握手),如您所见,MSS 是 65495(我猜是因为客户端和服务器在一个环境中运行并且未使用以太网 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], 长度 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 1,40114,wscale ], 长度为 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], 长度 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],长度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], 长度 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], 长度 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], 长度 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], 长度 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], 长度 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], 长度 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], 长度 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], 长度 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], 长度 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], 长度 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));

关于tcp - boost 1.55.0 asio,TCP,TCP_MAXSEG,在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22062847/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com