http 报文解析小记

(以下内容仅用于个人学习的记录,有些术语可能不太专业,若有读者,错误之处希望不要误导。若有错误之处,望指出,一起学习。谢谢!)

http报文按收发方向分为请求报文,和响应报文。当向指定的socket发送报文,接受报文时及可实现通信,大体的原理也就是这样的。

请求报文

就是当我们需要访问一个服务器端的资源时,向服务器发送的请求。具体包括请求行、请求头部、两个CRLF(CRLF -- Carriage-Return Line-Feed 回车换行CRLF)、请求正文(如果需要)。

请求行:包括报文的具体的方法(method):GET/POST等,当然不同的方法对后面的内容有影响;URL:需啊要访问服务器上的什么资源;http版本协议。之前分别用空格分开。


请求头部:由一组 关键字/值 对组成,将一些本地的信息发送给服务器,服务器端可根据这些信息对客户端有一个大致的了解,比如说可接受的格式,这样服务器端就可以选择客户端可接受的格式发送响应报文。各个关键字/值之间需要用“\n”字符隔开,关键字和值之间由空格组成。

Host:指定服务器的主机地址(此项和客户端本地没什么关系,若指定的服务器地址与实际发送到的地址不一致,报文将被视为异常)。

Accept-Encoding 客服端可接受的压缩编码格式,如最常见的Accept-Encoding: gzip, deflate,通知服务器客户端可接受按gzip方式压缩的响应报文。

User-Agent:声明客户端的系统等信息。

另外还有一些其他的关键字,如Accept,Connection: keep-alive(用于http1.1协议)等。


请求正文:比如POST方法需要提交一些具体的信息给服务器(GET方法一般不用),此时就需要请求正文,请求正文在请求头部后面,中间用两个CRLF分割,包含一些服务器可以理解的具体的信息

通常在用浏览器上网时,输入网址后,一系列操作全部由浏览器来完成。


响应报文

当服务器接受到请求报文,会根据请求报文将客户端请求的URL资源返回给客户端。具体包括状态行,消息报头,两个CRLF,响应正文。

状态行:包括状态码,协议版本,不同状态码表示不同状态,最常见的状态码200,表示请求成功。

消息报头:由一组 关键字/值 对组成。表明相应报文以什么形式传输。

Content-Length: 响应报文的长度

Location: 请求url被重定向,需要访问Location:后的地址

Transfer-Encoding: 响应报文的压缩编码格式,如最常见的gzip, deflate,表明响应报文已经被算法gzip压缩,需要对响应正文先进行解压,才能得到正确的数据,传输的报文正文全是乱码。

Content-Encoding:这个关键字最常见与chunked值搭配,与Content-Length关键字是互斥的。有的响应报文在发送前可以确定报文长度,则用Content-Length后跟的值表明,报文长度,只客户端只接受指定长度的报文及可。有的响应报文在发送前无法确定总长度,就不能使用Content-Length关键字,因为长度不确定。此时就可以用Content-Encoding:chunked,它指定报文按chunked编码格式传输,一个报文由多个chunk组成,并由一个长度为0的chunk标志结束。chunk具体格式为:

长度(16数进制)+CRLF+正文(长度与前面给出的长度一致)+CRLF

一个chunk就是一段数据,不过它有固定的格式,最后长度为0的chunk标志报文的结束。

注:长度是16进制,需要将16进制转换为10进制,再接收后面的数据。

你可能感兴趣的:(http 报文解析小记)