# HTTP
# HTTP的特点和缺点
特点:无连接
、无状态
、灵活
、简单快速
- 无连接:每一次请求都要连接一次,请求结束就会断掉,不会保持连接
- 无状态:每一次请求都是独立的,请求结束不会记录连接的任何信息,减少了网络开销,这是优点也是缺点
- 灵活:通过http协议中头部的 Content-Type 标记, 可以传输任意数据类型的数据对象(文本、图片、视频等),非常灵活
- 简单快速:发送请求访问某个资源时,只需传送请求方法和URL就可以来,使用简单,正由于http协议简单,使得http服务器的程序规模小,因而通信速度很快
缺点:无状态
、不安全
、明文传输
、对头阻塞
- 无状态:请求不会记录任何链接信息,没有记忆,就无法区分多个请求发起者身份是不是同一个客户端的,意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次链接传送的数据量增大
- 不安全:明文传输可能被窃听不安全,缺少身份认证也可能遭遇伪装,还有缺少报文完整性验证可能遭到篡改
- 明文传输:报文(header部分)使用的是明文,直接将信息暴露给了外界,wifi陷阱就是复用明文传输的特点,诱导你连上热点,然后疯狂抓取你的流量,从而拿到你 敏感信息
- 对头阻塞:开启长链接时,只建立一个TCP连接,同一时刻只能处理一个请求,那么当请求耗时过长时,其他请求就只能阻塞状态。
# HTTP 报文组成部分
http报文:由 请求报文
和 响应报文
组成
请求报文:由 请求行
、请求头
、空行
、请求体
四部分组成
响应报文:由 状态行
、响应头
、空行
、响应体
四部分组成
- 请求行:包含http方法,请求地址, http协议以及版本
- 请求头/响应头:就是一些key:value来告诉服务端我要哪些内容,要注意什么类型等,请求头/响应头每一个字段详解 (opens new window)
- 空行:用来区分首部和实体,因为请求头都是key:value的格式,当解析遇到空行时,服务端就知道下一个不再是请求头部分,就该当做请求体来解析了。
- 请求体:请求的参数
- 响应体:服务端返回的数据
# HTTP 请求方法 (9种)
HTTP1.0: GET
、POST
、HEAD
HTTP1.1:PUT
、PATCH
、DELETE
、OPTIONS
、TRACE
、CONNECT
| 方法 | 描述 | | --- |: --- 😐 | GET | 获取资源 | | POST | 传输资源,通常会造成服务器资源的修改 | | HEAD | 获得报文首部 | | PUT | 更新资源 | | PATCH | 对PUT的补充,对已知资源部分更新 | | DELETE | 删除资源 | | OPTIONS | 列出请求资源支持的请求方法,用来跨域请求 | | TRACE | 追踪请求/响应路径,用于测试或诊断 | | CONNECT | 将连接改为管道方式用于代理服务器(隧道代理) |
# GET 和 POST 的区别
GET
在浏览器回退时是无害的,而POST
会再次发起请求GET
请求会被浏览器主动缓存,而POST
不会,除非手动设置GET
请求参数挥着保留在浏览器历史记录里, 而POST
中的参数不会被保留GET
请求在URL
中传递的参数有长度限制(浏览器限制大小不同),而POST
没有限制GET
参数通过URL
传递,POST
放在Request body
中GET
产生的URL地址可以被收藏,而POST
不可以GET
没有POST
安全,因为GET
请求参数直接暴露在URL
上, 所以不能用来传递敏感信息GET
请求只能进行URL
编码, 而POST
支持多种编码方式- 对参数的数据类型,
GET
只接受ASCII
字符,而POST
没有限制 GET
产生一个 TCP 数据包,POST
产生两个数据包(Firefox只发一次)。GET 浏览器把 http header 和 data 一起发出去,响应成功200,POST先发送 header,响应100 continue, 再发送data,响应成功200
# 常见 HTTP 状态码
1xx:提示信息————表示请求已接收,继续处理
2xx:成功————表示请求已被成功接收
3xx:重定向————表示要完成请求必须进行进一步操作
4xx:客户端错误————表示请求有语法错误或请求无法实现
5xx:服务端错误————表示服务器未能实现合法的请求
状态码 | 描述 |
---|---|
200 | 请求成功 |
206 | 已完成指定范围的请求,场景如video,audio播放文件较大,文件分片时 |
301 | 永久重定向 |
302 | 临时重定向 |
304 | 请求资源未修改,可以使用缓存的资源,不用在服务器取 |
400 | 请求有语法错误 |
401 | 没有权限访问 |
403 | 服务器拒绝执行请求,场景如不允许直接访问,只能通过服务器访问时 |
404 | 请求资源不存在 |
500 | 服务器内部错误,无法完成请求 |
503 | 请求未完成,因服务器过载,死机或维护等 |
# HTTP 和 HTTPS 的区别
- HTTP 是
明文传输
,不安全的, HTTPS 是加密传输
, 安全的多 - HTTP 标准端口是
80
, HTTPS 标准端口是443
- HTTP 不用认证证书
免费
, HTTPS 需要认证证书要钱
连接方式不同
, HTTP 三次握手, HTTPS中TLS1.2版本7次,TLS1.3版本6次- HTTP 在 OSI 网络模型中是在
应用层
, 而 HTTPS 的TLS是在传输层
- HTTP 是
无状态
的, HTTPS 是有状态
的
# HTTPS优缺点
优点:
- 内容加密,中间无法查看原始内容
- 身份认证,保证用户访问正确。如访问百度,即使DNS被劫持到第三方站点,也会提醒用户没有访问百度服务,可能被劫持
- 数据完整性,防止内容被第三方冒充或篡改
- 虽然不是绝对安全,但是现行架构下最安全的解决文案了,大大增加了中间人的攻击成本
缺点:
- 要钱,功能越强大的证书费用越贵
- 证书需要绑定IP,不能在同一个IP上绑定多个域名
- https双方加解密,耗费更多服务器资源
- https 握手更耗时,降低一定用户访问速度(优化好就不是缺点了)