写在前面
在面试中面试官总会问上几道关于网络方面的问题,所以想简单总结一下面试中常问的网络方面问题。
HTTP 超文本传输协议
架构在TCP协议之上,规定了WWW服务器与浏览器之间信息传递规范
状态码
- 200 OK 请求成功
- 301 Moved Permanently 目标资源被永久的移动到了一个新的 URI,任何未来对这个资源的引用都应该使用新的 URI
- 302 Found 所请求的页面已经临时转移到新的URL中,在location字段可以找到重定向的URL,由于历史原因,用户代理可能会在重定向后的请求中把 POST 方法改为 GET 方法
301和302的使用场景:- 301:新网址完成继承旧网址,旧网址排名清零,有利于搜索引擎优化;适用于当访问网站的域名发生了变化
- 302:对旧网址不会有影响,新网址不会有排名;未登录的用户访问个人中心返回登录页面/用户访问404页面返回首页
- 304 Not Modified 没有修改文档,一般是提供一个if-Modified-since头表示客户查询浏览器缓存的文档是否发生了更改,服务器返回304说明该文档没有发生修改可以继续使用
- 307 Temporary Redirect 和302作用相似,但307 状态码不允许浏览器将原本为 POST 的请求重定向到 GET 请求上。
- 400 Bad Request 服务端未能理解请求
- 403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
- 404 Not Found 服务端未能找到被请求的页面
- 500 Internal Server Error 服务端内部发生错误
- 502 Bad Gateway 作为网关或代理工作的服务器尝试执行请求时,从远程服务器接受到了一个无效的响应
- 505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理
请求头
补充:
| Request Header | 规定 |
|---|---|
| Origin | 标识跨域资源请求(请求服务端设置Access-Control-Allow-Origin响应字段) |
| Range | 请求部分实体,设置请求实体的字节数范围 |
| Referer | 设置前一个页面的地址意思就是如果当前请求是在A页面中发送的那么referer就是A页面的url地址 |
| TE(Transfer-Encoding) | 设置用户代理期望接受的传输编码格式 |
| DNT(Do Not Track) | 请求web应用禁用用户追踪,1为禁用,0为不禁用 |
请求方法:
- GET:请求可以缓存,可以从浏览器历史记录中查找到GET请求,还可以把它收藏到书签中;且GET请求有长度限制,仅用于请求数据,不安全。
- POST:请求不会被缓存,对数据长度没有限制,相对比较安全。
- HEAD:与GET方法相同,但没有响应体,仅传输状态行和标题部分。这对于恢复相应头部编写的元数据非常有用,而无需传输整个内容。
- PUT:用于将数据发送到服务器以创建或更新资源,它可以用上传的内容替换目标资源中的所有当前内容,它会将包含的元素放在所提供的URI下,如果URI指示的是当前资源,则会被改变。如果URI未指示当前资源,则服务器可以使用该URI创建资源。
- DELETE:用来删除指定的资源,它会删除URI给出的目标资源的所有当前内容。
- CONNECT:用来建立到给定URI标识的服务器的隧道;它通过简单的TCP / IP隧道更改请求连接,通常是使用解码的HTTP代理来进行SSL编码的通信(HTTPS)。
- OPTIONS:用来描述了目标资源的通信选项,会返回服务器支持预定义URL的HTTP策略。例如:在跨域请求前发起预检请求,以检测请求是否被服务器接受。
- TRACE:用于沿着目标资源的路径执行消息环回测试;它回应收到的请求,以便客户可以看到中间服务器进行了哪些(假设任何)进度或增量。
响应头
补充:
| Request Header | 规定 |
|---|---|
| Access-Control-Allow-Origin | 指定哪些站点可以参与跨站资源共享 |
| Accept-Ranges | 响应首部字段 Accept-Ranges 用于告知客户端是否能处理范围请求,可以处理使用 bytes,否则使用 none |
| Age | 对象在代理缓存中暂存的秒数 |
| Date | 设置消息发送的日期和时间 |
| X-Frame-Options | 点击劫持保护,用来给浏览器指示允许一个页面可否在 <frame>, </iframe> 或者 <object>中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌套到别人的网站中去,也从而避免了点击劫持的攻击,deny(frame中不渲染),sameorigin(如果源不匹配不渲染),allow-from(允许指定位置访问),allowall(不标准,允许任意位置访问) |
Cookie
是因为无状态的HTTP协议而产生的,保存在客户端,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。
- 用途
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
- 如何创建
- 服务器发送的响应报文包含 Set-Cookie 首部字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。
- 客户端之后对同一个服务器发送请求时,会从浏览器中取出 Cookie 信息并通过 Cookie 请求首部字段发送给服务器。
- JavaScript
- 浏览器可以通过 document.cookie 属性可创建新的 Cookie,也可通过该属性访问非 HttpOnly 标记的 Cookie。
console.log(document.cookie) - HttpOnly
- 标记为 HttpOnly 的 Cookie 不能被 JavaScript 脚本调用。
- 跨站脚本攻击 (XSS) 常常使用 JavaScript 的 document.cookie API 窃取用户的 Cookie 信息,因此使用 HttpOnly 标记可以在一定程度上避免 XSS 攻击。
- Secure
- 标记为 Secure 的 Cookie 只能通过被 HTTPS 协议加密过的请求发送给服务端。
- 如果浏览器禁用Cookie怎么办?
- Session
Session存储在服务端,代表着服务器和客户端一次会话的过程,Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者 Session 超时失效时会话结束。
-
Session与Cookie的区别
区别 Cookie Session 存储位置 客户端 服务端 存取方式 ASCII 任意数据类型 有效期 可长期 会话结束失效 安全性 比较不安全,易被盗取 相对安全 存储大小 不超过4K 可以很大 -
Session与Cookie如何配合
-
分布式session问题
缓存
HTTP/1.1 通过 Cache-Control 首部字段来控制缓存。
-
禁止进行缓存
no-store: 指令规定不能对请求或响应的任何一部分进行缓存。Cache-Control: no-store -
协商缓存
no-cache: 指令规定缓存服务器需要先向源服务器验证缓存资源的有效性,只有当缓存资源有效时才能使用该缓存对客户端的请求进行响应。
若服务器返回304说明资源未发生修改,返回200说明资源发生修改并返回最新的资源。Cache-Control: no-cacheLast-Modify/If-Modify-Since: 浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间;当浏览器再次请求该资源时,request的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存。
ETag/If-None-Match: 当服务器上一个资源被修改了,但实际上内容并没有发生改变,会因为Last-Modify时间不匹配而重新发送相同的数据,因此引入了ETag(web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识)/If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有ETag声明,则再次向web服务器请求时带上头If-None-Match(ETag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定是否命中协商缓存。
-
强制缓存
max-age(HTTP/1.1) 指令出现在请求报文,并且缓存资源的缓存时间小于该指令指定的时间,那么就能接受该缓存。
max-age 指令出现在响应报文,表示缓存资源在缓存服务器中保存的时间。Cache-Control: max-age=300Expires(HTTP/1.0在响应头中):过期时间,用于判断下次请求是否需要到服务端取回页面
Expires: Wed, 04 Jul 2012 08:26:05 GMT -
private / public
public: 所有内容都将被缓存(客户端和代理服务器都可缓存)
private: 内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)
内容协商
通过内容协商返回最合适的内容,例如根据浏览器的默认语言选择返回中文界面还是英文界面 Accept Accept-Encoding Accept-Language
- 服务端驱动型
- 客户端设置特定的 HTTP 首部字段,例如 Accept、Accept-Charset、Accept-Encoding、Accept-Language,服务器根据这些字段返回特定的资源。
- 存在的问题
- 服务器很难知道客户端浏览器的全部信息
- 客户端提供的信息相当冗长(HTTP/2协议的首部压缩机制缓解了这个问题),并且存在隐私风险(HTTP 指纹识别技术)
- 给定的资源需要返回不同的展现形式,共享缓存的效率会降低,而服务器端的实现会越来越复杂
- 代理驱动型
- 服务器返回 300 Multiple Choices 或者 406 Not Acceptable,客户端从中选出最合适的那个资源。
内容编码
内容编码将实体主体进行压缩,从而减少传输的数据量 Accept-Encoding Content-Encoding
- 常用的内容编码有:gzip、compress、deflate、identity。
- 浏览器发送 Accept-Encoding首部,其中包含有它所支持的压缩算法,以及各自的优先级。服务器则从中选择一种,使用该算法对响应的消息主体进行压缩,并且发送 Content-Encoding 首部来告知浏览器它选择了哪一种算法。由于该内容协商过程是基于编码类型来选择资源的展现形式的,响应报文的 Vary 首部字段至少要包含 Content-Encoding。
范围请求
如果网络出现中断,服务器只发送了一部分数据,范围请求可以使得客户端只请求服务器未发送的那部分数据,从而避免服务器重新发送所有数据。
- Range
在请求报文中添加 Range 首部字段指定请求的范围。请求成功的话服务器返回的响应包含 206 Partial Content 状态码。GET /z4d4kWk.jpg HTTP/1.1 Host: i.imgur.com Range: bytes=0-1023HTTP/1.1 206 Partial Content Content-Range: bytes 0-1023/146515 Content-Length: 1024 ... (binary content) - Accept-Ranges
响应首部字段 Accept-Ranges 用于告知客户端是否能处理范围请求,可以处理使用 bytes,否则使用 none。
Accept-Ranges: bytes - 响应状态码
- 在请求成功的情况下,服务器会返回 206 Partial Content 状态码。
- 在请求的范围越界的情况下,服务器会返回 416 Requested Range Not Satisfiable 状态码。
- 在不支持范围请求的情况下,服务器会返回 200 OK 状态码。
HTTPS
在HTTP的基础上加入SSL层,通过使用传输加密和身份认证保证了传输过程的安全性,通过使用 SSL,HTTPS 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
加密
- 对称密钥加密
- 特点:发送方和接收方持有同一把密钥,发送消息和接收消息都需要使用这个密钥
- 优点:加解密速度快
- 缺点:密钥在传输的过程可能会被拦截,安全性不高
- 常用算法:AES(密钥最长只有256个bit,执行速度快)
- 非对称密钥加密
- 特点:接收方在接收信息前生成公钥和私钥,将公钥发送给发送方,发送方将需要发送的信息用公钥进行加密,接收方在接受数据以后用私钥进行解密
- 优点:
- 数据在传输的过程中即使被拦截,但由于不知道私钥,所以没有办法对数据进行解密,安全性高
- 不存在密钥分发问题,解码方可以自己生成密钥对,一个做私钥存起来,另外一个作为公钥进行发布
- 密钥管理变得简单,多个加密方都可以使用一个已知的公钥进行加密,但只有拥有私钥的一方才能解密
- 缺点:加解密速度慢
- 常用算法:RSA(需要大数的乘幂求模等算法,运行速度慢)
- 混合加密机制
- 使用非对称密钥加密方式,传输对称密钥加密方式所需要的 Secret Key从而保证安全性
- 获取到 Secret Key 后,再使用对称密钥加密方式进行通信,从而保证效率
认证
通过使用证书来对通信方进行认证。假如中间人拦截后把服务器的公钥替换为自己的公钥,因为数字签名的存在,会导致客户端验证签名不匹配,这样就防止了中间人替换公钥的问题。
主要认证这三个点:
1.证书是否为受信任的权威机构颁发的
2.证书是否被篡改
3.证书是否为服务器发过来的,而不是第三方发的
数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。
数字证书 = 公钥 + 数字签名(CA机构将证书的指纹和指纹算法通过自己的私钥加密得到的就是数字签名)
我们在验证证书的时候,首先通过机构的根公钥去解密证书的数字签名,解密成功以后得到证书的指纹和指纹算法,指纹是一个hash值,代表着证书的原始内容,然后通过指纹算法计算证书内容得到另外一个hash值,如果这两个hash值相同,则代表证书没有被篡改过,否则就是被篡改了。
假如证书上的指纹是不法分子伪造的,伪造是没有用的,因为你伪造的指纹不可能用CA机构的根私钥去加密(根私钥是CA机构绝对保密的),伪造者只能拿自己的秘钥去加密这个伪造的指纹,但当我们拿机构的根公钥去解密伪造指纹的时候是不可能成功的(加密内容只能由一对公钥私钥解密)。
在证书没有被修改过的基础上,再检查证书上的使用者的URL(比如csdn.net)和我们请求的URL是否相等,如果相等,那么就可以证明当前浏览器链接的网站也是正确的,而不是一些钓鱼网之类的。
但如果浏览器的连接被某个中间人截取了,中间人也可以发一个由权威的CA机构颁发的证书给浏览器,然后也可以通过证书没有被篡改的验证,但是在证书没有被篡改的前提下,通过对比证书上的URL和我们请求的URL是否相同,就可以判断当前接收到的证书是否为服务器发的证书。可以这么理解,因为URL具有唯一性,所以中间人的证书的上的URL和我们的证书的URL是不可能相同的,如果中间人修改了自己证书上的URL,但是通过不了证书没有被篡改的验证,所以中间人的证书也是欺骗不了我们的。
此处参考了这篇文章——HTTPS的数字证书验证原理
HTTP/1.0
串行连接:每请求一个资源就要进行一次连接
HTTP/1.1
1.持久连接:一个TCP连接上可以进行传输多个HTTP请求
2.浏览器为每个域名最多同时维护6个TCP持久连接
- 存在的问题:
- TCP的慢启动
- 多条TCP连接竞争带宽
- 队头阻塞
- 头部冗余,采用文本格式,HTTP/1.X版本是采用文本格式,首部未压缩,而且每一个请求都会带上cookie、user-agent等完全相同的首部。
HTTP/2.0
多路复用,建立在二进制分帧层的基础上(使用二进制格式传输数据),每个HTTP请求都有一个序列标识符(ID),这样浏览器可以并发多个请求,并且同一个域名下的所有请求都复用同一个TCP连接,极大增加了服务器处理并发的上限。
-
特点
- 可以设置请求的优先级
- 服务器推送
- 头部压缩
在浏览器和服务端
-
多路复用给性能带来的影响