原来是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模块的内置网页。
本文暂时没有评论,来添加一个吧(●'◡'●)