# HTTP 长短连接 & 长连接怎么知道数据传输结束?

# HTTP 长短连接

  • 短连接就是每次的建立数据连接 -> 数据传输 -> 关闭连接,适用于一些实时数据请求,配合轮询来进行新旧数据的更替
  • 长连接就是建立连接 -> 传输数据 -> 保持连接 -> 数据传输 -> 关闭连接,实质是保持这个通信管道,之后便可以对其进行复用,适用于消息推送,请求频繁的场景(直播)
  • 优点:避免了建立 / 释放连接的开销
  • http1.1 默认设置 Connection: keep-alive,表示支持持久连接

# keep-alive 的优点

  • 较少的 CPU 和内存的使用(同时打开的连接的减少了)
  • 允许请求和应答的 HTTP 管线化
  • 降低拥塞控制 (TCP 连接减少了)
  • 减少了后续请求的延迟(无需再进行握手)
  • 报告错误无需关闭 TCP 连接

# 长短连接长短轮循

轮询就是在一个循环周期内不断发起请求来得到数据的机制

  • 短轮循:在循环周期内,不断发起请求,每一次请求都立即返回结果,根据新旧数据对比决定是否使用这个结果
  • 长轮询:在请求的过程中,若是服务器端数据没有更新,就将这个连接挂起,直到服务器推送新的数据,再返回,然后再进入循环周期

# 长连接如何知道数据已经传输完了?

短连接在发送完所请求的数据后就关闭了连接,这样客户端会读取到 EOF(-1) 表示数据传输完了

  1. content-length
    实体长度和传输长度,当二者相等时表示数据传输完毕了
    只适合用于服务端清楚知道返回内容的大小,比如客户端请求一个静态页面、一张图片之类的

  2. Transfer-Encoding
    动态页面,服务器预先不知道内容大小,就使用 Transfer-Encoding: chunk 模式来传输数据。即一边产生数据,一遍发送给客户端
    把数据分成一块一块的发送,数据由一个个的 chunk 串联而成,用一个表明长度为 '0' 的 chunk 来表示结束

  3. 不含消息体的消息(1xx、304 等响应消息),以空行结束

  4. 服务器关闭连接,确定消息长度

Last Updated: 5/6/2020, 11:48:16 AM