我正在调查boost 1.55.0 asio库。 我想找出增加TCP套接字的MSS(最大段大小)的方法。boost 1.55.0 asio,TCP,TCP_MAXSEG,哪里?
我想这个选项应该通过acceptor.set_option(...)
方法或类似的方法来设置,但我找不到,这个选项如何被称为asio。
我已经看过了升压文件夹中有以下疑问:
grep -ircl --include=*.{c,cpp,h,hpp} "MSS"
grep -ircl --include=*.{c,cpp,h,hpp} "TCP_MAXSEG"
却发现nothgin。其他搜索也没有成功。
有没有可能?
谢谢。
UPDATE:
看来,我很困惑,现在甚至更多。这是另一个问题,但与此有关。
据我所知MSS参数负责最大段的大小。因此,如果MSS = 1460,则不应重新组装IP包(至少达到最小MTU大小)。
在我的情况下,我有简单的回声客户端服务器应用程序。
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
为什么? TCP MSS由路径MTU自动确定。是什么让你认为你可以确定更好的价值? – EJP
我已经将数据从本地接口发送到本地接口(例如,客户端和服务器在Virtual Box中的同一台机器上运行。Ubuntu 13.10。 MSS = 576字节而不是1460(MTU-IP4 HEADER-TCP HEADER)。 – Engler
而第二个原因只是学术兴趣 – Engler