首页 文章 精选 留言 我的

精选列表

搜索[linux],共10000篇文章
优秀的个人博客,低调大师

linux内核协议栈TCP time_wait原理、配置、副作用

0. 手把手教你做中间件、高性能服务器、分布式存储技术交流群 手把手教你做中间件、高性能服务器、分布式存储等(redis、memcache、nginx、大容量redis pika、rocksdb、mongodb、wiredtiger存储引擎、高性能代理中间件),git地址如下: git地址:https://github.com/y123456yz/middleware_development_learning 1. time_wait状态产生条件 只有在正常四次挥手关闭连接的情况下,在主动关闭连接的一方会出现一段时间的time_wait。如果启用了快速回收功能,回收时间和网络延迟状况有关,正常情况下小于1s,如果没有开启time_wait快速回收功能,则time_wait回收时间默认60s。 三次挥手过程(FIN+ACK, FIN+ACK,ACK)的情况,例如杀掉一段进程,第一个发送FIN+ACK的一端也会产生time_wait。 2. Time_wait状态相关参数说明 TCP中有和time_wait状态相关的参数有以下四个: tcp_tw_recycle 表示开启TCP连接中time_wait的快速回收功能,默认为0,表示关闭;生效前提是必须启用本端和对端tcp_timestamps配置。 tcp_timestamps 时间戳选项,只有在该选项置1的时候tcp_tw_recycle才会生效。 tcp_max_tw_buckets 表示系统同时保持time_wait的最大数量,如果超过这个量,time_wait将打印警告信息。超限的时候后面产生的time_wait直接不处理,释放资源。注意:是新的连接直接释放资源,老的连接还是处于time_wait状态。 Tcp_tw_reuse 客户端大量time_wait状态存在时,端口被占用,当有新的连接,如果没有可用端口,则会连接失败。启用该功能后,可以复用time_wait状态的连接。客户端tcp_tw_reuse生效前提是启用本端和对端tcp_timestamp。 Tcp_tw_reuse端口重用功能一般只针对客户端,因为服务端一般都是监听固定端口,端口数是固定的,端口不会用完。而客户端每次连接端口一般都是由协议栈自动分配。 3. Time_wait快速回收 3.1 快速回收功能失效前提 Time_wait快速回收功能生效前提:启用tcp_tw_recycle,并启动本端和对端tcp_timestamps配置。启用timestamps功能时,报文中会携带时间戳选项信息,抓包如下: 3.2 启用time_wait快速回收功能副作用 如果启用了tcp_tw_recycle和tcp_timestamps,如果接收报文四层选项字段带有时间戳信息,则会对时间戳进行检查,对不满足条件的包会直接丢弃,可能会造成客户端连接建立不成功。例如网络路由信息反复变化,移动cmwap网络发来的包的时间戳乱跳,同一局域网通过路由器做NAT访问服务器(因为做NAT后,源IP就变为路由器的IP了,如果局域网内各个电脑系统时间不一致,则会出现)等情况有可能会出现部分连接异常。原因是tcp_tw_recycle/tcp_timestamps以及对端tcp_timestamps都开启的条件下,60s内同一源ip主机的socket connect请求中的timestamp必须是递增的。不同主机经过路由器做NAT后,报文的源IP地址就变为路由器的IP地址了。 3.3内核协议栈相关主要源码 Time_wait状态生成及快速回收相关代码: 开启timestamps引起的丢包相关源码如下: 4. 客户端端口重用 4.1 客户端大量time_wait,端口重用前提 启用tcp_tw_reuse,并启动本端和对端tcp_timestamps配置。 4.2 内核协议栈相关主要源码 5. 大量timewait对客户端、服务端影响 5.1 客户端大量time_wait影响 大量time_wait会造成连接资源不释放,内存无法回收。 由于客户端端口一般采用协议栈随机分配的方式,协议栈会给每个客户端连接分配一个未使用的端口,因此如果客户端同一IP对应的time_wait数量超过ip_local_port_range设置的最大值(也就是65000),端口将被用完,连接会无法建立。 5.2 服务端大量time_wait影响 由于服务端只占用监听端口,因此不存在端口用完的现象。服务端大量time_wait唯一影响是:资源不释放,内存无法回收。 6. 测试验证 本次测试结果采用sysbench.short来压测cobar来验证,客户端物理设备和服务端物理设备的ip_local_port_range(1024~65000)和tcp_max_tw_buckets(81920)参数都是默认值,测试结果如下: 当cobar服务端time_wait数达到81920的时候,任然可以继续接收客户端连接,能够正常提供连接服务。 当客户端测试工具sysbench.short服务器上的time_wait数达到60000多的时候,客户端连接失败,无法连接,因为端口用完。打印:Cannot assign requested address; Cobar服务器time_wait超限时打印: Cobar服务器time_wait超限的情况下,客户端sysbench压测结果基本不受影响,如下: 从上面测试可以看出,服务端time_wait不会影响客户端建链,只是占用内存。如果是客户端出现大量time_wait状态,此时端口用完,则无法建立连接。以上测试结论符合理论、代码分析。 7. 三种解决time_wait方法总结 Time_wait快速回收 端口重用 限制Tcp_max_tw_buckets 配置方法 在需要进行time_wait快速回收的一端进行一下配置: tcp_tw_recycle:1 本端tcp_timestamps:1 对端tcp_timestamps:1 在需要进行time_wait快速回收的一端进行一下配置: tcp_tw_reuse:1 本端tcp_timestamps:1 对端tcp_timestamps:1 配置Tcp_max_tw_buckets 的值在60000以下。例如配置为30000 副作用 在某些情况下可能引起用户建连接失败(例如需要直接返回给用户信息的服务器) 比较暴力,不符合TCP协议规范 在某些情况下可能引起用户建连接失败(例如需要直接返回给用户信息的服务器) 部署复杂,需要同时改服务端,而服务端比较多。 服务器时间戳会带出IDC,经过中间各种网络设备,尤其是运营商的无线设备等,如果某个设备对时戳有校验,则会产生丢包问题。 比较暴力,不符合TCP协议规范 应急的处理,立竿见影。 建议这种。

