深入理解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协议的主要内容,如果未能解决你的问题,请参考以下文章

深入理解HTTP协议

深入理解HTTP协议

深入理解HTTP协议

深入理解HTTP协议

转载和积累系列 - 深入理解HTTP协议

http协议深入理解