深入理解HTTP协议
Posted It‘s so simple
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解HTTP协议相关的知识,希望对你有一定的参考价值。
1. HTTP概述
- HTTP:超文本传输协议
- HTTP协议是无连接、无状态。工作在应用层的协议。
对无连接的理解:
HTTP协议本身是没有维护连接信息的,HTTP的数据会交给网络协议栈传输层的TCP协议。
这里其实就存在着一个问题:既然http是无连接的,不维护连接信息的,那么它是否是不可靠传输?
答案是否定的,它是可靠传输,因为它会将它的数据交给传输层的TCP协议,而TCP协议却是面向连接的协议,因此,HTTP协议是可靠传输的。
对无状态的理解:
HTTP协议自身不对请求和响应之间的通信状态做持久化的处理,换句话来讲就是不会对这些通信状态进行相应的保存,请求和响应完了也就完了,下次再来就还是当作新的请求和响应来处理。
2. 对HTTP中URL的解释
首先我们要知道URL是什么,平时我们所俗称的网址,其实说的就是URL。
那么URL中到底有什么呢?每个片段对应的含义又是怎样的呢?
话不多说,都在图里
这里我们要重点说一下URL格式中所要提交给服务器的数据,也就是查询字符串的那个片段。提交的数据是以多个键值对的形式存在的,并且数据与数据之间是通过&
来进行分隔,例如:key1=value1 & key2=value2 & ...
。
并且像 /
?
:
等这样的字符, 已经被URL当做特殊意义理解了. 因此这些字符不能随意出现。比如, 如果某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义。
URL也有对应的转义规则:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,然后在前面加上
%
,编码为%xy
的格式。
举个例子来说:
当我们搜索C++的时候,URL会自动对+
进行转义,这里其实涉及到了两个名词:
urlencode
:将字符转换为16进制。urldecode
:将16进制数据转换为字符因此,这里的
+
就被URL自动urlencode
了,转义为%2B
。
这里的%
的意思是提示服务器后面的数据是被urlencode
过来的。
对URL格式的一些补充:
① 使用http:或 https:等协议方案名获取访问资源时要指定的协议类型。并且它们之间时不区分大小写的。
- http:是明文传输。
- https:是加密传输。它和http最大的区别就是使用了ssl,即非对称加密方式来对数据进行加密。
- http默认侦听的端口是80端口,https默认侦听的端口是443端口。
② 登录信息(认证)是指将用户名和密码传递给服务器,是用来获取服务器资源的所必要的信息,此项是可选项。
③ 查询字符串针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数。此项也是可选项。
3. HTTP协议中的数据流
话不多说,直接见图:
4. HTTP协议的格式
先来看看请求的格式:
我们用实际的例子来验证一下请求的格式,直接用百度搜索搜百度文库,然后按下F12,进入开发者工具集,首先点击network的按钮,对其进行查看。
然后随便点击Name列的元素,查看其对应的请求头部。
接下来,我们来看看响应的格式:
同理,我们来实际验证一下响应格式:
5. HTTP的协议版本
HTTP到目前位置总共有四个版本。
① HTTP/0.9
它是第一个版本的HTTP协议,已经过时了,它的组成极其简单,只允许客户端发送GET这一种请求,且不支持请求头。
② HTTP/1.0
它是第一个在通讯中指定版本号的HTTP协议版本,至今任被广泛采用在服务器端。
③ HTTP/1.1
该版本是目前使用最广泛的协议版本,是目前主流的的HTTP协议版本。
④ HTTP/2.0
新一代HTTP/2.0正在制作中,但要达到较高的使用覆盖率,任需假以时日。
更为详细的HTTP版本之间的区别,请看这篇知乎大佬的文章。
6. 请求/响应的字段
- Content-Type:描述的是正文的数据类型
- Content-Length:描述的是正文(请求/响应)的长度
- Host:客户端告诉Web服务器,所请求的资源在哪一个ip和端口上。
- User-Agent:声明用户的操作系统和浏览器的版本信息(可以用来防爬虫)
- referer:当前页面是从哪个页面跳转过来的
- Location:搭配3XX的状态码来使用,告诉客户端接下来要去哪里进行访问
- Cookie:用于在客户端存储少量信息,通常用与实现会话(session)的功能。
对Cookie的简单了解
7. 对HTTPS的简单概述
首先我们要知道的是,HTTP + 加密 + 认证 + 完整性保护 = HTTPS。或者也可以这样看HTTPS,HTTPS是身披SSL外壳的HTTP,HTTPS并非是应用层的一种新协议。它只是HTTP通信接口部分用SSL和TLS协议代替而已。
通常,HTTP直接和TCP通信。当使用SSL时,则演变为先和SSL通信,再由SSL和TCP通信了
在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet协议均可配合SSL协议使用。
由此我们可以的得出的是,当我们数据在进行传输的时候,首先客户端和服务端建立TCP连接,假设应用层使用的协议是HTTPS,则我们是先进行SSL握手然后再发送数据,由于是先和SSL进行通信,然后再和TCP进行通信,因此是先进行SSL握手然后再进行三次握手。
以上是关于深入理解HTTP协议的主要内容,如果未能解决你的问题,请参考以下文章