23 September 2017

HTTP 的 keep alive

假设 client 有三个请求,在没有 keep-alive 的情况下,client 要和 server 进行 三次 TCP 的握手。
如果有 keep-alive,那么 client 和 server 只需要第一次握手,之后就不需要在进行握手了

HTTP 的 pipeline

上一个请求还没响应,下一个请求就发出,这样并发地发出 N 个请求

TCP 里面的 keep alive

tcp 的 keep alive 选项区别于 http:
tcp 的 keep alive 规定了 server 每隔一段时间发送一个 报文给 client,client 回复一个 ack 来表示自身还存活着。

有两个作用

  1. 某些 nat 设备会有超时设置,当 client 和 server 没有操作了,会自动断开,有 keep alive 就不会存在这个问题
  2. 当 client 崩溃(断电等),这种情况区别于正常退出、服务器关机/重启。如果是正常退出,client 会发送一个 RST 给 server,如果是崩溃,client 不发送数据给 server,server 并不知道 client 关闭了。这个时候如果有 keep alive 的话,就可以知道了
➜ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200

➜ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75

➜ cat /proc/sys/net/ipv4/tcp_keepalive_probes
9

《TCP/IP 协议详解》