网络原理(下)

  前言👀~

上一章我们介绍了网络层和数据链路层相关协议以及解释了DNS,今天来讲解HTTP协议以及HTTPS协议

HTTP 协议

HTTP报文格式

请求格式

响应格式

格式解释

URL

请求响应方法

Header

HTTPS协议

HTTPS加密过程


如果各位对文章的内容感兴趣的话,请点点小赞,关注一手不迷路,讲解的内容我会搭配我的理解用我自己的话去解释如果有什么问题的话,欢迎各位评论纠正 🤞🤞🤞

12b46cd836b7495695ce3560ea45749c.jpeg

个人主页:N_0050-CSDN博客

相关专栏:java SE_N_0050的博客-CSDN博客  java数据结构_N_0050的博客-CSDN博客  java EE_N_0050的博客-CSDN博客


HTTP 协议

使用HTTP协议的场景:浏览器打开网站(基本上)、手机APP访问对应的服务器(大概率),目前大规模使用的版本HTTP/1.1,HTTP 协议属于一种"一问一答"结果模型的协议,HTTP协议报文格式分两部分看待,请求和响应这两个协议格式有些区别"一问一答(访问网站)不是说是唯一的,可以多问一答(上传文件)、一问多答(下载文件)、多问多答(远程桌面),这些操作你可能感知不到

如何查看HTTP请求和响应格式?

抓包:把网卡上经过的数据获取到并且显示出来(必备技能,分析调试程序重要手段),抓包工具Fiddler还有Wireshark等,Fiddler本质是一个代理,可以获取到请求和响应的详细内容。注意代理程序之间可能会有冲突。你也可以使用浏览器自带的开发人员工具直接观察。下面是使用Fiddler进行抓包

代理和反向代理


HTTP报文格式

HTTP协议都是文本格式的协议!(协议里的内容都是字符串),可以直接查看也会看到二进制的数据(压缩后的),HTTP响应经常会被压缩,压缩体积后小了这样传输的时候会节省带宽。但是压缩和解压缩要消耗额外的cpu。解压缩之后看到的响应数据是html,也就是浏览器显示的页面,一般都是浏览器发起请求从服务器那边获取到页面数据(html)。程序下载了就不用下载了,打开一个网页都是一个重新下载的过程

请求和响应报文格式,下面针对一些部分详细解释

请求格式

1.首行,HTTP请求第一行包含三部分信息,之间使用空格分割

  1.HTTP请求的方法,描述你这次请求要干啥

  2.URL,唯一资源定位符,描述一个资源在网络上的位置

  3.版本号,HTTP/1.1

2.请求头(header)

除了第一行都是请求头,是一个键值对结构的数据(很多键值对),每个键值对都是独立占一行,键和值之间使用 :空格来区分,这里的键值对都属于标准规定的

3.空行:请求头的结束标志


 

4.正文:有的HTTP请求有,有的没有

响应格式

1.首行

  1.版本号, HTTP/1.1

 2.状态码(200),描述请求的结果

 3.状态码描述符(OK)

2.响应头(header)

除了第一行都是请求头,是一个键值对结构的数据(很多键值对),每个键值对都是独立占一行,键和值之间使用 :空格来区分

3.空行:响应头的结束标志

4.正文:空行之后的内容都是正文,内容比较长有多种格式,例如HTML、CSS、JS、图片、视频等格式,这里是通过抓包获取的数据还没解析属于是二进制的

格式解释

URL

唯一资源定位符,描述一个资源在网络上的位置

URL格式,http://就是协议名例如还有https://,www.example.com就是服务器地址也可以看作是IP地址,后面就是端口号可以省略,因为http请求默认端口号80,https请求默认端口号443,所以一个IP地址定位一个主机的位置,一个端口号来区分程序。后面这个就是文件路径通过这个路径去访问服务器的资源,但是服务器不一定使用目录这样的结构存储数据,可能使用内存存储数据,也可能通过网络访问其他服务器获取的数据。Uid=1这个就是请求中补充一些信息,就像之前做项目在查询的时候进行补充。#ch1就是网页内容长的情况,分多个片段完成页面内部的跳转(就是一个页面有很多部分点一个进行跳转点一个进行跳转),注意query string的value部分包含特殊字符的话,要进行urlencode操作!!!


请求响应方法

GET:随处可见,最常用的 HTTP 方法,常用于获取服务器上的某个资源,一般把传给服务器的数据放在url中的query string中

POST:POST 方法也是一种常见的方法, 多用于提交用户输入的数据给服务器(例如登陆页面)、上传文件等,一般把传给服务器的数据放在body中

注意:一般浏览器都会带有缓存,因为浏览器显示的网页,从服务器那边下载内容比较多,通过网络加载消耗的时间比较多。所以会把之前加载过的页面保存到本地硬盘上,下次直接读硬盘中的数据即可,节省时间以及开销,但是如果数据会经常更新,可能会有点问题涉及到前端的一些知识。然后可以使用ctrl+F5强制刷新。上传头像body比较长,图片属于二进制数据,放到请求中需要进行base64转码(针对二进制数据重新编码,编码之后的数据就是纯文本数据)

