Malformed Packet PNG排查分析

1、问题描述:
接到开发工程说,图片时而好,时而坏。怀疑是网络三角传输模式问题,或者是Nginx配置问题。
2、环境拓扑图:

  3、这是Nginx处抓报文信息:HTTP和Porttable Network Graphics

 Malformed Packet PNG

百度搜索翻译软件翻译的意思:“格式错误的数据包PNG”
4、抓包反映出来的问题
机顶盒端请求jpeg图片,服务端收到jpeg请求后,响应png图片,经由Nginx将图片发送到客户端,完成屏幕图片加载。当PNG图片传输完成后,Nginx的TCP发送TCP的Flag:Fin ack结束TCP连接,客户端直接SYN:RST,直接报数据包格式错误。然后丢弃数据包,再次与Nginx建立新TCP连接,获取图片数据。。。。。。。导致电视屏幕图片加载失败。
5、问题分析:
PNG图片编码和解码过程:下图

 6、PNG国际标准

PNG签名
PNG数据流的前八个字节始终包含以下(十进制)值:
137 80 78 71 13 10 26 10
这个签名表示该数据流的剩余部分包含一个PNG图像,由一系列与开始区块的IHDR块,并结束IEND块。
 
根据组块中前面的字节计算的四字节CRC(循环冗余码),包括组块类型字段和组块数据字段,但包括长度字段。CRC可用于检查数据是否损坏。CRC始终存在,即使对于不包含数据的块也是如此。

       有效的PNG数据流应以PNG签名开头,紧随其后的是IHDR块,然后是一个或多个IDAT块,并应以IEND 块结束。PNG数据流中仅允许一个IHDR块和一个IEND

已知块,其中必须包括此国际标准中定义的所有关键块(IHDRPLTEIDATIEND
PNG签名不匹配,CRC不匹配或意外的流结束,都表示数据流已损坏,可能被视为致命错误。
简单一句话:“PNG数据流校验时,需要PNG信令,关键块(IHDRPLTEIDATIEND)”
7、那么造成机顶盒发送RST错误原因,就是PNG收到所有PNG数据流后,进行CRC校验时,并未收到IEND结束块,请求图片格式收到的格式不匹配,致使应用程序发送异常错误信息RST。
8、解决方法:将服务器的图片格式改成请求图片格式就行,比如:请求PNG就就响应PNG图片,请求JPEG就响应JEPG图片等等

猜你喜欢

转载自www.cnblogs.com/slyy/p/11774341.html