HTTP协议英文全称为:HyperText Transfer Protocol,意为超文本传输协议。
它是浏览器和web服务器之间传输数据格式的一种协议,是应用层协议。
HTTP基于TCP协议,所以发送数据前需要建立好链接。
HTTP协议制作者是蒂姆·伯纳斯-李爵士,长这样:
现在来说一说应用层、传输层、网络层和网络接口层。
1.应用层:负责处理特定的应用程序细节;
2.传输层:主要为两台主机上的应用提供端到端的通信;
3.网络层:处理分组在网络中的活动,比如分组的选路;
4.网络接口层(链路层/数据链路层):包括操作系统中的设备驱动程序、计算机中对应的网络接口卡;
HTTP协议的工作模式
HTTP工作模式是一次请求(request)和一次响应(response)的模式
使用谷歌浏览器开发工具查看HTTP协议通信过程
Windows和Linux平台可以直接按F12调出开发者工具,或者如图也可以调出开发者工具:
元素(Elements):用于查看或修改HTML元素的属性、CSS属性、监听事件、断点等.
控制台(Console):控制台一般用于执行一次性代码, 查看JavaScript对象, 查看调试日志信息或异常信息.
源代码(Sources):该页面用于查看页面的HTML文件源代码、JavaScript源代码、CSS源代码, 此外最重要的是可以调试JavaScript源代码, 可以给JS代码添加断点等.
网络(Network):网络页面主要用于查看 header 等与网络连接相关的信息.(Network 中的每一项就是一次请求/响应过程, 点击每一项, 可查看本次请求响应的报文信息)
HTTP请求报文协议
格式如下:
1.请求行 “GET /favicon.ico HTTP/1.1”
2.请求头
3.空格
4.请求体(POST请求才有请求体(form data),给服务器发送数据)
Request Headers 中就是请求的报文数据内容。
以下是示例
GET /favicon.ico HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
1.请求行: “GET /favicon.ico HTTP/1.1”。包含三个信息,用空格隔开。
第一个是请求方法,除了GET还有POST、PUT、DELETE等方法。最常用的为GET和POST方法。
GET方法主要用于从服务器获取数据,POST方法主要用于从浏览器提交数据到服务器。
第二个是请求资源路径,“/favicon.ico”
第三个是HTTP协议的版本,“HTTP/1.1”
2.请求头:示例代码中除了请求行,其余都是请求头
Host 表示浏览器要请求的主机地址. 这是我们查看下 baidu.com , 请求不同的网站, 会有不同的主机地址.
Connection 表示浏览器和服务器之间的连接方式, 浏览器和服务器连接是长连接还是短连接, 稍后会讲解.
User-Agent 用户代理, 我们使用谷歌浏览器和火狐浏览器分别请求百度, 那么会发现 User-Agent 的值是不一样的, 它主要是用于浏览器告诉服务器自己的身份, 比如浏览器端使用的操作系统是什么版本, 浏览器是什么版本等等. 服务器端为什么需要知道这个信息呢? 因为爬虫的存在,爬虫程序主要是从服务器端获取数据, 那么服务器端就会有反爬机制, 服务器不希望爬虫来获取数据, 所以通过该项可以知道客户端是否是爬虫程序. 如果爬虫程序想伪装成一个浏览器的请求, 就必须设置此项.
Accept 表示浏览器告诉服务器, 自己能够接收并识别的文件类型.
Accept-Encoding 表示浏览器能够处理的压缩方式. 为什么需要压缩呢? 当网页数据量大的时候, 压缩之后可以提高传输速率, 提高用户体验.
Accept-Language 浏览器可以接收的文本语言, 如果非中文编码可能会出现乱码.
HTTP响应报文协议
与请求报文对应,格式类似
1.响应行 “HTTP/1.1 200 OK ”
2.响应头
3.空行
4.响应体(客户端真正使用的数据在响应体里面)
Response Headers 中就是响应的报文数据内容。
以下是示例
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: image/x-icon
Date: Fri, 19 Apr 2019 09:02:56 GMT
Server: Apache
1.响应行:“HTTP/1.1 200 OK”,分为三个部分。
第一部分 HTTP/1.1 表示 HTTP协议的版本,
第二部分是一个数字, 这个数字表示响应状态码, 用户向服务器发出了请求, 如果服务器正常返回响应报文, 那么状态码一般都是200, 这里需要说的是, 响应的状态码除了 200 之外, 还有其他的状态码,
302 redirect, 我们通过 302 状态码可以指示浏览器跳转到某一个 URL.
404 NOT FOUND, 当我们访问一个不存在的 URL 时, 一般会返回404状态码, 告诉浏览器, 你访问的 URL 是不存在的.
500 Internal Server Error, 服务器遇到了一个未曾预料的状况, 导致了它无法完成对请求的处理. 一般来说, 这个问题都会在服务器端的源代码出现错误时出现.
第三部分的 “OK” 表示原因短语, 表示对前面状态码的简单描述.
2.第二行下面的所有内容, 我们叫做响应头. Content-Type 表示响应内容的文本格式和编码方式.