面试常问HTTP的理解

272 阅读8分钟

什么是HTTP

HTTP协议是计算机网络体系结构的最顶层应用层协议之一,它用于客户端和服务端之间的通信,通过HTTP协议能够明确区分哪端是客户端,哪端是服务器。

报文是HTTP通信中的基本单位,客户端发送请求报文,服务端发送响应报文

HTTP通信

客户端和服务端通过请求和响应的交换达成通信,客户端发出请求,服务端响应回复。

我们来看看发送请求的流程吧!

HTTP发送请求过程 (1).jpg

当客户端要发起一个请求时,应用层中的HTTP和DNS协议就开始分工啦!DNS解析要请求的URL的IP地址,HTTP生成请求报文,为了方便通信,TCP将请求报文标好序号拆分,然后IP经过路由器边中转边传输报文段,服务端TCP将报文端按序号重组,HTTP对请求内容进行处理。响应过程和请求过程一致。

这个过程就像邮快递。HTTP把请求打包成快递,DNS给快递地址,TCP将快递拆成好几份发送,物流车经过多个物流分拨中心,服务端TCP将多分快递按顺序放好,然后HTTP对打开完整的快递,最后清楚了给邮的什么快递。

HTTP是不保存状态的协议

HTTP协议对请求和响应之间的通信状态不进行保存,客户端不记得自己请求过什么,服务端不记得自己响应过什么,不保留之前一切的请求和响应报文的信息。这么做的目的是为了更快的处理大量事务,确保协议的可伸缩性。

Cookie

HTTP不对之前发生过的请求和响应状态进行管理,无法根据之前的状态对本次请求处理,这样可以减少对服务器的CPU及内存资源的消耗。Cookie应运而生。

Cookie的用处

服务端:Cookie可以让服务器知道本次响应是给谁发的

服务端在发送响应报文内加入一个Set-Cookie的头部字段,通知客户端保存Cookie,下次客户端再向服务器发起请求时,客户端会自动在请求报文的头部加入Cookie后发送给服务端。

服务端发现客户端发送过来的Cookie后,会去检查是哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

客户端:Cookie可以存储一些必要的信息

在我们登录一个网页时,我们不希望出现每进入一次网站就要登陆一次的情况,然而我们的HTTP没有办法存储状态,我们可以使用Cookie来存储登录状态信息,这样每次再打开这个网站,会从Cookie中读取登陆状态。Cookie也还可以存储一些天气、皮肤颜色等信息。SessionStorage也可以存储登录信息,先了解一下,以后的文章再详细的说。

每条Cookie能存储4KB,我们要珍惜这个空间,尽量只放入必要的信息。

HTTP持久连接

在以前的HTTP协议中每次请求都要建立/断开一次TCP连接,HTTP/1.1提出持久连接(keep-alive)的方案。

持久连接的特点是只要任意一端没有明确提出断开连接,则保持TCP连接状态。这样只要我们进行一次TCP连接,就可以进行多次请求和响应的交互,使得网页的打开速度加快。

持久连接减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。

在持久连接之后有一个管线化(pipeline)的概念,就是不需要等待上一个请求响应后再发送新的请求,这样就可以同时并行发送多个请求。

HTTP请求方法

GET

GET方法用来请求服务端的资源。更注重传回来资源

POST

POST方法用来传输信息、文件等实体。他和GET类似,但它更注重实体到达服务端后的响应

PUT

PUT方法用来传输文件,请求报文的主体包含文件内容,然后保存到请求URI指定的位置。

PUT存在安全性问题,HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件。

PUT的响应只有两种情况,一种是成功,另一种是失败(已存在、格式限制、大小限制)

HEAD

HEAD方法和GET方法一样,但不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间。

DELETE

DELETE方法用来删除文件,和PUT相反,按请求URI删除指定的资源。和PUT相同的是安全性问题和响应

TRACE

TRACE方法用来追踪路径,回显服务端收到的请求,主要用于测试或诊断

OPTIONS

OPTIONS方法用来询问服务端所支持的HTTP请求方法

CONNECT

CONNECT方法用来要求用隧道协议连接代理

HTTP状态码

HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器端 的处理是否正常、通知出现的错误等工作。

我们可以通过状态码知道服务端是正常处理了请求,还是出错了。

类别原因短语
1XXInformational(信息性状态码)接收的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务器错误状态码)服务器处理请求出错

常见的HTTP状态码

2XX 成功

2XX的状态码表明请求被正常处理了

200 OK

表示客户端发送的请求被服务器端正常处理了

204 No Content

表示服务器接收的请求已成功处理,但在返回的响应报文中 不含实体的主体部分。比如, 当从浏览器发出请求处理后,返回 204 响应,那么浏览器显示的页面不发生更新。

一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

206 Partial Content

表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

3XX 重定向

3XX的状态码表明浏览器需要执行某些特殊的处理以正确处理请求。

301 Moved Permanently

永久性重定向。表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。

302 Found

临时重定向。表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。

303 See Other

表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法获取请求的资源。

304 Not Modified

表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。

我们在进行协商缓存时,Cache没有被修改返回304

307 Temporary Redirect

临时重定向。和302Found有着相同的含义。302 是禁止POST变换成GET,但实际使用时大家并不遵守。306会遵照浏览器标准,不会从POST变成GET。但处理响应时每种浏览器会出现不同的行为。

4XX 客户端错误

4XX 的响应结果表明客户端是发生错误的原因所在。

400 Bad Request

表示请求报文语法错误。当错误发生时,需修改请求 的内容后再次发送请求。浏览器不会对他做任何处理。

401 Unauthorized

表示认证失败或没有认证信息。发送的请求需要有通过 HTTP 认证(BASIC 认证、 DIGEST 认证)的认证信息,返回含有 401 的响应必须包含一个适用于被请求资源的 WWWAuthenticate 首部用以质询(challenge)用户信息。当浏览器初次接收到 401 响应,会弹出认证用的对话窗口。

403 Forbidden

表示对请求资源的访问被服务器拒绝了。服务端会在主体部分对原因进行描述。

404 Not Found

表示服务器上无法找到请求的资源。

5XX 服务器错误

5XX 的响应结果表明服务器本身发生错误。

500 Internet Server Error

表示服务端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障

503 Service Unavailable

表示服务端暂时处于超负载或停机维护中,现在无法处理请求。