http问题整理
0. 开场王炸: 谈谈你对http的认识
宽泛的问题, 旨在挖掘你知识的深度和宽度, 需要提前准备一个大纲, 以及避免自己不熟悉的部分.
- 协议是什么, 协议有什么特点
- 常见 http 方法
- 请求体格式及常见请求头
- 常见状态码
- tcp连接
- 网络安全 XSS/CRFS
- 网络存储
从以上几个角度谈应该可以谈够时间了.
1. Easy
http协议是什么?有哪些特点?
-
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP是一个属于应用层的面向对象的协议,用于客户端和服务器端之间的通信,请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一 端称为服务器端。
-
-
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
-
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
-
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
-
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
-
支持B/S及C/S模式。(browser/server及client/server)
-
常见http方法有哪些?使用场景分别是什么?
方法 | 用途 |
---|---|
GET | 获取资源 |
POST | 传输实体主体 |
PUT | 传输文件(用得少) |
DELETE | 删除文件(用得少) |
GET与POST的区别
https://www.cnblogs.com/Nullc/p/12770418.html
方法 | 参数 | 安全 | 包 | 长度限制 | 应用场景 |
---|---|---|---|---|---|
GET | URL明文 | 不安全 | 一个TCP数据包 | 一般是 1024 个字符 | 主要用于获取参数 |
POST | 请求消息体内 | 相对安全 | 两个(先header再data) | 支持较大数据传输(4~10Mb) | 用于传输数据 |
常见HTTP状态码
200 | OK | 从客户端发来的请求在服务器端被正常处理了 |
301 | Moved Permanently | 永久性重定向 |
302 | Found | 临时性重定向 |
304 | Not Modified | 找到资源,但不符合条件请求,无法访问 |
403 | Forbidden | 对请求资源的访问被服务器拒绝 |
404 | Not Found | 服务器上无法找到请求的资源 |
500 | Internal Server Error | 服务器端在执行请求时发生了错误 |
503 | Service Unavailable | 服务器暂时处于超负载或正在进行停机维护,现在无法 处理请求 |
Web安全中有哪些常见的攻击方式?
方法 | 解释 |
---|---|
SQL注入 | 数据库注入 |
XSS | 跨站脚本攻击 |
DDoS | 通过大量恶意流量占用带宽和计算资源以达到瘫痪对方网络的目的。 |
CSRF | 跨站请求伪造 |
URL和URI的区别
- URI 是统一资源标识符,而 URL 是统一资源定位符。
- URL是URI的子集
- URI 唯一标识一个资源。
URL在唯一标识一个资源的同时,提供找到该资源的路径。
一次完整的Http请求所经历哪些步骤?
步骤 | 解释 |
---|---|
DNS解析 | 通过输入的URL查询网站的IP地址(缓存) |
TCP连接 | 通过三次握手与DNS解析查询到的IP地址建立起TCP连接 |
HTTP请求 | 构建HTTP请求,请求中包含请求行(动词 路径 协议/版本号)、请求报头(Accept、Content-Type、Cookie等内容)、请求正文(使用POST、PUT、PEACH等方法所需要的数据) |
服务器处理请求并返回数据 | 响应包括状态码(200\304\404等)、响应报头(Accept、Content-Type、Server等内容)、响应正文(返回的资源) |
浏览器渲染解析页面 | HTML解析出DOM树,CSS解析出CSS规则树,然后浏览器根据DOM树和CSS规则树计算每个元素的位置和样式,最后浏览器将每个元素绘制在屏幕上 |
连接结束 | 四次握手 |
2. Medium
说说Http协议的工作流程
流程 | 具体工作 |
---|---|
地址解析 | 解析:协议类型+域名+端口(+请求文件+请求参数) |
封装HTTP 请求 | 把上面写的 URL 以及本机的一些信息封装成一个 HTTP 请求数据包 |
封装 TCP 包 | 封装 TCP 包 , 建立 TCP 连接(三次握手) |
客户端发送请求命令 | 连接建立之后 , 客户端发送 HTTP 请求到服务端与请求相关的信息都会包含在请求头和请求体中发送给服务器端 |
服务器端响应 | 服务器端在收到请求之后 , 根据客户端的请求发送给客户端相应的信息 , 相关的响应信息都会放在响应头和响应体中 . |
关闭连接 | 服务器端在发送完响应之后 , 就会关闭连接 , 如果过客户端的请求的头部信息中有 Connection-alive , 那么客户端在响应完这个请求之后不会关闭连接 , 知道客户端的所有请求都响应完毕 , 才会关闭连接 , 这样大大节省了带宽和 IO 资源 . |
2. http请求报文与响应报文的格式?
请求:
GET / HTTP/1.1
Host: hackr.jp
User-Agent: Mozilla/5.0(Windows NT 6.1; WOW64; rv:13.0) Gecko/2010010
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*; q=0
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
If-Modified-Since: Fri, 31 Aug 2007 02:02:20 GMT
If-None-Match: "45bae1-16a-46d776ac"
Cache-Control: max-age=0
//请求数据,GET无
响应:
HTTP/1.1 304 Not Modified
Date: Thu, 07 Jun 2012 07:21:36 GMT
Server: Apache
Connection: close
Etag: "45bae1-16a-46d776ac"
3. Http首部包含哪些字段?举例说明
-
HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分 隔。
首部字段名: 字段值
例如,在 HTTP 首部中以 Content-Type 这个字段来表示报文主体的对象类型。
Content-Type: text/html
就以上述示例来看,首部字段名为 Content-Type,字符串 text/html 是 字段值。
另外,字段值对应单个 HTTP 首部字段可以有多个值,如下所示。
Keep-Alive: timeout=15, max=100
-
HTTP 首部字段根据实际用途被分为以下 4 种类型。
**通用首部字段**(General Header Fields) 请求报文和响应报文两方都会使用的首部。 **请求首部字段**(Request Header Fields) 从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加 内容、客户端信息、响应内容相关优先级等信息。 **响应首部字段**(Response Header Fields) 从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加 内容,也会要求客户端附加额外的内容信息。 **实体首部字段**(Entity Header Fields) 针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更 新时间等与实体有关的信息。
HTTP/1.1规定了47种首部字段,由于较多,请直接去翻阅《图解HTTP》
补充:https://andrewpqc.github.io/2018/07/15/http2/
https的原理是什么?
HTTP+ 加密 + 认证 + 完整性保护 =HTTPS
HTTP 通信接口部分用 SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替。
通常,HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通 信,再由 SSL 和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披 SSL 协议这层外壳的 HTTP。在采用 SSL 后,HTTP 就拥有了 HTTPS 的加密、证书和完整性保护 这些功能。
浅析Http和Https的三次握手有什么区别。
https三次握手过程:
1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3.获得网站证书之后浏览器要做以下工作:
a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4.网站接收浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
b) 使用密码加密一段握手消息,发送给浏览器。
5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,
此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。
谈谈Session/cookie机制,如何实现会话跟踪?
Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
会话跟踪
- 会话是客户端发送请求,服务器返回响应的连接时间段。
HTTP是无状态协议:每次都是单独连接,不能维持客户的上下文信息。
会话跟踪技术是用于维持客户端和服务器端通信信息的技术。
会话跟踪解决方案 | 详细 |
---|---|
Cookie | 服务器在浏览器中保存cookie,包含服务器指定的内容(如用户信息和用户操作信息),再次访问网站时,浏览器再发送HTTP请求到服务器端时会携带之前保存的cookie;服务器端会从收到的cookie中识别用户身份 |
Session | 浏览器访问网站时,服务器会向浏览器发送一个每个用户特有的会话编号sessionID,让他进入到cookie里。服务器同时也把sessionID和对应的用户信息、用户操作记录在服务器上,这些记录就是session。客户端浏览器再次访问时,会发送cookie给服务器,其中就包含sessionID。服务器从cookie里找到sessionID,再根据sessionID找到以前记录的用户信息就可以知道他之前操控些、访问过哪里。 |
URL重写 | URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写 到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。 |
隐藏表单域 | 将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示,浏览时看不到,源代码中有。 |
什么是Web缓存?原理如何?
http://www.alloyteam.com/2016/03/discussion-on-web-caching/
OSI有哪七层模型?TCP/IP是哪四层模型。
讲一讲TCP协议的三次握手和四次挥手流程。
https://mp.weixin.qq.com/s/SelwKdCokq7MS5fn74vtzA
为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?
三次即可确保报文传输的安全性.两次不够,四次多余.
两次握手互相传递同步信号,确保连接畅通,第三次直接发送报文
websocket是什么?和Http有什么区别?
websocket和http都是网络传输协议的一种.
最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话(常用于页面通信和web应用)。
其他特点包括:
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
3. HARD
什么是非持久连接,什么是持久连接?
HTTP/1.1(以及HTTP/1.0的各种增强版本)允许HTTP设备在事务处理结束后仍将TCP 连接保持在打开状态,以便为未来的HTTP请求重用现存连接在事务处理结束后仍然保持在打开状态的TCP连接被称为持久连接。
非持久连接在每次事务处理结束后就会关闭。重用TCP连接可以加速数据传输,因为:
避免每次都经历缓慢的连接建立阶段,以及每次都执行关闭操作,节省耗时和带宽
避免TCP连接慢启动特性的拥塞适应阶段
持久连接有两种类型:
比较老的HTTP/1.0+ “keep-alive”连接
现代的HTTP/1.1 “persistent”连接
More: https://www.jianshu.com/p/0a47fc776314
Keep-Alive: timeout=5, max=100是什么意思?
参数timeout:在Keep-Alive响应首部中发送,告诉客户端服务器估计会在打开状态保持到连接空闲多长时间后关闭连接。
参数max:在Keep-Alive响应首部中发送,告诉客户端服务器还会为另外几个http事务将连接保持在打开状态。
注意,这两个参数值仅仅是估计,并非承诺。
http1.0,http1.1,http2.0区别(HTTP1.1版本新特性?HTTP2版本新特性?)
https://www.jianshu.com/p/be29d679cbff
对Http代理做个介绍?
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务 器。代理不改变请求 URI,会直接发送给前方持有资源的目标服务器。
持有资源实体的服务器被称为源服务器。从源服务器返回的响应经过 代理服务器后再传给客户端。
每次通过代理服务器转发请求或响应时,会追加写入 Via 首 部信息
在 HTTP 通信过程中,可级联多台代理服务器。请求和响应的转发会 经过数台类似锁链一样连接起来的代理服务器。转发时,需要附加 Via 首部字段以标记出经过的主机信息。
使用代理服务器的理由有:利用缓存技术(稍后讲解)减少网络带宽 的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要 目的,等等。
代理有多种使用方法,按两种基准分类。一种是是否使用缓存,另一 种是是否会修改报文。
缓存代理
代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本 (缓存)保存在代理服务器上。
当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获 取资源,而是将之前缓存的资源作为响应返回。
透明代理
转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理 (Transparent Proxy)。反之,对报文内容进行加工的代理被称为非 透明代理。