Http(s)知识梳理


前言

最近在面试了经常会被问到的问题是你对http协议的理解是什么,了解https协议吗?http协议有什么版本?面试的时候都是印象流的回答.梳理一下http协议吧.

一、Http协议是什么?

Http协议的全称翻译是超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议。

主要特点有:

参考内容

1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

3.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
(这里的无连接理解为无Http连接,实际上http作为应用层,是借助了TCP的连接来进行传输的,不过下层为上层提供透明的服务.在http1.1以后的版本支持持久连接,减少资源的浪费)

4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
(引入Cookie和Seesion)
5、支持B/S及C/S模式。

二、URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息

https://editor.csdn.net/md?articleId=115570014

url的组成

协议名://主机名(ip或域名):端口号(http默认80,https默认443)
后续还有目录名文件名以及参数设置(get请求的参数会体现在地址栏)

三、Http请求Request

http请求的数据格式:
请求状态行、请求头、空行和请求数据
在这里插入图片描述
(此处为wireshark抓包)

请求状态行

如抓包图所示,第一行即为请求状态行

GET / HTTP/1.1\r\n

状态行包括请求方法(这里为GET)、URL字段(这里为/,因为是访问首页)、http协议版本(这里为1.1)
关于请求方法:
参考资料
GET: 请求获取Request-URI所标识的资源
POST在Request-URI所标识的资源后增加新的数据
HEAD: 请求获取由Request-URI所标识的资源的响应消息报头
PUT: 请求服务器存储或修改一个资源,并用Request-URI作为其标识 DELETE: 请求服务器删除Request-URI所标识的资源
TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT: 保留将来使用
OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求
现阶段我常接触到的是GET、POST

请求头

图中为Accept到Connect的几行
在这里插入图片描述
请求头的目的是想服务器端发送一些附加信息或者客户端的自身信息.在爬虫的时候经常需要伪装成浏览器,那就需要伪装构造一个请求头.Cookie是在请求头中的
(在抓包中可以看到Connection:Keep-Alive字段,可以保持TCP连接)

请求正文

POST方法才有请求征文,GET方法无.请求正文里的一般是请求数据.举例

articleId=115570014&name=rglkt

四、Http响应Response

响应包括:
状态行、消息报头、空行和响应正文
在这里插入图片描述

状态行

HTTP/1.1 200 OK \r\n

状态行包括HTTP协议版本,HTTP响应状态码以及对状态码的文本描述
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息 - 表示请求已接收,继续处理
2xx:成功 - 表示请求已被成功接收、理解、接受
3xx:重定向 - 要完成请求必须进行更进一步的操作
4xx:客户端错误 - 请求有语法错误或请求无法实现
5xx:服务器端错误 - 服务器未能实现合法的请求

常见状态代码、状态描述、说明:
200: OK - 客户端请求成功
400: Bad Request - 客户端请求有语法错误,不能被服务器所理解 401: Unauthorized - 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403: Forbidden - 服务器收到请求,但是拒绝提供服务
404: Not Found - 请求资源不存在,eg:输入了错误的URL 500: Internal Server Error - 服务器发生不可预期的错误
503: Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常

消息报头

用来说明客户端要使用的一些附加信息
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

响应正文

服务器向客户端返回的信息(图里没有截图,比较多的为HTML文件,比如浏览器浏览网页)

HTTP版本

参考资料
HTTP/0.9 最初版本,功能简陋,只有GET方法,仅能请求访问HTML格式的资源
HTTP/1.0 增加POST和HEAD方法,可以根据Content-Type可以支持多种数据格式.通信必须包括头信息,新增了状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。
但是每次TCP连接只能发送一个请求,服务器响应后就会关闭连接,下一个请求需要再次建立连接(比较浪费资源).所以使用Connection: keep-alive字段来解决问题
HTTP/1.1 默认为持久连接.加入管道机制,同一个TCP连接中允许多个请求同时发送,增加并发性.但是服务器还是会按顺序回应请求
HTTP/2.0 彻底的二进制协议,头信息和数据体都是二进制,统称为"帧".头信息帧和数据帧.多工:可以同时发送多个请求和响应,且不用一一按顺序响应.服务器推送,web请求数据时会预先推送资源到客户端(客户端本地有缓存直接本地加载)

补充:Cookie和Session

参考资料
1、存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、安全性:cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
3、性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
4、限制:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

Cookie

当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内容给你。
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。

Session

cookie保存session的id:保存这个session id的方式可以采用cookie,一般这个cookie的名字都是类似于SEEESIONID。
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。

经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器
会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:

<form name="testform" action="/xxx"> 
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 
<input type="text"> 
</form> 

工作原理

参考资料
在这里插入图片描述
想补充的是,浏览器关闭后session并没有消失,不过是sessionId已经不知道了,服务器会为浏览器重建一个session.原来的还存在服务器上,等到时间到过期了就会被关闭

HTTPS

由于HTTP是明文通信,容易被窃听.所以通过SSL(Secure Socket Layer, 安全套接层 )或 TLS(Transport Layer Security, 安全层传输协议)的组合使用,加密 HTTP 的通信内容。属于通信加密,即在整个通信线路中加密。

HTTPS 采用共享密钥加密(对称)和公开密钥加密(非对称)两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。

所以应充分利用两者各自的优势, 将多种方法组合起来用于通信。 在交换密钥阶段使用公开密钥加密方式,之后的建立通信交换报文阶段 则使用共享密钥加密方式。
在这里插入图片描述
在这里插入图片描述

以下为我个人理解

参考资料
在这里插入图片描述

  1. 首先客户端向服务器发送请求.服务器返回SSL证书

解释:为什么需要证书?因为当大家都有公钥和私钥.没有证书,黑客可以采取这种方法截取信息.客户端向服务器发送消息,黑客截取下来.黑客向服务器发送请求信息,同时向客户端返回一个假公钥.服务器向黑客返回真公钥.黑客用自己的私钥解密客户端发送的信息,再用真公钥加密发送给服务器端.然后用自己的私钥向客户端返回服务器返回的信息.这样就可以持续监听消息.而证书的作用就是用于鉴定公钥的真伪.

  1. 客户端接收证书,对证书进行验证

解释:如何验证?证书是由权威机构进行颁发的.因此验证证书会找到证书上的颁发机构的根证书,权威机构会在浏览器中内嵌证书(如果找不到,就不承认证书),从根证书中获取公钥对证书签名进行解密,可以获得指纹和指纹算法.然后通过指纹算法计算证书hash值,是否与指纹一致(不一致说明证书被修改,不承认).然后再验证证书上的URL即可

  1. 确认证书正确后,客户端用正确的公钥加密一个对称性密钥.
  2. 服务器用私钥解密对称性密钥,用对称密钥来对客户端进行通信.

解释:为什么要使用对称性密钥结合非对称性密钥的方式.纯对称密钥(1)不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高(2)因每个客户端、服务器的安全级别不同,密钥极易泄露而结合的好处是:对称性密钥通信会更加快速.还有一个可以解决黑客冒充的问题.黑客可以截断客户端请求,然后原样向服务器发送请求,服务器返回请求,由于黑客也有公钥,可以解密服务器私钥加密的数据,这样就可以窃取服务器发送的消息.两种密钥结合的方式能够发挥各自的优势.

猜你喜欢

转载自blog.csdn.net/rglkt/article/details/115570014