我正在调查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
答案 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));