GET和POST的区别

首先直接下定论,GET和POST没有本质区别(双方可以替换对方的场景,就是能使用get也能使用post,反之),但在一些小方面有差异

1.使用习惯:GET经常把传输的数据放在query string中,POST则经常放在body中(但是其实GET也可以使用body,POST也可以使用query string,前提是客户端和服务器都要按一样的方式进行处理)


2.语义上的差异:GET大多数用于获取数据(随便点一个网页就属于GET),POST大多数用于提交数据(登录需要填写后才能登录)


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

请求中有body才会有两个以下属性:

Content-Length:body中数据的长度,之前说到TCP会有粘包问题,HTTP数据包是通过TCP进行传输的,所以传输多个HTTP数据包的时候到TCP接收缓冲区的时候也会出现这样的问题,所以使用GET请求的时候使用 空行 进行区分,POST请求使用 空行 和 Content-Length 进行区分

Content-Type:body中数据的格式

请求:有json、form表单的格式、form-data的格式

响应:html、css、js、json、图片、视频等

不同Content-Type,服务器所处理数据的逻辑不同,服务器返回数据给浏览器需要设置合适的Content-Type,浏览器根据不同的Content-Type做出不同的处理

User-Agent (UA)描述了浏览器的版本以及对应主机的操作系统的版本,现在主要用来区分PC端还是移动端

Referer:表示当前页面是从哪个页面跳转过来的

Cookie

HTTP协议是无状态的,每个请求都是独立的,服务器不会保存之前请求的状态信息。这是HTTP协议的一个基本特性,导致服务器无法知道这个请求是否和之前请求是否有关联,于是引入cookie,客户端在发起下一次请求时自动带上cookie,这样服务器就能识别并且关联之前的请求

cookie就是一些数据,由浏览器存储在本地的小块数据,服务器给客户端返回的数据,客户端保存这些数据以便后续需要用到,用到的时候直接带着这个信息发给服务器,然后服务器利用cookie进行处理。例如记录历史记录、访问时间、累计访问次数等。一般会存储用户爱好以及会话标识等信息

cookie按照键值对的形式来组织的,写代码的时候这里的键值对也都是由我们自己进行定义的。cookie存储在浏览器所在主机的硬盘上,后续访问浏览器会带上cookie,每个不同的域名下都可以有不同的 Cookie, 不同网站之间的 Cookie 并不冲突

补充:session属于是服务器一种存储机制,主要用于存储用户登录信息和状态信息。每个用户会有一个唯一的Session ID,通过这个ID,服务器可以识别并管理用户的会话状态,缺点就是增加服务器负担。token就相当于是一个令牌,通常在登录成功后,由服务器生成然后返回给客户端,它比cookie更安全有加密和签名,并且适合无状态的身份验证可以跨多个服务使用


状态码:表示这次请求对应的响应是啥状态,有成功、失败等

1xx:表示请求正在处理

2xx:表示访问成功

3xx:表示重定向,就是请求访问的是A地址,返回响应叫你去访问B的地址。这像一个网页中实现页面跳转,还有旧的地址换了通过这个重定向跳转到新的地址

4xx:405表示请求方法不被允许,例如服务器只支持GET请求你发POST,404表示请求资源找的在服务站不存在,403表示访问的资源没有权限

5xx:表示服务器出错


如何让客户端构造一个HTTP请求?

1.浏览器直接输入URL触发请求

2.html中,使用特殊的标签进行触发请求

3.通过form表单来触发请求(GET/POST),也是一个html标签

4.通过ajax方式,ajax通过js提供的api构成请求,针对获取的响应,可以使用js灵活处理


HTTPS协议

在1几年,我还记得在网站上下载软件的时候,明明下的是我要找的,结果最后下了个不知道啥流氓软件,那时还没有HTTP还没有加密。HTTPS建立在HTTP基础上,引入"加密"机制,防止数据被恶意篡改,关键在于"加密"

什么是"加密"?下面各种密钥本质都是一串数字或字符串

加密就是把 明文 (要传输的信息)进行一系列变换, 生成 密文。可以得出明文+密钥=>密文,解密就是把 密文 再进行一系列变换, 还原成 明文。可以得出密文+密钥=>明文

使用密钥加密,有两种主要方式:

1.对称加密:加密和解密使用的是同一个密钥

例如密钥为key,明文+key=>密文,密文+key=>明文,只是简单举个例子,背后涉及一系列数学运算    


2.非对称加密:有两个密钥(一对!),一个叫"公钥",一个叫"私钥"(公钥可公开,私钥自己留着)

可以得出 明文+公钥=>密文,密文+私钥=>明文 或 明文+私钥=>密文,密文+公钥=>明文,所以用哪把钥匙加密,使用配对的另外一把钥匙进行解密

例子:就像是夫妻一样一对的,生活在一起这么久传输的话通过公钥转为密文,这个密文只有对方也就是私钥才能破解,反过来也是一样一个意思就像是生活一起很久的夫妻在外人看上去两个在说什么胡话,其实只有双方心里清楚


