网络原理3-应用层(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)首行

http 复制代码
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 复制代码
HTTP/1.1 200 OK

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

2)响应头

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

3)空行

4)正文(body)

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

HTTP响应的基本格式:

URL

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

http 复制代码
协议名://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的取值:

http 复制代码
Content-Type:text/html;charset=utf8
http 复制代码
Content-Type:text/css
http 复制代码
Content-Type: application/javascript;charset=utf8
http 复制代码
Content-Type: application/jason

3、User-Agent

例如:

http 复制代码
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、引入证书,解决中间人攻击

相关推荐
Tony聊跨境4 分钟前
独立站SEO类型及优化:来检查这些方面你有没有落下
网络·人工智能·tcp/ip·ip
2403_8757368741 分钟前
道品科技智慧农业中的自动气象检测站
网络·人工智能·智慧城市
Tassel_YUE2 小时前
网络自动化04:python实现ACL匹配信息(主机与主机信息)
网络·python·自动化
Diamond技术流3 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
Spring_java_gg3 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
方方怪4 小时前
与IP网络规划相关的知识点
服务器·网络·tcp/ip
weixin_442643425 小时前
推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案
服务器·网络·安全·filelink数据摆渡系统
阑梦清川5 小时前
JavaEE初阶---网络原理(五)---HTTP协议
网络·http·java-ee
阿尔帕兹6 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
FeelTouch Labs6 小时前
Netty实现WebSocket Server是否开启压缩深度分析
网络·websocket·网络协议