前言
文内部分图片来自Carson_Ho大佬的文章 https://www.jianshu.com/p/a6d086a3997d
从图中我们可以看到的例如HTTP、DNS、SMTP等一系列的协议都是在应用层这一层建立的。而这次我们主讲的就是面试中最常问到的HTTP和DNS了。
HTTP
请求报文
一般用的比较多的就是数据交换和键值对。数据交换形式一般在POST请求中出现,键值对形式一般在GET请求中出现。
响应报文
案例分析
请求报文 | 响应报文 |
---|---|
HTTP三大版本的区别
HTTP其实分为很多的版本,Version 1.0,1.1以及2。
Q1:什么叫做多路复用/流水线?
数据传输从一次只能发送一条,到了一次性能够发送多条数据的升级。
"HTTP1.1在同一时间对于同一个域名的请求数量有限制,超过限制就会阻塞请求"。多路复用底层采用"增加二进制分帧层"的方法,使得不改变原来的语义、首部字段的情况下提高传输性能,降低延迟。
二进制分帧将所有传输信息分割为更小的帧,用二进制进行编码,多个请求都在同一个TCP连接上完成,可以承载任意数量的双向数据流。
Q2:第二个问题:什么叫做持久化连接/长连接?
从一次TCP连接只进行一次的数据传输,到一次TCP连接能够进行多次数据传输的升级。而他们的完成就是依靠一个字段的添加 keep-alive。这种方案需要思考的问题,就是服务器的压力,因为过多的TCP连接进行了保持的话,那么造成的问题就是服务器崩溃。
Q3:为什么HTTP1.1节约带宽
HTTP 1.1支持只发送header信息,如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。另外HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可(Range、Content-Range)。这是支持文件断点续传的基础。
Q4:什么是HOST域
其实就是一个参数,这是在HTTP 1.1后加入的,通过访问同一网站,比如www.baidu.com,但是 HOST 不同,就可以根据不同的 HOST 将同一个请求定向到不同发主机,它的作用最后实现的就是一个负载均衡。
HTTPS和HTTP的区别
其实两者大致内容上来说是相同,你可能会说端口号啊、CA认证啊这些,但是归根结底做出的升级最主要其实是一个安全性方面。
为什么要做安全性的升级呢? 看图说话好了,下图是通过wireshark软件对数据的一个抓包。
加密前
这还是一般的数据,如果我们数据里掺杂了我们的个人信息,比如说账号密码等等,被抓去之后,造成的结果就是灾难性的。而这就是https做了安全性处理带来的好处。害处自然也是存在的,就是需要加密和解密的时间,但是这个削弱程度已经完全的被现代社会的高速处理能力给弱化了。
ResponseCode
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
几个重要的响应码
100 (Continue):信息型状态响应码表示目前为止一切正常, 客户端应该继续请求, 如果已完成请求则忽略 101 (Switching Protocol):状态码表示服务器应客户端升级协议的请求(Upgrade请求头)正在进行协议切换。
200 (OK):一切正常,对GET和POST请求的应答文档跟在后面。
201(Created):成功请求并创建了新的资源
202(Accepted):表示服务器端已经收到请求消息,但是尚未进行处理。但是对于请求的处理确实无保证的,即稍后无法通过 HTTP 协议给客户端发送一个异步请求来告知其请求的处理结果。这个状态码被设计用来将请求交由另外一个进程或者服务器来进行处理,或者是对请求进行批处理的情形。
304 (Not Modified): 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
400(Bad Requests):客户端请求的地址不存在或者包含不支持的参数 401(Unauthorized):未授权,或认证失败。对于需要登录的网页,服务器可能返回此响应 403(Forbidden):没权限。服务器收到请求,但拒绝提供服务
404 (Not Found): 无法找到指定位置的资源。
500 (Internal Server Error ):服务器遇到了意料不到的情况,不能完成客户的请求。
503(Service Unavailable):由于超载或系统维护,服务器无法处理客户端的请求。
DNS
在DNS这个模块上,考察的点一般都是工作流程的问题,所以重点做一个讲解。
Q1:首先要知道DNS是干什么的?
官方语言是将域名地址转化为IP地址,那俗话讲就是将www.baidu.com转化为14.215.177.39。玩过云服务器的朋友应该知道,不管是哪家公司给你的公网地址都是一个IP地址,而想要域名的话,就要自己再购买后,然后绑定完成。
Q2:那为什么不直接用IP地址来访问呢?
这个问题其实有挺多原因的:
请求过程详解
一般来说这种事件的发起人是我们的本地客户机,我们通过浏览器输入了www.baidu.com,那么这个时候他的探索历程开始了。
总结
其实应用层还有很多很多的协议比如:
这一类的协议他们都基于TCP协议完成。
像DNS基于的就是UDP协议完成,SMTP则是基于TCP的协议,这是因为他们对应用场景的思考,如果邮件没发到,那么跟没发没有区别,而DNS这种如果每次都要通过请求建立服务,完全比不上UDP直接发数据快的,而且UDP有着组播方式,能够加快获取信息的速度。