#### CLOSE_WAIT
> 四次挥手 前面2次
> 发起TCP连接关闭的一方称为client,被动关闭的一方称为server。
> 被动关闭的server收到FIN后,但未发出ACK的TCP状态就是CLOSE_WAIT
> 一般是由于server端代码的问题
#### TIME_WAIT
> 四次挥手 后面2次
> 当server端调用close()来关闭连接,给client发送PIN,client收到后给server回复ACK确认,同时client关闭读通道,进入TIME_WAIT状态
> server接收到client对自己的FIN的确认ACK,关闭写通道,TCP连接转化为CLOSE,也就是关闭连接
> client在TIME_WAIT状态下要等待最大数据段生存期的两倍,然后才进入CLOSE状态,TCP协议连接过程结束
为何要让TIME_WAIT保留2倍的时间
> 保证TCP协议的全双工连接能够可靠关闭
*如果client直接close,可能会因为网络问题,server端没有收到ack,然后server端又重发pin来关闭,但是client已经关闭了,会找不到连接,这就导致tcp协议不符合可靠连接的要求*
> 保证这次连接的重复数据段从网络中消息
*如果client直接close,然后又发起一个新连接,不能保证这个新链接端口与刚关闭的连接端口是不同的,如果前一次连接的数据仍然在网络中,这些数据在新连接之后才到达server,server就会认为这是新连接的数据,就出现混淆了。所以需要等待2倍的Maximum Segment Lifetime时间,确保本次连接的所有数据都从网络中消失。*
> Maximum Segment Lifetime :最大分段寿命,也就是一个TCP分段可以存在于互联网系统中的最大时间。
- 虚拟机
- JVM内存结构
- JVM调优手段
- java对象生命周期
- 垃圾回收判断对象死亡
- 垃圾回收算法
- 垃圾收集器
- JAVA基础知识
- java事件机制
- java反射机制
- jvm创建对象
- java异常
- finally语句一定会执行吗?
- 集合类介绍
- ArrayList
- LinkedList
- HashMap
- ConcurrentHashMap
- 多线程
- 为什么要使用线程池
- 线程死锁
- 死锁检测和解除
- jstack
- jconsole
- 死锁预防
- 常见线程池
- 线程池参数
- 工作队列介绍
- 拒绝策略
- ThreadLocal
- CAS
- ReentrantLock
- AQS
- CountDownLatch
- Spring
- spring中bean的作用域
- REDIS
- redis数据结构
- redis hash实现
- redis rehash与hashmap扩容的区别
- Redis使用场景
- Redis为何这么快
- redis连接数不足导致错误
- 分布式
- 分布式事务
- ACID
- CAP
- BASE
- 事务隔离性
- 一致性哈希算法
- 负载均衡算法
- Hystrix 信号量和线程池隔离的差异
- Spring Cloud
- eureka
- MYSQL
- mysql优化经验
- undo redo binlog
- web
- http协议
- http和https区别
- Cookie和session
- TCP三次握手、4次挥手
- TCP的time_wait和close_wait
- 算法问题
- 编辑距离算法
- MQ
- RabbitMq
- Kafka
- 安装教程
- Win ELK安装