我正在編寫一個小程序來測試網絡吞吐量作爲練習的一部分,並且需要將發送和接收緩衝區增加到256 KB(以嘗試提高TCP性能)。我正在使用setsockopt()
和SO_SNDBUF/SO_RCVBUF選項執行此操作,並且還增加了'net.core.rmem_max'和'net.core.wmem_max'值。TCP網絡吞吐量測量
getsockopt()確認緩衝區大小的增加(雙倍的256KB值),所以我知道這很好。然而,當我從一臺主機向另一臺主機發送256KB數據時,接收器總是以幾種不同大小的讀取方式接收數據(大約20到40次讀取,其範圍從1448到18824),直到接收到所有數據。我很困惑,在這一點上主要是與這些問題,
- 隨着增加的緩衝區大小不應該它在一次讀取?
- 此外,爲什麼每次讀取的字節數量差異如此之大(不應該它們更不穩定)?
- 是否有某種方法可以確保在一次讀取中接收到256KB?
下面是表示該讀部分接收端片段,
while(1) {
memset(&client_addr, 0, sizeof(client_addr));
if ((connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) <= 0) {
perror("accept()");
exit(EXIT_FAILURE);
}
while ((n = recv(connfd, &buff[0], BUFF_SIZE, 0/*MSG_WAITALL*/)) > 0) {
totalBytes += n;
++pktCount;
printf("Received(%d): %d bytes\n", pktCount, n);
}
if (n == 0) {
printf("Connection closed (Total: %lu bytes received)\n", totalBytes);
}
close(connfd);
connfd = -1;
totalBytes = 0;
pktCount = 0;
}
任何幫助將是巨大的。
TIA
[MTU](https://en.wikipedia.org/wiki/Maximum_transmission_unit#Table_of_MTUs_of_common_media)。 ACK數據包也需要發回。 – 2012-11-24 17:24:58
TCP是面向流的協議,不是數據報。每次讀取的數據量取決於MSS(取決於網絡MTU)和TCP窗口大小。這就是爲什麼在單個TCP連接上運行的面向消息的協議通常使用額外的數據成幀,例如每條消息都以其長度爲前綴,以便讀者知道何時停止從套接字讀取與當前消息相關的數據。 –