HTTP、HTTPS

http协议概述

http是一个客户端和服务端请求应答的标准
通过网络请求或者网络爬虫或其他工具,客户端发起一个http请求到服务端的制定端口(80)
应答的服务器上存放着资源,html文件,图片,等等
应答服务器称之为源服务器
在用户和源服务中间可能有多个中间层,比如代理服务器,网关,隧道 等

尽管TCP/IP协议是最流行的传输协议
但是http协议并没有规定必须使用TCP/IP
http可以在任何互联网协议上,或其他网络上实现
http协议会假定下层的协议是安全可靠的,因此能够提供这种保障的都可以被其使用,
TCP是传输层协议,http是应用层协议

客户端连接到服务端 与服务端建立TCP套接字连接
发送http请求
客户端发送一个文本的请求报文
由请求行,请求头,空行、请求数据四部分组成
服务端收到请求后解析请求,定位请求资源 将资源复写到TCP套接字,由客户端进行读取,由状态行,响应头、空行、返回数据四部分组成
如果connection模式是false则服务器主动关闭连接,如果值为keppAlive则连接会保持一段时间,在这段时间是可以继续进行数据传输的
客户端收到相应数据后
会先解析状态行,查看请求是否成功,
然后读取响应头,
然后读取响应数据,将响应的数据在页面中进行展示

在浏览器地址栏输入URL,按下回车之后会经历以下流程:

1.浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2.解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3.浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4.服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5.释放 TCP连接;
6.浏览器将该 html 文本并显示内容;  

http的特点

http协议规定,在发起http请求的时候,一定是从客户端开始发起链接请求,服务端在没有接收到请求的时候是不会向服务端发送响应。
http是无状态的 是不对响应和请求之间的状态做保存的,协议对发送过的请求和响应是不做持久化处理的。
http是无连接的,也就是说每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户端的应答后,就会断掉链接,采用这种方式,可以节省传输时间,和提高并发性能

无连接的两种方式:

一个请求一个响应之后就直接断开了。

但是在http1.1中不是这样的而是会等待几秒钟,这几秒钟就是在等待客户端的操作,如果这个时候用户还有新的请求,就不用再重新发起连接
还是通过直接的连接进行收发消息,因为没次建立连接的三次握手也是耗时的。

不支持该请求方式时状态码为405
错误的请求方式时状态码为501

为什么http建立连接需要三次握手,不是两次或四次?

答:三次是最少的安全次数,两次不安全,四次浪费资源;

SPDY协议

http2是基于spdy协议
spdy协议是基于TCP的应用层协议
目标 是优化http的性能
通过压缩、多路复用、优先级等技术缩短页面的加载时间和提高安全
SPDY的核心思想是减少TCP的连接数量
SPDY协议不是替代http协议而是增强HTTP协议

http1的缺点

1.http1 一次只允许一个TCP的链接请求,1.1的处理并发的方式也比较局限性,客户端发起多次请求的时候也会导致队列头的阻塞。
2.单向请求,只能由客户端发起请求
3.请求头和响应头的信息冗杂
4.数据未压缩,导致数据传输量过大

http2的优化点

1.二进制分帧

http1的数据传输方式是通过文本的形式进行传输,在二中则使用可以将传输信息分为更小的帧的形式进行传输,
原来的请求头封装到headers帧
原来的request body 封装到Data帧

2.首部压缩

http1是不支持首部压缩的
SPDY使用DEFLATE算法和http2使用HPACK算法对头部进行压缩

http1中使用文本的形式进行头信息的传输,如果携带了cookie则每次都要进行传输
http2中通过算法对头部进行了压缩,并且在客户端和服务端同时维护两张索引表,其中记录出现过的header
在后面的传输中就可以通过键名进行传递,两端收到数据后就可以通过键名找到对应的值

3.多路复用

