前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >锦囊篇|一文遨游应用层

锦囊篇|一文遨游应用层

作者头像
ClericYi
发布2020-06-23 15:16:21
3740
发布2020-06-23 15:16:21
举报
文章被收录于专栏:ClericYi's BlogClericYi's Blog

前言

文内部分图片来自Carson_Ho大佬的文章 https://www.jianshu.com/p/a6d086a3997d

从图中我们可以看到的例如HTTP、DNS、SMTP等一系列的协议都是在应用层这一层建立的。而这次我们主讲的就是面试中最常问到的HTTP和DNS了。

HTTP

请求报文

  • 请求行:放置请求方法、路径URL、使用的http版本、以及资源路径的位置。
  • 请求头:内部放置的是报文的部分信息。(形式:header(字段名):value(值))另外面试中的断点续传其实就是对请求头中添加Range和Content-Range来完成的。以下为常用部分:
  • 请求体:发送给服务器的数据信息,一般分为如下的三种格式:

一般用的比较多的就是数据交换键值对。数据交换形式一般在POST请求中出现,键值对形式一般在GET请求中出现。

响应报文

  • 状态行:声明协议版本,状态码,状态码描述
  • 响应头:声明客户端、服务器 / 报文的部分信息,同样以(key:value)形式的方式展现,以下为常用部分:
  • 响应体:存放需返回给客户端的数据信息,存储方式与请求体一致。

案例分析

请求报文

响应报文

  • 请求报文
    1. 请求行:Request Method:GET;Request URI:/ ;Request Version:HTTP/1.1 。
    2. 请求头:Accept、Accept-Language、。。。、Connection中的内容都是
    3. 请求体:暂时无数据
  • 响应报文
    1. 状态行:Request Version:HTTP/1.1 ;Response Code:100。
    2. 响应头:Server、Date
    3. 响应体:暂时无数据

HTTP三大版本的区别

HTTP其实分为很多的版本,Version 1.0,1.1以及2。

  • HTTP1.0与HTTP 1.1的主要区别
    1. 长连接/持久化连接
    2. 节约带宽
    3. HOST域
  • HTTP1.1与HTTP 2.0的主要区别
    1. 多路复用
    2. 二进制分帧
    3. 首部压缩
    4. 服务器推送

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

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx:指示信息--表示请求已接收,继续处理
  • 2xx:成功--表示请求已被成功接收、理解、接受
  • 3xx:重定向--要完成请求必须进行更进一步的操作
  • 4xx:客户端错误--请求有语法错误或请求无法实现
  • 5xx:服务器端错误--服务器未能实现合法的请求

几个重要的响应码

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地址来访问呢?

这个问题其实有挺多原因的:

  1. 好记。 生硬的数字,没有他的实际意义,如果我告诉他的IP地址和域名地址,你会记住哪个?这显然是域名地址。
  2. 分布式中的应用。 我记得很久以前听过分布式是一个轮询的请求方式,因为网络中IP是唯一的,但是和域名关联后,一个域名地址可以对应多个IP地址,你又是通过域名方式请求,也就做到了负载均衡。(理解有误可以提出!!)

请求过程详解

一般来说这种事件的发起人是我们的本地客户机,我们通过浏览器输入了www.baidu.com,那么这个时候他的探索历程开始了。

  1. 先搜索本地的hosts文件,这里可以比较清楚的看到一些IP地址对应的域名地址 (命令为:sudo vim /etc/hosts)
  1. 如果本地不存在,那我们就要改变策略,向本地域名服务器发出请求。很久以前我小时候玩qq的时候其实就是可以直接查看附近区域的IP地址存在哪些的。存在则直接返回,不存在,那我们只好继续往上找了。
  2. 这里需要注意,他是直接向根DNS服务器发出请求的,如果根DNS服务器中,我们同样的还是找不到,那我们才有开始下面的步骤,向下级服务器发出查找请求。
  1. 下级服务器不断向下查询,直到找到了对应的IP地址后,就将我们的数据进行一个返回,自此我们就得到了我们我们需要的IP地址。

总结

其实应用层还有很多很多的协议比如:

  • FTP(文件传输协议)这种专门用于文件传输的协议。为了降低连接的成本,将端口分为两类:控制连接(端口:21)、数据连接(端口:20)。
  • SMTP(简单邮件协议)这种用于邮件发送的协议,只支持7位ASCII编码文件。

这一类的协议他们都基于TCP协议完成。

像DNS基于的就是UDP协议完成,SMTP则是基于TCP的协议,这是因为他们对应用场景的思考,如果邮件没发到,那么跟没发没有区别,而DNS这种如果每次都要通过请求建立服务,完全比不上UDP直接发数据快的,而且UDP有着组播方式,能够加快获取信息的速度。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevGW 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档