应用层 HTTP、DNS协议

应用层协议

应用层在之前文章简要总结过,例如:我们写文章,程序猿敲代码,都发生在应用层,那么应用层协议是什么?

假如我们要实现一个网络版的计算器,客户端把 1+1这个字符串发送给服务器,那么服务器经过解析,将1 ,+ ,1 分别提取出来,至于服务器是如何提取的,我们先不管,这个提取规则可以理解为协议,当然协议有很多种类,也可以定义结构体,将结构体按照规则转换成字符串发送给服务器,服务器接收到后解析为字符串返回给客户端正确的答案,总之一端发送时构造的数据, 在另一端能够正确的进行解析,这中约定就是 应用层协议.

协议可以自定义,但是这篇主要总结的是一些大佬们定义的协议,所以像我这种小菜鸡,只能望尘莫及

DNS 协议

负责解析域名到 IP 地址之间的服务,因为我们在地址栏输入的是url,也就是域名,比如 https://baidu.com.www ,当按下回车时候,DNS 协议会解析出对应的 IP 地址,这个IP地址在网络层和链路层就可以大显身手了.

当然 DNS 也可以通过 IP 地址查询到域名,是一个双向的服务

这里有个常考的面试题:当输入 url 的按下回车的时候,发生了什么?

其实可以分为两个部分:通过 DNS 查询 IP,通过 socket 发送数据

通过 DNS 查询 IP
如果浏览器之前有访问记录,则首先通过浏览器 DNS 缓存或者系统缓存 Hosts 文件中查找,找不到的话会去路由器缓存或者本地服务器 DNS 缓存中查找,找到了则将解析结果返回客户端进行域名解析

如果还没有找到,那么域名对应的 IP 地址就必须去 DNS 服务器查询,基于 UDP 实现,比如要访问 www.abc.com 首先由本机所设置的 DNS 服务器向 DNS 根节点查询负责 .com 区域的域务器,然后通过其中一个负责 .com 的服务器查询负责 abc.com 的服务器,最后由其中一个 abc.com 的域名服务器查询 www.abc.com 域名的IP地址返回给客户端,所以这是一个递归方式的查询

通过 Socket 发送数据
拿到 IP 地址后,就可以使用 Socket API 来发送数据了,可以选择TCP 协议,也可以选择 UDP 协议,这里就属于传输层的模块了,一般情况选择 TCP协议与Web服务器建立连接,向服务器发送请求,服务器处理后会返回给客户端对应的内容,客户端接收响应,浏览器开始下载并通过浏览器的内核渲染画面.

HTTP 协议

HTTP 是超文本传输协议

HTTP 分为两个时代

  • http1.0
    • http/1.0 客户端可以与 web 服务器连接后,只能获得一次资源
  • http2.0
    • http/1.1 客户端可以与 web 服务器连接后,可以获得多次资源

HTTP 职责

http 协议的职责就是生成针对目标服务器的请求报文,也可以理解为数据单元,在请求报文中包含很多内容,当请求报文发送到web服务器时,会返回一个响应报文,里面也有很多内容
下面详细总结里面有啥内容

请求报文分为两个部分,报文首部报文主体,报文首部又可以分为请求行首部字段

请求行方法 ,url,协议版本组成,至于方法和协议版本有哪些,后面详细总结

POST   http://www.baidu.com    HTTP/1.1

请求首部字段(Header) 由多组属性组成,每一组属性的格式是一个键值对,一组属性占一行,比如:

Host:job.xjtu.edu.cn
Connection:keep-alive
Content-Length:36
Cache-Control:max-age=0

报文主体 也可以叫内容的主体(body),body里面可以有东西,主要是像服务器提供资源请求被处理,当然也可以为空字符串

响应报文也分为两个部分,分别是响应报文首部响应报文主体,首部又可以分为 状态行首部字段

状态行版本号,状态码状态码解释组成,状态码和状态码解释后面也会详细总结.

HTTP/1.1     200    OK

响应首部字段 也是由键值对组成的属性

Accept: 告诉浏览器,它所支持的数据类型
Accept-Encoding: 支持哪种编码格式 GBK, UFT-8,GB2312,…
Accept-Language: 告诉浏览器,它的语言环境
Cache-Control: 缓存控制
Connection:告诉浏览器,请求完成是保持连接还是断开连接
Refresh: 告诉客户端,多久刷新一次
Referer: 当前页面是从哪个页面跳转过来的;
Content-Type : 数据类型(text/html 等)
Content-Length: Body的长度,如果实体主体经过编码后,将不会有这个字段
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
Location: 搭配3xx状态码使用, 告诉客户端接下来要去指定的 url 访问;

主体 body 里面存放着信息,如果服务器返回一个页面,那么这个页面资源就在body中,例如:

< html >

< /html>

下面是请求报文中的方法,以及相应报文中的 状态码

在请求报文的第一行,由方法和 url,协议版本组成

