networking - ns3 中 TCP 数据包大小的变化
问题描述
我是一个新的 ns3 用户。程序Sixth.cc生成 pcap 文件
1.136956 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 17177:17681, ack 1, win 32768, options [TS val 1133 ecr 1127,eol], length 504: HTTP
1.403196 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 33280:33784, ack 1, win 32768, options [TS val 1399 ecr 1394,eol], length 504: HTTP
1.436476 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 37440:37944, ack 1, win 32768, options [TS val 1432 ecr 1428,eol], length 504: HTTP
2.533823 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 174184:174720, ack 1, win 32768, options [TS val 2530 ecr 2525,eol], length 536: HTTP
2.543036 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 175760:176264, ack 1, win 32768, options [TS val 2539 ecr 2534,eol], length 504: HTTP
2.608703 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 183544:184080, ack 1, win 32768, options [TS val 2605 ecr 2600,eol], length 536: HTTP
5.804476 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 583440:583944, ack 1, win 32768, options [TS val 5800 ecr 5796,eol], length 504: HTTP
6.453436 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 664560:665064, ack 1, win 32768, options [TS val 6449 ecr 6445,eol], length 504: HTTP
7.367743 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 778424:778960, ack 1, win 32768, options [TS val 7364 ecr 7360,eol], length 536: HTTP
7.393596 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 782080:782584, ack 1, win 32768, options [TS val 7389 ecr 7386,eol], length 504: HTTP
8.158143 IP 10.1.1.1.49153 > 10.1.1.2.8080: Flags [.], seq 877224:877760, ack 1, win 32768, options [TS val 8155 ecr 8149,eol], length 536: HTTP
如果 MSS 从 536 字节变为 504 字节,谁能解释我,如果是,为什么?
解决方案
在 Sixth.cc 中生成的 pcap 文件仅显示已丢弃的数据包。默认 MSS 为 536 字节,这就是丢弃的最大数据包具有该大小的原因。碰巧 TCP 也决定传输 504 字节的段,而相应的数据包被接收方丢弃。后来,同样的情况也发生在 536 字节的段上。
自然,下一个问题是:为什么 TCP 决定在一种情况下传输一个 504 字节的段,而在另一种情况下传输一个 536 字节的段?我还没有调试程序来验证这一点,但我的猜测是 TCP 的缓冲区只有 504 个字节要发送,所以这就是它发送的全部内容。MSS 是最大段大小(不是最小值),因此 TCP 可以发送小于 536 字节的数据包。您可以尝试通过以下任一方式验证这一点
- 在 TcpSocketBase 中设置断点,或
- 启用 TcpSocketBase 的调试消息,并查找有关调用 Nagle 算法的消息。
因此,MSS 没有变化,但传输的段的大小确实发生了变化。可能传输了较小的 504 字节段,因为这是 TCP 在给定时间在其缓冲区中要发送的全部内容。
其他详情
在第 208-210 行,RateErrorModel 被实例化,并与设备 1 相关联。该模型将在接收方 NetDevice 处随机丢弃数据包。因此,在这个模拟中,数据包可能由于缓冲区溢出而被丢弃,或者由于 RateErrorModel 而随机丢弃。
在第 238-240 行,与设备 1 关联的 PhyRxDrop TraceSource 连接到RxDrop
. RxDrop
使用一个绑定参数实例化回调。bound 参数是一个 PcapFileWrapper,它可以被认为是一个封装文件的类,并且可以很容易地将数据包添加到 pcap 文件中。
推荐阅读
- c++ - 以类为成员的 C++ 结构,结构未在此范围内声明
- python - 如何正确获取数据?
- laravel - Laravel 中基于令牌的简单身份验证(无护照)
- python - 使用 Pandas 将小表中的信息添加到大表中
- python - Selenium:循环网络驱动程序(Python)
- rxjs - RX 编程 - 如何从 MessageBroker 获取以前的消息?
- python - CPython中的字符串'in'运算符
- python - Jupyter / Colab:在任何单元格中播放任何错误的声音+在完成长时间运行的单元格后播放声音
- javascript - 是否可以在没有写入/读取的情况下将当前表示为缓冲区的文件命名?
- swagger - OpenAPI 中带有 HOBA 身份验证的 RESTful API