# 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: GETPOSTHEAD

HTTP1.1:PUTPATCHDELETEOPTIONSTRACECONNECT

| 方法 | 描述 | | --- |: --- 😐 | 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 握手更耗时,降低一定用户访问速度(优化好就不是缺点了)