优秀的个人博客,低调大师

使用 Web 服务 为 ECS Linux 实例配置网站及绑定域名

Nginx 服务绑定域名 以 YUM 安装的 Nginx 为例: 执行命令vi /etc/nginx/nginx.conf编辑 Nginx 的配置文件,将默认的server {...}配置修改为以下内容: server { listen 80 default_server; server_name www.123.com; root /home/web1; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50.xhtml; location = /50x.html { } } server { server_name www.abc.com; root /home/web2; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } 访问 www.123.com 时,跳转到 /home/web1 目录。 访问 www.abc.com 时,跳转到 /home/web2 目录。 执行命令nginx -s reload重启 Nginx 服务。 Tomcat 服务绑定域名 执行命令vi /etc/TOMCAT_HOME/conf/server.xml编辑 Tomcat 配置文件。 将上述内容修改为: <Host name="localhost" appBase="webapps" unpackWARs="true" autoPlay="true"> <Value className="org.apache.catalina.valves.AccessLogValue" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %c &quot;%r&quot; %s %b" /> </Host> <Host name="120.76.210.250" appBase="/data/wwwroot/web" unpackWARs="true" autoPlay="true"> <Content path="" docBase="/data/wwwroot/web" debug="0" reloadable="false" crossContext="true" /> <Value className="org.apache.catalina.valves.AccessLogValue" directory="logs" prefix="120.76.210.250_access_log." suffix=".txt" pattern="%h %l %u %c &quot;%r&quot; %s %b" /> </Host> <Host name="www.abc.com" appBase="/data/wwwroot/default" unpackWARs="true" autoPlay="true"> <Content path="" docBase="/data/wwwroot/default" debug="0" reloadable="false" crossContext="true" /> <Value className="org.apache.catalina.valves.AccessLogValue" directory="logs" prefix="www.abc.com_access_log." suffix=".txt" pattern="%h %l %u %c &quot;%r&quot; %s %b" /> </Host> 访问 www.abc.com 时,默认跳转到 /data/wwwroot/default 目录。 访问 120.76.210.250 时,默认跳转到 /data/wwwroot/web 目录。 运行bin/shutdown关闭 Tomcat 服务,再运行bin/startup重启 Tomcat 服务。 Apache 服务绑定域名 以一键安装包配置的 Apache 环境为例: 执行命令cd /alidata/server/httpd/conf/vhosts/进入站点配置文件目录。 执行命令vi aa.conf新建一个配置文件,按下键盘上的字母 “I” 键,复制并粘贴以下内容: Order allow,deny Deny from all DocumentRoot /alidata/www/test ServerName www.test.com ServerAlias test.com ErrorLog "/alidata/log/httpd/test-error.log" CustomLog "/alidata/log/httpd/test.log" 注意:您需要修改对应的日志名字以区分不同网站的日志信息。 执行命令/alidata/server/httpd/bin/apachectl restart重启 Apache 服务。 Apache 服务配置实现多域名跳转 假设程序目录为 /var/www/html,网站目录结构如下: 开启 Apache 的虚拟主机功能,配置对应的虚拟主机到对应的目录即可。 实现效果: 使用 a.example.com 访问时,实际是访问 /var/www/html/a 目录。 使用 b.example.com 访问时,实际是访问 /var/www/html/b 目录。 使用 c.example.com 访问时,实际是访问 /var/www/html/c 目录。 Apache 服务配置二级域名 前提条件:您有一个泛域名解析的顶级域名,例如: aliyun.com 。 在httpd.conf中打开 mod_rewrite 模块; 在httpd.conf的最后,添加以下内容: RewriteEngine on RewriteMap lowercase int:tolower RewriteMap vhost txt:/usr/local/etc/apache/vhost.map RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$ RewriteCond ${vhost:%1} ^(/.*)$ RewriteRule ^/(.*)$ %1/$1 注意:/usr/local/etc/apache 是 Apache 服务配置文件所在路径,您需要根据实际情况修改。 执行命令vi vhost.map新建文件,复制并粘贴以下内容: www.aliyun.com /usr/local/www/data-dist/aliyun bbs.aliyun.com /usr/local/www/data-dist/aliyunbbs anyname.aliyun.com /usr/local/www/data-dist/anyname 注意:请注意保持域名+空格+绝对路径的格式。 在根目录 /usr/local/www/data-dist 下创建对应目录:aliyun , bbs , any name 等目录。 通过浏览器访问www.aliyun.com时,实际上访问的就是 /usr/local/www/data-dist/aliyun 目录下的文件。 通过浏览器访问bbs.aliyun.com时,实际上访问的就是 /usr/local/www/data-dist/aliyunbbs 目录下的文件。 您可以通过修改 vhost.map 来增加、删除和修改您的二级域名和所指向的实际路径,不需要重启 Apache 服务。 Apache 禁止未经许可的域名访问 ECS 上的网站 ECS 实例上的网站被人恶意指向,例如,您的实例 IP 地址为 123.123.123.123,正常服务的域名为 www.abc.com , 恶意用户使用其他的域名 www.fake.com , 指向 123.123.123.123,此时客户端访问 www.fake.com 时会出现您的网站内容。 通过 Apache 的虚拟主机可以变通的解决这个问题。以如下场景为例: Apache 版本号 ECS 实例上的网站 2.2.15 http://t1.huigher.cn/http://p1.huigher.cn/ 打开 Apache 的实际配置文件,如执行命令vi /etc/httpd/conf/httpd.conf打开 CentOS 的 Apache 配置文件,加入以下内容: 加入代码NameVirtualHost *:80,告知 Apache 使用基于 host 名的虚拟主机功能: 加入以下代码。 <ViretualHost *:80> DocumentRoot /var/www/html/error/ ServerName * ErrorLog logs/dummy-host.example.com-error_log CustomeLog logs/dummy-host.example.com-access_log common </ViretualHost> 注意:当客户端携带的 host 名不在之后设置的网站域名内时,会指向一个 403 错误页面告知用户域名非法,其中DocumentRoot是放置错误提示页面的目录,在下面可以放置一个简单的 html 页面提示用户正在访问非法域名。 加入以下代码。 <VirtualHost *:80> ServerAdmin p1@huigher.cn DocumentRoot /var/www/html/another/ ServerName p1.huigher.cn ErrorLog logs/p1.huigher.cn-error_loh CustomLog logs/p1.huigher.cn-access_log common </VirtualHost> <VirtualHost *:80> ServerAdmin t1@huigher.cn DocumentRoot /var/www/html/ ServerName t1.huigher.cn ErrorLog logs/t1.huigher.cn-error_loh CustomLog logs/t1.huigher.cn-access_log common </VirtualHost> 注意:这一步告知 Apache 合法的网站主机头,您需要根据实际情况修改这个代码块内容,如示例中的 p1.huigher.cn 和 t1.huigher.cn。 执行命令/etc/httpd/bin/apachectl restart重启 Apache 服务。 若您希望其他域名访问您的网站时直接返回 403 错误: 修改第二步中的代码为以下形式: <VirtualHost *:80> DucumentRoot /var/www/html/error/ ServerName * <Location> Order Allow, Deny Deny from all </Location> ErrorLog logs/dummy-host.example.com-error_log CustomLog logs/dummy-host.example.com-access_log commom </VirtualHost> 执行命令/etc/httpd/bin/apachectl restart重启 Apache 服务。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册