20200214

@ShiKaiWi

Plan

60min: UNP

Notes

poll

poll 函数签名如下:

#include <poll.h>
int poll(struct pollfd *fdarray, unsigned long fds, int timeout);
// 返回值为:若有就绪描述符,则为就绪描述符的数目,超时则为 0,出错为 -1

socket 选项

  • SO_KEEPALIVE: 设置了,默认会在 2 小时内在该套接字的任一方向上面都没有发生数据交换的情况下,会自动给对端发送 keep-alive probe segment,用于探测对方是否还存活(或者说是否还可达),因此比较常见的用法是服务端设置该选项,用于将 dead connection 发现。
  • SO_LINGER: 如果不启动这样的配置,那么 close 会立即返回无需等待对端的任何响应,也会立即丢弃缓冲区的残留数据,如果设置了 SO_LINGER,也就会指定一个等待时间,那么调用 close 会将缓冲区的数据发送给对端,并且等待对端的数据确认 ACK 和 FIN 的 ACK,才会返回 (前提是不超过设置的等待时间)。相较于 shutdown 调用,是可以一直做到等待到对端的 FIN segment,更加精细化。
  • SO_RCVBUF & SO_SNDBUF: 缓冲区大小一般是 MSS 的四倍大小,原因是 TCP 快速恢复算法的机制。需要知道的是 TCP 的缓冲区大小会用来缓存发送的数据,用于重发,而 UDP 的缓冲区大小没有这个浪费。
  • SO_REUSEADDR: 配置了之后允许同一台主机上面,可以使用不同的 IP 创建 socket。
  • SO_REUSEPORT: 此前以为使用这个选项可以消除 TIMEWAIT 状态,实际上并非如此,这个选项意味着,允许完全重复的 bind(在相同的端口和地址上面创建不同的 socket)。

More

  • poll 相对于 select 的优化是什么?
  • TCP 快速恢复算法的机制?为什么需要缓冲区大小为 MSS 的四倍大小。