应用层 HTTP、DNS协议_程序猿的温柔香的博客-程序员宅基地

技术标签: 应用层协议  HTTPS  DNS协议  学习篇 & 应用篇 --- Web Server  HTTP协议  

应用层协议

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

假如我们要实现一个网络版的计算器,客户端把 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 采用混合机制,用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去

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

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

加密的应用场景

… 待补充

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43763344/article/details/98677491

智能推荐

java io 多线程_JavaIO流操作及多线程_邓炯源的博客-程序员宅基地

Java IO 流操作及多线程• JAVA流的概念• 字符输入输出流• 字节输入输出流• JAVA中文件与目录管理• 线程基本概念• 线程同步• 线程死锁• 线程挂起、恢复与终止1 、Java 流的概念流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动。按照数据的传输方向,流可分为输入流与输出流。Java语言里的流序列中的数据既可以是未经加工的原始二进制数据,也可以是经过一定编码处...

联想启天m410进bios_联想启天m410电脑U盘重装win10系统教程_weixin_39611930的博客-程序员宅基地

如果想要电脑以高效易用为主的话可以选择联想启天m410,其搭载英特尔第七代酷睿处理器,是一台性能强大的办公电脑,能让工作事半功倍。那么这台联想启天m410电脑如何用U盘重装win10系统呢?下面快启动小编就跟大家介绍联想启天m410电脑U盘重装win10系统教程。u盘是必备的,容量至少8G以上,因为你需要将一个win10系统镜像拷贝进去,容量太小怕是装不下。步骤大概分为两步,第一步是制作u盘启动盘...

字节跳动《算法中文手册》高清版.pdf_普通网友的博客-程序员宅基地

今天给大家推荐一份曾经火爆全网的算法中文小册,据说有不少小伙伴靠这份指南成功掌握了算法的核心技能,成功拿到了 BAT offer。先来给你们看看里面具体都有哪些内容:目前上述内容已打包成...

ubuntu 12.04 java7_ubuntu 12 04下安装JDK7_weixin_39975122的博客-程序员宅基地

前几天刚刚装了64位的ubuntu 12 04。各种折腾啊,基本是linux小白。非常白的小白,很多东西都是从网上各种翻资料,才找到解决办法~不多废话了。说一下自己安装jdk段的过程。本文参考自,http://hi.baidu.com/wtx521/item/a453d3e43003b3068d3ea8d0。2. 下载完成后,在usr/lib/目录下建立jvm文件夹。sudo mkdir jvm ...

html css 最佳实践,最佳实践:非阻塞脚本载入_html/css_WEB-ITnose_伊瓦的战士莱曼的博客-程序员宅基地

当今Web页面和脚本已经越来越复杂,页面性能有时会变得很差。 这常常被误解为网络或浏览器的问题,其实前端技术对页面性能有着非常显著的影响。 前端对页面性能的影响也是多方面的: 脚本/样式文件的划分会影响浏览器缓存效率。频繁的DOM操作会占用大量CPU资源。资源链接的先后顺序也会影响页面渲染速度。同步的网络请求会使页面停止响应。本文将探讨不同的脚本载入方式对页面性能的影响, 包括『浏览器忙提示』...

vuex获取TS封装 - 戴向天_戴向天的博客-程序员宅基地_ts 封装vuex

大家好!我叫戴向天QQ群:602504799如若有不理解的,可加QQ群进行咨询了解interface IStore { _actions: any; getters: any;}/** * 获取模块名称和指定的方法 * @param args */function getArgumentsResult(...args: any[]) { const arg = args[0]; let module = null; let methods: string[] = [

随便推点

java spring环境搭建,Spring系列之一——开源框架Spring环境搭建_新店韩师傅的博客-程序员宅基地

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Sp...

html怎么不可以使用右键,在html中怎么设定让文字框不能贴上,包括滑鼠右键贴上也不可以。..._周达和的博客-程序员宅基地

在html中怎么设定让文字框不能贴上,包括滑鼠右键贴上也不可以。以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在中怎么设定让文字框不能贴上,包括滑鼠右键贴上也不可以。功能:禁止右键、禁选择、禁贴上、禁shift、禁ctrl、禁alt滑鼠右键不能复制贴上怎么办滑鼠右键选单没有复制命令时,可以采取下述方法解决:1)直接使用...

Android自定义View分享——仿网易云音乐留声机效果_KingfarOu的博客-程序员宅基地

写在前面这是笔者自学习自定义View以来,分享的第六篇效果,之前写过一篇打钩小动画,有兴趣的可以看看:Android自定义View分享——打钩动画之前的博客笔者一般都会说,这是不太复杂但是“长得”还可以的效果,这次的分享也长得挺好看的,但是不敢说“不太复杂”。虽然没有用到很高级的API(这篇分享还是以canvas的各个API调用为主),但是在涉及到计算的地方,确实是有些复杂(繁琐)。让

3.1 MathType上标位置调整的两种方法_山清水秀iOS的博客-程序员宅基地

具体操作步骤如下:1.打开MathType窗口后在工作区域中编辑好公式。2.调整上标位置有两种方法:(1)选中要调整的上标,按下“Ctrl+↑,Ctrl+↓,Ctrl+←,Ctrl+→”进行调整,将之调整到目标位置。(2)选中要调整的上标,选择“格式”——“定义间距”,将“上标高度”数字进行修改后保存即可。【格式】——【定义间距】中将【上标高度】数字进行修改。...

河北经贸大学计算机类专业评价报告,河北经贸大学经济管理学院计算机专业怎么样..._人则水州的博客-程序员宅基地

类似问题答案河北经贸大学经济管理学院的计算机科学与技术专业怎么样啊您好!河北经贸大学经济管理学院的计算机科学与技术专业还是比较好的!恭喜您被这个专业录了!河北经贸大学经济管理学院行政管理怎么样?师资不错,和本部的老师一样.宿舍不是特别好,有些旧了,没有空调和浴室,但是有卫生间.就业情况来说,会计是经管学院就业最好的,接着就是金融与国际经济与贸易,行政管理没有上面这几种好,需要工作经验.男女比例就行...

MySQL 学习心得和知识总结(四)_孤傲小二~阿沐的博客-程序员宅基地

事务处理事务事务一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元。只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库;如果有部分事务处理失败,那么事务就要回退到最初的状态,因此,事务中的任何一个SQL要么全部执行成功,要么全部失败。事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态。事务是一组SQL语句的执行,要求...

推荐文章

热门文章

相关标签