计算机网络
auggie

HTTP 专题

  1. HTTP 报文
  2. GET 和 POST 方法
  3. Cookie 和 Session
  4. HTTP 缓存
  5. HTTPS

HTTP 报文

HTTP 请求报文

  • 请求行
    • 请求方法
    • HTTP 版本
    • URL
  • 首部行
    • Connection 表示要不要持续链接
    • Accept-language 表示希望收到的语言版本
  • 空行
  • 请求体:供 POST 方法使用

HTTP 响应报文

GET 和 POST 方法的区别

  • GET 方法把参数包含在 URL 中,POST 通过 Request Body 传递参数
  • GET 方法比 POST 方法更快
    • POST 请求包含更多的首部行
    • POST 先将请求头发送给服务器进行确认,然后才真正发送数据
  • GET 会将数据缓存起来

总结

  • POST 更安全,不会作为 URL 的一部分,不会被缓存。
  • POST 发送的数据更大,GET 有 URL 长度限制
  • POST 能发送跟多的数据类型,GET 只能发送 ASCII 字符
  • POST 比 GET 慢
  • POST 一般用于修改和写入数据,GET 一般用于搜索排序和筛选
  • Cookie
  • Session
  • Cookie 和 Session 的联系
  • Cookie 和 Session 的区别

问题:Web 站点希望能够识别用户,来对用户进行专门化服务,就生成一个唯一 ID,作为索引在数据库中产生表项。

服务器通过一个包含 Set-cookie 首部行的 HTTP 响应报文进行响应。

  • 如果没有设置 Cookie 失效日期,他们仅保存在浏览器会话期间
  • 大多数浏览器支持的 Cookie 最大存储的数据量是 4K,因此不用来保存大数据
  • Cookie 以明文的方式存储,并不安全
  • Cookie 是不跨域名的

Cookie 并不提供修改和删除

  • 如果想要修改,需要服务器在 HTTP 响应报文中返回一个同名的 Cookie
  • 如果想要删除,只需要返回一个同名的 Cookie,并发 maxAge 设置为 0

注意:返回同名 Cookie 的时候,需要除 maxAge,value 之外的全部信息都和原 Cookie 相同

Session

client 访问 server 的时候,server 将 client 信息记录在 server 上面,这就是 session。

用户和服务器建立连接的时候,服务器会为其分配一个 SessionId

Session 的生命周期

  • Session 在用户的第一次访问服务器的时候创建,只访问静态资源并不会创建 Session
  • server 会将长时间没有活动的 Session 从服务器内存中清除,此时 Session 便失效。Tomcat 的默认失效时间为 30 min
  • 计时从 Session 未被访问的时候开始算起

Session 需要通过 Cookie 实现,服务器要向 client 发送一个 JSESSIONID 的 Cookie,它的值就是该 Session 的 id,Session 依据此 Cookie 来识别是否为同一用户

  • 该 Cookie 是服务器自动生成的,maxAge 一般为 -1,也就是关闭浏览器就会失效。
  • 因此同一计算机的两个浏览器窗口访问服务器时会生成两个不同的 Session ,但是由子窗口会共享父窗口的 Cookie ,共享一个 Session
  • 存储位置
  • 安全性
  • 对服务器的影响
  • 数据大小:Cookie 保存的数据最多不超过 4k ,一般浏览器限制一个站点最多保存 20 个 Cookie

HTTP 缓存

一般只用于 GET 请求

img
HTTP 缓存流程图

HTTPS

  • 引入 CA 使用数字证书来保证公钥的合法性,避免了中间人攻击。
  • 使用非对称加密来约定对称加密要使用的 key
  • 信息传递过程使用对称加密来实现

HTTPS 的核心 SSL/TLS 协议的工作原理

  • 对称加密:如何约定密钥在计算机网络中存在问题,性能高很多
  • 非对称加密:可以使用公钥模拟用户发送信息,也存在问题

数字证书

解决:第三方仿照 server 给 client 发送自己的公钥,并且中间截获的问题

img
中间人攻击,server 根本看不懂密文的内容

为了公钥传输的信赖性问题,第三方机构应运而生——证书颁发机构(CA,Certificate Authority)。CA 默认是受信任的第三方。CA 会给各个服务器颁发证书,证书存储在服务器上,并附有 CA 的电子签名

  1. client 向 server 发送 HTTPS 请求时
  2. 获取目标服务器的证书,并验证合法性
  3. 证书内存在 server 的公钥

如何生成数字签名

  • CA 使用散列技术生成一个摘要,并使用 CA 的密钥对摘要进行加密,然后将证书发给 server
  • server 将证书发给 client 时,client 向 CA 获取加密摘要所用的公钥,并自己计算摘要,与 CA 解密出来的摘要进行比对。
  • 如果相同,则成功
image-20220313151431722
CA 数字签名的详细验证过程

总结:通过引入第三方机构 CA 对 server 的公钥进行验证。

image-20220313151635199
CA 的认证过程
  • HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。
  • HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。

HTTPS 的工作流程

  • client 向 server 发起 HTTPS 请求
  • server 将数字证书发送给 client
  • client 校正数字证书的合法性,如果不通过产生 HTTPS 警告信息
  • client 通过公钥对对称加密要使用的 key 进行加密,发送给客户端
  • server 通过密钥解密对称加密要使用的 key
  • client 和 server 进行对称加密传输

为什么不适用非对称加密?

  • 资源消耗远大于对称加密
image-20220314172756595

TCP

TCP 报文格式

  1. 序号 && 确认号 (32 位)

    TCP 的 ACK 并不是立即发出的,因为 TCP 会采取累计确认的方式,一旦延迟期间后面的数据包也来了,就可以直接发送最新的 ACK,提高效率

  2. 首部长度 (4 位)

    一个单位表示 4 字节,最长是 64 字节

  3. 窗口大小 (16 位)

    用于流量控制,设置 cwnd

  4. TCP 校验和 (16 位)

拥塞控制 & 流量控制

拥塞控制

通过拥塞窗口实现

TCP 维持一个 cwnd 和一个门限值

  • 慢开始
  • 拥塞避免
  • 快重传
  • 快恢复

流量控制

通过滑动窗口来实现

  • 发送方维持一个 rwnd,接收方可以通过 TCP 报文来控制 rwnd

拥塞控制和流量控制的区别

  • 流量控制解决的是发送方和接收方速率不匹配
  • 拥塞控制解决的是避免网络资源被耗尽的问题,全局性。

差错控制

通过 TCP 校验和实现,如果发现错误,则不发送 ACK,等待重传。

应用层可以使用更强力的手段,例如 CRC

TCP 粘包、拆包

发生的原因:

  • 要发送的数据大于或小于 TCP 发送缓冲区剩余空间大小
  • 待发送的数据大于 MSS

解决方式:

  • 给每个数据包添加包首部,包含数据包的长度
  • 在数据包之间设置边界,添加特殊字符等
  • 设置消息定长

TCP 三次握手和四次挥手

img

TCP 与 UDP 的区别

TCP UDP
面向连接,提供可靠交付 无连接,尽最大努力交付
面向字节流 面向报文
一对一 一对多、一对一、多对一、多对多
有拥塞控制、流量控制 首部开销小

TCP:FTP、HTTP、HTTPS、SSH、SMTP、Telnet

UDP:DNS、DHCP、TFTP