报文
请求报文
- 请求行:请求方法、请求地址和协议及版本,以CRLF结束。
- 请求Header:拥有若干个报文属。
- 空行,分隔首部和请求体
- 请求体。
POST和PUT的区别
在HTTP规范中,POST是非幂等的,PUT是幂等的
GET与POST的区别?
- GET是幂等的,POST不是幂等的;
- GET一般用于从服务器获取资源,而POST一般是改变服务器上的资源;
- GET请求的数据附在URL之后,参数有长度限制;POST请求的数据在请求体中,参数无长度限制;
- GET请求可被缓存、收藏、保留到历史记录,参数暴露在URL中。POST不会被保存,安全性相对较高,参数在body中;
- GET只允许ASCII字符,POST对数据类型没有要求;
- GET的长度有限制(操作系统或者浏览器的限制),而POST数据大小无限制
- GET产生一个TCP数据包;POST一般产生两个TCP数据包。POST,浏览器先发送header,服务器响应100 continue,浏览器再发送body,服务器响应200
并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
GET 加 request body,POST 带url参数,不同服务器的处理方式也是不同的,有些服务器支持有些不支持,所以,虽然GET可以带 request body,不能保证一定能被接收到。
post里面传的都是表单吗?
contentType用于表明发送数据流的类型
常用的Content-Type:text/html, image/png,application/x-www-form-urlencoded, multipart/form-data, application/json等。
断点续传的原理是什么
范围请求,首部字段Range
来指定资源的byte范围。
一个 url 分为哪几部分,各个部分的含义是什么
统一资源定位符(URL)用于完整地描述资源的地址。
URL的一般格式为(带方括号的为可选项):protocol://hostname[:port]/path/[;parameters][?query]#fragment
URL由三部分组成: 协议类型 ,主机名 和 路径及文件名 。
1、protocol:指定使用的传输协议。
2、hostname:是指存放资源的服务器主机名或 IP 地址。
3、port:省略时,使用默认端口。
4、path:表示主机上的一个目录或文件地址。
5、;parameters:指定特殊参数的可选项。
6、?query:可选,可有多个参数。
7、fragment,信息片断,用于指定网络资源中的片断。
百分号(URL)编码
URL规定只能使用英文字母、数字和某些标点符号。如果 URL 中有其他字符,就必须编码后使用。
百分号编码与 Base64 异同
相同点:它们都是用给定的ASCII 码(可打印字符)去表示更广范围数据的方法。
区别:百分号编码是针对超出 URI 合法字符范围外的字符做编码,而 Base64 是针对二进制数据做编码;一个是对文本的编码,一个是对二进制数据的编码。
HTTP怎么实现分包?
用\r\n\r\n来分割消息头和消息体,消息头中有Content-Length来告知消息体有多大,如果没有该字段就表示无消息体
响应报文
- 协议版本、状态码以及描述
- 响应头
- 空行:分隔响应头和响应体
- 响应体
HTTP
什么是HTTP
Hyper Text Transfer Protocol(超文本传输协议),服务器传输超文本到本地浏览器。
HTTP是属于TCP上层的协议,基于请求/响应模式的,是无状态的协议。
HTTP为什么基于TCP?
http协议只定义了应用层的东西,需要基于TCP实现消息可靠性
http1.0/1.1/2.0 的区别
HTTP 1.1
支持长连接,一个TCP连接上可以传送多个HTTP请求和响应,在HTTP1.1中默认开启keep-alive
请求和响应都应支持Host头域,且请求消息中如果没有Host域会报告一个错误(400 Bad Request)。
引入了更多的缓存控制策略,例如If-Match, If-None-Match。
引入了range头域,它允许只请求资源的某个部分,支持断点续传。
HTTP 2.0
多路复用:请求与响应以二进制帧的形式交错进行,只需建立一次连接,即一轮三次握手,实现多路复用
压缩消息头:将原来每次都要携带的大量 key value在两端建立一个索引表,对相同的头只发送索引表中的索引。
服务端推送:HTTP2.0中服务器会主动将资源推送给客户端。
HTTP2.0的多路复用和HTTP1.1中的长连接复用区别
- HTTP/1.0 每一个请求都要建立一个连接;
- HTTP/1.1 默认是 keep-alive 的,即tcp连接可以复用,不用每次都要重新建立和断开 TCP 连接,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞。
- HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行
浏览器对同一 Host 建立 TCP 连接到数量有没有限制?
Chrome 最多允许对同一个 Host 建立六个 TCP 连接,不同的浏览器有一些区别。
HTTP如何保持长连接?
- 浏览器发起请求,HTTP版本号为1.1。
- 服务器收到请求,在响应的头中也增加keep-alive。同时不会关闭已建立的tcp连接。
- 浏览器收到服务器的响应头中包含keep-alive,不关闭tcp连接。并用该tcp连接再发送请求。
减少了TCP的三次握手和四次挥手
HTTP缓存机制
HTTP缓存主要分强制缓存和对比缓存
- 强制缓存:Cache-Control,Exipres(HTTP1.0),浏览器直接读本地缓存,不会再跟服务器端交互,状态码200。
- 对比缓存:Last-Modified / If-Modified-Since, Etag / If-None-Match,每次请求需要让服务器判断一下资源是否更新过,从而决定浏览器是否使用缓存,如果是,则返回304,否则重新完整响应。
重定向和转发
- 重定向:返回3xx状态码+location响应头;浏览器跳转到location所在的URL。重定向是在客户端进行跳转。URL会改变。
- 转发:直接获取要转发的URL地址并返回。转发是在服务端进行跳转。URL不会改变。
HTTPS
什么是 https
https 是 http + ssl,对 http 通信内容进行加密,是HTTP的安全版
Https的作用:
- 内容加密建立一个信息安全通道,来保证数据传输的安全;
- 身份认证确认网站的真实性
什么是SSL
Secure Socket Layer,创建安全的Internet通信,用于加密浏览器和服务器之间的通信。
HTTP和HTTPS区别?
- 端口不同:HTTP使用的80端口,HTTPS使用443端口;
- HTTP信息是明文传输,HTTPS运行在SSL之上,添加了加密和认证机制,更加安全;
- HTTPS由于加密解密会带来更大的CPU和内存开销;
- HTTPS通信需要证书,一般需要向CA购买
- HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
Https的连接过程?
证书验证阶段
- 浏览器发起请求,请求携带了浏览器支持的加密算法和哈希算法
- 服务器接收到请求之后,选择浏览器支持的加密算法和哈希算法,会返回证书,包括公钥
- 浏览器接收到证书之后,会检验证书是否合法(网站的网址、网站的公钥、证书的有效期),不合法的话,会弹出告警提示
数据传输阶段
证书验证合法之后
- 浏览器会生成一个随机数,使用公钥进行加密,发送给服务端
- 服务器收到浏览器发来的加密随机数,使用私钥进行解密,得到随机数
- 解析成功之后,使用随机数为秘钥的对称加密算法进行加密传输
https为什么要采用对称和非对称加密结合的方式
非对称加密在性能上较差,对称加密安全性较差。
非对称加密主要用于传输秘钥,真正数据通信都是通过对称加密进行的。
什么是中间人攻击
与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话。
中间人拦截客户端请求,然后向客户端提供自己的公钥,再向服务端请求公钥。
https 是如何防止中间人攻击的
https证书,证明就需要权威第三方机构CA来公正。
浏览器是如何确保CA证书的合法性?
证书包含什么信息?
颁发机构、公钥、公司信息、域名、有效期、指纹
浏览器如何验证证书的合法性?
- 验证域名、有效期等信息是否正确。证书上都有包含这些信息,比较容易完成验证;
- 判断证书来源是否合法。每份签发证书都可以根据验证链查找到对应的根证书,利用本地根证书完成来源验证;
- 判断证书是否被篡改。需要与CA服务器进行校验;
- 判断证书是否已吊销。
https可以抓包吗
常规下抓到的包是加密状态,无法直接查看。
模拟中间人抓包
- 抓包工具生成一个证书,用户需要手动把证书安装到客户端中。
- 客户端发起请求到抓包工具,然后抓包工具再转发请求到服务器
- 把服务器返回的结果在控制台输出后再返回给客户端,从而完成整个请求的闭环。
输入 xxx.com,怎么变成 https://www.xxx.com 的?
302跳转,服务器把所有的HTTP流量跳转到HTTPS。
什么是对称加密、非对称加密?区别是什么?
- 对称加密:加密和解密采用相同的密钥。如:DES、RC2、RC4
- 非对称加密:需要两个密钥:公钥和私钥。如果用公钥加密,需要用私钥才能解密。私钥加密的信息,只有公钥才能解密 如:RSA
- 区别:对称加密速度更快,通常用于大量数据的加密;非对称加密安全性更高
数字证书
鉴别别人给你的公钥是对的。 包括公钥、证书的所有者 、CA签名、颁发者、签名算法。
数字签名、报文摘要的原理
- 发送者A用私钥进行签名,接收者B用公钥验证签名。因为除A外没有人有私钥,所以B相信签名是来自A。
- 摘要算法:MD5、SHA
签名算法
一般是对信息做一个 Hash 计算,得到一个 Hash 值,这个过程是不可逆的,也就是说无法通过 Hash 值得出原来的信息内容。在把信息发送出去时,把这个 Hash 值加密后,作为一个签名和信息一起发出去。
CA 用自己的私钥给外卖网站的公钥签名,就相当于给外卖网站背书,形成了外卖网站的证书。
Session和Cookie
Session与Cookie的区别?
Session是服务器端保持状态的方案,Cookie是客户端保持状态的方案
Cookie保存在客户端本地,客户端请求时会将Cookie一起提交;
Session保存在服务端,检索Sessionid查看状态。保存Sessionid的方式可以采用Cookie
cookie用途
保存用户相关信息,下次再访问您的站点时,应用程序就可以检索以前保存的信息。
服务端怎么设置cookie
HTTP响应,Set-Cookie中设置cookie
cookie关闭浏览器重新打开就没了吗?
cookie生命周期默认为浏览器会话期间,驻留内存,关闭浏览器cookie就没了
浏览器禁用cookie怎么办
URL重写
判断前端是否禁用了cookie,如果禁用了cookie,在url后带上jsessionid。
cookie包含哪几项内容
- Expire:cookie失效日期。
- Domain和Path:限制 cookie 能被哪些 URL 访问。即请求的URL是Domain或其子域、且URL的路径是Path或子路径,则都可以访问该cookie
- Size:Cookie的大小
- Secure:Secure选项用来设置cookie只在确保安全的请求中(HTTPS)才会发送。
- httpOnly:这个选项用来设置cookie是否能通过 js 去访问。带httpOnly选项时,客户端则无法通过js代码去访问cookie。
http/1.1协议中Expires已经由 Max age 选项代替。
Cookie防劫持?
基于XSS攻击,窃取Cookie信息,并冒充他人身份。
- 给Cookie添加HttpOnly属性, document.cookie无法获取到该Cookie值.
- 在cookie中添加校验信息, 这个校验信息和当前用户外置环境有些关系,比如ip、agent有关,当cookie被人劫持了,在服务器端校验的时候, 发现校验值发生了变化, 要求重新登录
- cookie中session id的定时更换
状态码
常见状态码
- 1xx消息 这一类型的状态码,代表请求已被接受,需要继续处理
- 2xx状态码:操作成功。200 OK,201状态码英文名称是Created,该状态码表示已创建。
- 3xx状态码:重定向。
- 4xx状态码:客户端错误。400 Bad Request;401 Unauthorized;403 Forbidden;404 Not Found;405 方法禁用,禁用请求中指定的方法。
- 5xx状态码:服务端错误。500服务器内部错误;501服务不可用; 502 Bad Gateway:请求未完成,服务器从上游服务器收到一个无效的响应。
502
并不是指网关(例如nginx)本身出了问题,而是从上游接收响应出了问题,比如由于上游服务自身超时导致不能产生响应数据,或者上游不按照协议约定来返回数据导致网关不能正常解析。
504
,Gateway Timeout
,网关超时。它表示网关没有从上游及时获取响应数据。原因在于超过了nginx
自身的超时时间
304 Not Modified:客户端有缓冲的文件并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
301和302区别
- 301 永久重定向;302暂时重定向
- 都表示重定向,自动跳转到一个新的URL地址
- 301表示旧地址已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
发生502,应该先查看什么
502错误最通常的出现情况就是后端主机宕机。
1、查看后台进程数是否够用,确定是否是因为高并发导致的
2、查看程序执行时间是否超过Nginx等待时间,应用日志。可能是数据库死锁导致的。
3、查看Nginx日志
发生500应该先查看什么
先看看服务的进程还在不在,然后查看日志,从日志里面找原因。
为什么重定向?
域名别称:需要为资源设定不同的名称。其重定向到那个实际的URL
保持链接有效:重构 Web 站点,不想旧链接失效。
对于耗时请求的临时响应
一些请求的处理会需要比较长的时间,链接到一个页面,表示请求的操作已经被列入计划,并且最终会通知用户操作的进展情况。
从输入网址到获得页面的过程?
- 浏览器查询 DNS,获取域名对应的IP地址
- 浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询。
- 如果本地域名服务器并未缓存该网址映射关系,迭代查询根 DNS 、顶级域名服务器、权威DNS服务器;
- 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
- TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
- 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
- 浏览器解析并渲染视图;