首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UDP数据包丢失因数据包大小而异

UDP数据包丢失因数据包大小而异
EN

Stack Overflow用户
提问于 2014-10-20 05:31:50
回答 1查看 215关注 0票数 1

我有在Qt中测试udp套接字的应用程序。这真的很简单。一个套接字绑定到端口并侦听传入的数据包。其他套接字用于发送数据包。包裹中的第一个数字是发送者发送的包裹,后续数据仅用于测试。当接收方收到包时,它会显示接收/发送速率。你可以改变包的大小和定时器发送包的超时时间。我有两台位于两台不同路由器后面的计算机,我是这样测试的:

将两个套接字绑定到同一端口。将端口转发添加到此端口。然后将数据包发送到127.0.0.1和路由器外部ip。

两台计算机都显示,接收的包的最大大小为32kb - 28b。28b是UDP报头大小。我想是的。

然后,我尝试以相同的方式在两台计算机之间进行测试。测试以一种方式显示了相同的结果(例如,当我从comp1发送到comp2时),但当我从comp2发送到comp1时,最大大小约为3kb(2975b)。Comp1不会得到比这个更大的包。

这是程序的代码:

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    receiveSocket(),
    sendSocket(),
    timer(),
    packetSend(0),
    packetReceived(0),
    address(),
    sendPort(63465), 
    receivePort(62345),
{
    ui->setupUi(this);

    timer.setSingleShot(false);
    timer.setInterval(100);

    receiveSocket.bind(receivePort);

    connect(&timer, SIGNAL(timeout()), this, SLOT(sendData()));
    connect(&receiveSocket, SIGNAL(readyRead()), this, SLOT(receiveData()));

    connect(ui->startButton, SIGNAL(clicked()), this, SLOT(startStopSend()));
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::receiveData()
{
    unsigned int otherSideSent = 0;
    do
    {
        receiveDatagram.resize(receiveSocket.pendingDatagramSize());
        receiveSocket.readDatagram(receiveDatagram.data(), receiveDatagram.size());
    }while(receiveSocket.hasPendingDatagrams());

    QDataStream in(&receiveDatagram, QIODevice::ReadOnly);
    in >> otherSideSent;

    float tempVal;
    std::vector<float> value;
    for (int i=0; i<receiveDatagram.size()/8 - 1;i++ )
    {
        in >> tempVal;
        value.push_back(tempVal);
    }

    packetReceived++;

    ui->packetData->setText(QString("I receive/you sent:     ")+QString::number(packetReceived)+QString("/")+QString::number(otherSideSent));
}


void MainWindow::sendData()
{
    QDataStream out(&sendDatagram, QIODevice::WriteOnly);
    out << ++packetSend;
    for(unsigned int i = 0; i < 8185; ++i)
    {
        out << 1.0 + i/100.0;
    }

    sendSocket.writeDatagram(sendDatagram, address, sendPort);
}


void MainWindow::startStopSend()
{
    if(!timer.isActive())
    {
        address.setAddress(ui->ipLine->text());
        timer.start();
    }
    else
    {
        timer.stop();
    }
}

第一次测试,我认为,没有router1,router2,comp1或comp2限制最大的UDP包的大小。但仅在从comp2到comp1的情况下,最大包大小限制为奇数。

问题是为什么?

EN

回答 1

Stack Overflow用户

发布于 2014-10-20 05:54:07

大多数设备支持高达1500字节的MTU/MRU。事实上,您可以发送/接收比此更大的数据包,这意味着您要么完全启用了巨型帧,要么数据包正在碎片化。

不是100%清楚你在做什么,但是你提到了router external IP。如果这两台计算机位于两个不同的位置,通过两个不同的路由器连接到Internet,那么您发送的超大数据包肯定会被“连接Internet”的路由器分割。

实际上,我认为你可以通过互联网从comp1comp2发送32KB的数据包,这是很神奇的,因为首先必须对其进行分段的路由器不会太高兴,当它收到32KB大小的数据包时,它必须将其分段为,比方说,32 x 1KB的数据包,更不用说接收端,它将不得不重新组装它。

我不确定你说的“测试udp套接字”到底是什么意思,但由于这个原因,大多数网络测试都是用小于1518 (或1522)字节的数据包进行的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26455638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档