2014-02-27 86 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