tcp握手

tcp握手

tcp是面向连接的.可靠地.基于字节流的传输层通讯协议.


backlog其实是一个连接队列,backlog大小包括半连接状态和全连接状态两种队列大小。

半连接状态为:服务器处于Listen状态时收到客户端SYN报文时放入半连接队列中,即SYN queue。

全连接状态为:TCP的连接状态从服务器(SYN+ACK)响应客户端后,到客户端的ACK报文到达服务器之前,则一直保留在半连接状态中;当服务器接收到客户端的ACK报文后,该条目将从半连接队列搬到全连接队列尾部,即 accept queue。

分为两个backlog来分别限制半连接(SYN_RCVD状态)队列大小和全连接(ESTABLISHED状态)队列大小。

SYN queue 队列长度由 /proc/sys/net/ipv4/tcp_max_syn_backlog 指定,默认为2048。

SYN queue 配置信息


Accept queue 队列长度由 /proc/sys/net/core/somaxconn 和使用listen函数时传入的参数,二者取最小值。默认为128。
在配置文件 /proc/sys/net/core/somaxconn 中直接修改,或者在 /etc/sysctl.conf 中配置 net.core.somaxconn = 128 。

只有SWOOLE_BASE模式才有backlog情况.

还要设置tcp_abort_on_overflow=0.设置0后会自动丢弃包.


当 tcp 建立连接的 3 路握手完成后,将连接置入 ESTABLISHED 状态并交付给应用程序的 backlog 队列时,会检查 backlog 队列是否已满。若已满,通常行为是将连接还原至 SYN_ACK 状态,以造成 3 路握手最后的 ACK 包意外丢失假象 —— 这样在客户端等待超时后可重发 ACK —— 以再次尝试进入 ESTABLISHED 状态 —— 作为一种修复/重试机制。如果启用 tcp_abort_on_overflow 则在检查到 backlog 队列已满时,直接发 RST 包给客户端终止此连接 —— 此时客户端程序会收到 104 Connection reset by peer 错误。

tcp关闭


短链接缺点

多余传输(多次握手,挥手)
TCP启动慢(总是进行握手链接,然后慢慢的传输(速度逐渐加快))
握手阶段丢包问题(重传的时间.)  

fpm下除了pconnect连接之外都是短连接.单例模式也是短链接.


长连接失效

重连或者心跳检测.最好是心跳检测.
swoole的心跳检测要用客户端配置,就是客户端每过一段时间,发送一个包.这样也不够灵活.
所以自己自定义协议,发送和回复包