1.同一域名下,只需要建立一个连接。 => 减少握手等待时间,以及多个 tcp 竞争带宽。
2.单个连接可以承受任意数量的双向数据流。 => 并行多个请求响应。
3.数据流以消息的形式发送,消息由一个或多个帧组成;帧可以乱序发送,根据帧头部的流标识重新组装。 => 可以设置一个 31 bit 的优先级,有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。
建立一次链接(三次握手只进行一次)
然后将消息分解为独立的帧,
可无序的进行信息传递
在另一端根据帧头部的流标识将传递的信息进行重新组装
可避免http的队头阻塞。

4.请求优先级

当请求的信息被分为多个帧之后,可以通过优化传输顺序来起到优化性能的作用

5.服务器推送

服务器可以在接受到一个请求后对客户端发起多个响应
服务器向客户端推送资源无需客户端进行确认
比如服务端收到你首页的请求时可以同时响应多个资源,服务端知道这些资源都是客户端所需要的,这样就加快了页面的渲染速度
推送的确定是必须遵守同源策略,服务器不能随便将三方资源推送给客户端,而且必须是两端都确认过才行。

三次握手

客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:我要连接你)

服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:好的,你来连吧)

客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。(客户端:好的,我来了)

四次挥手

Client向Server发送FIN包,表示Client主动要关闭连接,然后进入FIN_WAIT_1状态,等待Server返回ACK包。此后Client不能再向Server发送数据,但能读取数据。

Server收到FIN包后向Client发送ACK包,然后进入CLOSE_WAIT状态,此后Server不能再读取数据,但可以继续向Client发送数据。

Client收到Server返回的ACK包后进入FIN_WAIT_2状态,等待Server发送FIN包。

Server完成数据的发送后,将FIN包发送给Client,然后进入LAST_ACK状态,等待Client返回ACK包,此后Server既不能读取数据,也不能发送数据。

Client收到FIN包后向Server发送ACK包,然后进入TIME_WAIT状态,接着等待足够长的时间(2MSL)以确保Server接收到ACK包,最后回到CLOSED状态,释放网络资源。

Server收到Client返回的ACK包后便回到CLOSED状态,释放网络资源。

为什么要四次挥手?

TCP是全双工信道,何为全双工就是客户端与服务端建立两条通道,通道1:客户端的输出连接服务端的输入;通道2:客户端的输入连接服务端的输出。两个通道可以同时工作:客户端向服务端发送信号的同时服务端也可以向客户端发送信号。所以关闭双通道的时候就是这样:

客户端:我要关闭输入通道了。(通知)
服务端:好的,我检查下有咩有还要传输的数据。(收到通知,并进行确认)

服务端:我检查好了可以关闭了 我关闭输入通道了。(确认完毕后,向客户端发起通知)
客户端:好的你关闭吧,我也把这个通道关闭。(最后回复)

http的发展历程

版本 产生时间 内容 发展现状
HTTP/0.9 1991年 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 没有作为正式的标准
HTTP/1.0 1996年 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 正式作为标准
HTTP/1.1 1997年 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 2015年前使用最广泛
HTTP/2 2015年 多路复用、服务器推送、头信息压缩、二进制协议等 逐渐覆盖市场

https

1.客户端对服务端发起请求(携带浏览器支持的加密算法和哈希算法。)
2.服务端返回证书给客户端

3.客户端端拿到证书在客户端校验证书的合法性(不合法提示警告)(使用证书的公钥解密得到证书内容,然后校验证书)
4.客户端生成随机密钥x(随机数生成)
5.客户端再用证书的公钥加密密钥x
6.客户端把加密后的密钥x给到服务端

7.服务端收到后用私钥解密加密后的密钥x
8.服务端端用密钥x对网页内容进行加密(对称加密算法)
9.服务端把加密后的内容返回给客户端

10.客户端对使用密钥x对加密后的网页内容进行解密获取网页内容

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2019-2021 伯温

请我喝杯咖啡吧~