接入手机wifi连接拒绝接入大于backlog的值会怎样

4971人阅读
MFC(139)
原文地址:
平台:xp sp3+vc6。
测试方法:
retval = function(....)
if(retval == SOCKET_ERROR)
r = WSAGetLastError();
各种情况下的返回值由retval取得。
错误号由r取得。
错误查询使用vc6自带的tool:“Error Lookup”
SOCKET socket(int,int,int);
》》af,通常为AF_INET
使用AF_ISO等其他地址族标识,而非AF_INET。
返回:-1。
错误:10047(使用了与请求的协议不兼容的地址)
》》type,通常为SOCK_STREAM或SOCK_DGRAM
头文件中定义的只有如下几种标准类型:
#define SOCK_STREAM 1 /* stream socket */
#define SOCK_DGRAM 2 /* datagram socket */
#define SOCK_RAW 3 /* raw-protocol interface */
#define SOCK_RDM 4 /* reliably-delivered message */
#define SOCK_SEQPACKET 5 /* sequenced packet stream */
使用非如上定义的类型。
返回:-1。
错误:10044(在这个地址家族中不存在对指定的插槽类型的支持)
》》protocol,通常为0
type = SOCK_STREAM,protocol = 6
type = SOCK_STREAM,protocol = 7
错误号:10043(请求的协议还没有在系统中配置,或者没有它存在的迹象)
type = SOCK_DGRAM,protocol = 17
type = SOCK_DGRAM,protocol = 19
错误号:10043(请求的协议还没有在系统中配置,或者没有它存在的迹象)
Socket暂时只支持AF_INET协议族。
对非标准的套接字类型不支持。
协议号参数可以为0,则使用与套接字类型相应的协议号;
否则,协议号参数必须与相应的套接字类型相同。
int bind(SOCKET,const
struct sockaddr FAR*,int);
在没有用socket申请资源的套接字上操作。
错误号:10038(在一个非套接字上尝试了一个操作)
》》name,通常使用AF_INET地址族、INADDR_ANY(0)地址
a、在local结构中,sin_family成员赋值为AF_OSI,
错误码:10047(使用了与请求的协议不兼容的地址)
b、在local结构中,sin_addr成员赋值为本计算机的IP地址,
c、在local结构中,sin_addr成员赋值为非本计算机的IP地址,如同小组的另一个同学的IP地址;
错误码:10049( 在其上下文中,该请求的地址无效)
d、在local结构中,sin_port成员赋值为135;
错误码:10048(通常每个套接字地址(协议/网络地址/端口)只允许使用一次)
》》namelen,通常为name所指的结构的大小,如sizeof(SOCKADDR_IN)
namelen = 10
错误码:10014(系统检测到在一个调用中尝试使用指针参数时的无效指针地址)
namelen = 16
namelen = 40
可以bind本机拥有的地址(或INADDR_ANY),非本机拥有的地址出错。
bind已经被占用的端口值会出错。
len参数要大于等于地址结构实际上所占的长度。
因为本机可以有多个IP,所以需要有方法指出从哪个实体接收数据。
当然,提供一种表达“从所有实体接收”的方法是必要的。
在头文件中INADDR_ANY被明确定义为0。
关于bind已占用的端口。
是指端口被bind,并且上层还是活的。(不设置复用)
处于TIME-WAIT状态的端口表面上是被占用,
实际上是可以bind成功的,但connect会失败。
详见关于,第六条。
int listen(SOCKET,int);
使用尚未半相关的套接字。(未成功bind的)
错误号:10022(提供了一个无效的参数)
》》backlog
纯引用一段:(无出处)
“windows套接字实现中最多只允许服务器同时监听5个套接字。
使用参数0,则系统将把该参数改为1,而使用超过5的值,系统将自动把该参数改为5。”
设置参数值为0,有 1 个客户机可同时与服务器连接
(在vista下有时有2个可以连接,有时有3个可以连接,-_0//)
设置参数值为1,有 1 个客户机可同时与服务器连接
设置参数值为10,有 10 个客户机可同时与服务器连接
第一个参数的套接字必须是成功bind过后的。
监听个数为0的话,会自动设置为1。
最大监听个数在XP SP3下可以超过5。
如何获得实际的backlog值?
MSDN: There is no standard provision to obtain the actual backlog value.
如何结束套接字的监听状态?
首先,close掉是可以的。如果不close呢?
最初猜想backlog为0,-1等特殊值可以达到此效果,结果失败。
SOCKET accept(SOCKET,struct
sockaddr FAR*,int
在没有listen的套接字上面。
错误号:10022(提供了一个无效的参数)
》》addr,输出参数,一般不填
单机测试,填上本机的IP和某个端口号。
结果:无法限制所接收的地址,执行完后addr中存放实际的地址。
》》addrlen
主套接字必须处于监听状态。
在地址字段填上任何值不能限制接受的连接。
len参数要求所携带的值大于等于16。(AF_INET地址结构的长度)
int recv(SOCKET,char
FAR*,int,int);
对于服务器,一般是ns = accept(s , &addr , &len)
》》s,一般是用上面accept正常返回的值
在没有accept的从套接字上操作。(上面的ns)
错误号:10038(在一个非套接字上尝试了一个操作)
在主套接字上操作。(上面的s)
错误号:10057(由于套接字没有连接并且
(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,
发送或接收数据的请求没有被接受。 )
》》buf,要求指向一个有效的缓冲区
如果指向的无效的内存区域
错误号:10014(系统检测到在一个调用中尝试使用指针参数时的无效指针地址)
》》len,发送的字节数
len过长可能造成缓冲区溢出。
这个属于编程中的普遍考虑问题,不是socket函数特有。
》》flags,一般用0
设置MSG_PEEK标志后,接收但不移除数据。
(再次接收可得到相同的数据)
对服务器来说,必须传递成功accept之后返回的套接字。
缓冲区指针所指位置必须有效。
缓冲区长度参数不可超过实际准备的缓冲区长度。
MSG_PEEK标志在接收的时候将保留数据。
int send(SOCKET,const
char FAR*,int,int);
》》s,同recv
在没有accept的从套接字上操作。(上面的ns)
错误号:10038(在一个非套接字上尝试了一个操作)
在主套接字上操作。(上面的s)
错误号:10057(由于套接字没有连接并且
(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,
发送或接收数据的请求没有被接受。 )
必须指向有效缓冲区,同recv
必须和要发送的数据长度一致。
除flag可选项不同外,和recv一致。
7.closesocket
int closesocket(SOCKET);
在申请套接字资源(调用socket)之前closesocket
错误号:10038(在一个非套接字上尝试了一个操作)
再已经closesocket的套接字上closesocket
错误号:10038(在一个非套接字上尝试了一个操作)
s必须是有效打开的套接字。
不得重复关闭。
int connect(SOCKET,const
struct sockaddr FAR*,int);
》》没有对端响应的情况
在没有运行服务器的情况下,connect是否会一直阻塞?
结果:等待一定时间后返回错误。
错误码:10061(由于目标机器积极拒绝,无法连接)
没有使用过bind的套接字。
成功连接。
产生隐式绑定,。
使用一些特殊的地址来测试。
a、 使用远端点IP地址为INADDR_ANY测试。
错误号:10049(在其上下文中,该请求的地址无效)
b、 使用远端点IP地址为10.1.1.255广播地址。
错误号:10060(由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败)
》》namelen
同bind等需要传递地址结构长度的函数
服务器必须启动listen。
可以不建立本地半相关,则进行隐式绑定。
客户不可以与INADDR_ANY主动相连,立即返回报错。
客户不可以与广播地址连接,会等待很久,返回失败。
1两种错误不同。
其中10061解释为目标机器积极拒绝,返回错误很快(秒级)。
10060的情况,返回错误需要很长时间(几十秒级)。
此处值得深入研究,两种情况下的抓包应该不一样。
9.recvfrom
int recvfrom(SOCKET,char
FAR*,int,int,struct
sockaddr FAR*,int
》》缺少半相关
在没有bind的套接字上面,直接recvfrom。
错误号:10022(提供了一个无效的参数)
》》填写from结构
向其中填入非对端使用的地址或端口。
正常接收,并且from内置对端地址信息。
必须先进行本地半相关,指定端口,才能够接收。
无法通过recvfrom的地址结构限制接收的地址和端口。
int sendto(SOCKET,const
char FAR*,int,int,const
struct sockaddr FAR*,int);
》》缺少半相关
在没有bind的套接字上面,直接sendto。
成功。返回发送的数据个数。
》》不存在的对端实体
sendto到一个不存在的实体(to结构)
返回:发送的字符数
错误号:无
紧接着调用recvfrom
结果:没有阻塞,直接返回
错误号:10054 (远程主机强迫关闭了一个现有的连接。)
可以在未本地半相关的情况下发送数据。
由系统随机选择端口。
可以向不存在的远端点发送数据,
本地仍然报告发送的字节数(不管有没有人接收)。
一般情况下,没有数据的时候recvfrom会阻塞。
但是当给不存在的对端发送过数据后,会收到错误报告,
紧接着的一次recvfrom会立即返回失败。(后面的仍然阻塞)
SOCK_DGRAM类型的服务,
无法为用户确保数据的正常交付。
但是通过recvfrom返回的错误,
可以对发送情况作出一定的判断。
这也启示在使用SOCK_DGRAM时候的编程框架要考虑下,
当recvfrom错误的时候,判断一下错误号,再进一步处理。
猜测当对端没有bind的时候,使用icmp的端口不可达通知。
需要进一步验证。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:175258次
积分:3289
积分:3289
排名:第6898名
原创:156篇
评论:19条
(1)(1)(5)(10)(1)(1)(3)(62)(7)(11)(60)(1)(2)/proc/sys/net目录
  所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),例如下面这些重要的参数:
参数(路径+文件)
默认值
优化值
/proc/sys/net/core/rmem_default
默认的TCP数据接收窗口大小(字节)。
/proc/sys/net/core/rmem_max
最大的TCP数据接收窗口(字节)。
/proc/sys/net/core/wmem_default
默认的TCP数据发送窗口大小(字节)。
/proc/sys/net/core/wmem_max
最大的TCP数据发送窗口(字节)。
/proc/sys/net/core/netdev_max_backlog
在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
/proc/sys/net/core/somaxconn
定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。
/proc/sys/net/core/optmem_max
表示每个套接字所允许的最大缓冲区的大小。
/proc/sys/net/ipv4/tcp_mem
确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(注意,其单位是内存页而不是字节)。
/proc/sys/net/ipv4/tcp_rmem
为自动调优定义socket使用的内存。第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)。
/proc/sys/net/ipv4/tcp_wmem
为自动调优定义socket使用的内存。第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)。
/proc/sys/net/ipv4/tcp_keepalive_time
TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。
/proc/sys/net/ipv4/tcp_keepalive_intvl
探测消息未获得响应时,重发该消息的间隔时间(秒)。
/proc/sys/net/ipv4/tcp_keepalive_probes
在认定TCP连接失效之前,最多发送多少个keepalive探测消息。
/proc/sys/net/ipv4/tcp_sack
启用有选择的应答(1表示启用),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对CPU的占用。
/proc/sys/net/ipv4/tcp_fack
启用转发应答,可以进行有选择应答(SACK)从而减少拥塞情况的发生,这个选项也应该启用。
/proc/sys/net/ipv4/tcp_timestamps
TCP时间戳(会在TCP包头增加12个字节),以一种比重发超时更精确的方法(参考RFC 1323)来启用对RTT 的计算,为实现更好的性能应该启用这个选项。
/proc/sys/net/ipv4/tcp_window_scaling
启用RFC 1323定义的window scaling,要支持超过64KB的TCP窗口,必须启用该值(1表示启用),TCP窗口最大至1GB,TCP连接双方都启用时才生效。
/proc/sys/net/ipv4/tcp_syncookies
表示是否打开TCP同步标签(syncookie),内核必须打开了CONFIG_SYN_COOKIES项进行编译,同步标签可以防止一个套接字在有过多试图连接到达时引起过载。
/proc/sys/net/ipv4/tcp_tw_reuse
表示是否允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接 。
/proc/sys/net/ipv4/tcp_tw_recycle
能够更快地回收TIME-WAIT套接字。
/proc/sys/net/ipv4/tcp_fin_timeout
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。
/proc/sys/net/ipv4/ip_local_port_range
表示TCP/UDP协议允许使用的本地端口号
/proc/sys/net/ipv4/tcp_max_syn_backlog
对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器经常出现过载,可以尝试增加这个数字。
/proc/sys/net/ipv4/tcp_low_latency
允许TCP/IP栈适应在高吞吐量情况下低延时的情况,这个选项应该禁用。
/proc/sys/net/ipv4/tcp_westwood
启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化,对于WAN 通信来说应该启用这个选项。
/proc/sys/net/ipv4/tcp_bic
为快速长距离网络启用Binary Increase Congestion,这样可以更好地利用以GB速度进行操作的链接,对于WAN通信应该启用这个选项。
/etc/sysctl.conf文件
  /etc/sysctl.conf是一个允许你改变正在运行中的Linux系统的接口。它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,可用来控制Linux网络配置,由于/proc/sys/net目录内容的临时性,建议把TCPIP参数的修改添加到/etc/sysctl.conf文件, 然后保存文件,使用命令“/sbin/sysctl –p”使之立即生效。具体修改方案参照上文:
net.core.rmem_default = 256960
net.core.rmem_max = 513920
net.core.wmem_default = 256960
net.core.wmem_max = 513920
net.core.netdev_max_backlog = 2000
net.core.somaxconn = 2048
net.core.optmem_max = 81920
net.ipv4.tcp_mem =
net.ipv4.tcp_rmem = & 4088000
net.ipv4.tcp_wmem = & 4088000
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range =
net.ipv4.tcp_max_syn_backlog = 2048
& &可调优的内核变量存在两种主要接口:sysctl命令和/proc文件系统,proc中与进程无关的所有信息都被移植到sysfs中。IPV4协议栈的sysctl参数主要是sysctl.net.core、sysctl.net.ipv4,对应的/proc文件系统是/proc/sys/net/ipv4和/proc/sys/net/core。只有内核在编译时包含了特定的属性,该参数才会出现在内核中。
& & 对于内核参数应该谨慎调节,这些参数通常会影响到系统的整体性能。内核在启动时会根据系统的资源情况来初始化特定的变量,这种初始化的调节一般会满足通常的性能需求。
& & 应用程序通过socket系统调用和远程主机进行通讯,每一个socket都有一个读写缓冲区。读缓冲区保存了远程主机发送过来的数据,如果缓冲区已满,则数据会被丢弃,写缓冲期保存了要发送到远程主机的数据,如果写缓冲区已慢,则系统的应用程序在写入数据时会阻塞。可知,缓冲区是有大小的。
socket缓冲区默认大小:
/proc/sys/net/core/rmem_default & & 对应net.core.rmem_default
/proc/sys/net/core/wmem_default & & 对应net.core.wmem_default
& & 上面是各种类型socket的默认读写缓冲区大小,然而对于特定类型的socket则可以设置独立的值覆盖默认值大小。例如tcp类型的socket就可以用/proc/sys/net/ipv4/tcp_rmem和tcp_wmem来覆盖。
socket缓冲区最大值:
/proc/sys/net/core/rmem_max & & & &对应net.core.rmem_max
/proc/sys/net/core/wmem_max & & & &对应net.core.wmem_max
/proc/sys/net/core/netdev_max_backlog & &对应 net.core.netdev_max_backlog
& & 该参数定义了当接口收到包的速率大于内核处理包的速率时,设备的输入队列中的最大报文数。
/proc/sys/net/core/somaxconn & & & &对应 net.core.somaxconn
& & 通过listen系统调用可以指定的最大accept队列backlog,当排队的请求连接大于该值时,后续进来的请求连接会被丢弃。
/proc/sys/net/core/optmem_max & & & & &对应 net.core.optmem_max
& & 每个socket的副缓冲区大小。
TCP/IPV4内核参数:
& & 在创建socket的时候会指定socke协议和地址类型。TCP socket缓冲区大小是他自己控制而不是由core内核缓冲区控制。
/proc/sys/net/ipv4/tcp_rmem & & 对应net.ipv4.tcp_rmem
/proc/sys/net/ipv4/tcp_wmem & & 对应net.ipv4.tcp_wmem
& & 以上是TCP socket的读写缓冲区的设置,每一项里面都有三个值,第一个值是缓冲区最小值,中间值是缓冲区的默认值,最后一个是缓冲区的最大值,虽然缓冲区的值不受core缓冲区的值的限制,但是缓冲区的最大值仍旧受限于core的最大值。
/proc/sys/net/ipv4/tcp_mem &
& & 该内核参数也是包括三个值,用来定义内存管理的范围,第一个值的意思是当page数低于该值时,TCP并不认为他为内存压力,第二个值是进入内存的压力区域时所达到的页数,第三个值是所有TCP sockets所允许使用的最大page数,超过该值后,会丢弃后续报文。page是以页面为单位的,为系统中socket全局分配的内存容量。
socket的结构如下图:
/proc/sys/net/ipv4/tcp_window_scaling & & &对应net.ipv4.tcp_window_scaling
& & 管理TCP的窗口缩放特性,因为在tcp头部中声明接收缓冲区的长度为26位,因此窗口不能大于64K,如果大于64K,就要打开窗口缩放。
/proc/sys/net/ipv4/tcp_sack & &对应net.ipv4.tcp_sack
& & 管理TCP的选择性应答,允许接收端向发送端传递关于字节流中丢失的序列号,减少了段丢失时需要重传的段数目,当段丢失频繁时,sack是很有益的。
/proc/sys/net/ipv4/tcp_dsack & 对应net.ipv4.tcp_dsack
& & 是对sack的改进,能够检测不必要的重传。
/proc/sys/net/ipv4/tcp_fack & &对应net.ipv4.tcp_fack
& & 对sack协议加以完善,改进tcp的拥塞控制机制。
TCP的连接管理:
/proc/sys/net/ipv4/tcp_max_syn_backlog & &对应net.ipv4.tcp_max_syn_backlog
& & 每一个连接请求(SYN报文)都需要排队,直至本地服务器接收,该变量就是控制每个端口的 TCP SYN队列长度的。如果连接请求多余该值,则请求会被丢弃。
/proc/sys/net/ipv4/tcp_syn_retries & &对应net.ipv4.tcp_syn_retries
& & 控制内核向某个输入的SYN/ACK段重新发送相应的次数,低值可以更好的检测到远程主机的连接失败。可以修改为3
/proc/sys/net/ipv4/tcp_retries1 & &对应net.ipv4.tcp_retries1
& & 该变量设置放弃回应一个tcp连接请求前,需要进行多少次重试。
/proc/sys/net/ipv4/tcp_retries2 & &对应net.ipv4.tcp_retries2
& & 控制内核向已经建立连接的远程主机重新发送数据的次数,低值可以更早的检测到与远程主机失效的连接,因此服务器可以更快的释放该连接,可以修改为5
TCP连接的保持:
/proc/sys/net/ipv4/tcp_keepalive_time & & & &对应net.ipv4.tcp_keepalive_time
& & 如果在该参数指定的秒数内连接始终处于空闲状态,则内核向客户端发起对该主机的探测
/proc/sys/net/ipv4/tcp_keepalive_intvl & &对应net.ipv4.tcp_keepalive_intvl
& & 该参数以秒为单位,规定内核向远程主机发送探测指针的时间间隔
/proc/sys/net/ipv4/tcp_keepalive_probes & 对应net.ipv4.tcp_keepalive_probes
& & 该参数规定内核为了检测远程主机的存活而发送的探测指针的数量,如果探测指针的数量已经使用完毕仍旧没有得到客户端的响应,即断定客户端不可达,关闭与该客户端的连接,释放相关资源。
/proc/sys/net/ipv4/ip_local_port_range & 对应net.ipv4.ip_local_port_range
& & 规定了tcp/udp可用的本地端口的范围。
TCP连接的回收:
/proc/sys/net/ipv4/tcp_max_tw_buckets & & 对应net.ipv4.tcp_max_tw_buckets
& &该参数设置系统的TIME_WAIT的数量,如果超过默认值则会被立即清除。
/proc/sys/net/ipv4/tcp_tw_reuse & & & & & 对应net.ipv4.tcp_tw_reuse
& &该参数设置TIME_WAIT重用,可以让处于TIME_WAIT的连接用于新的tcp连接
/proc/sys/net/ipv4/tcp_tw_recycle & & & & 对应net.ipv4.tcp_tw_recycle
& &该参数设置tcp连接中TIME_WAIT的快速回收。
/proc/sys/net/ipv4/tcp_fin_timeout & & & 对应net.ipv4.tcp_fin_timeout
& &设置TIME_WAIT2进入CLOSED的等待时间。
/proc/sys/net/ipv4/route/max_size
& &内核所允许的最大路由数目。
/proc/sys/net/ipv4/ip_forward
& &接口间转发报文
/proc/sys/net/ipv4/ip_default_ttl
& &报文可以经过的最大跳数
虚拟内存参数:
/proc/sys/vm/
& &在linux kernel 2.6.25之前通过ulimit -n(setrlimit(RLIMIT_NOFILE))设置每个进程的最大打开文件句柄数不能超过NR_OPEN(),也就是100多w(除非重新编译内核),而在25之后,内核导出了一个sys接口可以修改这个最大值/proc/sys/fs/nr_open。shell里不能直接更改,是因为登录的时候pam已经从limits.conf中设置了上限,ulimit命令只能在低于上限的范围内发挥了。
Linux中查看socket状态:
cat /proc/net/sockstat #(这个是ipv4的)
sockets: used 137
TCP: inuse 49 orphan 0 tw 3272 alloc 52 mem 46
UDP: inuse 1 mem 0
RAW: inuse 0
FRAG: inuse 0 memory 0
sockets: used:已使用的所有协议套接字总量
TCP: inuse:正在使用(正在侦听)的TCP套接字数量。其值≤ netstat –lnt | grep ^tcp | wc –l
TCP: orphan:无主(不属于任何进程)的TCP连接数(无用、待销毁的TCP socket数)
TCP: tw:等待关闭的TCP连接数。其值等于netstat –ant | grep TIME_WAIT | wc –l
TCP:alloc(allocated):已分配(已建立、已申请到sk_buff)的TCP套接字数量。其值等于netstat –ant | grep ^tcp | wc –l
TCP:mem:套接字缓冲区使用量(单位不详。用scp实测,速度在4803.9kB/s时:其值=11,netstat –ant 中相应的22端口的Recv-Q=0,Send-Q≈400)
UDP:inuse:正在使用的UDP套接字数量
FRAG:使用的IP段数量
参考:http://www.mjmwired.net/kernel/Documentation/sysctl
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:29382次
积分:1527
积分:1527
排名:第18335名
原创:98篇
转载:215篇
(8)(8)(5)(12)(5)(4)(12)(22)(14)(5)(20)(24)(17)(11)(24)(40)(42)(7)(17)(3)(5)(3)(1)(4)博客访问: 127230
博文数量: 66
博客积分: 2697
博客等级: 少校
技术积分: 607
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
tcp_syn_retries :INTEGER默认值是5对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)tcp_synack_retries :INTEGER默认值是5对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据上面的tcp_syn_retries来决定这个值)tcp_keepalive_time :INTEGER默认值是7200(2小时)当keepalive打开的情况下,TCP发送keepalive消息的频率。(由于目前网络攻击等因素,造成了利用这个进行的攻击很频繁,曾经也有cu的朋友提到过,说如果2边建立了连接,然后不发送任何数据或者rst/fin消息,那么持续的时间是不是就是2小时,空连接攻击?tcp_keepalive_time就是预防此情形的.我个人在做nat服务的时候的修改值为1800秒)tcp_keepalive_probes:INTEGER默认值是9TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)tcp_keepalive_intvl:INTEGER默认值为75探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)tcp_retries1 :INTEGER默认值是3放弃回应一个TCP连接请求前﹐需要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 - 8分钟之间。(注意:这个值同时还决定进入的syn连接)tcp_retries2 :INTEGER默认值为15在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)tcp_orphan_retries :INTEGER默认值是7在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是7个﹐相当于 50秒 - 16分钟﹐视 RTO 而定。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源。另外参的考 tcp_max_orphans 。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为3)tcp_fin_timeout :INTEGER默认值是 60对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在2.2版本的内核中是 180 秒。您可以设置该值﹐但需要注意﹐如果您的机器为负载很重的web服务器﹐您可能要冒内存被大量无效数据报填满的风险﹐FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1 ﹐因为它们最多只吃 1.5K 的内存﹐但是它们存在时间更长。另外参考 tcp_max_orphans。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为30)tcp_max_tw_buckets :INTEGER默认值是180000系统在同时所处理的最大 timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要人为的降低这个限制﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。(事实上做NAT的时候最好可以适当地增加该值)tcp_tw_recycle :BOOLEAN默认值是0打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求﹐请不要随意修改这个值。(做NAT的时候,建议打开它)
tcp_tw_reuse:BOOLEAN默认值是0该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)tcp_max_orphans :INTEGER缺省值是8192系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)tcp_abort_on_overflow :BOOLEAN缺省值是0当守护进程太忙而不能接受新的连接,就象对方发送reset消息,默认值是false。这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复状态。只有在你确信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用。(对待已经满载的sendmail,apache这类服务的时候,这个可以很快让客户端终止连接,可以给予服务程序处理已有连接的缓冲机会,所以很多防火墙上推荐打开它)tcp_syncookies :BOOLEAN默认值是0只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。注意:该选项千万不能用于那些没有收到攻击的高负载服务器,如果在日志中出现synflood消息,但是调查发现没有收到synflood攻击,而是合法用户的连接负载过高的原因,你应该调整其它参数来提高服务器性能。参考:tcp_max_syn_backlogtcp_synack_retriestcp_abort_on_overflowsyncookie严重的违背TCP协议,不允许使用TCP扩展,可能对某些服务导致严重的性能影响(如SMTP转发)。(注意,该实现与BSD上面使用的tcp proxy一样,是违反了RFC中关于tcp连接的三次握手实现的,但是对于防御syn-flood的确很有用.)tcp_stdurg :BOOLEAN默认值为0使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的 BSD解释,因此如果您在 Linux 打开它﹐或会导致不能和它们正确沟通。
tcp_max_syn_backlog :INTEGER对于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目。对于超过 128Mb 内存的系统﹐默认值是 1024 ﹐低于 128Mb 的则为 128。如果服务器经常出现过载﹐可以尝试增加这个数字。警告﹗假如您将此值设为大于 1024﹐最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE ﹐以保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ﹐并且编进核心之内。(SYN Flood攻击利用TCP协议散布握手的缺陷,伪造虚假源IP地址发送大量TCP-SYN半打开连接到目标系统,最终导致目标系统Socket队列资源耗尽而无法接受新的连接。为了应付这种攻击,现代Unix系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完全连接应用(Connect()和Accept() ),是用另一个队列单独存放半打开连接。这种双队列处理方式和其他一些系统内核措施(例如Syn-Cookies/Caches)联合应用时,能够比较有效的缓解小规模的SYN Flood攻击(事实证明<1000p/s)加大SYN队列长度可以容纳更多等待连接的网络连接数,所以对Server来说可以考虑增大该值.)tcp_window_scaling :INTEGER缺省值为1该文件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力(RFC 1323)。(对普通地百M网络而言,关闭会降低开销,所以如果不是高速网络,可以考虑设置为0)tcp_timestamps :BOOLEAN缺省值为1Timestamps 用在其它一些东西中﹐可以防范那些伪造的 sequence 号码。一条1G的宽带线路或许会重遇到带 out-of-line数值的旧sequence 号码(假如它是由于上次产生的)。Timestamp 会让它知道这是个 '旧封包'。(该文件表示是否启用以一种比超时重发更精确的方法(RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。)tcp_sack :BOOLEAN缺省值为1使用 Selective ACK﹐它可以用来查找特定的遗失的数据报--- 因此有助于快速恢复状态。该文件表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段)。(对于广域网通信来说这个选项应该启用,但是这会增加对 CPU 的占用。)tcp_fack :BOOLEAN缺省值为1打开FACK拥塞避免和快速重传功能。(注意,当tcp_sack设置为0的时候,这个值即使设置为1也无效)tcp_dsack :BOOLEAN缺省值为1允许TCP发送"两个完全相同"的SACK。tcp_ecn :BOOLEAN缺省值为0打开TCP的直接拥塞通告功能。tcp_reordering :INTEGER默认值是3TCP流中重排序的数据报最大数量 。 (一般有看到推荐把这个数值略微调整大一些,比如5)tcp_retrans_collapse :BOOLEAN缺省值为1对于某些有bug的打印机提供针对其bug的兼容性。(一般不需要这个支持,可以关闭它)tcp_wmem(3个INTEGER变量): min, default, maxmin:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4096(4K)。default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默认值为16384(16K)。max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,"静态"选择参数SO_SNDBUF则不受该值影响。默认值为K)。(对于服务器而言,增加这个参数的值对于发送数据很有帮助,在我的网络环境中,修改为了 204800)tcp_rmem (3个INTEGER变量): min, default, maxmin:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲,默认值为8K。default:为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem_default 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win=0默认值情况下,TCP窗口大小为65535。默认值为87380max:用于TCP socket接收缓冲的内存最大值。该值不会影响 net.core.wmem_max,"静态"选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为87380*2 bytes。(可以看出,.max的设置最好是default的两倍,对于NAT来说主要该增加它,我的网络里为
204800)tcp_mem(3个INTEGER变量):low, pressure, highlow:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。(理想情况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配 - 这第 2 个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072 * 300 / 4096)。 )pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值 (204800 * 300 / 4096)。 )high:允许所有tcp sockets用于排队缓冲数据报的页面量。(如果超过这个值,TCP 连接将被拒绝,这就是为什么不要令其过于保守 (512000 * 300 / 4096) 的原因了。 在这种情况下,提供的价值很大,它能处理很多连接,是所预期的 2.5 倍;或者使现有连接能够传输 2.5 倍的数据。 我的网络里为000 732000)一般情况下这些值是在系统启动时根据系统内存数量计算得到的。tcp_app_win : INTEGER默认值是31保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。tcp_adv_win_scale : INTEGER默认值为2计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。
tcp_rfc1337 :BOOLEAN缺省值为0这个开关可以启动对于在RFC1337中描述的"tcp 的time-wait暗杀危机"问题的修复。启用后,内核将丢弃那些发往time-wait状态TCP套接字的RST 包.
tcp_low_latency : BOOLEAN缺省值为0允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况;这个选项一般情形是的禁用。(但在构建Beowulf 集群的时候,打开它很有帮助)
tcp_westwood :BOOLEAN缺省值为0启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化;对于 WAN 通信来说应该启用这个选项。
tcp_bic :BOOLEAN缺省值为0为快速长距离网络启用 Binary Increase Congestion;这样可以更好地利用以 GB 速度进行操作的链接;对于 WAN 通信应该启用这个选项。
阅读(978) | 评论(2) | 转发(3) |
相关热门文章
给主人留下些什么吧!~~
jjg6256308: 这些参数值 在那个设置呢.....使用sysctl命令,“sysctl -n 参数”可以查看参数的当前值,“sysctl -w 参数=value“表示将参数的值设为value
这些参数值 在那个设置呢
请登录后评论。}

我要回帖

更多关于 大于22采用机械连接 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信