http://blog.csdn.net/guowake/article/details/6615728

Linux下高并发socket最大连接数所受的各种限制

http://stackoverflow.com/questions/651665/how-many-socket-connections-possible

How many socket connections possible?

http://www.cppblog.com/Solstice/archive/2011/06/02/147985.html

Muduo 网络编程示例之十:socks4a 代理服务器

http://www.cnblogs.com/Solstice/archive/2011/04/27/2029904.html

Muduo 网络编程示例之六:限制服务器的最大并发连接数

socket server file descriptors limit

TCP has a feature called "TIME_WAIT" that ensures connections are closed cleanly. It requires one end of the connection to stay listening for a while after the socket has been closed.

In a high-performance server, it's important that it's the clients who go into TIME_WAIT, not the server. Clients can afford to have a port open, whereas a busy server can rapidly run out of ports or have too many open FDs.

To achieve this, the server should never close the connection first -- it should always wait for the client to close it.

TIME_WAIT is a TCP state and doesn't consume file descriptors persay. However the sockets in TIME_WAIT will consume file descriptors. A socket is a file like just about everything else in unix. If this is Linux you can tune the expire time of sockets (how long they are in time wait) as well as enable socket recycling in /proc/sys/net/ipv4/.

Two items of particular interest are probably:

sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1

As always, test these beforehand if you can.

http://bbs.csdn.net/topics/290048302

用完成端口+AcceptEx+DisconnectEx+线程池+内存池写了一个http server, 
我用局域网的几台PC开300线程刷服务器,SOCKET由于过多的TIME_WAIT被耗尽,
然后服务器效率大大降低最后挂掉, 开50线程刷了2天没问题!

TIME_WAIT是TCP协议的一个必经状态,
网上说可以通过SO_LINGER选项让socket不经过TIME_WAIT状态,可是我试了试不行!
谁有解决TIME_WAIT问题的经验,分享一下,谢谢!

http://blog.csdn.net/Solstice/article/details/6527585

网络编程:优雅关闭socket/TIME_WAIT/CLOSE_WAIT/SoLinger

前言:经常检查Apache的连接数,同样会发现很多无用的Time_Wait连接。有人说这是正常的,是因为一个请求中途中断造成的;还有人说 微软的IE连接时产生的Time_wait会比用Firefox连接时多。个人认为有一定的Time_wait是正常的,

如果超过了连接数 的比例就不是很正常,所以还是找来方法解决一下。

检查net.ipv4.tcp_tw当前值,将当前的值更改为1分钟:
[root@aaa1 ~]# sysctl -a|grep  net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
[root@aaa1 ~]#

vi /etc/sysctl
增加或修改net.ipv4.tcp_tw值:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

使内核参数生效:
[root@aaa1 ~]# sysctl -p

