- 内存资源占用
- 端口资源占用 , 假设端口被占满 , 将无法建立新的连接
# 该参数用于指定开放的端口资源 , 默认是32768-61000net.ipv4.ip_local_port_range
文章插图
TIME_WAIT优化TIME_WAIT的优化主要有以下几种方式 , 每种方式都有利有弊:
- 打开net.ipv4.tcp_tw_reuse和net.ipv4.tcp_timestamps选项
- net.ipv4.tcp_max_tw_buckets
- 应用程序使用SO_LINGER , 应用强制使用RST关闭
参数开启以后 , 可以复用处于TIME_WAIT的Socket给新的连接使用 。
tcp_tw_reuse的功能只能用于连接发起方 , 开启该参数以后 , 在调用connect函数时 , 内核会随机找一个time_wait超过1s的连接给新的连接复用 。
net.ipv4.tcp_timestamp默认开启 , 表示打开对TCP时间戳的支持 。时间戳字段存储在TCP头部的选项字段中 , 用于记录TCP发送方的时间戳和从对端接收到的最新时间戳 。
net.ipv4.tcp_max_tw_buckets
当系统中的TIME_WAIT的连接数超过该项的值时 , 系统那个会将后面TIME_WAIT的连接重置 , 不推荐使用 。
程序使用SO_LINGER
通过设置Sokcet的一些选项 , 来影响close方法的一些行为 。
如果SO_LINGER中的onoff为非0 , 并且linger为0 , 调用close方法以后会立即发送一个RST报文给对方 , TCP连接会直接跳过四次握手关闭 。也过于暴力不推荐 。
TCP保活机制在某个时间段内 , 如果TCP连接上无任何活动 , TCP保活机制开始生效 , 每隔一段时间就会发送一个探测报文 , 如果连续几个探测报文都没有收到响应 , 则认为TCP连接已死 , 系统内核会将错误信息通知给应用程序 。
# 用于控制保活时间 , 如果7200s内没有活动 , 则会启动保活机制net.ipv4.tcp_keepalive_time=7200# 保活机制每次检测间隔为75snet.ipv4.tcp_keepalive_intvl=75# 如果9次探测无响应 , 则认为对端不可答 , 中断本次连接net.ipv4.tcp_keepalive_probes=9
上述三个都是Linux中的默认值 , 也就是说Linux操作系统中至少经过2小时11分15秒才可以发现一个死亡连接 。Socket编程
public ServerSocket(int port, int backlog) throws IOException {this(port, backlog, null);}
JAVA中的ServerSokcet的初始化方法中有一个backlog参数 , 该参数在Linux2.2以前代表SYN队列大小 , 但是在Linux 2.2以后就是全连接队列的大小(accept队列的大小) 。- 半连接队列(SYN队列):接收SYN请求 , 处于SYN_RCVD状态的连接
- 全连接队列(Accept队列):完成三次握手处于ESTABLISHED状态的连接
文章插图
- Socket在调用connect方法时 , 会发送SYN包给服务端 , 服务端会接收到到SYN报文 , 并且服务端会半连接队列里初始化一个连接 。
- 服务端在处理完以后会发送ACK+SYN报文给客户端 , 客户端收到以后切实是就是connect方法的返回 , 同时客户端也需要对服务端的SYN报文进行应答 。
- 服务端收到ACK报文以后 , 半连接队里的连接会被转移到全连接队列中 , 此时accept方法会成功拿到连接并生成一个Socket(这个就是传输时的Socket , 不是监听Socket) 。
文章插图
- 客户端调用close方法 , 会发送一个FIN报文给服务端
- 服务端收到FIN报文时 , TCP协议栈会为该包插入一个文件结束符EOF到接收缓冲区 , 应用程序可以通过read方法获取到该文件结束符 。**EOF会被放在所有的数据之后 。**服务端会进入CLOSED_WAIT状态 。
- 服务端处理完所有的数据以后 , 会读取到EOF , 此时会调用close方法关闭Socket , 然后发送一个FIN包进入LAST_ACK状态 。
推荐阅读
- 一文弄懂Redis缓存一致性最佳实践参考案例
- 电脑残留垃圾清除:执行1行代码轻松搞定!无需杀毒软件
- 红茶的历史,遵义红茶的起源
- 一文看穿跨域BGP/MPLS IP VPN三方案
- 一文读懂Access数据库,从此不用Access数据库
- 手把手带你找到她电脑的wifi密码
- 一文详解Liquibase如何自动化数据库脚本部署
- 一文带你搞定TCP连接队列
- 微软|Win11中的祖传UI从Win9X流传至今!一文了解详情
- 一文看懂编程的本质,程序员有前途么?