2014-02-27 80 views
1

我正在调查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

+0

为什么? TCP MSS由路径MTU自动确定。是什么让你认为你可以确定更好的价值? – EJP

+0

我已经将数据从本地接口发送到本地接口(例如,客户端和服务器在Virtual Box中的同一台机器上运行。Ubuntu 13.10。 MSS = 576字节而不是1460(MTU-IP4 HEADER-TCP HEADER)。 – Engler

+0

而第二个原因只是学术兴趣 – Engler

回答

0

asio的伟大的,但它缺少一些功能,设立套接字选项,这似乎到b他们中的一个。另见: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)); 
+0

Yeap,似乎是这样。 – Engler