TCP/IP文档阅读笔记-TCP Receive Window
TCP Receive Window
TCP接收窗口,TCP接收數(shù)據(jù)到緩沖,應(yīng)用程序還未處理的那塊數(shù)據(jù)。
TCP Receive Window大小,在TCP三次握手時(shí)就已經(jīng)商量好了。并且還確定了數(shù)據(jù)包的最大字節(jié)數(shù)。這個(gè)最大字節(jié)數(shù)被稱為最大消息長度(Maximum Segment Size,MSS)。當(dāng)要發(fā)送的數(shù)據(jù)超過該值,就需要將數(shù)據(jù)分為多個(gè)包,依次發(fā)送,該操作稱為數(shù)據(jù)分片,如下:
如上TCP上次握手時(shí),商量了MSS為1460.
過程如下:
上面的例圖中,Win為windows是窗口大小,客戶端的大小為65535,服務(wù)端的窗口大小為5840。另一個(gè)例子:
客戶端的窗口大小從65535減少到59695,因?yàn)榭蛻舳瞬荒芸焖偬幚頂?shù)據(jù)。
?
TCP窗口為2個(gè)字節(jié),也就是最大65535
TCP窗口為0的情況。
當(dāng)TCP的緩存接收區(qū)(TCB)里面滿了,就會為0(死機(jī),被其他程序影響等等)
下面來舉個(gè)例子:
客戶端:192.168.1.102
服務(wù)端:192.168.1.1
服務(wù)端代碼:
#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() << "已連接服務(wù)";});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個(gè),和最后4個(gè),就不再說明了。
看下中間:
包的總大小是1514其中數(shù)據(jù)大小是1460。
滑動窗口為2,每次發(fā)2個(gè)包,服務(wù)端回一個(gè)ack。這個(gè)ack的值為seq最后一個(gè)值。
?
?
總結(jié)
以上是生活随笔為你收集整理的TCP/IP文档阅读笔记-TCP Receive Window的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt文档阅读笔记-重现GUI事件进行单元
- 下一篇: Java工作笔记-WebService使