前言
在做IOT设备的时候经常会用到LWIP开源TCP/IP协议库,特此问题记录以及解决办法
1. LWIP-HTTP无法保持长连接
1.1 问题
???????在开发http服务器给前端提供数据的时候,网页加载会失败,在http_accepet函数中打桩会看到,浏览器会总是发起请求,造成协议栈溢出。 ???????前端发起一个js请求的时候没有问题,但是发起十几个请求是连续的不同的js请求,每次都是重新连接,而且几乎中间无时间等待,这样会造成http服务器繁忙,资源消耗殆尽然后宕机。
- 解决保持http长连接,http_accept只进一次即可
- 解决浏览器在接到完整的静态页面数据之后再请求下一次
1.2 分析
- 了解http协议以及前端浏览器的工作方式,以下两篇文章记录了服务器端和浏览器端的工作方式,是我想要的。
HTTP协议请求头和响应头 浅谈Http长连接和Keep-Alive以及Tcp的Keepalive
- 根据1中的说法 ,了解到浏览器是需要知道一次的传输文本是多少,来判断本次的连接是否结束。
- 要想保持长连接,响应头中必须要有connetion:persistant,貌似我的没有
1.3 知识
记一次Content-Length引发的血案
2. 大量的TIMEWAIT造成资源耗尽
2.1 问题
在使用LWIP开发IOTdev时,我分配了10个PCB,但是因为TIMEWAIT在LWIP中要等待60秒,时间太长了,因为我的设备可能要在16秒内快速使用16个不同PCB块,这样总是造成资源不够,连接不到程序。
2.2 原因
- 发现网页没有建立长连接,因为有RTC每1s轮询每次消耗掉PCB,在TIMEWIAT中等待60s,显然时间太长,资源不够用的。
- TIMEOUT的时间太长了,我觉得在局域网内10s足矣。
2.3 解决方案
- 将TCP_MSL 改成100000UL/10s/
- 增加MEMP_NUM_TCP_PCB 到30个
2.4 知识
2.4.1 TCP/IP详解–TCP连接中TIME_WAIT状态过多
TCP/IP详解–TCP连接中TIME_WAIT状态过多
2.4.2 TCP在FIN_WAIT1状态到底能持续多久以及TCP假连接问题
TCP在FIN_WAIT1状态到底能持续多久以及TCP假连接问题
2.4.3 TCP协议RST:RST介绍、什么时候发送RST包
TCP协议RST:RST介绍、什么时候发送RST包
2.4.4 为什么服务器突然回复RST——小心网络中的安全设备
为什么服务器突然回复RST——小心网络中的安全设备
2.4.5 图解网络|收到 RST,就一定会断开 TCP 连接吗?
图解网络|收到 RST,就一定会断开 TCP 连接吗?
总结
|