程序员开发实例大全宝库

网站首页 > 编程文章 正文

原来是MTU,从中作祟(原来的意思)

zazugpt 2024-08-18 01:30:40 编程文章 16 ℃ 0 评论

原来是MTU从中作祟!

昨天,设置5G路由器的OPENVPN连接参数以及安全证书,并且设置了端口转发规则。

在浏览器上输入5G路由器的WAN口IP地址以及转发到IO模块的端口。

浏览器通过虚拟专网以及5G路由器从IO模块下载网页首页以及javascript文件,

前面几个比较小的javascript文件下载得很顺利,

到了下载因内容多、分页大而被拆分成多个TCP数据包发送的rts.js文件时,却一直下载不成功。

我思考了一会,觉得应该是在分包传输的javascript文件数据包的传输链路中在某一个环节中因某种原因被丢弃了。

整个数据通路为:

1) 测试电脑的浏览器发送HTTP请求

2) 测试电脑上的OPENVPN client将请求通过虚拟专网的TLS加密通道发送给处理云服务器上的OPENVPN server

3) OPENVPN server根据目的IP地址,将数据包通过TLS加密通道发送给5G路由器的OPENVNP client

4) 5G路由器根据端口转发规则,将由OPENVPN client解密之后的数据包发送IO模块

5) IO模块内部的W5500以太网模块在收到来自5G路由器的TCP数据包之后,通过SPI接口发送给处理器STM32F103RET6

6) STM32F103RET6的程序判断TCP数据包为HTTP请求,则将数据传给自己实现的简易HTTP服务器处理

7) 简易HTTP服务器从内部flash中读取首页index.html文件或者javascript文件数据,通过SPI接口发送给W5500中的指定的socket

8) W5500通过指定socket将数据发送给5G路由器

9) 5G路由器内部的OPENVPN client通过TLS加密通道将应答数据发送给OPENVPN server

10) OPENVPN server再通TLS加密通道将数据发送给测试电脑的OPENVPN client

11) OPENVPN client再将数据解密发送给浏览器

12) 浏览器最终以网页形式将数据渲染出来

网页并不是一次性从设备上下载所有的javascript和首页文件,而是用javascript编写代码,逐一从设备下载javascript文件,从而降低设备的通信并发数。

对些一些比较大的文件,STM32F103RET6的代码按照1250个字节拆成多个数据包,分多次通过上述的链路发送给浏览器。

而根据TCP/IP协议的定义,单个数据包用MTU字节数的限制,MTU的最大值一般为1500字节。

1250个有效负荷数据加上HTTP协议头,总字节数大概是1400左右。

如果5G路由器的MTU设置小于1400字节,则IO模块发送的数据会被丢弃。

经确认,5G路由器的MTU已经设置为最大值1500。

那么可能是OPENVPN client将数字发送给OPENVPN server时,

1400个字节的数据加上虚拟通道的一些标志数据之后,超过了1500个字节,导致数据被丢弃。

抓包发现OPENVPN client和OPENVPN server之间的通信数据包的大小为1350个字节。

于是,我修改STM32F103RET6的代码,将每个数据包字节数的宏定义由1250改为1000。

重新编译程序,并将新固件通过OTA升级至IO模块,

浏览器顺利打开了IO模块的内置网页。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表