TCP/IP文档阅读笔记-TCP Receive Window
生活随笔
收集整理的這篇文章主要介紹了
TCP/IP文档阅读笔记-TCP Receive Window
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
TCP Receive Window
TCP接收窗口,TCP接收數據到緩沖,應用程序還未處理的那塊數據。
TCP Receive Window大小,在TCP三次握手時就已經商量好了。并且還確定了數據包的最大字節數。這個最大字節數被稱為最大消息長度(Maximum Segment Size,MSS)。當要發送的數據超過該值,就需要將數據分為多個包,依次發送,該操作稱為數據分片,如下:
如上TCP上次握手時,商量了MSS為1460.
過程如下:
上面的例圖中,Win為windows是窗口大小,客戶端的大小為65535,服務端的窗口大小為5840。另一個例子:
客戶端的窗口大小從65535減少到59695,因為客戶端不能快速處理數據。
?
TCP窗口為2個字節,也就是最大65535
TCP窗口為0的情況。
當TCP的緩存接收區(TCB)里面滿了,就會為0(死機,被其他程序影響等等)
下面來舉個例子:
客戶端:192.168.1.102
服務端:192.168.1.1
服務端代碼:
#include <QCoreApplication> #include <QTcpServer> #include <QDebug> #include <QTcpSocket>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QTcpServer server;server.listen(QHostAddress::Any, 8888);QTcpSocket *peer = nullptr;QObject::connect(&server, &QTcpServer::newConnection, [&](){QTcpSocket *peer = server.nextPendingConnection();qDebug() << "IP:" << peer->peerAddress() << "已連接服務";});return a.exec(); }客戶端代碼:
#include <QCoreApplication> #include <QTcpServer> #include <QDebug> #include <QTcpSocket>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QTcpSocket testSocket;testSocket.connectToHost("192.168.1.1", 8888);if(testSocket.waitForConnected()){QString msg = "";for(int i = 0; i < 999; i++){msg += QString::number(i) + " Hello World";}testSocket.write(msg.toUtf8());qDebug() << "sendOver";testSocket.close();}return a.exec(); }抓包如下:
上面3個,和最后4個,就不再說明了。
看下中間:
包的總大小是1514其中數據大小是1460。
滑動窗口為2,每次發2個包,服務端回一個ack。這個ack的值為seq最后一個值。
?
?
總結
以上是生活随笔為你收集整理的TCP/IP文档阅读笔记-TCP Receive Window的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt文档阅读笔记-重现GUI事件进行单元
- 下一篇: HTTP笔记-SOAP基本概念