HTTPS加密过程

针对HTTP的header和body进行加密

1.引入对称加密

客户端在传输的时候使用对称密钥对明文进行加密(密文),然后服务器也使用对称密钥进行解密得到明文。此时黑客没有密钥截获了也没事

思考两个问题!

问题1:服务器不只是和一个客户端进行通信,并且每个客户端的密钥都是不同的,所以和服务器通信的时候彼此之间不知道对方的密钥是啥。如果都是相同的,黑客也发送一个请求就能轻松拿到密钥了

问题2:比较理想的做法, 就是能在客户端和服务器建立连接的时候, 双方协商确定这次的密钥是啥。所以每个客户端在和服务器建立连接的时候就把密钥生成出来(涉及随机机制,保证每个客户端的密钥都不同),然后客户端把自己生成的密钥通过网络传输发送给服务器,如果密钥被黑客拿了就凉了

如何让密钥的传输安全到达服务器?引入非对称加密,加密传输

首先建立连接的时候,服务器生成一把公钥和一把私钥,私钥自己留着,然后给客户端向服务器发起密文请求,服务器返回密文响应给客户端这个过程中黑客也拿的到公钥,也有可能推出算出密钥,但是难度很大,不如直接黑服务器拿到密钥更轻松。然后客户端生成对称密钥并且拿到公钥后,然后使用服务器给的 公钥 对 对称密钥 加密,此时生成密文然后发送给服务器,此时就算黑客拿到加密后的密钥(密文)也没用,因为公钥加密后需要使用私钥才能进行解锁然后服务器手里有私钥就很容易解密出明文,后续客户端和服务器的通信都只用对称加密即可。上述这个流程还有一些漏洞,下面进行讲解

为什么不都使用非对称加密?

进行非对称加密/解密运算成本高、运算速度比较低,对称加密运算成本低、运算速度快。所以非对称加密用一般只用在关键操作(传输密钥),对称加密的效率比非对称加密高很多,因此只是在开始阶段协商密钥的时候使用非对称加密,后续的传输仍然使用对称加密

上述对称加密+非对称加密过程属于是HTTPS基本加密流程,但还有个漏洞下面进行讲解

客户端如何确定这个公钥不是黑客伪造的?

黑客从服务器返回密文响应时获取到公钥,自己也搞一对公钥和私钥发个公钥给客户端,此时客户端使用黑客发来的公钥+对称密钥转为密文发出去,此时黑客就使用自己的私钥把这个密文破解了拿到对称密钥,再把刚才服务器那边拿到的公钥+对称密钥发给服务器,后续服务器和客户端使用对称加密,由于黑客有了这个密钥里面的数据一览无余


如何解决这个问题呢?引入证书

关键在于客户端分辨不出这个公钥是不是伪造的,没有分辨能力。所以引入证书

工作人员在搭建服务器的时候生成好公钥(只要一份即可,不用每个客户端不一样),然后向公正机构申请证书类似去办个营业执照,提交一些材料(域名、公钥等),接着公正机构对材料进行审核,审核通过就会给服务器一个证书(就是一段结构化的数据,比如服务器的主域名、服务器公钥、证书过期时间、数字签名等),然后服务器保存好证书。这里还涉及一点证书给服务器之前还会对证书中的各个属性计算出一个校验和并且进行加密得到数字签名

数字签名:使用非对称加密,公正机构自己搞一对公钥和私钥,公钥发布给各个客户端设备(一般这个公钥内置在系统中的,安装了操作系统就会自带公证机构的公钥),使用私钥对校验和进行加密得到数字签名

然后客户端发起请求询问证书,服务器就会返回证书包含公钥(审核过了),客户端拿到证书也拿到了公钥,然后客户端对这个证书进行验证判断是不是被黑客篡改的。验证过程也称为"证书的校验",如何进行校验?核心机制 数字签名(被加密后的校验和),此时客户端拿到数字签名,通过系统内置的公证机构的公钥进行解密,得到最初的校验和,然后客户端再把证书的其他字段重新算一遍也得到一个校验和,两个一对比,一致就说明没被篡改过,不一致说明服务器发来的公钥被黑客替换了,识别出来会发一个警告,你访问的网站有风险!!!黑客能不能搞个数字签名?不行,首先要对校验和加密,而加密需要用到公证机构的私钥才能进行加密。黑客拿自己的私钥进行加密,客户端使用公证机构的公钥无法对黑客发来的数字签名进行解密,并且公证机构的公钥是客户端系统自带的,黑客无法替换

黑客是否能自己申请一个证书然后替换掉服务器的证书?

不能,域名是唯一的,公证机构会认证这个域名是不是你的。所以黑客申请过来的证书客户端拿过来一看域名都不一样就知道是假的

总结:

1.对称加密,加密业务数据

2.非对称加密,加密对称密钥

3.中间人攻击

4.引入证书,校验服务器公钥

以上便是HTTP协议和HTTPS协议的相关内容,网络原理这章就先结束了知识量还是很多的需要好好吸收,我们下一章再见💕

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值