详解HTTP&HTTPS协议(附面试题文档)
前言 & 初衷
- 希望能对后面面试前端工程师实习生这一岗位的小伙伴们有所帮助,也希望自己能在这次总结中能力有所提升。
了解一下TCP/IP协议
- TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集,所以要理解HTTP协议,有必要先了解下TCP/IP协议相关的知识。 由于TCP/IP协议族包含众多的协议,在这里我们无法一一讨论。接下来,我们仅介绍理解HTTP协议需要掌握的TCP/IP协议族的一些相关知识点。如果想深入理解TCP/IP协议,可以参考经典书籍《TCP/IP详解》。
TCP的三次握手
- 客户端和服务端都需要直到各自可收发,因此需要TCP的三次握手。
- 从图片可以得到三次握手可以简化为:A发起请求连接B确认,也发起连接A确认我们再看看每次握手的作用:
第一次握手:B只可以确认自己可以接受A发送的报文段、:SYN=1的报文段不能携带数据,但消耗一个序号
第二次握手:A可以确认 B收到了自己发送的报文段,并且可以确认 自己可以接受B发送的报文段、:二次握手时分配服务器端的资源
第三次握手:B可以确认A收到了自己发送的报文段:ACK报文段可以携带数据,不携带数据则不消耗序号。三次握手时分配客户端的资源
SYN洪泛攻击: SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
防范SYN攻击措施:降低主机的等待时间使主机尽快的释放半连接的占用,短时间受到某IP的重复SYN则丢弃后续请求。
TCP的四次挥手
- 客户端主动要求断开连接,服务端把要发送的数据发送完,被动关闭连接,所以需要四次挥手
- 第一次挥手:A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u)
第二次挥手:B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v)
第三次挥手:B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1)
第四次挥手A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1)
TCP和UDP的区别
- TCP是面向连接的,UDP是无连接的即发送数据前不需要先建立链接。
- TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;并且因为tcp可靠,面向连接,不会丢失数据因此适合大数据量的交换。UDP尽最大努力交付,即不保证可靠交付。
- TCP是面向字节流,UDP面向报文,并且网络出现拥塞不会使得发送速率降低(因此会出现丢包,对实时的应用比如IP电话和视频会议等)。
- TCP只能是1对1的,UDP支持1对1,1对多。
- TCP的首部较大为20字节,而UDP只有8字节。
- TCP是面向连接的可靠性传输,而UDP是不可靠的。
TCP协议为什么可靠?
TCP是面向连接的,TCP通过三次握手的方式建立连接,并且有ACK机制保证传输的可靠性。添加笔者微信,回复:HTTP,可以获取更多笔者整理的HTTP面试干货。
- ACK机制
由于通信过程的不可靠性,传输的数据不可避免的会出现丢失、延迟、错误、重复等各种状况,TCP协议为解决这些问题设计了一系列机制。 这个机制的核心,就是发送方向接收方发送数据后,接收方要向发送方发送ACK(回执)。如果发送方没接收到正确的ACK,就会重新发送数据直到接收到ACK为止。
- 比如:发送方发送的数据序号是seq,那么接收方会发送seq + 1作为ACK,这样发送方就知道接下来要发送序号为seq + 1的数据给接收方了。
添加笔者微信,回复:HTTP,可以获取更多笔者整理的HTTP面试干货。
我们来看看在不同的异常情况下,ACK机制是怎么工作的:
- 数据丢失或延迟。发送方发送数据seq时会同时起一个定时器,如果在指定时间内没有接收到ACK seq + 1,就把数据seq再发一次。(重传策略)
- 数据乱序。接收方上一个收到的正确数据是seq + 4,它返回seq + 5作为ACK。这时候它收到了seq + 7,因为顺序错了,所以接收方会再次返回seq + 5给发送方。
- 数据错误。每一个TCP数据都会带着数据的校验和。接收方收到数据seq + 3以后会先对校验和进行验证。如果结果不对,则发送ACK seq + 3,让发送方重新发送数据。(校验策略)
- 数据重复。接收方直接丢弃重复的数据即可。
ACK机制的优化
- 流量控制(滑动窗口机制)
数据的传送过程中很可能出现接收方来不及接收的情况,这时就需要对发送方进行控制以免数据丢失。
利用滑动窗口机制可以很方便地在TCP连接上对发送方的流量进行控制。TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。
- 堵塞控制(慢启动机制)
拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。
流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收
- 拥塞控制的算法
我们假定: 数据单方向传送,而另外一个方向只传送确认。
接收方总是有足够大的缓存空间,因为发送窗口的大小由网络的拥塞程度来决定。
发送方的发送窗口的上限值应当取为接收方窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个,即发送窗口的上限值为Min[rwnd, cwnd]
当rwnd < cwnd时,是接收方的接收能力限制发送窗口的最大值
当cwnd < rwnd时,则是网络的拥塞限制发送窗口的最大值
拥塞控制的过程一共涉及了4种算法: 慢启动 拥塞避免 快重传 快恢复 本文只介绍其中一种算法慢启动算法,其他算法各位看官可自行百度。
- 慢启动
发送方维护一个拥塞窗口cwnd的状态变量,拥塞窗口的大小取决于网络的拥塞程度,动态变化。通过逐渐增加cwnd的大小来探测可用的网络容量,防止连接开始时采用不合适的发送量导致网络拥塞。
当主机开始发送数据时,如果通过较大的发送窗口立即将全部数据字节都注入到网络中,由于不清楚网络状况,有可能引起网络拥塞。较好的方法是试探,从小到大逐渐增大发送端拥塞窗口的cwnd数值。
例如:开始发送方先设置cwnd=1,发送第一个报文段M1,接收方接收到M1后,ACK返回给发送端,发送端将cwnd增加到2,接着发送方发送M2,再次接受到ACK后将cwnd增加到4...慢启动算法每经过一个传输轮次,拥塞窗口cwnd就加倍。添加笔者微信,回复:HTTP,可以获取更多笔者整理的HTTP面试干货。
HTTP && HTTPS协议
- http: 超文本传输协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
- https: 是以安全为目标的HTTP通道,简单讲是HTTP的安全版,HTTP下加入SSL层(SSL协议),HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 https协议的主要作用是:建立一个信息安全通道,来确保数据的传输,确保网站的真实性。
http 和 https 区别
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
- https协议需要ca证书,费用较高。
- 使用不同的链接方式,端口也不同,一般而言,http协议的端口为80,https的端口为443
https协议的工作原理(SSL层原理)
- 客户使用https url访问服务器,则要求web 服务器建立ssl链接。
- web服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),返回或者说传输给客户端。
- 客户端和web服务器端开始协商SSL链接的安全等级,也就是加密等级。
- 客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。
- web服务器通过自己的私钥解密出会话密钥。
- web服务器通过会话密钥加密与客户端之间的通信。
http1.0、http1.1、http2 的区别
1.在http1.0h协议中,一个Request一个Response,这次http请求就结束了
2.在http1.1中进行了改进,WebSocket有一个connection:Keep-alive,也就是说,在一个http连接中,可以发送多个Request,接收多个Response。
3.http2.0中:3.1.允许多路复用:多路复用允许同时通过单一的HTTP/2连接发送多重请求-响应信息。改善了:在http1.1中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制(连接数量),超过限制会被阻塞。
3.2.二进制分帧:HTTP2.0会将所有的传输信息分割为更小的信息或者帧,并对他们进行二进制编码
3.3.首部压缩
3.4.服务器端推送
讲一下对称加密算法、非对称加密算法
- 对称加密算法
发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。
相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。
- 非对称加密算法
接收方在发送消息前需要事先生成公钥和私钥,然后将公钥发送给发送方。发送方收到公钥后,将待发送数据用公钥加密,发送给接收方。接收方收到数据后,用私钥解密。
在这个过程中,公钥负责加密,私钥负责解密,数据在传输过程中即使被截获,攻击者由于没有私钥,因此也无法破解。
非对称加密算法的加解密速度低于对称加密算法,但是安全性更高。
但是必须记住,在http1.0和http1.1中一个Request只能对应有一个Response,而且这个Response是被动的,不能主动发起。
HTTP与TCP/IP、DNS的关系
如果要说清楚HTTP与TCP/IP、DNS的关系,那就要清楚一次完整的HTTP事务(在浏览器输入地址(url),按下回车后,到看到完整页面之前,发生了什么?)
- 我们通过一张图来解释,一共分为六步。
第一步:DNS域名解析(找到域名对应的IP地址)。
第二步:建立TCP连接(包含三次握手和四次挥手)。
第三步:浏览器发起HTTP请求。
第四步:服务器端解析HTTP请求,处理并响应HTTP请求。浏览器得到html代码。
第五步:浏览器解析html代码,请求资源(如js、css、图片等)。
第六步:浏览器对页面进行渲染,呈现给用户。
常用的状态码
- 2XX 成功
200 OK,表示从客户端发来的请求在服务器端被正确处理
204 No content,表示请求成功,但响应报文不含实体的主体部分
206 Partial Content,进行范围请求 - 3XX 重定向
301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
302 found,临时性重定向,表示资源临时被分配了新的 URL
303 see other,表示资源存在着另一个 URL,应使用 GET 方法丁香获取资源
304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
307 temporary redirect,临时重定向,和302含义相同 - 4XX 客户端错误
400 bad request,请求报文存在语法错误
401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
403 forbidden,表示对请求资源的访问被服务器拒绝
404 not found,表示在服务器上没有找到请求的资源 - 5XX 服务器错误
500 internal sever error,表示服务器端在执行请求时发生了错误
503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
总结
至此有关与http和https的一些基本面试问题算是都列出来了!(各位看官如果喜欢本文的欢迎点赞收藏!你们的鼓励会使我更有动力,当然,如果发现我的总结还有不足之处,欢迎评论指正!)