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