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
根據組塊中前面的字節計算的四字節CRC(循環冗余碼),包括組塊類型字段和組塊數據字段,但不包括長度字段。CRC可用於檢查數據是否損壞。CRC始終存在,即使對於不包含數據的塊也是如此。
PNG簽名不匹配,CRC不匹配或意外的流結束,都表示數據流已損壞,可能被視為致命錯誤。
7、那么造成機頂盒發送RST錯誤原因,就是PNG收到所有PNG數據流后,進行CRC校驗時,並未收到IEND結束塊,請求圖片格式收到的格式不匹配,致使應用程序發送異常錯誤信息RST。

8、解決方法:將服務器的圖片格式改成請求圖片格式就行,比如:請求PNG就就響應PNG圖片,請求JPEG就響應JEPG圖片等等
