这是我参与「第四届青训营 」笔记创作活动的第6天
前言
今天学习了HTTP相关的知识,从HTTP的发展,到HTTP整个发送以及后端响应的整个过程都做了一个详细的学习。以下就是我对今天HTTP所学内容的总结。
HTTP
HTTP是应用层协议,是基于TCP/IP的。英文名为Hyper Text Transfer Protocol译名超文本传输协议。HTTP是一个无状态简单可靠的协议。大多应用在与后端交互数据。
协议分析
发展
HTTP/0.9
单行协议,请求只有GET,响应只有HTML文档
HTTP/1.0
增加Header信息,有了状态码,支持多种文档。
HTTP/1.1
链路复用,缓存,内容协商。
HTTP/2
二进制协议,压缩header,服务器推送
HTTP/3
草案中
HTTP请求方式
- GET (请求一个指定资源的表示形式,使用GET请求应只被用于获取数据
- POST(用于将实体提交到指定资源,通常导致服务器上状态变化)
- PUT(用请求有效负荷替换目标资源的所有当前表示)
- DELETE(删除指定资源)
- HEAD (请求一个Get请求的响应相同的响应,但没有响应体)
- CONNECT(建立一个到由目标资源表示的服务器隧道)
- OPTIONS (用于描述资源的通信选项)
- TRACE(沿着目标资源的路径执行一个消息环回测试)
- PATCH(用于对资源应用部分的修改)
常见HTTP状态码
- 200 客户端请求成功
- 301 资源等永久转移到其它URL
- 302 临时跳转
- 401 请求未经授权
- 500 服务器内部发生错误
- 504 网关或者代理无法超时
常见请求头
- Accept 接受类型,表示浏览器支持的MIME类型,服务器对应的是Content-type
- Content-type 客户端发送出去实体内容的类型
- Cache—Control 指定请求和响应的缓存机制
- If-Modified-Since 对应服务器的Last-Modified,用来匹配文件是否更改,精确到1s内。
- Exprices 缓存控制,在这个时间内不会请求,直接使用缓存。
- Max-age 代表资源在本地缓存多少秒
- If-none-Match 对应服务器的Etage,匹配文件内容是否更改。
- Cookie 有cookie时请求同域下会自动带上
- Refere 请求源,通常用于CSRF。
- User-Agent 客户端信息
常见响应头
| 标志 | 作用 |
|---|---|
| Content-type | 服务端返回的实体内容类型 |
| Cache-Control | 指定请求和相应遵循的缓存机制,如no-cache |
| Last-Modified | 请求资源的最后时间 |
| Expires | 应该在什么时候认为文档已经过期,从而不在缓存它 |
| Max-age | 客户端的本地资源应该缓存多少秒,开启Cache-control后才起效 |
| ETag | 资源的特点版本的标识符,Etags类似指纹 |
| Set-Cookie | 设置和页面相关的Cookie 服务器通过这个头部吧cookie传递给客户端 |
| Server | 服务器的一些相关信息 |
| Access-Control-Allow-Origin | 服务器允许请求的origin头部 |
缓存
使用缓存的好处,减少了不必要的数据传输,节省带宽,减少服务器负担,提高网站性能。
缓存分为强缓存,和协商缓存,强缓存指设置了Cache-Control,Expires,每次请求的时候会在本地里面先去找,并且核对过期时间,如果存在且没过期,则直接使用。协商缓存,通过每次请求的etag,last-modified和后端服务器进行对比,如果更改就返回新资源,如果没变,etag和last-modified就不改变。
过程大致像这样,发请求,看资源是否过期,过期则请求服务器,服务器对比资源是否真的过期,没过期,返回304状态码,客户端用缓存的老资源。
Cookie
如果在浏览器设置HttpOnly,js就无法获取Cookie。在浏览器端设置cookie的格式为name=value,可以设置过期时间,目前最新的goole浏览器为400天最大时间,以前是永久不过期。domain字段限制cookie使用的域名,一般情况下默认为当前域。如果有其它需求,可以设置SameSite = None | Strict | Lax 字段。None表示同站跨域请求都能发送,Strict,只能在同站发送,Lax为允许与顶级,第三方网站一起发送。
HTTP2.0
HTTP2.0最小通信单位为Frame(帧),基于二进制,可以交错发送,接收放重组信息。HTTP2.0连接是永久的。
HTTPS
信息经过TSL/SSL加密才会发送,保证了用户的信息安全。 一个完整的HTTPS请求过程如图所示。
对称加密:加密和解密都使用一个密钥。 非对称加密:加密和解密都使用2个不同的密钥。公钥(public key) 私钥(private key)
普通的HTTP请求是三层 HTTP层->TCP层->IP层 HTTPS层分为4层 HTTP层->TLS|SSL层->TCP层->IP层
跨域
如图所示:我们的url由3个部分组成协议,域名,端口。只要其中一项不同就是跨域。http默认的情况下是80端口,写和不写都是默认80,https默认是443。
解决跨域的方式
- jsonp(不常用)
- 代理服务器 (天然解决,很好用)
- iframe