目录
前言:
1.HTTP协议
1.1HTTP协议是什么
1.2HTTP协议的报文格式
1.2.1抓包工具的使用
1.2.2HTTP请求
1.2.3HTTP响应
2.HTTP请求
2.1首行的组成
2.2.1URL的组成
2.2认识“方法”(method)
2.2.1GET方法
2.2.2POST方法
2.2.3GET和POST请求的区别
2.3认识请求“报头”(header)
2.4认识请求正文(body)
3.HTTP响应
3.1认识“状态码”
3.2HTTP请求的构造
3.2.1直接构造
3.2.2html中的特殊标签
3.2.3通过form表单构造http请求
3.2.4通过ajax构造
3.2.5通过postman构造
4.HTTPS
4.1HTTPS是什么
4.2HTTPS的工作过程
4.2.1使用对称密钥
4.2.2引入非对称加密
4.2.3引入证书
4.2.4完整流程
4.2.5总结
4.2.6HTTPSvsHTTP
结束语:
在之前的博客中小编给大家简单的介绍了一下有关于HTTP协议的东西,他是属于应用层的一个广泛使用的协议,再应用层中主要关注的是数据怎么使用。应用层协议是经常需要“自定义”的但是很多时候也不一定要从0开始设定,我们也可以基于大佬们设计好的协议,在这个基础上进行设定。这个协议就是HTTP,HTTP的应用非常广泛,他之所以这么广泛就是因为HTTP的可制定性非常强。那么我们在什么时候可以用到HTTP协议呢?只要我们在上网的时候就会使用到HTTP协议,比如浏览器打开一个网页,手机APP从网络上加载一份数据,微信小程序,支付宝小程序,打开游戏...都是在使用HTTP协议。所以接下来就和小编一起来学习一下HTTP协议吧!
HTTP的全称是“超文本传输协议”,是一种应用非常广泛的应用层协议。他是一种“一问一答”这种形式的协议,一个请求对应一个响应。HTTP往往是基于传输层的TCP协议实现的,目前我们主要使用的是HTTP1.1。
想要仍是报文格式,就需要借助一些外部工具来把http协议给显示出来。这里就涉及到了“抓包工具”,抓包工具本质上相当于一个“代理”,借助这样的代理就可以看到网络上传输的具体数据了。在网上有很多抓包工具其中Chrome就内置了抓包工具,还有wireshark这里的功能更加复杂也更加全面,但是小编这里给大家介绍的是fiddler,它一般是只专注于http,所以使用起来比较简单方便。大家可以自己去网上下载一个,下面小编就直接进入fiddler使用的演示了。
②在界面中左侧是抓到包的列表,当双击要关注的包的时候,右侧就会显示详情,右上是请求,右下是响应。
我们按照下面的操作就可以直接打开了。这里点击Raw就是最原始的http请求的数据。
上面就是一个完整的http请求,所谓的http请求其实就是通过代码构造出一个HTTP格式要求的字符串,在往TCP的socket中写就可以了。
一个http请求数据,包含了4个部分。
注意在空行后面可能还会有正文,但是有的时候可以没有正文。
有的同学的响应可能是下面的这种二进制的,不影响我们只要点击上面的那一串就可以将其转换成文本格式的了。
你会发现这里的正文就是html代码,HTTP响应就是要显示的html的本体,浏览器拿到这个http响应也就拿到了里面的html就可以显示了。
这里我们借助了抓包工具fiddler,就看到了HTTP协议的请求和响应的详细内容了,具体细节如下所示:
下面我们就一一来看一下HTTP里面的具体内容吧。
其中HTTP方法描述了这个方法想要干什么,HTTP方法有很多种,不同的方法,表示的“语义”不同。下面会给大家一一介绍的。
URL是唯一资源定位符,它描述了网络上的唯一的一个资源。
版本号就是我们现在使用的HTPP的版本。
针对URL来说大概是由一下这几个部分组成。
比如现在有一家餐厅,如果你要点外卖的话就会有以下的信息。
大家可以对应上述的情况来理解一下。
在HTTP中有以下几种方法。
方法 | 说明 |
GET | 获取资源 |
POST | 传输实体主体 |
PUT | 传输文件 |
HEAD | 获得报文首部 |
DELETE | 删除文件 |
OPTIONS | 询问支持的方法 |
TRACE | 追踪路径 |
CONNECT | 要求用隧道协议连接代理 |
LINK | 建立和资源之间的联系 |
UNLINE | 断开连接关系 |
上述的这么多种方法我们最常见到的就是get和post请求,所以接下来我们来详细的看一下这两个方法。
GET的语义是“从服务器这里拿取数据”。我们一般看到的请求都是GET请求。
如上述我们在搜索“搜狗”的时候,我们使用fiddler抓包抓到的也是GET请求。
GET请求的特点:
POST方法的语义是“往服务器里提交东西”,这个一般是在登录的时候或者是在上传文件的时候会出现POST请求,比如我们现在登录一下一个网站,然后使用fiddler进行抓包。
并且在POST请求中body一般不为空。
首先GET和POST是没没有本质区别的,使用GET场景换成POST一般也是可以的,但是在使用习惯上存在区别:
头部是以键值对的结构组织的,每一个键值对占一行,键和值之间使用冒号分隔,这里的键值对可有N行,最后会用空行作为结束标记的。
header中的键值对大多都是HTTP协议规定的,当然这里也可以添加自定义的键值对。
在上述中我们可以看到他是以json的形式来组织的,json使用{}表示的,这里面包含了若干个键值对,键值对之间使用,分隔,键和值之间使用:分隔。如下所示:
在content-type中还有一些其他的写法比如:text/html,text/css,application/javascript,image/jpg,image/png......
这里面就描述了他是Windows NT 10.0的操作系统,64位,并且后面还描述了浏览器的版本。
如上所示就是我们在使用fiddler来进行抓到的Cookie。他存储的是字符串,一般是存储用户的身份信息,由于客户端有很多,每个客户端提供的服务可能不一样,因此服务器就可以通过Cookie来进行区分,比如客户端在登录时候,服务器就识别好客户端的角色,把角色信息返回给浏览器,然后保存在Cookie中,后续客户端在访问的时候,就会带着这个Cookie,然后服务器就直接返回数据给客户端。
我们来使用fiddler进行抓包就可以看到正文了。
状态码表示访问一个页面的结果(是成功还是失败,还是其他的一些情况....)在http中提供的状态码是非常复杂繁多的,我们看一下下面的这些状态码。
上面这些虽然有很多,但是会发现大概被分成了以下几大类:
类别 | 原因短语 | |
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
而这五大类中又包含了很多具体的状态码。具体的我们来看一下以下的这几个。
我们可以直接在浏览器的地址栏中国输入一个url来构造出一个GET请求。
在html中一些特殊标签也会触发GET请求。比如:link、script、img、a。
form表单构造出来的GET请求,这里我们借助抓包工具来给大家展示,如下图所示:
form表单构造出来的POST请求,这里我们借助抓包工具来给大家展示,如下图所示:
注意:form只支持get和post。
在js中提供了原生的ajax的api,但是这里我们使用的是jQuery中提供的ajax的api。下面我们来给大家来实现一下吧。
①打开jQuery的官网☞https://releases.jquery.com/
②复制下面的路径到代码中。注意这里可以先自己进行访问一下,确保这个地址可以进行访问。
如果上述的地址打开的页面是下面的这种情况就说明可以正确访问到。
引入到代码中。
③明确$符号的含义。
$:在jQuery中是一个特殊的全局变量。jQuery中的各种的api都是$的方法。你也可以直接使用jQuery和$是一样的。
上述的body是响应的正文,function是一个回调函数,会在服务器中返回一个正确的响应的时候,
会被浏览器自动执行,这个执行过程就是“异步”,在我们页面的js中把请求发送出去之后就不用管了,就会继续执行后续的代码,直到响应回来之后传给代码。
相比于form来说ajax的功能比form更加丰富,更加灵活。
下面我们来运行一下代码。
代码展示:
ajax示例
我们可以看到在这个运行结果中前端的控制台中出现了红色的子,注意这并不是bug,而是Ajax中的一个典型的跨域问题,现在运行的Ajax代码的页面域名是abc.com但是在Ajax的请求中访问的域名是def.com,这两域名不一致的话哪怕服务器给你响应了数据,浏览器还是不能处理,还是要报错。在后面只要咱们自己写了服务器,自己的页面来请求自己的服务器,自然这里就不会存在这个跨域问题了。
上述的这些都是需要进行代码来进行构造的,是否有办法可以不写代码来构造请求呢?有一些现成的工具,可以直接构造出HTTP请求,例如postman。网址☞https://www.postman.com/
①进入到官网之后,我们切换到workspace。
② 进行注册使用,并打开界面。
③创建一个标签页,点击+号即可创建。
④构造一个请求。
在侧边栏中也可以构造其他请求。
这样就可以构建好请求了。
HTTPS(Hyper Text Transfer Protocol Secure,安全的超文本传输协议)是一种基于SSL/TSL协议的HTTPS协议,他是HTTP协议的安全版本。HTTPS协议通过加密通信内容和身份验证来保证数据传输的安全和完整性,从而可以有效的防止数据在传输的过程中被窃取或篡改。
你可以理解为HTTPS=HTTP + 加密 + 认证 + 完整性保护。
那么什么是加密,什么又是解密呢?
在加密中主要是有两种模式,一种是使用堆堆对称密钥,另一种是使用非对称密钥进行加密。下面我们来分别看下两种加密模式。
原理:对称加密其实就是通过同一个“密钥”,把明文加密成密文,并且也能把密文解密成明文。
那么这个密钥是怎么保证客户端和服务端两者之间是一致的呢?
在客户端传输数据的时候是需要加密的,此时客户端就会自己生成一个密钥,那么在通过网络然后传输给服务端。既如此那么也就说明黑客也是可以拿到这里的key的。所以这里就会存在一些安全问题,如下图所示:
那么针对上述的不安全情况下,我们就引入了另一种机制,非对称加密的机制。客户端希望把自己的key安全的传给服务器不被黑客拿到,那么此时我们就可以使用非对称密钥来进行加密操作。
由于这里黑客拿不到pri私钥,无法对密文进行解密,所以黑客就无法对密文的数据进行解析和篡改了。这样使用非对称密钥就达到了一个安全的保证机制。
当然安全是相对的,黑客也不是吃素的,黑客会通过偷袭的方式来进行篡改数据。如下所示。
以上就会将非对称密钥变得不安全了。那么它攻击的原理就是要让客户端能够信任公钥。那么该怎么让客户端相信这里的公钥呢?这里我们就需要引入一个证书的概念。我们继续往下来看。
这里向大家解释两个概念:
证书:它像是一个结构化的字符串,里面包含了以下信息(证书的发放机构、证书有效期、公钥、证书所有者、签名....)
校验:当客户端获取到这个证书之后就会对该证书进行一个校验,辨别一下真伪。具体操作如下所示。
HTTPS工作过程涉及到的密钥有三组。
HTTPS协议与HTTP协议的区别在于HTTPS协议再数据传输的过程中使用了SSL/TLS协议进行加密和身份验证,另外关于它们两个的默认端口号也是不同的,HTTP的默认端口号是80,而HTTPS默认端口号是443。
这节中小编主要是给大家分享了有关于HTTP和HTTPS协议的一些具体内容,希望这节对大家了解HTTP协议有一定帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)