1、HTTP 协议的主要特点
- 简单快速、灵活、无连接、无状态
2、HTTP 报文的组成部分
- 请求报文:
- 请求行 ( http 方法 + 页面地址 + http 协议 + 版本)
- 请求头( key + value 值)
- 空行(服务端通过空行来判断下一部分不再是请求头,而当做请求体来解析)
- 请求体(数据部分)
- 响应报文:状态行 + 响应头 + 空行 + 响应体
3、HTTP 方法
- GET => 获取资源
- POST => 传输资源
- PUT => 更新资源
- DELETE => 删除资源
- HEAD => 获得报文首部
4、POST 和 GET 的区别
- GET在浏览器回退时是无害的,而POST会再次提交请求 *
- GET请求会被浏览器主动缓存,而POST不会,除非手动设置 *
- GET请求参数会被完整保留在浏览器的历史记录里,而POST中的参数不会被保留 *
- GET请求在URL中传送的参数是有长度限制的,而POST没有限制 *
- GET参数通过URL传递,POST放在Request body中 *
- GET请求只能进行 url 编码,而POST支持多种编码方式
- GET产生的URL地址可以被收藏,而POST不可以
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
5、HTTP 状态码
-
1xx:指示信息 —— 表示请求已接受,继续处理
-
2xx: 成功 —— 表示请求已被成功接受
- 200:OK,表示从客户端发来的请求在服务器端被正确处理
- 204:No content,表示请求成功,但响应报文不含实体的主体部分
- 205:Reset Content,表示请求成功,但响应报文不含实体的主体部分,但是与 204 响应不同在于要求请求方重置内容
- 206:Partial Content,客户发送了一个带有Range头的GET请求,服务器完成了它(例如请求较大的文件,如用vedie标签或audio标签播放音视频地址)
-
3xx:重定向 —— 要完成请求必须进行更进一步操作
- 301:moved permanently,永久性重定向,表示资源已被分配了新的 URL
- 302:found,临时性重定向,表示资源临时被分配了新的 URL
- 303:see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源
- 304:not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
- 301:temporary redirect,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
-
4xx:客户端错误——请求有语法错误或请求无法实现
- 400:bad request,请求报文存在语法错误
- 401:unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
- 403:forbidden,表示对请求资源的访问被服务器拒绝
- 404:not found,表示在服务器上没有找到请求的资源
-
5xx:服务端错误——服务器未能实现合法的请求
- 500:internal sever error,表示服务器端在执行请求时发生了错误
- 501:Not Implemented,表示服务器不支持当前请求所需要的某个功能
- 503:service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
6、TCP 三次握手和四次挥手的理解
三次握手和四次挥手可以模拟成对讲机通话的过程
- 三次握手:
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
- 四次挥手:
1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
更多详细内容请查看链接:https://blog.csdn.net/qq_38950316/article/details/81087809
7、HTTPS
HTTPS 还是通过了 HTTP 来传输信息,但是信息通过 TLS 协议进行了加密。
TLS 中的加密:
- 对称加密 —— 两边拥有相同的秘钥,两边都知道如何将密文加密解密。
- 非对称加密 —— 有公钥私钥之分,公钥所有人都可以知道,可以将数据用公钥加密,但是将数据解密必须使用私钥解密,私钥只有分发公钥的一方才知道。
HTTPS 握手过程:
- 第一步,客户端给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
- 第二步,服务端确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。
- 第三步,客户端确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给服务端。
- 第四步,服务端使用自己的私钥,获取客户端发来的随机数(即Premaster secret)。
- 第五步,客户端和服务端根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程。
7、HTTP 2.0的特性
- 二进制传输:将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码
- 多路复用:一个 TCP 连接中可以发送多个请求
- Header 压缩
- 服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求
8、用户输入 url 到页面呈现的过程
- 用户输入url
- 浏览器查找域名的 IP 地址 域名解析(DNS解析)
- 找到 IP 地址后,建立 TCP 三次握手 ,与目标服务器建立连接
- 握手成功后,通过规定的协议(http),浏览器向目标主机发送 http 请求,请求数据包
- 服务器处理收到的请求,将数据返回至浏览器
- 浏览器收到 HTTP 响应报文
- 关闭连接 浏览器解析文档
- 读取页面内容,浏览器渲染,解析html源码
- 生成 Dom 树、解析 css 样式、js 交互
- 在生成 Render 树的过程中,浏览器就开始调用 GPU 绘制,合成图层,将内容显示在屏幕上了