NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
来源:互联网 发布:网络空间主权 编辑:程序博客网 时间:2024/06/10 05:28
现象:有某种上网方式的用户经常不能连接到服务器。
简单来说,tcp_tw_recycle 机制允许协议不需要真的等待2个最大段生存时间MSL 那么长,就可以关闭一个连接了,只需要等待2个数据包来回时间,这个相对很短,所以TIME_WAIT状态的连接就可以及时回收了,免得占用系统资源。但2*MSL改为了2*RTT, 那么问题很明显,可能出现数据包错乱,比如被动关闭一方的FIN迟迟没有到来,服务器这边会回收这个连接,然后之后的新连接可能就会复用了这个端口port信息,然后突然之间客户端的老的FIN到达了服务器,然后服务器以为这个FIN包对应的Port正好是刚刚建立的新连接的一个FIN包,于是服务器就把新连接给干掉了·····
也就是说,本身TCP协议规定了,主动关闭一方必须等待2*MSL 的时间,可能长达几分钟,但你现在改为2*RTT,明显短太多了,会出问题的。所以怎么办呢?
由于我们在/proc/sys/net/ipv4/tcp_tw_recycle设置后,会清除掉TCP的四元组信息,释放内存,所以没法进行端口判断了,但是IP还是可以的,所以退而求其次:比较这个IP的最新更新的时间戳,如果碰到一个很老的时间戳TSVal的数据包过来,那么服务器认为这应该是之前很老的数据包的重传,只能忽略它。因此实践中协议采取的策略是:60秒内同一个IP建立2个连接的话,后面一个SYN连接的时间戳必须大于之前的SYN里面的TSVal,否则服务器会认为这是一个老连接的数据包,忽略它。
从而导致客户端明明发送了SYN,服务端却偏偏就是不回复SYN-ACK。
类似的不少人碰到,就不多重复了。解决方法一般就是关闭/proc/sys/net/ipv4/tcp_tw_recycle 就OK了,不用这么激进的去回收TIME_WAIT。
注意这个状态只在主动关闭的一方才会出现,但是很多不明真相的同学总会喜欢不管如何,都设置这个参数,其实像web服务器这样的,开启了keepalive的服务器,是不需要去care这个状态的,因为一般都是客户端主动关闭连接,所以是客户端的责任区处理TIME_WAIT。
- [转]NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
- NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
- NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
- NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
- tcp_tw_recycle导致NAT网络TCP连接失败
- F5做了NAT出来的TCP包被服务器丢弃
- SYN cookies机制下连接的建立
- SYN cookies机制下连接的建立
- 公网服务器或客户端为 NAT 网络的服务器不要同时开启 tcp_tw_recycle 和 tcp_timestamps
- SYN(synchronous)是TCP/IP建立连接时使用的握手信号
- TCP连接建立系列 — 服务端接收SYN段
- TCP连接建立系列 — 客户端发送SYN段
- net.ipv4.tcp_tw_recycle 与 网络连接失败
- TCP三步握手建立连接(1)-----主动连接syn包发送
- TCP三步握手建立连接(2)-----被动连接方发送SYN/ACK
- vm下 nat网络连接 linux
- linux下的网络连接方式 NAT
- 和服务器建立TCP连接的工具
- MFC/基于对话框的MFC上位机串口通信(C++实现)简单例程
- 移动端媒体查询的一些尺寸参考
- 华为2016暑假实习机试题
- 一个女程序员想说的话
- 2016江苏省大学生程序设计大赛 JSCPC 总结
- NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
- Vim 匹配字符串出现次数
- MATLAB信号处理仿真-基带脉冲成形的数字滤波器
- 《剑指offer》-合并两个排序的链表
- 低版本XCode如何支持高版本iOS系统进行真机调试
- Qt路径问题
- ios设计模式
- hdu湫湫系列故事——减肥记I(完全背包)
- 常用的uboot的bootargs设置