TCP常用优化参数


1. 端口监听

1.1 SO_REUSEADDR(端口重用)

  服务端主动断开连接以后,需要等 2 个 MSL 以后才最终释放这个连接,重启以后要绑定同一个端口,默认情况下,操作系统的实现都会阻止新的监听套接字绑定到这个端口上。

  TCP 连接由四元组唯一确定。{local-ip-address:local-port , foreign-ip-address:foreign-port}

  TCP 要求这样的四元组必须是唯一的,但大多数操作系统的实现要求更加严格,只要还有连接在使用这个本地端口,则本地端口不能被重用(bind 调用失败)

  启用 SO_REUSEADDR 套接字选项可以解除这个限制,默认情况下这个值都为 0,表示关闭。

  不一定是要处于 TIME_WAIT 才允许端口复用的,只是大多数情况下,主动关闭连接的服务端都会处于 TIME_WAIT,四次挥手中的第 3 步没能成功,服务端此时将处于 FIN_WAIT2 状态,此时也可以复用端口。

1.2 自连接问题

  当服务需要connect一个目标端口时,系统会随机分配一个临时端口号用于连接目标端口;

  如果此时分配的临时端口号和监听端口号一致,且客户端和服务端都在同一台机器,此时就发生自连接现象;

  解决方案:Linux TCP自连接问题

1.3 临时端口号范围

临时修改:

  vim /proc/sys/net/ipv4/ip_local_port_range

  32768  6099

  这两个数字表示临时端口号的岂止范围

永久修改:

  vim /etc/sysctl.conf

  net.ipv4.ip_local_port_range = 10240 65535 

2. 关闭连接

  关闭连接有两种方式

  1. FIN:发送完数据后关闭连接,并确保对端收到了该报文,主动关闭时将处于TIME_WAIT两个MSL

  2. RST:强制关闭连接,不做保证

2.1 SO_LINGER(快速关闭)

  SO_LINGER 启用时,调用close()后,操作系统开启一个定时器,在定时器期间内发送数据,定时时间到直接 RST 连接,主动关闭一方的TCP状态跳过TIMEWAIT,直接进入CLOSED。

  SO_LINGER 参数是一个 linger 结构体,代码如下:

struct linger {
    int l_onoff;    /* linger active */
    int l_linger;   /* how many seconds to linger for */
};

  第一个字段 l_onoff 用来表示是否启用 linger 特性,非 0 为启用,0 为禁用 ,linux 内核默认为禁用。这种情况下 close 函数立即返回,操作系统负责把缓冲队列中的数据全部发送至对端

  第二个参数 l_linger 在 l_onoff 为非 0 (即启用特性)时才会生效。

  • 如果 l_linger 的值为 0,那么调用 close,close 函数会立即返回,同时丢弃缓冲区内所有数据并立即发送 RST 包重置连接
  • 如果 l_linger 的值为非 0,那么此时 close 函数在阻塞直到 l_linger 时间超时或者数据发送完毕,发送队列在超时时间段内继续尝试发送,如果发送完成则皆大欢喜,超时则直接丢弃缓冲区内容 并 RST 掉连接。

2.2 tcp_tw_recycle(快速回收)

  默认情况下,主动关闭的一方最后发送一个确认关闭的ACK报文后处于TIME_WAIT状态,最多等待两个MSL若没有收到消息后,则关闭连接。

  通过减小等待的时间来提高端口利用率

  vim /etc/sysctl.conf

  net.ipv4.tw_recycle = 1  #启用快速回收

  net.ipv4.tcp_fin_timeout = 30  #MSL的值。默认60S

  sysctl -p /etc/sysctl.conf  #重新加载配置文件 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM