当前位置: 首页 > news >正文

网络原理3-应用层(HTTP/HTTPS)

目录

  • DNS
  • HTTP/HTTPS
    • HTTP协议报文
    • HTTP的方法
    • 请求报头、响应报头(header)
    • 状态码
    • 构造HTTP请求
    • HTTPS

应用层是我们日常开发中最常用的一层,因为其他层:传输层、网络层、数据链路层、物理层这些都是操作系统和硬件、驱动已经实现好的,我们只能使用人家的。应用层我们可以使用别人已经创建好的协议(HTTP等),也可以自己定义应用层协议

自定义应用层协议要做的事情:

1、明确前后端交互的过程中,需要传递哪些信息

2、明确组织这些信息的格式,前后端要是同一种方式

网络通信常见的数据格式有:xml、JSON、yml

1、xml

采用成对的标签,类似于HTML,但是xml的标签可以自定义,例如 < userID > 1011< userID/>

2、JSON

采用键值对的形式,键和值使用冒号分开,例如 {“userID”:1011,“username”:“zhangsan”}

3、yml

强制了数据组织的格式,要求键值对必须占据一行

DNS

DNS是一个应用层协议,DNS就是域名解析系统。域名对应一个或者多个IP地址,或者多个域名对应一个IP地址。由于IP地址不方便记忆并且不能显示地址组织的名称和性质,人们设计出了域名,并通过域名系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串,把域名转换成IP地址,这样的系统就叫域名解析系统。

当某个电脑需要进行域名解析,直接会访问DNS服务器。全世界有非常多设备上网,一个服务器是顶不住的,所以有了镜像服务器。当服务器数据有变更,只需要修改基准的服务器(也叫根服务器),其他镜像服务器从根服务器中同步数据。

HTTP/HTTPS

HTTP全称:HyperTransferProtocol,超文本传输协议,这里的文本指的是字符串,而超文本是在文本的基础上的扩展,也就是说,HTTP不仅可以传输文本,也可以传输图片、音频等其他数据,HTTP是最广泛使用的应用层协议。HTTPS可以认为是HTTP的升级版,安全性比HTTP高。除了安全性外,其他部分都是一样的。HTTP是一问一答模型的协议,客户端发一个请求,服务器就返回一个响应。

HTTP应用场景:

1、使用浏览器,打开网页

2、打开手机App,加载相关的信息

3、服务器之间的调用,大概率也是使用的HTTP

现在HTTP已经更新至3.0版本,3.0基于UDP,但是我们最常使用的还是HTTP/1.1(基于TCP)

HTTP协议报文

在学习HTTP协议报文格式前,我们可以借助抓包工具,来了解HTTP请求响应的详细情况。

选择Fiddler进行抓包

下载网址

选择Fiddler Classic

在这里插入图片描述

选择Try For Free
在这里插入图片描述

邮箱随便填一个,国家随便填一个,然后点击Download For Windows

在这里插入图片描述

打开软件后
在这里插入图片描述

点击Tools,然后点击Options

在这里插入图片描述

点击HTTPS,以上4个选项全部勾选,

工具的使用:

在使用前,先选中左边,ctrl+a+delete清除列表

在这里插入图片描述

然后再随便打开一个网页,在网页中点击刷新,这里拿CSDN网页举例
在这里插入图片描述

此时,会显示抓取到的数据报列表,双击CSDN的数据报列表
在这里插入图片描述

右上方部分是请求,右下方部分是响应
在这里插入图片描述

选择Raw,此时列出的是原始的HTTP请求

如果想要更清楚的观察,可以点击View in Notepad,在记事本中打开

在这里插入图片描述

但是响应的文本显示的是乱码,因为这里的数据是压缩后的二进制数据

在这里插入图片描述

此时点击如下按钮即可
在这里插入图片描述

很容易发现,响应其实就是HTML
在这里插入图片描述

HTTP协议的请求:
在这里插入图片描述

1)首行

GET https://www.csdn.net/ HTTP/1.1

GET表示HTTP请求的方法(method) ,中间部分是URL,表示访问的资源,HTTP/1.1指的是HTTP的版本是1.1版本

2)请求头(红框框)部分
在这里插入图片描述

请求头的每一行都是一个键值对,键和值用冒号分割。

3)空行(请求头的结束标记)

4)正文(body)

有的请求是没有body的,有的有body

如抓取gitee

在这里插入图片描述

HTTP请求的基本格式
在这里插入图片描述

HTTP协议的响应

在这里插入图片描述

1)首行

HTTP/1.1 200 OK

HTTP/1.1表示版本,200表示状态码,OK是状态码的描述

2)响应头

响应头的每一行也是一个键值对,键值对之间用冒号分割

3)空行

4)正文(body)

响应的正文通常是HTML、CSS、JS等

HTTP响应的基本格式:
在这里插入图片描述

URL

URL是唯一资源定位符,网络上的资源可以是一个网页、一个图片、一个文件

协议名://ip地址:端口号/带层次的路径/资源名称?查询字符串#片段标识符

在这里插入图片描述

协议方案名:指使用的是哪种协议

登录信息:进行身份认证,现在已经见不到了

服务器地址:要访问的资源的服务器地址,可以是IP也可以是域名

服务器端口号:IP是确定唯一的主机,端口号是确定主机上的程序,如果不写端口号,浏览器会根据协议类型,自动分配端口,如果是HTTP,端口号是80,如果是HTTPS,端口号是443

带层次的文件路径:确定服务器上的具体资源,

查询字符串:查询字符串是程序猿自定义的键值对结构,是针对访问的资源进行补充说明,键值对之间使用&分割,键和值之间使用=分割,等号两边不能有空格

片段标识符:标识页面中的某个部分,常见于文档类文件。例如某个文档网站中,点开目录,每个章节会对应一个片段标识符

URL encode:

查询字符串是键值对结果,但是它的值里面可能包含特殊符号,而URL中有的特殊符号是有重要意义的,如果值出现了特殊符号,在解析的时候可能会出现问题,所以需要转义,URL encode的作用就是把这些特殊意义的字符进行转义。

例如,在浏览器搜索c++,

在这里插入图片描述

此处把 + 字符转义成 %2B

转义规则:把要转义的字符或者汉字,每个字节以16进制的形式表示出来,然后给每个字节前面加上%

例如,在浏览器中搜索 你好,复制地址栏的URL
在这里插入图片描述

得到如下内容

https://cn.bing.com/search?q=%E4%BD%A0%E5%A5%BD&qs=n&form=QBRE&sp=-1&lq=0&pq=%E4%BD%A0%E5%A5%BD&sc=10-2&sk=&cvid=A7357277519D4F10A61D2542BB754587&ghsh=0&ghacc=0&ghpl=

根据utf编码查得你好这两个字的16进制编码

在这里插入图片描述

HTTP的方法

方法描述了HTTP请求的动作想要干什么,HTTP的方法如下

方法说明支持的HTTP协议版本
GET获取资源1.0 、1.1
POST传输实体主体1.0 、1.1
PUT传输文件1.0 、1.1
HEAD获取报文首部1.0 、1.1
DELETE删除文件1.0 、1.1
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK建立和资源之间的联系1.0
UNLINK断开连接关系1.0

常用的方法有GET、POST,重点掌握这两个

**GET:**直接在浏览器中输入一个URL,就会触发GET请求

打开Fiddler,在CSDN主页,按住Ctrl点击刷新,Fiddler会获取到如下的内容
在这里插入图片描述

这里说明了,访问一个网页并不是一个HTTP请求就能完成的,而是需要多个HTTP请求得到的结果。

上述带有csdn的都是这个页面触发的请求,其实就是css文件、JavaScript文件、图片文件、字体文件等,在你的浏览器第一次访问这个网页时,会把这些资源保存到你的电脑上,以后再访问的时候就不需要再次获取这些内容了,这个机制就叫浏览器缓存,这样的机制加快了页面展示速度,节省服务器宽度。直接点击刷新,是从缓存中读取数据,按住Ctrl再点刷新可以强制忽略缓存,重新从服务器读取数据。

POST

通常出现在登录、注册以及上传文件的场景

例如,登录Gitee的请求:
在这里插入图片描述

POST和GET的区别:

首先,这两个方法没有本质区别,POST能用的GET也能用,但是在使用习惯上有区别

1、语义不同:一般来说,GET用于表示从服务器获取数据,POST表示提交数据给服务器。

2、传递数据的方式不同:一般来说,GET传递数据,通过是通过query string,把自定义的数据提交给服务器;POST是通过body把自定义数据交给服务器。

3、GET方法对应的请求,通常设计成幂等的,POST方法对幂等性没有要求。幂等: 是其任意多次执行所产生的影响均与一次执行的影响相同,(牛今天吃草,今天挤出来的是奶,明天吃草明天挤出来的也是奶,结果非常稳定,就是幂等的,如果今天吃草今天挤出来的是史,那就是不幂等)。这个区别在今天不是非常合适了,实际开发中还是需要看具体的业务要求,但是http标准文档中建议这么做

4、GET如果设计成幂等性,此时GET的结果可以缓存,POST不设计成幂等性一般不会缓存

请求报头、响应报头(header)

header是键值对格式的,常见的报头:

1、Host:

表示服务器主机的地址和端口

2、Content-Length、Content-Type:

Length表示body中数据的长度,单位字节,Type表示body中数据的格式。如果请求、响应中没有body,也就没有这两个字段。HTTP是基于TCP的(1.1版本),TCP是面向字节流,存在粘包问题,有了Length、Type就能知道HTTP数据包从哪开始从哪结束。Content-Length和Content-Type在响应和请求中都会存在

常见的Content-Type的取值:

Content-Type:text/html;charset=utf8
Content-Type:text/css
Content-Type: application/javascript;charset=utf8
Content-Type: application/jason

3、User-Agent

例如:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0

主要包含了操作系统信息(版本)和浏览器信息(版本),表述了你用的什么设备上网

4、Referer

描述了当前页面是从哪个页面跳转过来的,例如,在搜狗搜索主页中搜索哔哩哔哩,打开哔哩哔哩的主页

在这里插入图片描述

5、Cookie

Cookie也是键值对结构的,使用;分割键值对,使用=分割键和值,键值对的含义是程序员自定义的

在这里插入图片描述

Cookie是浏览器给网站提供的一种“客户端存储数据”的机制

浏览器禁止网页直接访问咱们的硬盘,但是浏览器允许网页通过键值对的方式存储数据,这样的键值对数据是浏览器负责存储到咱们的硬盘中,网页不能干涉。

浏览器在第一次访问某个网站时,浏览器中可能没有Cookie,服务器返回的响应会带有Set-Cookie,Cookie中的键值对就会写到浏览器中,浏览器收到Cookie就会存储到本地硬盘中。接下来浏览器访问网站时,就会带有Cookie

如何查看Cookie?

在这里插入图片描述
在这里插入图片描述

可以选择删除Cookie,删除之后本地存储的Cookie也会删除掉,在下一次访问这个网站时,服务器返回的响应会带有Set-Cookie,浏览器会根据这个重新存储Cookie。

总结:

Cookie是什么?

浏览器本地持久化存储数据的机制,按照键值对方式存储,键值对内容程序员可以自定义,按照域名为维度分别进行存储,每个网站都有自己的Cookie,互不影响。

Cookie从哪里来?

服务器返回的响应数据中会包含Set-Cookie字段。

Cookie到哪里去?

Cookie虽然会存储到本地,但是目的并不如此,存储好之后,后续浏览器再次访问同一个网站的服务器时,会把之前存储的Cookie带上,发送给服务器。为什么发回来还要再发回去?Cookie中的数据在客户端中需要使用到,在服务器这边也要使用到。

Cookie中存储的键值对是程序员自己定义的

Cookie经典使用场景:
在这里插入图片描述

总结:

