关于time_wait状态的理解
TIME_WAIT状态之所以存在,是为了保证网络的可靠性
有以下原因:
1.为实现TCP全双工连接的可靠释放
当服务器先关闭连接,如果不在一定时间内维护一个这样的TIME_WAIT状态,那么当被动关闭的一方的FIN到达时,服务器的TCP传输层会用RST包响应对方,这样被对方认为是有错误发生,事实上这只是正常的关闭连接工程,并没有异常
2.为使过期的数据包在网络因过期而消失
在这条连接上,客户端发送了数据给服务器,但是在服务器没有收到数据的时候服务器就断开了连接
现在数据到了,服务器无法识别这是新连接还是上一条连接要传输的数据,一个处理不当就会导致诡异的情况发生
下面讲讲大量的TIME_WAIT产生需要的条件:
1.高并发
2.服务器主动关闭连接
如果服务器不主动关闭连接,那么TIME_WAIT就是客户端的事情了
问题1:如果服务器端确实存在大量的TIME_WAIT,那么会导致什么问题呢?
问题2: 首先先明确TIME_WAIT状态占用的到底是什么?
被占用的是一个五元组(协议,本地IP,本地端口,远程IP,远程端口)
对于Web服务器,协议是TCP,本地ip也只有一个,端口一般是80或者433或8080(固定的),只剩下远程IP和远程端口可用了,如果远程IP相同的话,就只有远程端口可用了,远程端口只有几万个,所以当同一客户端向服务器建立了大量连接的话,可用的五元组会耗尽导致问题
现在我们知道了大量的TIME_WAIT会占用大量的五元组
那么五元组什么时候会耗尽呢?
当客户端通过应用层的负载均衡代理到服务器导致进入服务器的ip地址只有几个的话,可能会导致五元组耗尽!
产生大量TIME_WAIT状态的解决办法:
解决方法1:服务器不主动关闭连接,那么这个问题就是客户端应该解决的了~(TIME_WAIT将不会产生)
解决方法2:增加客户端IP(一般客户端IP少都是通过应用层的负载均衡到达服务器的)(五元组将不会耗尽)
解决方法3:设置允许地址重用,这样每次bind的时候,如果五元组正在使用,bind就会把五元组抢过来(不安全
最新文章
- Toolbar设置回退箭头的方法
- Oracle--(Hierarchical Queries)层级查询
- AT91-PWM应用
- [iOS微博项目 - 2.5] - 封装授权和用户信息读写业务
- Linux Stu
- [Head First Python]6. 定制数据对象:打包代码与数据
- Java基础知识总结(二)
- 基于visual Studio2013解决C语言竞赛题之0808打印链表
- cookie是指web浏览器存储的少量数据,该数据会在每次请求一个相关的URL时自动传到服务器中(转)
- SVN &; Git (二)
- Spring bean 生命周期验证
- [转载]ACM搜索算法总结(总结)
- ZooKeeper全面介绍
- bzoj 4013: [HNOI2015]实验比较
- css中单位px,em,rem和vh/vw的理解
- C++函数式编程实现牛顿法
- Android初级教程:如何自定义一个状态选择器
- 程序员大牛 Jeff Atwood 的两本中文书
- 【Python】Talk Python To Me Podcast播客
- Mysql 5.7--ubuntu18.04 安装过程及遇到的问题
热门文章
- [golang]A modern, fast and scalable websocket framework with elegant API written in Go
- SSM ehcache 配置 mapper 文件出错
- LOJ#565. 「LibreOJ Round #10」mathematican 的二进制 分治,FFT,概率期望
- LeetCode之打家劫舍
- Bootstrap selectpicker 下拉框多选获取选中value和多选获取文本值
- <;英狼>; 团队作业2--王者光耀
- Open vSwitch系列实验(二):Open vSwitch的GRE隧道实验网络
- Assignment3:白盒测试以及测试框架简介
- 深度学习面试题12:LeNet(手写数字识别)
- Flutter Offstage、Visibility隐藏/可见