当Web服务器返回JPEG图像(mime type image / jpeg)时,它是如何编码的?

时间:2012-09-09 00:20:41

标签: http mime-types

如果您向Web服务器发出HTTP请求,并且它返回类型为image / jpeg的响应,那么二进制数据是如何实际编码的?它是通过线路的图像的原始字节级内容,还是它的一些基于字符的表示(例如base64)?

3 个答案:

答案 0 :(得分:4)

编码的传输数据由Content-Encoding HTTP响应头指定(请参阅RFC2616第14.11节和第3.5节中的HTTP 1.1规范)。如果存在,则可以是gzipcompressdeflate压缩数据(HTTP 1.1中没有定义其他数据)。如果不是,则数据基于Content-Type HTTP响应头(MIME类型)进行原始编码。 Content-EncodingAccept-Encoding HTTP请求标头值以及Web服务器是否支持请求编码确定。

在您的情况下,如果没有Content-Encoding HTTP响应标头,则数据与文件内容完全相同。否则,它使用指定的编码进行压缩。例如: GZip Deflate

答案 1 :(得分:2)

原始字节通过网络发送。

(通过一些设置,您可以使用Wireshark,tcp_dump等确认这一点。)

请注意,大多数服务器都配置为而非来压缩JPEG,但该文本数据通常是压缩的。

答案 2 :(得分:0)

奇怪的是,它并非“直通”。

除了添加MIME标头之外,网络服务器似乎剥离了所有jpeg标记(0xFF,0xNN),但其余部分保持不变。这看起来很奇怪,因为我不知道网页浏览器是如何识别图像框架的开始的。

我通过在嵌入式系统中编写自己的简单网络服务器来发现这一点 - 我想我只需要添加MIME标头并发送其余的jfif-jpeg文件,但浏览器说“图像不能显示,因为它包含错误“!

这是十六进制原始jpeg / jfif的开头

ff d8 ff e0 00 10 4a 46 49 46 00

[SOI] [APP0] [length] J F I F NULL

根据规范。

收到的文件在标题后面包含:

0d 0a 0d 0a 00 10 4a 46 49 46 00

前4个字节是标题末尾的cr / lf / cr / lf,然后是NO标记,但它确实包含数据字段。对于其他标记重复相同的事情,例如框架的开始。

奇怪吧?我不认为这是一个哑剧编码问题,因为其余的数据看起来完好无损 - 包括数据中的FF等。

任何人都知道这里发生了什么? PS看起来更接近,只需要使用putty或类似的任何网站请求.jpg,并保存你得到的,并将其与原始版本,甚至保存为版本进行比较。