引言
HTTP协议是一个基于请求和响应模式的应用层协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定;它主要关注的是数据内容;就比如我们要在淘宝上买东西,卖家[客户端]把物品通过顺丰[路径选择]等渠道送到买家[服务器]手里,买家和卖家只关注其中物品的信息,至于中间是谁送过去的,怎么送的,都不需要考虑;HTTP协议于1990年提出,经过几年的使用和发展,慢慢得到完善,现在有HTTP1.0、HTTP1.1、HTTP2.0等几个版本。
一、认识URL
URL就是我们平时所说的"网址",也叫资源唯一定位符,描述了互联网上资源的位置,它由协议名称、IP地址/域名、端口号、路径、查询字符串等几个重要部分组成,一个URL中的组成部分不是绝对的,会根据一些因素所改变。
- 域名:和IP地址是等价的关系,通过域名可以自动转化成一个对应的IP地址,域名会通过DNS机制自动转化成IP地址的。
- 路径:标识该服务器程序上的哪个资源。
- 查询字符串:表示该资源里面的一些具体内容。
二、HTTP协议的特点
- 支持客户端/服务器模式。
- 是一个纯文本的协议
- 简单快速,客户端向服务器发起请求时,只需要传送请求的方法和路径。
- 无连接:限制每次连接只处理一个请求,服务器处理完请求并且接收到应答后,立刻断开连接(这里就很有疑惑了,不是说HTTP是无连接的吗?实际上无连接强调的是HTTP协议的特性,他具体的数据传输是依靠传输层的TCP协议建立的连接,所以从本质上说HTTP协议就是无连接的,它传输的每一个请求都是相互独立的)。
- 无状态:无状态是指协议对于事务处理没有记忆能力,缺少状态就意味着后续处理如果需要前面的信息,就需要全部重传。
三、HTTP请求
一个HTTP请求是由请求行、请求报头、请求正文三个部分组成的。
1、请求行
请求行由请求方法、URL、HTTP版本号三个部分组成
- 请求方法有GET、POST、HEAD、PUT等等方法,常用的是GET(从服务器获取数据)、和POST(向服务器提交数据)。
- HTTP现在有HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP/3.0等几个版本。
问:GET和POST有什么区别?
答:本质上没有区别,因为从根本上讲,GET和POST都是基于TCP协议去传输的,他俩只是对HTTP请求的格式做出了一些规定而已,也就是说一般情况下能用GET实现的场景下用POST也可以,用POST实现的场景,用GET也通向可以,但是由于浏览器的原因,细节上还是会有一些区别的。
- GET一般用来获取数据,POST一般用来提交数据,但是这件事不绝对,在有些框架中POST也可以用来获取数据,所以一般是因地制宜。
- GET的数据一般是放在URL的query string中,而POST的数据一般是放在body中的,但是也不绝对,因为URL是HTTP请求规定携带的,有参数也可以,没参数也不影响,所以完全可以让POST方法把数据放在URL中,也可以让GET把数据放在body中,这样写是没问题,但是浏览器和服务器能不能解析成功,就需要看具体情况了。
- GET一般会设计成"幂等"的,POST一般不考虑"幂等",幂等是说多次访问和一次访问的结果如果相同就是幂等的,不相同就是非幂等的,但是这只是HTTP标准建议这么设计的,具体要不要采纳这个建议就需要人为考虑了,比如像一般的搜索网站,搜索功能都是用GET实现的,但是却不是"幂等的",他们会根据用户的情况来决定推送什么广告,如果用户一直不点击广告,慢慢推送就会变少,如果点击的广告总是那几个类,就会发送更多这类广告。
- GET会被浏览器缓存,POST不会被缓存,浏览器认为从网络获取数据是一个非常满的过程(一般是毫秒或者秒级别的),但是从本地获取数据就很快了,所以有些不会被修改的数据,浏览器就会缓存到本地,下次访问时就直接从本地中取,但是有时也可以让浏览器不缓存这些数据,而POST也可以手动设置缓存数据。
- 一般GET请求的长度有限制,而POST没有限制,这说是他俩的区别,其实是浏览器在其中起的作用,GET数据是放在URL中的,而浏览器对URL是有规定长度的,而针对body就不做要求了。
- GET请求只产生一个TCP数据包,而POST会产生两个TCP数据包,但是在HTTP标准中并没有明确规定这样做,也就是说这是由浏览器和框架决定的,像Firefox使用POST时就只会发送一个TCP数据包。
总结来说,他俩的区别有些是因为条件限制,而有些是浏览器限制,所以从根上上说都不是他俩的区别。
2、请求报头
请求头中是很多的键值对,这些键值对是描述这个请求的一些属性,之后跟着一个空行,标志着结束。
请求头 | 说明 |
---|---|
Host | 描述了服务器主机的地址 |
Referer | 表示当前的页面是通过哪个页面跳转过来的 |
User-Agent | 包含了用户设备的操作系统和浏览器版本 |
Cookie | 是一个键值对结构的字符串,是服务器返回的 |
3、请求正文
可选部分,GET请求一般没有body,POST请求一般有body。
四、HTTP响应
HTTP响应由首行、响应报头、响应正文三个部分组成。
1、首行
首行一般由版本号、状态码、和状态码的描述三个部分组成。
- 状态码:一次HTTP请求可能成功也可能失败,服务器会根据不同的情况,用不同的状态码来表示。常见的有1xx,表示请求已接收,继续处理、2xx,表示请求已被接收、3xx,表示重定向,需要进一步操作、4xx,表示请求失败、5xx,表示服务器错误。
- 状态码描述:可以使用HTTP协议自带的描述,也可以有程序员自己定义。
状态码 | 说明 |
---|---|
200 | 响应成功 |
301 | 永久重定向 |
302 | 重定向,跳转地址通过响应头中Location属性指定 |
400 | 客户端请求语法错误,不能被服务器识别 |
403 | 没有访问权限 |
404 | 没有找到资源 |
500 | 服务器内部错误 |
2、响应报头
和请求报头一样,也是一些键值对形式的存在,描述这个HTTP响应的一些属性,也是以一个空行作为结束标志。
响应头 | 说明 |
---|---|
Cache-Control | 是否需要缓存资源 |
Content-Type | 规定数据的格式 |
Content-Length | 表示返回的响应正文长度 |
Location | 用于重定向接收者到一个新的位置 |
3、响应正文
一般是返回一些文件(html文件、css文件、js文件、图片、视频)。
五、Cookie和Session
什么是Cookie
Cookie是一个键值对结构的字符串,在浏览器中保存(每个域名都有自己的Cookie),Cookie的内容是服务器返回的,HTTP响应中有一个或多个Set-Cookie,当浏览器获取到服务器返回的Cookie之后,再次请求服务器时会自动带上Cookie。
为什么要用Cookie
这就要从我们HTTP协议无状态的特点说起了,因为HTTP协议是无状态的,所以每条响应之间都是互相独立的,而我们如果要实现一个登录功能,就需要记录登录用户的信息,这时就引入了Cookie,相当于Cookie中记录了用户的信息,告诉服务器这次请求是谁发的。
什么是Session
在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
两者的区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上
- cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,如果主要考虑到安全应当使用session
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用Cookie
- 单个cookie在客户端的限制是4K,就是说一个站点在客户端存放的Cookie不能4K。
- 所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在Cookie中
六、HTTPS
HTTPS其实就是加密的HTTP协议,因为HTTP协议一切的数据都是明文传输,所以很容易受到攻击。所以我们就想到了加密手段,服务器和客户端规定一个密钥对信息进行加密,然后再通过密钥进行解密,但是这种方法也不是绝对安全的,会受到 “中间人攻击”,也就是有人从中间获取到密钥。
所以我们就又想到通过非对称加密的方式来传输对称加密,进行二次加密,首先服务器生成一对公钥和私钥,然后把公钥发送给客户端,客户端生成一个对称密钥,用非对称加密的公钥加密对称加密的密钥,传送给服务器。
但是这种方法还不是完全完全的,所以我们又引入的证书机制,服务器通过证书机制把公钥传给客户端,客户端会对证书进行校验(通过数字签名机制)
HTTS的简单总结
- 数据之间的传输是通过对称加密来完成的,密钥是客户端生成的,传个服务器。
- 非对称加密是服务器生成的,把公钥通过证书机制传个客户端。
- 数据之间的传输大量会用到对称加密,因为对称加密的效率要高于非对称加密。