TCP握手常见问题
1,连接拒绝端口
连接一个不存在的端口,被TCP拒接(rst)
2,Operation now in progress
丢包,错误IP,backlog满&阻塞
tcp_abort_on_overflow=0
设置:/opt/sys/net/ipv4/tcp_obort_on_overflow
0:的情况会不处理新的连接,让客户端超时连接不上
1:回一个rst,即重置这个连接,客户端recv的错误:Connection reset by peer
3,如何查看backlog
min(maxconn,backlog)
查看blocklog大小:ss -lt
查看block是否满:
netstat -s |grep 'times the listen queue of a socket overflowed'
netstat -s|grep "drop"
SYN Flood
1,tcp_max_syn_backlog
适当调大半连接队列的值
2,tcp_synack_retries
可以把syn重试的次数设为0
3,tcp_syncookies
第二次握手的时候返回cookie,等第三次握手成功后才分配资源
挥手时常见的问题
通信4元组:客户端IP+客户端port 服务端IP+服务端port
1,time_wait(发生在主动打开一方)
1,2个msl等待的时间(1分钟)
2,Cannot assign requested address (端口用完,没有多余的端口分配),示例如下:
<?php
$redis = new Redis();
while(1)
{
var_dump($redis->connect("127.0.0.1",6379));
$redis->close();
}
3,Address already in use (端口被占用,由于打开太多端口,开启服务的时候端口被占用)
在未设置SO_REUSEADDR时,内核将一个处于TIME_WAIT状态的socketA仍然看成是一个绑定了指定
ip和port的有效socket,因此此时如果另外一个socketB试图绑定相的ip和port都将失败,
直到socketA被真正释放后,才能够绑定成功
解决方法:SO_REUSERADDR
4,系统设置
net.ipv4.tcp_timestamps=1(等待一分钟)
net.ipv4.tcp_tw_resue=1(端口复用)
net.ipv4.ip_local_port_range(调大端口范围)
net.ipv4.tcp_tw_recycle=1(这种方式不要开启,会马上复用端口)
5,time_wait问题(服务端连接泄露)
查看:netstat -anp|grep 80
1,swoole的SWOOLW_BASE模式不会出现这种问题,因为直接交给系统回收了
2,SWOOLE_PROCESS 模式会出现没有正确close(),close的时候出现阻塞,die(),抛异常