如今面试门槛愈来愈高,不少开发者对于网络知识这块了解的不是不少,遇到这些面试题会手足无措。本篇文章知识主要集中在 HTTP 这块。文中知识来自 《图解 HTTP》与维基百科,如有错误请你们指出。文章会持续更新。html
面试 -- 网络 TCP/IPweb
了解 Web 及网络基础
对端传输
发送端在层与层间传输数据时,没通过一层都会被加上首部信息,接收端每通过一层都会删除一条首部面试
多种协议做用
IP 协议,TCP 协议和 DNS 服务在使用 HTTP 协议过程当中发挥的做用浏览器
简单的 HTTP 协议
请求报文和响应报文
客户端像服务器发起请求时会生成一段请求报文,请求报文是由请求方法,URL,协议版本,可选的请求首部字段和内容实体构成。缓存
请求报文
接收到请求的服务器,会将请求内容的处理结构以响应的形式返回。响应报文基本上由协议版本,状态码,用以解释状态的缘由短语,可选的响应首部字段以及实体主体构成。安全
响应报文
HTTP 是不保存状态的协议和 Cookie 的简单介绍
HTTP 协议对于发送的请求和响应不作持久化处理。这时候引入了 Cookie 技术用于状态管理。Cookie 对用与登陆的状态管理,没有 Cookie 这个技术的话,由于 HTTP 不保存状态,每次打开新网页都必须再次登陆。服务器
Cookie 会根据响应报文中的 Set-Cookie 字段来通知客户端自动保存 Cookie。下次请求时会自动发送 Cookie,服务器会比对数据获得状态结果。cookie
Cookie
Post 和 Get 的区别
先引入反作用和幂等的概念。网络
反作用指对服务器上的资源作改变,搜索是无反作用的,注册是反作用的。session
幂等指发送 M 和 N 次请求(二者不相同且都大于1),服务器上资源的状态一致。注册10个和11个账号是不幂等的,对文章进行更改10次和11次是幂等的。
在规范的应用场景上说,Get 多用于无反作用,幂等的场景,例如搜索关键字。Post 多用于反作用,不幂等的场景,例如注册。
在技术上说:
- Get 请求能缓存,Post 不能
- Post 相对 Get 安全一点点,由于Get 请求都包含在 URL 里,且会被浏览器保存历史纪录,Post 不会,可是在抓包的状况下都是同样的。
- Post 能够经过 request body来传输比 Get 更多的数据,Get 没有这个技术
- URL有长度限制,会影响 Get 请求,可是这个长度限制是浏览器规定的,不是 RFC 规定的
- Post 支持更多的编码类型且不对数据类型限制
常见状态码
常见状态码
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 首部
通用首部
指请求报文和响应报文均可以使用的字段
- Cache-Control
- no-cache 指客户端不缓存过时资源
- no-store 指不进行缓存
- max-age 指缓存资源的缓存时间比指定的值小,那么客户端就接受缓存资源,且缓存服务器不对资源有效性进行再次确认
- Connection 指控制再也不转发给代理的首部字段(Hop-by-hop),管理持久链接
- close 指服务器像明确断开链接
- Keep-Alive 指保存持久链接,HTTP/1.1前默认链接是非持久性的,如须要保存持久链接,须要增长此字段
- Upgrade 能够用来指定一个彻底不一样的通讯协议,对于这个字段,服务器能够返回101状态码
请求首部字段
- Accept 指用户代理可以处理的媒体类型及媒体类型的相对优先级
- Accept-Encoding 指用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序
- Authorization 指用来告知服务器,用户代理的认证信息
- Host 当一个 IP 下存在多个域名时,帮助服务器知道要请求的具体主机
- User-Agent 会讲建立请求的浏览器和用户代理名称等信息传达给服务器
HTTPS
HTTPS 是 HTTP 创建在 SSL/TLS 安全协议上的。
在 iOS 中,客户端本地会存放着 CA 证书,在HTTPS 请求时,会首先像服务器索要公钥,得到公钥后会使用本地 CA 证书验证公钥的正确性,而后经过正确的公钥加密信息发送给服务器,服务器会使用私钥解密信息。
SSL/TLS握手阶段分为五步:
如下引自 阮一峰的网络日志
第一步,爱丽丝给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
第二步,鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。
第三步,爱丽丝确认数字证书有效,而后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。
第四步,鲍勃使用本身的私钥,获取爱丽丝发来的随机数(即Premaster secret)。
第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程。
HTTPS 相对于 HTTP 性能上差点,由于多了 SSL/TLS 的几回握手和加密解密的运算处理,可是加密解密的运算处理已经能够经过特有的硬件来加速处理。