linux中对socket的理解 socket高并发

1.socket是什么?
其实准确的来说,socket并不仅仅用于linux而已,它也应用于TCP/IP中。笼统的来说,socket就是指的“IP地址+端口号”。比如我有一个ssh服务器A,这时候我有两个终端通过ssh协议登陆到服务器A上面,那么这时候服务器上建立的socket连接数就是2个,那么这两个socket的连接状态就是establish。但是socket不仅仅应用与TCP/IP中,它有两个域,一个是internet domain,也就是一开始说的“IP地址+端口号”,通过网络来建立连接;而另外一个就是unix domain,而它也属于socket,则是两个进程共用一套文件系统以此通信,也就是主机内部线程之间的通信哦。
2.如何查看socket连接?
ss(socket statistics)命令可以获取socket连接信息,有点类似于netstat,但是它比netstat更强大,可以显示更详细的socket信息。它使用了tcp协议栈中的tcp_diag模块,能直接第一时间入手内核信息。
以下是ss命令的用法:
ss [参数]
如果不加任何参数,则ss会列出所有已经建立连接并不处于listen状态的socket连接
-s 显示socket概要统计,summary的意思
-n 以端口号显示socket连接
-p 以进程服务名称显示socket连接
-l 显示处在listen状态的socket连接
-t 只显示tcp的socket连接
-u 只显示udp的socket连接
-a 显示所有的socket连接,包括listen状态在内的socket连接
3.应用举例
查看socket的概览

[ning.liu@centos-linux-01 ~]$ ss -s
Total: 294 (kernel 0)
TCP:   8 (estab 2, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total     IP        IPv6
*      0         -         -        
RAW      1         0         1        
UDP      7         4         3        
TCP      8         5         3        
INET      16        9         7        
FRAG      0         0         0
这里着重介绍一下ss -s中的synrecv参数:这里的synrecv状态代表着tcp3次握手中的第二次握手,如果这里的数值较大,一般可以断定为syn攻击。
注意:netstat -anp|grep 'SYN_RECV'同样可以查看到处于synrecv状态的socket连接哦,只不过本讲只侧重于ss来讲的。
查看所有的tcp socket连接并暴露端口号

[ning.liu@centos-linux-01 ~]$ ss -ant
State       Recv-Q Send-Q                                 Local Address:Port                                                Peer Address:Port              
LISTEN      0      128                                                *:111                                                            *:*                  
LISTEN      0      128                                                *:22                                                             *:*                  
LISTEN      0      100                                        127.0.0.1:25                                                             *:*                  
ESTAB       0      0                                        10.211.55.3:22                                                   10.211.55.2:53356              
ESTAB       0      0                                        10.211.55.3:22                                                   10.211.55.4:43636              
LISTEN      0      128                                               :::111                                                           :::*                  
LISTEN      0      128                                               :::22                                                            :::*                  
LISTEN      0      100                                              ::1:25                                                            :::* 
查看所有的udp连接并显示进程名

[ning.liu@centos-linux-01 ~]$ ss -aup
State       Recv-Q Send-Q                               Local Address:Port                                                Peer Address:Port                
UNCONN      0      0                                                *:bootpc                                                         *:*                    
UNCONN      0      0                                                *:sunrpc                                                         *:*                    
UNCONN      0      0                                                *:757                                                            *:*                    
UNCONN      0      0                                        127.0.0.1:323                                                            *:*                    
UNCONN      0      0                                               :::sunrpc                                                        :::*                    
UNCONN      0      0                                               :::757                                                           :::*                    
UNCONN      0      0                                              ::1:323                                                           :::*  
4.在linux中如何保证socket连接的高并发量?
要想提高socket的高并发,要从两个方面下手。
一、修改linux用户进程所能打开的文件最大数值
第一步,首先查看当前用户每个进程所能打开的最大文件数
[root@centos-linux-01 ~]# ulimit -n
1024
1024【这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,也就是实际所能打开的文件数还不到1024】
/etc/security/limits.conf文件限制着用户可以使用的最大文件数,最大线程,最大内存等资源使用量。
修改limits.conf文件,在下面加入:
user soft nofile 10240
user hard nofile 10240
其中user指定了要修改哪个用户的打开文件数限制,可用’*'号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;10240则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。
修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/security/pam_limits.so
这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。
第三步,查看Linux系统级的最大打开文件数限制,使用如下命令,如果满意就不需要进行下面操作

[root@centos-linux-01 ~]# cat /proc/sys/fs/file-max 
97132
97132【这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)12158个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。】
修改此系统硬限制的方法是修改/etc/rc.local脚本,在脚本中添加如下行:
echo 99999> /proc/sys/fs/file-max
二、调整网络内核对TCP连接的最大支持数。
/etc/sysctl.conf文件是linux中的网络内核配置文件,通过修改它我们可以做到socket进程在TCP/IP网络连接数优化,具体操作:
第一步:设置本地端口范围
net.ipv4.ip_local_port_range = 1024 65000 【这表明将系统对本地端口范围限制设置为1024~65000之间。请注意,本地端口范围的最小值必须大于或等于1024;而端口范围的最大值则应小于或等于65535。修改完后保存此文件。】
第二步:设置系统对tcp连接跟踪的最大数限制
net.ipv4.ip_conntrack_max = 10240
这表明将系统对最大跟踪的TCP连接数限制设置为10240。请注意,此限制值要尽量小,以节省对内核内存的占用。
第三步:执行sysctl -p使其立即生效

猜你喜欢

转载自www.cnblogs.com/huskiesir/p/10211839.html