1.1.1 HTTP
访问网站使用的HTTP是应用最为广泛的应用层协议之一。本节通过抓包分析HTTP,查看客户端(Web浏览器)向Web服务器发送的请求(命令)、查看Web服务器向客户端返回的响应(状态码),以及请求报文和响应报文的格式。HTTP实现Web浏览器访问Web服务器的示意如图1-2所示。
图1-2 HTTP
1.请求报文格式
由于HTTP是面向文本的,因此报文中的每一个字段都是一些ASCII字符串,各个字段的长度都是不确定的。如图1-3所示,HTTP请求报文由3个部分组成。
图1-3 请求报文格式
(1)开始行。
开始行用于区分该报文是请求报文还是响应报文。在请求报文中的开始行叫作请求行,而在响应报文中的开始行叫作状态行。开始行的3个字段之间都以空格分隔,最后的“CRLF”中“CR”和“LF”分别代表“回车”和“换行”。
(2)首部行。
首部行用来说明浏览器、服务器或报文主体的信息。首部行可以有0行或多行。每个首部行都有首部字段名及其值,每一行在结束的地方都要有“CRLF”(“回车”和“换行”)。整个首部行结束时,还有一个空行将首部行和后面的实体主体分开。
(3)实体主体。
请求报文一般不用实体主体这个字段,而响应报文也可能没有这个字段。
Web浏览器能够向Web服务器发送以下8种方法(有时也叫动作或命令)来表明Request-URL指定的资源的不同操作方式。
● GET:请求获取Request-URL所标识的资源。通过在Web浏览器的地址栏中输入网址的方式访问网页时,Web浏览器采用GET方法向服务器请求网页。
● POST:在Request-URL所标识的资源后附加新的数据。要求被请求Web服务器接收附在请求后面的数据,常用于提交表单。比如向Web服务器提交信息、发帖、登录等。
● HEAD:请求获取由Request-URL所标识的资源的响应消息报文首部。
● PUT:请求Web服务器存储一个资源,并用Request-URL作为其标识。
● DELETE:请求Web服务器删除Request-URL所标识的资源。
● TRACE:请求Web服务器回送收到的请求信息,主要用于测试或诊断。
● CONNECT:用于代理服务器。
● OPTIONS:请求查询Web服务器的性能,或者查询与资源相关的选项和需求。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,Web服务器应当返回状态码405(Method Not Allowed);当Web服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
2.响应报文格式
通常每一个请求报文发出后,都能收到一个响应报文。响应报文的第一行就是状态行。如图1-4所示,状态行包括3项内容,即HTTP的版本、状态码以及解释状态码的简单短语。
图1-4 响应报文格式
3.HTTP响应报文状态码
HTTP响应报文状态码(Status-Code)都是3位数字的,分为5大类33种,如下所示。
● 1××表示通知信息,如请求收到或正在处理。
● 2××表示成功,如接受或知道了。
● 3××表示重定向,如要完成请求还必须采取进一步的行动。
● 4××表示客户端错误,如请求中有错误的语法或不能完成。
● 5××表示服务端出现错误,如由于Web服务器失效而导致无法完成请求。
下面是响应报文中经常见到的几种状态行。
● HTTP/1.1 202 Accepted(接受)。
● HTTP/1.1 400 Bad Request(错误的请求)。
● HTTP/1.1 404 Not Found(找不到)。
综上可知,HTTP定义了Web浏览器访问Web服务器的步骤,能够向Web服务器发送哪些请求(方法),HTTP请求报文格式(有哪些字段,分别代表什么意思)等,也定义了Web服务器能够向Web浏览器发送哪些响应(状态码),HTTP响应报文格式(有哪些字段,分别代表什么意思)等。
举一反三,其他的应用层协议也需要定义以下内容。
● 客户端能够向服务端发送哪些请求(方法或命令)。
● 客户端和服务端命令交互顺序,比如针对POPv3,需要先验证用户身份才能接收邮件。
● 服务端有哪些响应(状态码),每种状态码代表什么意思。
● 协议中每种报文的格式。如报文包含哪些字段,字段是定长还是变长,如果是变长,字段分隔符是什么等。
在计算机中通过抓包工具可以捕获网卡发出和接收的数据包,当然也能捕获应用程序通信时的数据包。这样就可以查看客户端和服务端的交互过程,即客户端发送了哪些请求,服务端返回了哪些响应。
如图1-5所示,在显示过滤器中输入“http and ip.addr == 202.206.100.34”,单击,应用显示过滤器,此时只显示访问河北师范大学网站的HTTP请求和响应的数据包。单击第1 396个数据包,可以看到该数据包中的HTTP请求报文,可以参照HTTP请求报文的格式进行对比,其请求方法是GET。
第1 440个数据包是Web服务器响应数据包,状态码为404。状态码404代表Not Found(找不到)。
如图1-6所示,第11 626个数据包是HTTP响应报文,状态码为200,表示成功处理了请求,一般情况下都会返回此状态码。可以参照HTTP响应报文的格式进行对比。
图1-5 HTTP请求报文
图1-6 HTTP响应报文
HTTP除定义客户端使用GET方法请求网页以外,还定义了其他很多方法,比如通过Web浏览器向Web服务器提交内容、登录网站、搜索网站等就需要使用POST方法。使用相同的方法,在显示过滤器中输入“http.request.method == POST”,单击,应用显示过滤器。如图1-7所示,单击第19 390个数据包,可以看到Web浏览器使用POST方法将搜索的内容提交给Web服务器。
图1-7 HTTP的POST方法