url 是什么?url 编码

url 可以理解为网页地址,主要包含协议名、服务器地址、端口号、带层次的文件路径、查询字符串、片段标识符

url 编码是对部分字符进行转义,比如 C++ 被转义为 C%2B%2B,因为 + 符号对于 url 有特定的含义,转义是为了避免产出歧义.

那么请求方法有多种,主要是 GET 和 POST

GET: 一般是去服务器请求获取资源或者指定的页面信息,请求的参数可以附在 url 的后面,所以它的安全性比较低,另外对应的服务器对 url 长度会有限制

POST: 一般是更新服务器资源或者提交资源,比如我们注册页面的时候,POST 请求会把数据放在 HTTP 请求报文体中去请求服务器,所以比起 GET 更加安全,另外 POST 也没有长度限制

其它请求方法

HEAD 获取报文首部,返回的响应中没有具体内容

PUT 传输文件,比如从客户端向服务器传输的数据取代指定的内容

DELETE 请求服务器删除指定的页面

以上三种有印象即可,在学习微服务的时候会详细总结

响应状态码

当服务器返回给客户端的响应报文中,包含的状态码主要有 2 开头, 3 开头 4 开头以及 5 开头

2xx:请求被成功处理了,例如

  • 200 OK
  • 204 No Content 响应正文中没有数据
  • 206 Partial Content 只返回资源的一部分,或者在请求的时候进行了范围请求

3xx: 重定向,表明浏览器需要执行特殊的处理,服务器才可以正确的处理

  • 301 Moved Permanently(永久重定向) 资源的 url 已经更新了,也就是说现在的 url 不能访问到该资源了,需要更新一下

  • 302 Found(临时重定向) 该状态码表示资源被分配了新的 url,需要使用新的 url 才可以访问该资源,和 301 特别相似,只不过它的 url 可能还会继续变化

4xx:客户端错误

  • 400 Bad Request 请求报文中存在语法错误

  • 401 Unauthorized 表示发送的请求中需要包含 认证信息,因为你访问的页面需要认证.

  • 403 Forbidden 服务器表示不可以访问那个资源,拒绝了你的访问,可能是没有权限

  • 404 Not Found 服务器没有资源,找不到请求的资源,也可能是人家服务器拒绝了请求,但是不想给你说理由.

5xx: 服务器错误啦

  • 500 Internal Server Error 表示服务器在请求的时候内部发送了错误

  • 502 网关错误

  • 503 Server Unavailable 表示服务器处于超负载,或者已经停机,管理员正在维护,现在无法处理请求

通信流程

网页 web 通信,当我们打开浏览器,在地址栏输入 url ,按下回车的时候,就会访问对应的 web 服务器,而他们之间的通信就建立在 HTTP 协议的基础上.

当然数据包也不会一下子就发送过去,依然是从应用层到传输层选择传输的方式以及建立连接,传输层(TCP协议)完成的工作还是比较复杂的,将数据进行分割,并在各个报文打上标记序号,及端口号,然后才转发给网络层,这个时候根本没有连接,只是在传输层约定连接的方式和规则,当数据段传送到 web 服务器的传输层,经过解析之后才会建立连接(如何建立连接),接着数据会来到网络层选择通过什么样的路径到达 web 服务器,并且会将 MAC 地址一并发给下一层…数据链路层处理连接网络的硬件部分

接收端的服务器在链路层收到数据,按序往上层发送,一直到应用层才算真正接收到了客户端发来的请求

发送端在层与层之间会附加一个该层的首部信息,反之在接收端每经过一层,就会去掉对应的首部,从传输层开始,附加一个 TCP 首部或者 UDP 首部到网络层,网络层会附加一个IP首部发送到链路层,链路层会附加一个以太网的首部,这个首部里面包含的信息是非常重要的,比如在TCP首部中,含有目标端口号,可以保障数据被发送到正确的应用程序.

HTTPS 协议

HTTP 协议虽然运行在 TCP 协议之上,保证可靠传输,但是属于明文传输,在传输的过程中可能会被篡改,而且客户端和服务器无法验证对方身份,所以在 HTPP 基础上加了 SSL 套接层,SSL 又是运行在 TCP 的基础上

所以通俗理解 HTTPS 就是在 HTTP 的基础上进行加密和认证

加密的方式

对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是如何安全地将密钥发给对方;

而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密

由于非对称加密的方式不需要发送解密的私钥,所以可以保证安全性;但是和对称加密比起来,处理速度要慢,所以 HTTPS 采用混合机制,用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去

这里面还有一个问题,就是如何保证公开密钥没有被攻击者篡改替换?

可以使用数字证书认证机构颁发的公开密钥证书,就比如说,我是名校本科毕业生,在面试的时候,证明我身份的是该学校的毕业证和学位证.而面试官通过查看毕业证,认为我值得信赖

加密的应用场景

… 待补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的温柔香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值