写在前面
之前做 爬虫相关的 工作基本上都是基于 Http 这个应用层的协议来做的,包括查看请求头,分析一些加密字段等等从而用代码来模拟客户端(浏览器)的行为,达到快速获取数据的目的。
今天我们借助 Wireshark 这个工具来分析一下 Http 协议。
1. Http 简介
Http(Hyper Text Transfer Protocol) 超文本传输协议,是运行在 应用层上的,默认端口为80,详细规定了 浏览器和万维网服务器 之间的通信规则,是 应用最广泛的协议。类似应用层的协议还有 FTP@port 21、SMTP@25、TELNET@23。

2. Http 特点
之前在介绍TCP的时候,大概介绍了 Http。特点如下:
- 快速:客户端发起请求时候,只传 请求方法 和 路径,所以通信快
- 灵活:就是所谓媒体独立性。可以传输任意类型的数据对象,只要双方进行指定。
- 无连接:每次处理一个请求。
- 无状态:无连接,所以无状态。对处理事务没有记忆能力。
- 支持 C/S 模式:支持基本认证和安全认证。
3. Http 工作流程
这里的工作流程很简单。
一次 HTTP 操作成为一个事务,工作流程分为4步:
- C/S建立连接:只要单击某个超链接,HTTP就开始工作,建立连接。
- 客户端发送 request:建立连接后,客户端发送请求给服务器。
- 服务器处理请求并响应:返回特定格式的响应。
- C接收响应:客户端接收服务器的相应,并且由浏览器显示,之后 断开连接(也就是上面提到的无连接)。
下面我们用 Wireshark 抓包来看一下整体 HTTP 协议的运行流程。需要注意的是,HTTP是基于TCP协议之上的,所以这里当然也可以看到很多 TCP 的包穿插其中。

1)TCP 三次握手。可以看到是帧号 47/71/73 这三个包。TCP 连接已经建立。
2)我的电脑(10.112.88.112)给百度的服务器(112.34.111.226) 发送了一个 HTTP 请求,是帧号为 76 的包。
看这个HTTP请求包的详细信息:

可以看到,倒数第二行 response in Frame:105。 就是说这个HTTP请求会在 105帧由服务器应答。而我们看105帧,确实是一个返回状态码200/OK 的由S到C的HTTP包。
进一步,看一下 105帧的 HTTP 包:

可以看到,这个包里注明了,是回应 76帧 的 HTTP request,这个response包中包含了 response的内容。并且制定了下一个 request 和 response 的帧号。
按照无连接的特点来说,这里一次HTTP连接已经断开,直到下一次请求重新建立。
这里只是看一下流程,至于具体的 request 和 response 的报文结构我们后面再看。
4. HTTP 请求消息 Request
客户端发送一个HTTP请求消息包括:
- 请求行:请求类型、访问的资源、HTTP版本
- 请求头:说明服务器要使用的附加信息
- 空行:请求头后面要有一个空行
- 请求数据:请求数据的主体
(1)Get请求例子

第一部分:请求行
第二部分:请求头
第三部分:空行是必须的
第四部分:请求数据的主体。 Get请求是没有这个部分的。Get请求发送的数据都放在URL后面,以?和URL隔开(这也就是之前做爬虫时候需要获得的那些参数。)
Get请求这里实际上只有三个部分
(2)POST请求例子

同样对应了上面四个部分。
5. HTTP 响应 Response
在以前做爬虫相关的工作中,也看了很多Response。这里 Response 也是包含4个部分:状态行、消息报头、空行、响应正文。

6. 状态码
三位数组成的状态码,其中第一位定义了相应的类别:
- 1xx:指示信息--表示请求已接收,继续处理
- 2xx:成功--表示请求已被成功接收、理解、接受
- 3xx:重定向--要完成请求必须进行更进一步的操作
- 4xx:客户端错误--请求有语法错误或请求无法实现
- 5xx:服务器端错误--服务器未能实现合法的请求
7. HTTP的 Request 方法
HTTP1.0定义三种请求方法:GET/POST/HEAD
HTTP1.1新增了5中方法:OPTIONS/PUT/DELETE/TRACE/CONNECT

8. HTTP 工作原理
按照上面说的工作步骤来叙述工作原理:
1)客户端连接到Web服务器:
浏览器与Web服务器的HTTP端口建立一个 TCP套接字连接。
2)发送HTTP请求:
通过套接字,C发送包括请求行、请求头、空行、请求数据组成的请求报文。
3)服务器接收请求并返回HTTP响应:
Web 服务器解析请求,定位请求资源,将资源复本写到 TCP 套接字,由C读取。
4)释放TCP连接:
如果 connection 模式为 close,则服务器主动关闭 TCP 连接;如果是 keep-alive,保持TCP连接。
5)浏览器解析HTML内容:
浏览器对 Response 从头到尾解读,显示在浏览器窗口中。
总之就是C/S端到端的模式。
9.Get 和 POST 的区别
- Get 提交的数据在 URL 之后,以?分隔。POST提交的数据在 第4部分的 body 中。
- Get 提交数据会有安全问题。所以一般不用来提交 name/paswd,因为对于用户是可见的,如1中提到的,是在 url 中的。
但是实际上 post 请求的包,如果去抓包的话,也是会抓到的,也不安全。
-
Get 提交数据大小有限制。POST没有
-
POST 请求,产生两个 TCP数据包,先发送 header 信息,服务器响应之后,再发送 data信息。
-
获取变量值的方法不同。
GET 请求直接用 get() 方法就可以获得,POST请求要通过表单来获得。 -
一般来说 ,GET 用来获取数据 , POST 用来向服务器发送数据。
当然,这个也不算不同点。
网友评论