Tcp握手问题分析

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(),抛异常
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值