常见的HTTP响应头属性:

  1. Content-Type: 指定返回的资源的MIME类型。
  2. Content-Length: 指定返回的资源的长度,单位是字节。
  3. Cache-Control: 控制响应的缓存行为。
  4. Connection: 控制持久连接。
  5. Date: 消息发出的时间。
  6. ETag: 资源的版本/修订号。
  7. Expires: 资源的过期时间。
  8. Last-Modified: 资源最后被修改的时间。
  9. Server: 服务器软件名称。
  10. Set-Cookie: 设置客户端的cookie。
  11. WWW-Authenticate: 用于HTTP认证。
  12. Access-Control-Allow-Origin: 跨域资源共享(CORS)策略。
  13. X-Frame-Options: 控制资源是否可以在iframe中显示。
  14. Content-Disposition: 控制内容的下载方式。
  15. Content-Encoding: 指定内容的编码格式。
  16. Content-Language: 指定内容的语言。
  17. Content-Security-Policy: 定义了网页的资源加载策略。
  18. Strict-Transport-Security: 告诉浏览器仅通过HTTPS连接。
  19. X-Content-Type-Options: 防止MIME类型混淆攻击。
  20. X-XSS-Protection: 启用浏览器的XSS过滤和阻断功能。
  21. Location: 用于重定向的URL。
  22. Retry-After: 告诉客户端在多长时间后再次发起请求。
  23. Vary: 告诉缓存服务器何时需要重新请求。
  24. Accept-Ranges: 指定服务器是否支持范围请求。
  25. Allow: 指定允许的HTTP方法。
  26. Cross-Origin-Embedder-Policy: 控制跨源嵌入策略。
  27. Cross-Origin-Opener-Policy: 控制跨源窗口行为。
  28. Cross-Origin-Resource-Policy: 控制跨源资源的加载策略。

常见的HTTP请求属性:

  1. Accept: 客户端能够处理的媒体类型。
  2. Accept-Language: 客户端能够接受的语言。
  3. Accept-Encoding: 客户端能够接受的编码格式。
  4. Authorization: 客户端发送的认证信息。
  5. Cache-Control: 客户端的缓存指令。
  6. Connection: 控制持久连接。
  7. Content-Length: 请求体的长度。
  8. Content-Type: 请求体的媒体类型。
  9. Cookie: 客户端发送的cookie信息。
  10. Host: 请求的服务器域名和端口。
  11. Origin: 请求的源。
  12. Referer: 请求的来源URL。
  13. User-Agent: 客户端的用户代理信息。
  14. X-Requested-With: 通常用于标识Ajax请求。

请求头用于向服务器提供额外的信息,以帮助服务器正确处理请求。

状态码

状态码表示访问一个页面请求是否成功,以及请求失败的原因

常见的状态码:

200 OK : 表示成功

404 Not Found :表示浏览器根据url访问的资源在服务器上没有找到,url的路径不对

403 Forbidden :访问被拒绝(没有权限)

405 Method Not Allowed :方法不支持

500 Internal Server Error :服务器内部错误,一般是服务器端代码出bug,抛出异常但是没有catch

504 Gateway Timeout :超时,响应没有在规定时间内返回

302 Found :重定向,访问A网站时会自动跳转到B网站,此时响应中返回的状态码就是302,并且在响应头中Location属性(包含B网站的地址)。浏览器收到302状态码后会自动跳转到Location中的网站。

构造HTTP请求

使用工具Postman,下载链接
在这里插入图片描述
点击next
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就可以自己构造HTTP请求了

HTTPS

HTTP协议内容是以文本的形式明文传输,传输的数据容易被黑客、运营商劫持和篡改,HTTPS在HTTP的基础上,引入了加密机制,解决了上述的问题。

明文:传输的原始数据

密文:对明文进行加密后的数据

加密:明文–>密文

解密:密文–>明文

密钥:进行加密、解密的工具

对称加密:加密和解密都使用同一个密钥

