2.3 HTTP协议
HTTP协议是应用层的协议,在TCP/IP协议接收到数据之后需要通过HTTP协议来解析才可以使用。就像过去的发电报一样,电报机就相当于Socket,负责选好发送的目标并将内容发过去,但是直接发过去的数据“嘀嘀嘀”并不能直接使用,还需要解码(在发送前需要先编码再发送)后才能用,电报中的编码和解码就相当于网络传输中的HTTP协议。
HTTP协议中的报文结构非常重要。HTTP中报文分为请求报文(request message)和响应报文(response message)两种类型,这两种类型都包括三部分:首行、头部和主体。请求报文的首行是请求行,包括方法(请求类型)、URL和HTTP版本三项内容,响应请求的首行是状态行,包括HTTP版本、状态码和简短原因三项内容,其中原因可有可无。头部保存一些键值对的属性,用冒号“:”分割。主体保存具体内容,请求报文中主要保存POST类型的参数,响应报文中保存页面要显示的结果。首行、头部和主体以及头部的各项内容用回车换行(\r\n)分割,另外头部和主体之间多一个空行,也就是有两个连续的回车换行。它们的结构如图2-3所示。
图2-3 HTTP报文结构
请求报文中的方法指GET、HEAD、POST、PUT、DELETE等类型,响应报文中的状态码就是Response中的status,一共可以分为5类:
□1XX:信息性状态码。
□2XX:成功状态码,如200表示成功。
□3XX:重定向状态码,如301表示重定向。
□4XX:客户端错误状态码,如404表示没找到请求的资源。
□5XX:服务端错误状态码,如500表示内部错误。
报文信息可以通过firefox的firebug插件来查看,比如,要看www.csdn.net网址请求的报文,可以在安装好firefox和firebug插件后按F12打开firebug的面板,然后选择“网络”下面的“HTML”,并输入网址发起请求,这时firebug就会记录下来,如图2-4所示。
图2-4 Firebug记录请求
这时点击URL前面的加号就可以展开详细信息,如图2-5所示。
图2-5 请求头信息
图中上边是响应的头信息,下面是请求的头信息,在“响应”选项卡中可以看到响应报文的主体。不过这时的头信息是经过格式化之后的,如果想看原始的可以点击“原始头信息”来查看,如图2-6所示。
图2-6 请求原始头信息
从这里就可以看到请求报文和响应报文的首行和头部。我们会在后面自己动手写一个实现了HTTP协议的简单例子。