[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse  = 1
net.ipv4.tcp_tw_recycle  = 1

设置这两个参数: reuse 是表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接; recyse 是加速TIME-WAIT sockets回收

用netstat再观察正常
这里解决问题的关键 是如何能够重复利用time_wait的值,我们可以设置时检查一下time和wait的值
#sysctl -a | grep time | grep wait
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

今天检查了一下基本一台服务器,发现TIME_WAIT高到3k多(正常1000-2000没有问题). TIME_WAIT本身并不会占用很大资源的,除非受到攻击.但太多服务器还是有可能挂掉.
TIME_WAIT 3699
CLOSE_WAIT 52
FIN_WAIT1 32
SYN_SENT 1
FIN_WAIT2 2
ESTABLISHED 17
SYN_RECV 45
CLOSING 6

根据《TCP/IP详解》 中的TCP的建立和终止中有关"TCP的终止"的讲解

TCP的终止通过双方的四次握手实现。发起终止的一方执行主动关闭,响应的另一方执行被动关闭。

1. 发起方更改状态为FIN_WAIT_1,关闭应用程序 进程,发出一个TCP的FIN段;
2. 接收方收到FIN段,返回一个带确认序号的ACK,同时向自己对应的进程发送一个文件 结束符EOF,同时更改状态为CLOSE_WAIT,发起方接到ACK后状态更改为FIN_WAIT_2;
3. 接收方关闭应用程序进程,更改状态为LAST_ACK,并向对方发出一个TCP的FIN段;
4. 发起方接到FIN后状态更改为TIME_WAIT,并发出这个FIN的ACK确认。ACK发送成功后(2MSL内)双方TCP状态变为CLOSED。

我们不难看出上面的显示的结果的意思。根据TCP协议,主动发起关闭的一方,会进入TIME_WAIT状态(TCP实现必须可靠地终止连接的两个方向(全双工关闭)),持续2*MSL(Max Segment Lifetime),缺省为240秒.

为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间?

TIME_WAIT 的等待时间为2MSL,即最大段生存时间.如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。第二个拥有相同相关五元组的连接出现(因为连接终止前发起的一方可能需要重发 ACK,所以停留在该状态的时间必须为MSL的2倍。),而第一个连接的重复报文到达,干扰了第二个连接。TCP实现必须防止某个连接的重复报文在连接终 止后出现,所以让TIME_WAIT态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被丢弃。建立第二个连接的时候,不 会混淆。

注:MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现都必须选择一个确定的MSL 值。RFC 1122建议是2分钟,但BSD传统实现采用了30秒。TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。

对apache的操作 
HTTP 协议1.1版规定default行为是Keep-Alive,也就是会重用TCP连接传输多个request/response.所以我打开http中的 keepalive On,发现TIME_WAIT就立刻少了下来.只有300的样子.总结一下.我认为有二个原因.

1.keepalive没有开,导致每次请求都要建立新的tcp连接,请求完成以后关闭,增加了很多time_wait的状态,没有重用,KeepAlive我认为它指的是保持连接活跃,类似于Mysql 的永久连接。如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。
2.然后keepalive在系统 中本身的值很高.默认空闲连接 7200 秒(2 小时)内没有活动.才会断开.

我们开启KeepAlive :

KeepAlive On
MaxKeepAliveRequests 120
KeepAliveTimeout 15

这样每个连接可以发送100次请求,超时时间为15秒(如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接)。

有关内核级别的keepalive和time_wait的优化调整

vi /etc/sysctl

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_fin_timeout = 30
net.core.netdev_max_backlog =8096

修改完记的使用sysctl -p 让它生效

以上参数的注解
/proc/sys/net/ipv4/tcp_tw_reuse
该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。

/proc/sys/net/ipv4/tcp_tw_recycle
recyse是加速TIME-WAIT sockets回收

对 tcp_tw_reuse和tcp_tw_recycle的修改,可能会出现.warning, got duplicate tcp line warning, got BOGUS tcp line.上面这二个参数指的是存在这两个完全一样的TCP连接,这会发生在一个连接被迅速的断开并且重新连接的情况,而且使用的端口和地址相同。但基本 上这样的事情不会发生,无论如何,使能上述设置会增加重现机会。这个提示不会有人和危害,而且也不会降低系统性能,目前正在进行工作

/proc/sys/net/ipv4/tcp_keepalive_time
表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时

/proc/sys/net/ipv4/tcp_fin_timeout   最佳值和BSD一样为30
fin_wait1状态是在发起端主动要求关闭tcp连接,并且主动发送fin以后,等待接收端回复ack时候的状态。对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。

/proc/sys/net/core/netdev_max_backlog
该文件指定了,在接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目

tcp tunnel proxy

http://www.partow.net/programming/tcpproxy/index.html
http://www.quietsche-entchen.de/cgi-bin/wiki.cgi/proxies/TcpProxy

http://tcpproxy.codeplex.com/

database proxy
http://code.google.com/p/amoeba/

转载于:https://www.cnblogs.com/2018/p/2976731.html

应用代理 socket TCP协议 的资料相关推荐

  1. Socket TCP协议解决粘包、半包问题的三种解决方案

    什么是粘包.半包问题:         粘包:例如服务端依次将两条消息发送给客户端,我们暂且简单的将这两条消息举例为"Hello"."Unity",而客户端一次 ...

  2. Android 使用Socket(TCP协议)实现监控(类似于及时通讯)服务器端使用Walkman

    最近的项目要实现一台平板控制其余平板的功能(类即时通讯),主要用tcp或者udp进行开发,因为要保证一台机的命令要"发到"其余的机器上,我采取的是数据接收安全的TCP.思路如下图: ...

  3. python socket TCP协议断网重连

    最近做了个基于树莓派(Linux系统)的客户端.客户端需要把温湿度数据传到服务器上,每次传输约300个传感器的数据,大约3000个字节,我选用了Python的socket模块,完成这个项目时,最大的阻 ...

  4. 简述tcp协议三报文握手过程_华为原理 | 传输层协议amp;交换转发原理

    Interface GigabitEthernet0/0/0 ip address 12.1.1.2 255.255.255.0 arp-proxy enable \\华为接口下默认没有开启代理ARP ...

  5. python使用socket实现协议TCP长连接框架

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 使用python实现协议中常见的TCP长连接框架." 分析多了协议就会发现,很多的应用,特别是游戏类和IM类应用,它们的协议会使用 ...

  6. 【转/TCP协议编程】 基于TCP的Socket 编程

    基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...

  7. Socket编程(C语言实现)——TCP协议(网络间通信AF_INET)的流式(SOCK_STREAM)+报式(SOCK_DGRAM)传输【多线程+循环监听】

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  8. 网络编程2_网络通讯协议, socket(tcp, udp)

    一. 网络通讯协议     互联网协议的功能: 定义计算机如何接入internet, 以及接入internet的计算机的通信标准     互联网协议按照功能的不同分为osi七层或tcp/ip五层    ...

  9. 网络编程 socket模块 tcp协议 udp协议

    网络基础相关知识 , socket模块 , tcp协议通信代码 , tcp和udp编码流程 网络基础相关知识(1) 架构 C / S 架构: client 客户端 和 server 服务器端 优势:能 ...

  10. Android中基于TCP协议的网络通信之使用Socket进行通信

    TCP协议被称为一种端到端的协议.这是因为它为两台计算机的连接起到了重要作用:当一台计算机需要与另一台计算机进行接连时,TCP协议会他们之间建立一个连接:用于发送和接收数据的虚拟链路. TCP协议负责 ...

最新文章

  1. 通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 – Part 2
  2. Kubernetes 落地案例|使用 Kubernetes 重新部署全球最大的教育公司
  3. C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象
  4. Json转换值类型字段为空字符串时报错问题
  5. 请解释Spring Bean 的生命周期?
  6. HDLBits答案(16)_Verilog有限状态机(3)
  7. 基于chrome内核的.NET开发资源
  8. Linux网络-数据包的接收流程(基于RTL8139网卡驱动程序)
  9. 【IDEA】Warning:scala: skipping Scala files without a Scala SDK in module(s) systemimport
  10. 集成微信支付的代码。兼容小程序,扫码,app,公众号。h5 支付 ,以及 服务商提现...
  11. c语言坐标打印佛祖,C语言输入平面上两个点的坐标(double类型),计算两个点之间的距离。看”详细“里哪里写错了谢谢...
  12. jdk1.8_API中文帮助文档
  13. 程序员的工资是不是太高了?真相让人心疼
  14. 如何查看所使用计算机的配置,电脑配置的三种查看方法 不用借助软件怎么查看电脑配置...
  15. 持续造风,快手为品牌、商家提供“保姆式”服务
  16. Ubuntu设置扁平化风格桌面
  17. 智慧高校共享单车管理系统
  18. pip安装GeoIP时报fatal error: GeoIP.h: No such file or directory
  19. php 转换带声调的字幕,PHP实现中文转拼音可选注音声调首字母大写
  20. 访问学者在中国和英国生活有哪些差异?

热门文章

  1. 区块链 以太坊 每个区块可以包含多少个交易
  2. 区块链 预言机 Oracle是什么 例子
  3. web访问linux创建目录权限设置,centos7下新建一个用户并限制访问目录
  4. java实现复原IP地址_LeetCode 力扣 93. 复原IP地址
  5. Unity实现动态资源加载的5种方式
  6. adminlte中datatable中自定义搜索和导出按钮
  7. IntelliJ IDEA上创建Maven Spring MVC项目
  8. TestLink 测试/测试用例使用
  9. ES6深入浅出-1 新版变量声明:let 和 const-2.视频 let和const
  10. Nginx + keepalived 实现高可用