非对称加密:使用一对密钥,使用A加密就使用B解密,使用B加密则使用A解密。这两个密钥一个公开一个私藏,公开的叫公钥,私藏的叫私钥。

关于HTTPS的工作过程:

这里只介绍加密过程,因为HTTPS是在HTTP基础上引入了加密机制,其他内容都是一样的。
在这里插入图片描述

未加密:客户端明文传输数据,很容易被黑客入侵,获取到请求的内容,并进行篡改

1、引入对称加密

在这里插入图片描述

一个服务器对应多个客户端,每个客户端的密钥都不同,要求每个客户端连上服务器的时候自己随机生成一个对称密钥,服务器拿到这个密钥才能进行解密,因此密钥也需要进行传输。
在这里插入图片描述

但是,密钥是明文传输的,黑客很容易获取到密钥。

2)引入非对称加密:

通过非对称加密,对要传输的密钥进行加密,而传输的数据还是使用对称加密。

在这里插入图片描述

上述流程看似安全,实则存在缺陷
在这里插入图片描述

3)引入证书

问题的关键是,能让客户端辨别出拿到的公钥是不是正确的。如何证明公钥是正确的?引入第三方公证机构,想搭建服务器,使用HTTPS,就需要在公证机构申请证书。申请证书时就要向机构提供信息:网站的域名,备案号,公钥等,公证机构根据这些信息生成一个证书(电子版),证书的内容包含了证书发布机构、证书有效期、公钥、证书所有者、签名等。签名则是保证证书合法性的重要内容。

服务器申请到证书后,后续客户端从服务器拿公钥,就不是拿公钥,而是拿整个证书。客户端可以根据证书的签名来验证证书的合法性。

签名的生成:校验和+加密,把证书中的所有字段综合在一起计算校验和,然后公证机构生成一对公钥私钥,公证机构持有私钥,公钥分发给客户端,公证机构拿着私钥对校验和进行加密得到数字签名。数字签名其实就是加密后的校验和。

客户端验证数字签名:

1、客户端把证书中各个字段再计算一次校验和,得到checksum1

2、客户端使用公证机构发的公钥对数字签名进行解密得到checksum2

3、比较,如果checksum1==checksum2证明当前证书和服务器发出的证书是一样的,如果checksum1!=checksum2,说明证书的内容被黑客篡改过。

客户端手里的公证机构的公钥是操作系统内置的,而不是通过网络获取的,所以不存在公证机构的公钥是黑客伪造的。

另外黑客不能做到:篡改数据后,让数字签名解密出来的checksum1和篡改后的checksum2相等,因为黑客篡改数据后需要使用公证机构的私钥来加密。如果黑客自己生成一个私钥,这时客户端拿着公证机构的公钥,也解密不了。

总结:HTTPS工作流程

1、引入对称加密

2、传输对称密钥

3、对 对称密钥进行加密,引入非对称加密

4、中间人攻击

5、引入证书,解决中间人攻击


http://www.mrgr.cn/news/36069.html

相关文章:

  • C# 面向对象基础,简单的银行存钱取钱程序
  • 精密矫平机如何推动工业自动化?
  • 素数判断-C语言
  • 硬刚小米15,又一小屏旗舰加入战场了
  • 深入理解同步和异步与reactor和proactor模式
  • MySQL | group by 用法
  • C++ vector容器迭代器失效
  • 音乐服务器测试报告
  • Python如何保存py文件
  • 植物大战僵尸杂交版v2.5.1最新版本(附下载链接)
  • 【linux】regulartor-fixed
  • c语言实现:链表创建、插入、删除、翻转
  • p2p、分布式,区块链笔记(OrbitDB.ControlCenter 003) :数据库接口 src\database\index.js
  • 设备程序驱动框架
  • 【Linux】解锁文件描述符奥秘,高效缓存区的实战技巧
  • MySQL: 数据类型介绍
  • 只要孩子感兴趣,学什么都不会白学
  • 如何根据拍立淘API返回值进行商品数据分析
  • USB-CAN的使用说明
  • QT开发模式(二):QML/JS/C++混合编程