HTTP报文有两种:请求报文和相应报文。
请求报文
结构构成:请求行+请求头部(首部)+请求数据(可选)
HTTP请求报文的第一行叫做请求行,其后继的行叫做首部行。
请求行有3个字段:方法字段、URL字段和HTTP版本字段。
方法字段有不同的值,包括GET、POST、HEAD和DELETE。
首部行如下图所示,Host:www.someschool.edu指明了服务器的主机名。实际上,TCP连接建立时已经寻找到目标主机的IP地址了,不需要Host字段告知主机的名称,但Host字段仍被需要,用于告知高速Web代理服务器所访问主机的地址。
Connection:close用于告诉服务器不要麻烦地使用持续链接,在发送完被请求的对象后就关闭连接。
User-agent:用来指明用户代理,即向服务器发送请求的浏览器的类型。
Accept-language:用于表示用户想要得到的对象的语言版本。
通用的请求报文格式如下所示。请求行以及首部行后会添加一个回车和换行表示该行的结束,在首部行后添加一个额外的回车和换行表示后又一个“实体体”,即数据部分。使用GET方法时实体体为空,使用POST方法时才正常使用实体体。
响应报文
结构构成:状态行+首部行(头部)+实体体(包体)
状态行由协议版本号,状态码以及状态码说明组成。
一些常见的状态码包括:
- 200 OK:请求成功
- 301 Moved Permanently:请求的对象已经被永久转移了
- 400 Bad Request:一个通用的差错代码,表示该请求不能被服务器理解
- 404 Not Found:被请求的资源不在服务器上
首部行如下图所示,Connection:close首部行告诉用户,发送完报文后将关闭TCP连接。Date首部行知识服务器产生并发送该响应报文的日期和时间,并不是该对象创建或者修改的时间。Last-Modified指示了对象创建或者最后修改的日期和时间。
MIME类型
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。
MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理URL,因此 We b服务器在响应头中添加正确的 MIME 类型非常重要。如果配置不正确,浏览器可能会无法解析文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。
MIME类型结构:
type/subtype
其中type表示可以被分多个子类的独立类别,subtype 表示细分后的每个类型。
常见的MIME类型如下图所示:
其中在MIME中,有两种较为相似的格式分别为text/javascript
以及application/javascript
。其中,text/javascript
是早期引入的,后来人们思考问题,并决定将text/*
表示为人类直接可读的东西。而Javascript尽管是以字符形式进行表示的,但并不是设计给人读的,因此引入了application/javascript
来替换它。即appliacation/javascript
是text/javascript
的一个更加先进的版本,如果考虑向后兼容的话,使用text/javascript
,如果使用HTML5,则可以直接使用application/javascript
。
Transfer-encoding:chunked
由于http协议允许进行持久连接,即在一个连接中发送多个数据。那么客户端和服务器需要某种方式来分辨出不同的报文。在首部行包含content-length字段的情况下,便可以通过报文长度来区分不同的报文。然而对于动态生成的内容或是某些难以计算报文长度的场景下,该字段将不能被使用。
Transfer-encoidng:chunnked,就是将整个报文切分成多个块,最后一个块长度为0,表示为结束。每个块按照MSS的长度进行切分输入到TCP中。