{"id":7003,"date":"2023-07-30T20:25:22","date_gmt":"2023-07-30T12:25:22","guid":{"rendered":"https:\/\/i007.vip:15443\/wordpress\/?p=7003"},"modified":"2023-07-30T20:25:22","modified_gmt":"2023-07-30T12:25:22","slug":"%e5%88%b0%e5%ba%95%e4%b8%80%e5%8f%b0%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e6%9c%80%e5%a4%9a%e8%83%bd%e5%88%9b%e5%bb%ba%e5%a4%9a%e5%b0%91%e4%b8%aatcp%e8%bf%9e%e6%8e%a5","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/7003","title":{"rendered":"\u5230\u5e95\u4e00\u53f0\u670d\u52a1\u5668\u4e0a\u6700\u591a\u80fd\u521b\u5efa\u591a\u5c11\u4e2aTCP\u8fde\u63a5"},"content":{"rendered":"<header class=\"post-header\"><\/header>\n<div class=\"post-body\">\n<p id=\"\u5230\u5e95\u4e00\u53f0\u670d\u52a1\u5668\u4e0a\u6700\u591a\u80fd\u521b\u5efa\u591a\u5c11\u4e2aTCP\u8fde\u63a5\"><a href=\"https:\/\/plantegg.github.io\/2020\/11\/30\/%E4%B8%80%E5%8F%B0%E6%9C%BA%E5%99%A8%E4%B8%8A%E6%9C%80%E5%A4%9A%E8%83%BD%E5%88%9B%E5%BB%BA%E5%A4%9A%E5%B0%91%E4%B8%AATCP%E8%BF%9E%E6%8E%A5\/\">cc from<\/a><\/p>\n<p>&nbsp;<\/p>\n<blockquote><p>\u7ecf\u5e38\u542c\u5230\u6709\u540c\u5b66\u8bf4\u4e00\u53f0\u673a\u5668\u6700\u591a\u80fd\u521b\u5efa65535\u4e2aTCP\u8fde\u63a5\uff0c\u8fd9\u5176\u5b9e\u662f\u9519\u8bef\u7684\u7406\u89e3\uff0c\u4e3a\u4ec0\u4e48\u4f1a\u6709\u8fd9\u4e2a\u9519\u8bef\u7684\u7406\u89e3\u5462\uff1f<\/p><\/blockquote>\n<h2 id=\"port-range\">port range<\/h2>\n<p>\u6211\u4eec\u90fd\u77e5\u9053linux\u4e0b\u672c\u5730\u968f\u673a\u7aef\u53e3\u8303\u56f4\u7531\u53c2\u6570\u63a7\u5236\uff0c\u4e5f\u5c31\u662flisten\u3001connect\u65f6\u5019\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u672c\u5730\u7aef\u53e3\uff0c\u90a3\u4e48\u5c31\u4ece\u4e0b\u9762\u7684port range \u4e2d\u968f\u673a\u53d6\u4e00\u4e2a\u53ef\u7528\u7684<\/p>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<div class=\"line\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\"># cat \/proc\/sys\/net\/ipv4\/ip_local_port_range<\/div>\n<div class=\"line\">2000 65535<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>port range\u7684\u4e0a\u9650\u662f65535\uff0c\u6240\u4ee5\u4e5f\u7ecf\u5e38\u770b\u5230\u8fd9\u4e2a<strong>\u8bef\u89e3<\/strong>\uff1a\u4e00\u53f0\u673a\u5668\u4e0a\u6700\u591a\u80fd\u521b\u5efa65535\u4e2aTCP\u8fde\u63a5<\/p>\n<h2 id=\"\u5230\u5e95\u4e00\u53f0\u673a\u5668\u4e0a\u6700\u591a\u80fd\u521b\u5efa\u591a\u5c11\u4e2aTCP\u8fde\u63a5\">\u5230\u5e95\u4e00\u53f0\u673a\u5668\u4e0a\u6700\u591a\u80fd\u521b\u5efa\u591a\u5c11\u4e2aTCP\u8fde\u63a5<\/h2>\n<p>\u5148\u8bf4<strong>\u7ed3\u8bba<\/strong>\uff1a\u5728\u5185\u5b58\u3001\u6587\u4ef6\u53e5\u67c4\u8db3\u591f\u7684\u8bdd\u53ef\u4ee5\u521b\u5efa\u7684\u8fde\u63a5\u662f<strong>\u6ca1\u6709\u9650\u5236<\/strong>\u7684\uff08\u6bcf\u4e2aTCP\u8fde\u63a5\u81f3\u5c11\u8981\u6d88\u8017\u4e00\u4e2a\u6587\u4ef6\u53e5\u67c4\uff09\u3002<\/p>\n<p>\u90a3\u4e48\/proc\/sys\/net\/ipv4\/ip_local_port_range\u6307\u5b9a\u7684\u7aef\u53e3\u8303\u56f4\u5230\u5e95\u662f\u4ec0\u4e48\u610f\u601d\u5462\uff1f<\/p>\n<p>\u6838\u5fc3\u89c4\u5219\uff1a<strong>\u4e00\u4e2aTCP\u8fde\u63a5\u53ea\u8981\u4fdd\u8bc1\u56db\u5143\u7ec4(src-ip src-port dest-ip dest-port)\u552f\u4e00\u5c31\u53ef\u4ee5\u4e86\uff0c\u800c\u4e0d\u662f\u8981\u6c42src port\u552f\u4e00<\/strong><\/p>\n<p>\u540e\u9762\u6240\u8bb2\u90fd\u9075\u5faa\u8fd9\u4e2a\u89c4\u5219\uff0c\u6240\u4ee5\u5728\u5fc3\u91cc\u53cd\u590d\u9ed8\u5ff5\uff1a<strong>\u56db\u5143\u7ec4\u552f\u4e00<\/strong>\u00a0\u4e94\u4e2a\u5927\u5b57\uff0c\u5c31\u80fd\u5206\u6790\u51fa\u6765\u5230\u5e95\u80fd\u521b\u5efa\u591a\u5c11TCP\u8fde\u63a5\u4e86\u3002<\/p>\n<p>\u6bd4\u5982\u5982\u4e0b\u8fd9\u4e2a\u673a\u5668\u4e0a\u7684TCP\u8fde\u63a5\u5b9e\u9645\u72b6\u6001\uff1a<\/p>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<div class=\"line\">2<\/div>\n<div class=\"line\">3<\/div>\n<div class=\"line\">4<\/div>\n<div class=\"line\">5<\/div>\n<div class=\"line\">6<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\"># netstat -ant |grep 18089<\/div>\n<div class=\"line\">tcp 0 0 192.168.1.79:18089 192.168.1.79:22 ESTABLISHED<\/div>\n<div class=\"line\">tcp 0 0 192.168.1.79:18089 192.168.1.79:18080 ESTABLISHED<\/div>\n<div class=\"line\">tcp 0 0 192.168.0.79:18089 192.168.0.79:22 TIME_WAIT<\/div>\n<div class=\"line\">tcp 0 0 192.168.1.79:22 192.168.1.79:18089 ESTABLISHED<\/div>\n<div class=\"line\">tcp 0 0 192.168.1.79:18080 192.168.1.79:18089 ESTABLISHED<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u4ece\u524d\u4e09\u884c\u53ef\u4ee5\u6e05\u695a\u5730\u770b\u523018089\u88ab\u7528\u4e86\u4e09\u6b21\uff0c\u7b2c\u4e00\u7b2c\u4e8c\u884csrc-ip\u3001dest-ip\u4e5f\u662f\u91cd\u590d\u7684\uff0c\u4f46\u662fdest port\u4e0d\u4e00\u6837\uff0c\u7b2c\u4e09\u884c\u7684src-port\u8fd8\u662f18089\uff0c\u4f46\u662fsrc-ip\u53d8\u4e86\u3002\u4ed6\u4eec\u7684\u56db\u5143\u7ec4\u5747\u4e0d\u76f8\u540c\u3002<\/p>\n<p>\u6240\u4ee5\u4e00\u53f0\u673a\u5668\u80fd\u521b\u5efa\u7684TCP\u8fde\u63a5\u662f\u6ca1\u6709\u9650\u5236\u7684\uff0c\u800cip_local_port_range\u662f\u6307\u6ca1\u6709bind\u7684\u65f6\u5019OS\u968f\u673a\u5206\u914d\u7aef\u53e3\u7684\u8303\u56f4\uff0c\u4f46\u662f\u5206\u914d\u5230\u7684\u7aef\u53e3\u8981\u540c\u65f6\u6ee1\u8db3\u4e94\u5143\u7ec4\u552f\u4e00\uff0c\u8fd9\u6837 ip_local_port_range \u9650\u5236\u7684\u662f\u8fde\u540c\u4e00\u4e2a\u76ee\u6807\uff08dest-ip\u548cdest-port\u4e00\u6837\uff09\u7684port\u7684\u6570\u91cf\uff08\u8bf7\u5ffd\u7565\u672c\u5730\u591a\u7f51\u5361\u7684\u60c5\u51b5\uff0c\u56e0\u4e3adest-ip\u4e3a\u4ee5\u540eroute\u53ea\u4f1a\u9009\u7528\u4e00\u4e2a\u672c\u5730ip\uff09\u3002<\/p>\n<p><strong>\u90a3\u4e48\u4e3a\u4ec0\u4e48\u5927\u5bb6\u6709\u8fd9\u6837\u7684\u8bef\u89e3\u5462\uff1f<\/strong>\u6211\u603b\u7ed3\u4e86\u4e0b\uff0c\u5927\u6982\u662f\u4ee5\u4e0b\u4e24\u4e2a\u539f\u56e0\u8ba9\u5927\u5bb6\u8bef\u89e3\u4e86\uff1a<\/p>\n<ul>\n<li>\u5982\u679c\u662flisten\u670d\u52a1\uff0c\u90a3\u4e48\u80af\u5b9a\u7aef\u53e3\u4e0d\u80fd\u91cd\u590d\u4f7f\u7528\uff0c\u8fd9\u6837\u5c31\u8ddf\u6211\u4eec\u7684\u8bef\u89e3\u5bf9\u5e94\u4e0a\u4e86\uff0c\u4e00\u4e2a\u670d\u52a1\u5668\u4e0a\u6700\u591a\u80fd\u76d1\u542c65535\u4e2a\u7aef\u53e3\u3002\u6bd4\u5982nginx\u76d1\u542c\u4e8680\u7aef\u53e3\uff0c\u90a3\u4e48tomcat\u5c31\u6ca1\u6cd5\u518d\u76d1\u542c80\u7aef\u53e3\u4e86\uff0c\u8fd9\u91cc\u768480\u7aef\u53e3\u53ea\u80fd\u76d1\u542c\u4e00\u6b21\u3002<\/li>\n<li>\u53e6\u5916\u5982\u679c\u6211\u4eec\u8981\u8fde\u7684server\u53ea\u6709\u4e00\u4e2a\uff0c\u6bd4\u5982\uff1a1.1.1.1:80 \uff0c\u540c\u65f6\u672c\u673a\u53ea\u6709\u4e00\u4e2aip\u7684\u8bdd\uff0c\u90a3\u4e48\u8fd9\u4e2a\u65f6\u5019\u5373\u4f7f\u76f4\u63a5\u8c03connect \u4e5f\u53ea\u80fd\u521b\u5efa\u51fa65535\u4e2a\u8fde\u63a5\uff0c\u56e0\u4e3a\u56db\u5143\u7ec4\u4e2d\u7684\u4e09\u4e2a\u662f\u56fa\u5b9a\u7684\u4e86\u3002<\/li>\n<\/ul>\n<p>\u6211\u4eec\u5728\u521b\u5efa\u8fde\u63a5\u524d\uff0c\u7ecf\u5e38\u4f1a\u5148\u8c03bind\uff0cbind\u540e\u53ef\u4ee5\u8c03listen\u5f53\u505a\u670d\u52a1\u7aef\u76d1\u542c\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8c03connect\u5f53\u505aclient\u6765\u8fde\u670d\u52a1\u7aef\u3002<\/p>\n<p>bind(ip,port=0) \u7684\u65f6\u5019\u662f\u8ba9\u7cfb\u7edf\u7ed1\u5b9a\u5230\u67d0\u4e2a\u7f51\u5361\u548c\u81ea\u52a8\u5206\u914d\u7684\u7aef\u53e3\uff0c\u6b64\u65f6\u7cfb\u7edf\u6ca1\u6709\u529e\u6cd5\u786e\u5b9a\u63a5\u4e0b\u6765\u8fd9\u4e2asocket\u662f\u8981\u53bbconnect\u8fd8\u662flisten. \u5982\u679c\u662flisten\u7684\u8bdd\uff0c\u90a3\u4e48\u80af\u5b9a\u662f\u4e0d\u80fd\u51fa\u73b0\u7aef\u53e3\u51b2\u7a81\u7684\uff0c\u5982\u679c\u662fconnect\u7684\u8bdd\uff0c\u53ea\u8981\u6ee1\u8db34\u5143\u7ec4\u552f\u4e00\u5373\u53ef\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u7cfb\u7edf\u53ea\u80fd\u5c3d\u53ef\u80fd\u6ee1\u8db3\u66f4\u5f3a\u7684\u8981\u6c42\uff0c\u5c31\u662f\u5148\u8981\u6c42\u7aef\u53e3\u4e0d\u80fd\u51b2\u7a81\uff0c\u5373\u4f7f\u4e4b\u540e\u53bbconnect\u7684\u65f6\u5019\u56db\u5143\u7ec4\u662f\u552f\u4e00\u7684\u3002<\/p>\n<p>\u6bd4\u5982 Nginx HaProxy envoy\u8fd9\u4e9b\u8f6f\u4ef6\u5728\u521b\u5efa\u5230upstream\u7684\u8fde\u63a5\u65f6\uff0c\u90fd\u4f1a\u7528 bind(0) \u7684\u65b9\u5f0f, \u5bfc\u81f4\u5230\u4e0d\u540c\u76ee\u7684\u7684\u8fde\u63a5\u65e0\u6cd5\u590d\u7528\u540c\u4e00\u4e2asrc port\uff0c\u8fd9\u6837\u540e\u7aef\u7684\u6700\u5927\u8fde\u63a5\u6570\u53d7\u9650\u4e8elocal_port_range\u3002<\/p>\n<blockquote><p>Linux 4.2\u540e\u7684\u5185\u6838\u589e\u52a0\u4e86IP_BIND_ADDRESS_NO_PORT \u8fd9\u4e2asocket option\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u5c06src port\u7684\u9009\u62e9\u5ef6\u540e\u5230connect\u7684\u65f6\u5019<\/p>\n<p><a href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/torvalds\/linux.git\/commit\/?id=90c337da1524863838658078ec34241f45d8394d\" target=\"_blank\" rel=\"external noopener\">IP_BIND_ADDRESS_NO_PORT (since Linux 4.2)<\/a><br \/>\nInform the kernel to not reserve an ephemeral port when using bind(2) with a port number of 0. The port will later be automatically chosen at connect(2) time, in a way that allows sharing a source port as long as the 4-tuple is unique.<\/p><\/blockquote>\n<p>\u4f46\u5982\u679c\u6211\u53ea\u662f\u4e2aclient\u7aef\uff0c\u53ea\u9700\u8981\u8fde\u63a5server\u5efa\u7acb\u8fde\u63a5\uff0c\u4e5f\u5c31\u4e0d\u9700\u8981bind\uff0c\u76f4\u63a5\u8c03connect\u5c31\u53ef\u4ee5\u4e86\uff0c\u8fd9\u4e2a\u65f6\u5019\u53ea\u8981\u4fdd\u8bc1\u56db\u5143\u7ec4\u552f\u4e00\u5c31\u884c\u3002<\/p>\n<p>bind()\u7684\u65f6\u5019\u5185\u6838\u662f\u8fd8\u4e0d\u77e5\u9053\u56db\u5143\u7ec4\u7684\uff0c\u53ea\u77e5\u9053src_ip\u3001src_port\uff0c\u6240\u4ee5\u8fd9\u4e2a\u65f6\u5019\u5355\u7f51\u5361\u4e0bsrc_port\u662f\u6ca1\u6cd5\u91cd\u590d\u7684\uff0c\u4f46\u662fconnect()\u7684\u65f6\u5019\u5df2\u7ecf\u77e5\u9053\u4e86\u56db\u5143\u7ec4\u7684\u5168\u90e8\u4fe1\u606f\uff0c\u6240\u4ee5\u53ea\u8981\u4fdd\u8bc1\u56db\u5143\u7ec4\u552f\u4e00\u5c31\u53ef\u4ee5\u4e86\uff0c\u90a3\u4e48\u8fd9\u91cc\u7684src_port\u5b8c\u5168\u662f\u53ef\u4ee5\u91cd\u590d\u4f7f\u7528\u7684\u3002<\/p>\n<p><a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/640-20220224103024676.png\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/640-20220224103024676.png\" alt=\"Image\" \/><\/a><\/p>\n<p><strong>\u662f\u4e0d\u662f\u52a0\u4e0a\u4e86 SO_REUSEADDR\u3001SO_REUSEPORT \u5c31\u80fd\u91cd\u7528\u7aef\u53e3\u4e86\u5462\uff1f<\/strong><\/p>\n<h2 id=\"TCP-SO-REUSEADDR\">TCP SO_REUSEADDR<\/h2>\n<p>\u6587\u6863\u63cf\u8ff0\uff1a<\/p>\n<blockquote><p>SO_REUSEADDR Indicates that the rules used in validating addresses supplied in a bind(2) call should allow reuse of local addresses. For AF_INET sockets this means that a socket may bind, except when there is an active listening socket bound to the address. When the listening socket is bound to INADDR_ANY with a specific port then it is not possible to bind to this port for any local address. Argument is an integer boolean flag.<\/p><\/blockquote>\n<p>\u4ece\u8fd9\u6bb5\u6587\u6863\u4e2d\u6211\u4eec\u53ef\u4ee5\u77e5\u9053\u4e09\u4e2a\u4e8b\uff1a<\/p>\n<ol>\n<li>\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u540e\uff0cbind\u64cd\u4f5c\u662f\u53ef\u4ee5\u91cd\u590d\u4f7f\u7528local address\u7684\uff0c\u6ce8\u610f\uff0c\u8fd9\u91cc\u8bf4\u7684\u662flocal address\uff0c\u5373ip\u52a0\u7aef\u53e3\u7ec4\u6210\u7684\u672c\u5730\u5730\u5740\uff0c\u4e5f\u5c31\u662f\u4e24\u4e2a\u672c\u5730\u5730\u5740\uff0c\u5982\u679c\u6709\u4efb\u610fip\u6216\u7aef\u53e3\u90e8\u5206\u4e0d\u4e00\u6837\uff0c\u5b83\u4eec\u672c\u8eab\u5c31\u662f\u53ef\u4ee5\u5171\u5b58\u7684\uff0c\u4e0d\u9700\u8981\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002<\/li>\n<li>\u5f53local address\u88ab\u4e00\u4e2a\u5904\u4e8elisten\u72b6\u6001\u7684socket\u4f7f\u7528\u65f6\uff0c\u52a0\u4e0a\u8be5\u53c2\u6570\u4e5f\u4e0d\u80fd\u91cd\u7528\u8fd9\u4e2a\u5730\u5740\u3002<\/li>\n<li>\u5f53\u5904\u4e8elisten\u72b6\u6001\u7684socket\u76d1\u542c\u7684\u672c\u5730\u5730\u5740\u7684ip\u90e8\u5206\u662fINADDR_ANY\uff0c\u5373\u8868\u793a\u76d1\u542c\u672c\u5730\u7684\u6240\u6709ip\uff0c\u5373\u4f7f\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\uff0c\u4e5f\u4e0d\u80fd\u518dbind\u5305\u542b\u8fd9\u4e2a\u7aef\u53e3\u7684\u4efb\u610f\u672c\u5730\u5730\u5740\uff0c\u8fd9\u4e2a\u548c 2 \u4e2d\u63cf\u8ff0\u7684\u5176\u5b9e\u662f\u4e00\u6837\u7684\u3002<\/li>\n<\/ol>\n<p>==SO_REUSEADDR \u53ef\u4ee5\u7528\u672c\u5730\u76f8\u540c\u7684(sip, sport) \u53bb\u8fdeconnect \u8fdc\u7a0b\u7684\u4e0d\u540c\u7684\uff08dip\u3001dport\uff09\/\/\u800c SO_REUSEPORT\u4e3b\u8981\u662f\u89e3\u51b3Server\u7aef\u7684port\u91cd\u7528==<\/p>\n<p><a href=\"https:\/\/mp.weixin.qq.com\/s\/YWzuKBK3TMclejeN2ziAvQ\" target=\"_blank\" rel=\"external noopener\">SO_REUSEADDR \u8fd8\u53ef\u4ee5\u91cd\u7528TIME_WAIT\u72b6\u6001\u7684port<\/a>, \u5728\u7a0b\u5e8f\u5d29\u6e83\u540e\u4e4b\u524d\u7684TCP\u8fde\u63a5\u4f1a\u8fdb\u5165\u5230TIME_WAIT\u72b6\u6001\uff0c\u9700\u8981\u4e00\u6bb5\u65f6\u95f4\u624d\u80fd\u91ca\u653e\uff0c\u5982\u679c\u7acb\u5373\u91cd\u542f\u5c31\u4f1a\u629b\u51fa<u>Address Already in use<\/u>\u7684\u9519\u8bef\u5bfc\u81f4\u542f\u52a8\u5931\u8d25\u3002\u8fd9\u65f6\u5019\u53ef\u4ee5\u901a\u8fc7\u5728\u8c03\u7528bind\u51fd\u6570\u4e4b\u524d\u8bbe\u7f6eSO_REUSEADDR\u6765\u89e3\u51b3\u3002<\/p>\n<blockquote><p>What exactly does SO_REUSEADDR do?<\/p>\n<p>This socket option tells the kernel that even if this port is busy (in the TIME_WAIT state), go ahead and reuse it anyway. If it is busy, but with another state, you will still get an address already in use error. It is useful if your server has been shut down, and then restarted right away while sockets are still active on its port. You should be aware that if any unexpected data comes in, it may confuse your server, but while this is possible, it is not likely.<\/p>\n<p>It has been pointed out that \u201cA socket is a 5 tuple (proto, local addr, local port, remote addr, remote port). SO_REUSEADDR just says that you can reuse local addresses. The 5 tuple still must be unique!\u201d This is true, and this is why it is very unlikely that unexpected data will ever be seen by your server. The danger is that such a 5 tuple is still floating around on the net, and while it is bouncing around, a new connection from the same client, on the same system, happens to get the same remote port.<\/p><\/blockquote>\n<p>By setting\u00a0<code>SO_REUSEADDR<\/code>\u00a0user informs the kernel of an intention to share the bound port with anyone else, but only if it doesn\u2019t cause a conflict on the protocol layer. There are at least three situations when this flag is useful:<\/p>\n<ol>\n<li>Normally after binding to a port and stopping a server it\u2019s neccesary to wait for a socket to time out before another server can bind to the same port. With\u00a0<code>SO_REUSEADDR<\/code>\u00a0set it\u2019s possible to rebind immediately, even if the socket is in a\u00a0<code>TIME_WAIT<\/code>\u00a0state.<\/li>\n<li>When one server binds to\u00a0<code>INADDR_ANY<\/code>, say\u00a0<code>0.0.0.0:1234<\/code>, it\u2019s impossible to have another server binding to a specific address like\u00a0<code>192.168.1.21:1234<\/code>. With\u00a0<code>SO_REUSEADDR<\/code>\u00a0flag this behaviour is allowed.<\/li>\n<li>When using the bind before connect trick only a single connection can use a single outgoing source port. With this flag, it\u2019s possible for many connections to reuse the same source port, given that they connect to different destination addresses.<\/li>\n<\/ol>\n<h2 id=\"TCP-SO-REUSEPORT\">TCP SO_REUSEPORT<\/h2>\n<p>SO_REUSEPORT\u4e3b\u8981\u7528\u6765\u89e3\u51b3\u60ca\u7fa4\u3001\u6027\u80fd\u7b49\u95ee\u9898\u3002\u901a\u8fc7\u591a\u4e2a\u8fdb\u7a0b\u3001\u7ebf\u7a0b\u6765\u76d1\u542c\u540c\u4e00\u7aef\u53e3\uff0c\u8fdb\u6765\u7684\u8fde\u63a5\u901a\u8fc7\u5185\u6838\u6765hash\u5206\u53d1\u505a\u5230\u8d1f\u8f7d\u5747\u8861\uff0c\u907f\u514d\u60ca\u7fa4\u3002<\/p>\n<blockquote><p>SO_REUSEPORT is also useful for eliminating the try-10-times-to-bind hack in ftpd\u2019s data connection setup routine. Without SO_REUSEPORT, only one ftpd thread can bind to TCP (lhost, lport, INADDR_ANY, 0) in preparation for connecting back to the client. Under conditions of heavy load, there are more threads colliding here than the try-10-times hack can accomodate. With SO_REUSEPORT, things work nicely and the hack becomes unnecessary.<\/p><\/blockquote>\n<p>SO_REUSEPORT\u4f7f\u7528\u573a\u666f\uff1alinux kernel 3.9 \u5f15\u5165\u4e86\u6700\u65b0\u7684SO_REUSEPORT\u9009\u9879\uff0c\u4f7f\u5f97\u591a\u8fdb\u7a0b\u6216\u8005\u591a\u7ebf\u7a0b\u521b\u5efa\u591a\u4e2a\u7ed1\u5b9a\u540c\u4e00\u4e2aip:port\u7684\u76d1\u542csocket\uff0c\u63d0\u9ad8\u670d\u52a1\u5668\u7684\u63a5\u6536\u94fe\u63a5\u7684\u5e76\u53d1\u80fd\u529b,\u7a0b\u5e8f\u7684\u6269\u5c55\u6027\u66f4\u597d\uff1b\u6b64\u65f6\u9700\u8981\u8bbe\u7f6eSO_REUSEPORT\uff08<strong>\u6ce8\u610f\u6240\u6709\u8fdb\u7a0b\u90fd\u8981\u8bbe\u7f6e\u624d\u751f\u6548<\/strong>\uff09\u3002<\/p>\n<p>setsockopt(listenfd, SOL_SOCKET, SO_REUSEPORT,(const void *)&amp;reuse , sizeof(int));<\/p>\n<p>\u76ee\u7684\uff1a\u6bcf\u4e00\u4e2a\u8fdb\u7a0b\u6709\u4e00\u4e2a\u72ec\u7acb\u7684\u76d1\u542csocket\uff0c\u5e76\u4e14bind\u76f8\u540c\u7684ip:port\uff0c\u72ec\u7acb\u7684listen()\u548caccept()\uff1b\u63d0\u9ad8\u63a5\u6536\u8fde\u63a5\u7684\u80fd\u529b\u3002\uff08\u4f8b\u5982nginx\u591a\u8fdb\u7a0b\u540c\u65f6\u76d1\u542c\u540c\u4e00\u4e2aip:port\uff09<\/p>\n<blockquote><p>(a) on Linux SO_REUSEPORT is meant to be used\u00a0<em>purely<\/em>\u00a0for load balancing multiple incoming UDP packets or incoming TCP connection requests across multiple sockets belonging to the same app. ie. it\u2019s a work around for machines with a lot of cpus, handling heavy load, where a single listening socket becomes a bottleneck because of cross-thread contention on the in-kernel socket lock (and state).<\/p>\n<p>(b) set IP_BIND_ADDRESS_NO_PORT socket option for tcp sockets before binding to a specific source ip<br \/>\nwith port 0 if you\u2019re going to use the socket for connect() rather then listen() this allows the kernel<br \/>\nto delay allocating the source port until connect() time at which point it is much cheaper<\/p><\/blockquote>\n<h2 id=\"The-Ephemeral-Port-Range\"><a href=\"http:\/\/www.ncftp.com\/ncftpd\/doc\/misc\/ephemeral_ports.html\" target=\"_blank\" rel=\"external noopener\">The Ephemeral Port Range<\/a><\/h2>\n<p>Ephemeral Port Range\u5c31\u662f\u6211\u4eec\u524d\u9762\u6240\u8bf4\u7684Port Range\uff08\/proc\/sys\/net\/ipv4\/ip_local_port_range\uff09<\/p>\n<blockquote><p>A TCP\/IPv4 connection consists of two endpoints, and each endpoint consists of an IP address and a port number. Therefore, when a client user connects to a server computer, an established connection can be thought of as the 4-tuple of (server IP, server port, client IP, client port).<\/p>\n<p>Usually three of the four are readily known \u2013 client machine uses its own IP address and when connecting to a remote service, the server machine\u2019s IP address and service port number are required.<\/p>\n<p>What is not immediately evident is that when a connection is established that the client side of the connection uses a port number. Unless a client program explicitly requests a specific port number, the port number used is an ephemeral port number.<\/p>\n<p>Ephemeral ports are temporary ports assigned by a machine\u2019s IP stack, and are assigned from a designated range of ports for this purpose. When the connection terminates, the ephemeral port is available for reuse, although most IP stacks won\u2019t reuse that port number until the entire pool of ephemeral ports have been used.<\/p>\n<p>So, if the client program reconnects, it will be assigned a different ephemeral port number for its side of the new connection.<\/p><\/blockquote>\n<h2 id=\"linux-\u5982\u4f55\u9009\u62e9Ephemeral-Port\">linux \u5982\u4f55\u9009\u62e9Ephemeral Port<\/h2>\n<p>\u6709\u8d44\u6599\u8bf4\u662f\u968f\u673a\u4ecePort Range\u9009\u62e9port\uff0c\u6709\u7684\u8bf4\u662f\u987a\u5e8f\u9009\u62e9\uff0c\u90a3\u4e48\u5b9e\u9645\u9a8c\u8bc1\u4e00\u4e0b\u3002<\/p>\n<p>\u5982\u4e0b\u6d4b\u8bd5\u4ee3\u7801\uff1a<\/p>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<div class=\"line\">2<\/div>\n<div class=\"line\">3<\/div>\n<div class=\"line\">4<\/div>\n<div class=\"line\">5<\/div>\n<div class=\"line\">6<\/div>\n<div class=\"line\">7<\/div>\n<div class=\"line\">8<\/div>\n<div class=\"line\">9<\/div>\n<div class=\"line\">10<\/div>\n<div class=\"line\">11<\/div>\n<div class=\"line\">12<\/div>\n<div class=\"line\">13<\/div>\n<div class=\"line\">14<\/div>\n<div class=\"line\">15<\/div>\n<div class=\"line\">16<\/div>\n<div class=\"line\">17<\/div>\n<div class=\"line\">18<\/div>\n<div class=\"line\">19<\/div>\n<div class=\"line\">20<\/div>\n<div class=\"line\">21<\/div>\n<div class=\"line\">22<\/div>\n<div class=\"line\">23<\/div>\n<div class=\"line\">24<\/div>\n<div class=\"line\">25<\/div>\n<div class=\"line\">26<\/div>\n<div class=\"line\">27<\/div>\n<div class=\"line\">28<\/div>\n<div class=\"line\">29<\/div>\n<div class=\"line\">30<\/div>\n<div class=\"line\">31<\/div>\n<div class=\"line\">32<\/div>\n<div class=\"line\">33<\/div>\n<div class=\"line\">34<\/div>\n<div class=\"line\">35<\/div>\n<div class=\"line\">36<\/div>\n<div class=\"line\">37<\/div>\n<div class=\"line\">38<\/div>\n<div class=\"line\">39<\/div>\n<div class=\"line\">40<\/div>\n<div class=\"line\">41<\/div>\n<div class=\"line\">42<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\">#include &lt;stdio.h&gt; \/\/ printf<\/div>\n<div class=\"line\">#include &lt;stdlib.h&gt; \/\/ atoi<\/div>\n<div class=\"line\">#include &lt;unistd.h&gt; \/\/ close<\/div>\n<div class=\"line\">#include &lt;arpa\/inet.h&gt; \/\/ ntohs<\/div>\n<div class=\"line\">#include &lt;sys\/socket.h&gt; \/\/ connect, socket<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">void sample() {<\/div>\n<div class=\"line\">\/\/ Create socket<\/div>\n<div class=\"line\">int sockfd;<\/div>\n<div class=\"line\">if (sockfd = socket(AF_INET, SOCK_STREAM, 0), -1 == sockfd) {<\/div>\n<div class=\"line\">perror(&#8220;socket&#8221;);<\/div>\n<div class=\"line\">}<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">\/\/ Connect to remote. This does NOT actually send a packet.<\/div>\n<div class=\"line\">const struct sockaddr_in raddr = {<\/div>\n<div class=\"line\">.sin_family = AF_INET,<\/div>\n<div class=\"line\">.sin_port = htons(8080), \/\/ arbitrary remote port<\/div>\n<div class=\"line\">.sin_addr = htonl(INADDR_ANY) \/\/ arbitrary remote host<\/div>\n<div class=\"line\">};<\/div>\n<div class=\"line\">if (-1 == connect(sockfd, (const struct sockaddr *)&amp;raddr, sizeof(raddr))) {<\/div>\n<div class=\"line\">perror(&#8220;connect&#8221;);<\/div>\n<div class=\"line\">}<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">\/\/ Display selected ephemeral port<\/div>\n<div class=\"line\">const struct sockaddr_in laddr;<\/div>\n<div class=\"line\">socklen_t laddr_len = sizeof(laddr);<\/div>\n<div class=\"line\">if (-1 == getsockname(sockfd, (struct sockaddr *)&amp;laddr, &amp;laddr_len)) {<\/div>\n<div class=\"line\">perror(&#8220;getsockname&#8221;);<\/div>\n<div class=\"line\">}<\/div>\n<div class=\"line\">printf(&#8220;local port: %i\\n&#8221;, ntohs(laddr.sin_port));<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">\/\/ Close socket<\/div>\n<div class=\"line\">close(sockfd);<\/div>\n<div class=\"line\">}<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">int main() {<\/div>\n<div class=\"line\">for (int i = 0; i &lt; 5; i++) {<\/div>\n<div class=\"line\">sample();<\/div>\n<div class=\"line\">}<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">return 0;<\/div>\n<div class=\"line\">}<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>bind\u903b\u8f91\u6d4b\u8bd5\u4ee3\u7801<\/p>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<div class=\"line\">2<\/div>\n<div class=\"line\">3<\/div>\n<div class=\"line\">4<\/div>\n<div class=\"line\">5<\/div>\n<div class=\"line\">6<\/div>\n<div class=\"line\">7<\/div>\n<div class=\"line\">8<\/div>\n<div class=\"line\">9<\/div>\n<div class=\"line\">10<\/div>\n<div class=\"line\">11<\/div>\n<div class=\"line\">12<\/div>\n<div class=\"line\">13<\/div>\n<div class=\"line\">14<\/div>\n<div class=\"line\">15<\/div>\n<div class=\"line\">16<\/div>\n<div class=\"line\">17<\/div>\n<div class=\"line\">18<\/div>\n<div class=\"line\">19<\/div>\n<div class=\"line\">20<\/div>\n<div class=\"line\">21<\/div>\n<div class=\"line\">22<\/div>\n<div class=\"line\">23<\/div>\n<div class=\"line\">24<\/div>\n<div class=\"line\">25<\/div>\n<div class=\"line\">26<\/div>\n<div class=\"line\">27<\/div>\n<div class=\"line\">28<\/div>\n<div class=\"line\">29<\/div>\n<div class=\"line\">30<\/div>\n<div class=\"line\">31<\/div>\n<div class=\"line\">32<\/div>\n<div class=\"line\">33<\/div>\n<div class=\"line\">34<\/div>\n<div class=\"line\">35<\/div>\n<div class=\"line\">36<\/div>\n<div class=\"line\">37<\/div>\n<div class=\"line\">38<\/div>\n<div class=\"line\">39<\/div>\n<div class=\"line\">40<\/div>\n<div class=\"line\">41<\/div>\n<div class=\"line\">42<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\">#include &lt;netinet\/in.h&gt;<\/div>\n<div class=\"line\">#include &lt;arpa\/inet.h&gt;<\/div>\n<div class=\"line\">#include &lt;stdio.h&gt;<\/div>\n<div class=\"line\">#include &lt;stdlib.h&gt;<\/div>\n<div class=\"line\">#include &lt;unistd.h&gt;<\/div>\n<div class=\"line\">#include &lt;errno.h&gt;<\/div>\n<div class=\"line\">#include &lt;string.h&gt;<\/div>\n<div class=\"line\">#include &lt;sys\/types.h&gt;<\/div>\n<div class=\"line\">#include &lt;time.h&gt;<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">void test_bind(){<\/div>\n<div class=\"line\">int listenfd = 0, connfd = 0;<\/div>\n<div class=\"line\">struct sockaddr_in serv_addr;<\/div>\n<div class=\"line\">char sendBuff[1025];<\/div>\n<div class=\"line\">time_t ticks;<\/div>\n<div class=\"line\">socklen_t len;<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">listenfd = socket(AF_INET, SOCK_STREAM, 0);<\/div>\n<div class=\"line\">memset(&amp;serv_addr, &#8216;0&#8217;, sizeof(serv_addr));<\/div>\n<div class=\"line\">memset(sendBuff, &#8216;0&#8217;, sizeof(sendBuff));<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">serv_addr.sin_family = AF_INET;<\/div>\n<div class=\"line\">serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);<\/div>\n<div class=\"line\">serv_addr.sin_port = htons(0);<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">bind(listenfd, (struct sockaddr*)&amp;serv_addr, sizeof(serv_addr));<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">len = sizeof(serv_addr);<\/div>\n<div class=\"line\">if (getsockname(listenfd, (struct sockaddr *)&amp;serv_addr, &amp;len) == -1) {<\/div>\n<div class=\"line\">perror(&#8220;getsockname&#8221;);<\/div>\n<div class=\"line\">return;<\/div>\n<div class=\"line\">}<\/div>\n<div class=\"line\">printf(&#8220;port number %d\\n&#8221;, ntohs(serv_addr.sin_port)); \/\/\u53ea\u662f\u6311\u9009\u5230\u4e86port\uff0c\u5728\u7cfb\u7edf\u5c42\u9762\u4fdd\u7559\uff0ctcp\u8fde\u63a5\u8fd8\u6ca1\u6709\uff0cnetstat\u662f\u770b\u4e0d\u5230\u7684<\/div>\n<div class=\"line\">}<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">int main(int argc, char *argv[])<\/div>\n<div class=\"line\">{<\/div>\n<div class=\"line\">for (int i = 0; i &lt; 5; i++) {<\/div>\n<div class=\"line\">test_bind();<\/div>\n<div class=\"line\">}<\/div>\n<div class=\"line\">return 0;<\/div>\n<div class=\"line\">}<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h3 id=\"3-10-0-327-ali2017-alios7-x86-64\">3.10.0-327.ali2017.alios7.x86_64<\/h3>\n<p>\u7f16\u8bd1\u540e\uff0c\u6267\u884c(3.10.0-327.ali2017.alios7.x86_64)\uff1a<\/p>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<div class=\"line\">2<\/div>\n<div class=\"line\">3<\/div>\n<div class=\"line\">4<\/div>\n<div class=\"line\">5<\/div>\n<div class=\"line\">6<\/div>\n<div class=\"line\">7<\/div>\n<div class=\"line\">8<\/div>\n<div class=\"line\">9<\/div>\n<div class=\"line\">10<\/div>\n<div class=\"line\">11<\/div>\n<div class=\"line\">12<\/div>\n<div class=\"line\">13<\/div>\n<div class=\"line\">14<\/div>\n<div class=\"line\">15<\/div>\n<div class=\"line\">16<\/div>\n<div class=\"line\">17<\/div>\n<div class=\"line\">18<\/div>\n<div class=\"line\">19<\/div>\n<div class=\"line\">20<\/div>\n<div class=\"line\">21<\/div>\n<div class=\"line\">22<\/div>\n<div class=\"line\">23<\/div>\n<div class=\"line\">24<\/div>\n<div class=\"line\">25<\/div>\n<div class=\"line\">26<\/div>\n<div class=\"line\">27<\/div>\n<div class=\"line\">28<\/div>\n<div class=\"line\">29<\/div>\n<div class=\"line\">30<\/div>\n<div class=\"line\">31<\/div>\n<div class=\"line\">32<\/div>\n<div class=\"line\">33<\/div>\n<div class=\"line\">34<\/div>\n<div class=\"line\">35<\/div>\n<div class=\"line\">36<\/div>\n<div class=\"line\">37<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\">#date; .\/client &amp;&amp; echo &#8220;+++++++&#8221; ; .\/client &amp;&amp; sleep 0.1 ; echo &#8220;&#8212;&#8212;-&#8221; &amp;&amp; .\/client &amp;&amp; sleep 10; date; .\/client &amp;&amp; echo &#8220;+++++++&#8221; ; .\/client &amp;&amp; sleep 0.1 &amp;&amp; echo &#8220;******&#8221;; .\/client;<\/div>\n<div class=\"line\">Fri Nov 27 10:52:52 CST 2020<\/div>\n<div class=\"line\">local port: 17448<\/div>\n<div class=\"line\">local port: 17449<\/div>\n<div class=\"line\">local port: 17451<\/div>\n<div class=\"line\">local port: 17452<\/div>\n<div class=\"line\">local port: 17453<\/div>\n<div class=\"line\">+++++++<\/div>\n<div class=\"line\">local port: 17455<\/div>\n<div class=\"line\">local port: 17456<\/div>\n<div class=\"line\">local port: 17457<\/div>\n<div class=\"line\">local port: 17458<\/div>\n<div class=\"line\">local port: 17460<\/div>\n<div class=\"line\">&#8212;&#8212;-<\/div>\n<div class=\"line\">local port: 17475<\/div>\n<div class=\"line\">local port: 17476<\/div>\n<div class=\"line\">local port: 17477<\/div>\n<div class=\"line\">local port: 17478<\/div>\n<div class=\"line\">local port: 17479<\/div>\n<div class=\"line\">Fri Nov 27 10:53:02 CST 2020<\/div>\n<div class=\"line\">local port: 17997<\/div>\n<div class=\"line\">local port: 17998<\/div>\n<div class=\"line\">local port: 17999<\/div>\n<div class=\"line\">local port: 18000<\/div>\n<div class=\"line\">local port: 18001<\/div>\n<div class=\"line\">+++++++<\/div>\n<div class=\"line\">local port: 18002<\/div>\n<div class=\"line\">local port: 18003<\/div>\n<div class=\"line\">local port: 18004<\/div>\n<div class=\"line\">local port: 18005<\/div>\n<div class=\"line\">local port: 18006<\/div>\n<div class=\"line\">******<\/div>\n<div class=\"line\">local port: 18010<\/div>\n<div class=\"line\">local port: 18011<\/div>\n<div class=\"line\">local port: 18012<\/div>\n<div class=\"line\">local port: 18013<\/div>\n<div class=\"line\">local port: 18014<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u4ece\u6d4b\u8bd5\u770b\u8d77\u6765linux\u4e0b\u7aef\u53e3\u9009\u62e9\u8ddf\u65f6\u95f4\u6709\u5173\u7cfb\uff0c\u8d77\u59cb\u7aef\u53e3\u80af\u5b9a\u662f\u987a\u5e8f\u589e\u52a0\uff0c\u8d77\u59cb\u7aef\u53e3\u5e94\u8be5\u662f\u5728Ephemeral Port\u8303\u56f4\u5185\u5e76\u4e14\u548c\u65f6\u95f4\u6233\u7ed1\u5b9a\u7684\u67d0\u4e2a\u503c\uff08\u4e5f\u662f\u9012\u589e\u7684\uff09\uff0c\u5373\u4f7f\u6ca1\u6709\u4f7f\u7528\u4efb\u4f55\u7aef\u53e3\uff0c\u8d77\u59cb\u7aef\u53e3\u4e5f\u4f1a\u968f\u65f6\u95f4\u589e\u52a0\u800c\u589e\u52a0\u3002<\/p>\n<h3 id=\"4-19-91-19-1-al7-x86-64\">4.19.91-19.1.al7.x86_64<\/h3>\n<p>\u6362\u4e2a\u5185\u6838\u7248\u672c\u7f16\u8bd1\u540e\uff0c\u6267\u884c(4.19.91-19.1.al7.x86_64)\uff1a<\/p>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<div class=\"line\">2<\/div>\n<div class=\"line\">3<\/div>\n<div class=\"line\">4<\/div>\n<div class=\"line\">5<\/div>\n<div class=\"line\">6<\/div>\n<div class=\"line\">7<\/div>\n<div class=\"line\">8<\/div>\n<div class=\"line\">9<\/div>\n<div class=\"line\">10<\/div>\n<div class=\"line\">11<\/div>\n<div class=\"line\">12<\/div>\n<div class=\"line\">13<\/div>\n<div class=\"line\">14<\/div>\n<div class=\"line\">15<\/div>\n<div class=\"line\">16<\/div>\n<div class=\"line\">17<\/div>\n<div class=\"line\">18<\/div>\n<div class=\"line\">19<\/div>\n<div class=\"line\">20<\/div>\n<div class=\"line\">21<\/div>\n<div class=\"line\">22<\/div>\n<div class=\"line\">23<\/div>\n<div class=\"line\">24<\/div>\n<div class=\"line\">25<\/div>\n<div class=\"line\">26<\/div>\n<div class=\"line\">27<\/div>\n<div class=\"line\">28<\/div>\n<div class=\"line\">29<\/div>\n<div class=\"line\">30<\/div>\n<div class=\"line\">31<\/div>\n<div class=\"line\">32<\/div>\n<div class=\"line\">33<\/div>\n<div class=\"line\">34<\/div>\n<div class=\"line\">35<\/div>\n<div class=\"line\">36<\/div>\n<div class=\"line\">37<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\">$date; .\/client &amp;&amp; echo &#8220;+++++++&#8221; ; .\/client &amp;&amp; sleep 0.1 ; echo &#8220;&#8212;&#8212;-&#8221; &amp;&amp; .\/client &amp;&amp; sleep 10; date; .\/client &amp;&amp; echo &#8220;+++++++&#8221; ; .\/client &amp;&amp; sleep 0.1 &amp;&amp; echo &#8220;******&#8221;; .\/client;<\/div>\n<div class=\"line\">Fri Nov 27 14:10:47 CST 2020<\/div>\n<div class=\"line\">local port: 7890<\/div>\n<div class=\"line\">local port: 7892<\/div>\n<div class=\"line\">local port: 7894<\/div>\n<div class=\"line\">local port: 7896<\/div>\n<div class=\"line\">local port: 7898<\/div>\n<div class=\"line\">+++++++<\/div>\n<div class=\"line\">local port: 7900<\/div>\n<div class=\"line\">local port: 7902<\/div>\n<div class=\"line\">local port: 7904<\/div>\n<div class=\"line\">local port: 7906<\/div>\n<div class=\"line\">local port: 7908<\/div>\n<div class=\"line\">&#8212;&#8212;-<\/div>\n<div class=\"line\">local port: 7910<\/div>\n<div class=\"line\">local port: 7912<\/div>\n<div class=\"line\">local port: 7914<\/div>\n<div class=\"line\">local port: 7916<\/div>\n<div class=\"line\">local port: 7918<\/div>\n<div class=\"line\">Fri Nov 27 14:10:57 CST 2020<\/div>\n<div class=\"line\">local port: 7966<\/div>\n<div class=\"line\">local port: 7968<\/div>\n<div class=\"line\">local port: 7970<\/div>\n<div class=\"line\">local port: 7972<\/div>\n<div class=\"line\">local port: 7974<\/div>\n<div class=\"line\">+++++++<\/div>\n<div class=\"line\">local port: 7976<\/div>\n<div class=\"line\">local port: 7978<\/div>\n<div class=\"line\">local port: 7980<\/div>\n<div class=\"line\">local port: 7982<\/div>\n<div class=\"line\">local port: 7984<\/div>\n<div class=\"line\">******<\/div>\n<div class=\"line\">local port: 7988<\/div>\n<div class=\"line\">local port: 7990<\/div>\n<div class=\"line\">local port: 7992<\/div>\n<div class=\"line\">local port: 7994<\/div>\n<div class=\"line\">local port: 7996<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u4ee5\u4e0a\u6d4b\u8bd5\u65f6\u7684\u53c2\u6570<\/p>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<div class=\"line\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\">$cat \/proc\/sys\/net\/ipv4\/ip_local_port_range<\/div>\n<div class=\"line\">1024 65535<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u5c061024\u6539\u62101025\u540e\uff0c\u5206\u914d\u51fa\u6765\u7684\u90fd\u662f\u5947\u6570\u7aef\u53e3\u4e86\uff1a<\/p>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<div class=\"line\">2<\/div>\n<div class=\"line\">3<\/div>\n<div class=\"line\">4<\/div>\n<div class=\"line\">5<\/div>\n<div class=\"line\">6<\/div>\n<div class=\"line\">7<\/div>\n<div class=\"line\">8<\/div>\n<div class=\"line\">9<\/div>\n<div class=\"line\">10<\/div>\n<div class=\"line\">11<\/div>\n<div class=\"line\">12<\/div>\n<div class=\"line\">13<\/div>\n<div class=\"line\">14<\/div>\n<div class=\"line\">15<\/div>\n<div class=\"line\">16<\/div>\n<div class=\"line\">17<\/div>\n<div class=\"line\">18<\/div>\n<div class=\"line\">19<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\">$cat \/proc\/sys\/net\/ipv4\/ip_local_port_range<\/div>\n<div class=\"line\">1025 1034<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">$.\/client<\/div>\n<div class=\"line\">local port: 1033<\/div>\n<div class=\"line\">local port: 1025<\/div>\n<div class=\"line\">local port: 1027<\/div>\n<div class=\"line\">local port: 1029<\/div>\n<div class=\"line\">local port: 1031<\/div>\n<div class=\"line\">local port: 1033<\/div>\n<div class=\"line\">local port: 1025<\/div>\n<div class=\"line\">local port: 1027<\/div>\n<div class=\"line\">local port: 1029<\/div>\n<div class=\"line\">local port: 1031<\/div>\n<div class=\"line\">local port: 1033<\/div>\n<div class=\"line\">local port: 1025<\/div>\n<div class=\"line\">local port: 1027<\/div>\n<div class=\"line\">local port: 1029<\/div>\n<div class=\"line\">local port: 1031<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u4e4b\u6240\u4ee5\u90fd\u662f\u5076\u6570\u7aef\u53e3\uff0c\u662f\u56e0\u4e3aport_range \u4ece\u5076\u6570\u5f00\u59cb, \u6bcf\u6b21\u4ece++\u53d8\u5230+2\u7684<a href=\"https:\/\/github.com\/plantegg\/linux\/commit\/1580ab63fc9a03593072cc5656167a75c4f1d173\" target=\"_blank\" rel=\"external noopener\">\u539f\u56e0<\/a>\uff0cconnect\u6311\u9009\u968f\u673a\u7aef\u53e3\u65f6\u90fd\u662f\u5728\u8d77\u59cb\u7aef\u53e3\u7684\u57fa\u7840\u4e0a+2\uff0c\u800cbind\u6311\u9009\u968f\u673a\u7aef\u53e3\u7684\u8d77\u59cb\u7aef\u53e3\u662f\u7cfb\u7edfport_range\u8d77\u59cb\u7aef\u53e3+1\uff08\u8fd9\u6837\u548cconnect\u9519\u5f00\uff09\uff0c\u7136\u540e\u6bcf\u6b21\u4ecd\u7136\u5c1d\u8bd5+2\uff0c\u8fd9\u6837connect\u548cbind\u57fa\u672c\u4e00\u4e2a\u7528\u5076\u6570\u53e6\u5916\u4e00\u4e2a\u5c31\u7528\u5947\u6570\uff0c\u4e00\u65e6\u4e0d\u591f\u4e86\u518d\u5c1d\u8bd5\u4f7f\u7528\u53e6\u5916\u4e00\u7ec4<\/p>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<div class=\"line\">2<\/div>\n<div class=\"line\">3<\/div>\n<div class=\"line\">4<\/div>\n<div class=\"line\">5<\/div>\n<div class=\"line\">6<\/div>\n<div class=\"line\">7<\/div>\n<div class=\"line\">8<\/div>\n<div class=\"line\">9<\/div>\n<div class=\"line\">10<\/div>\n<div class=\"line\">11<\/div>\n<div class=\"line\">12<\/div>\n<div class=\"line\">13<\/div>\n<div class=\"line\">14<\/div>\n<div class=\"line\">15<\/div>\n<div class=\"line\">16<\/div>\n<div class=\"line\">17<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\">$cat \/proc\/sys\/net\/ipv4\/ip_local_port_range<\/div>\n<div class=\"line\">1024 1047<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">$.\/bind &amp; &#8212;bind\u7a0b\u5e8f\u968f\u673a\u6311\u90095\u4e2a\u7aef\u53e3<\/div>\n<div class=\"line\">port number 1039<\/div>\n<div class=\"line\">port number 1043<\/div>\n<div class=\"line\">port number 1045<\/div>\n<div class=\"line\">port number 1041<\/div>\n<div class=\"line\">port number 1047 &#8211;\u7528\u5b8c\u6240\u6709\u5947\u6570\u7aef\u53e3<\/div>\n<div class=\"line\"><\/div>\n<div class=\"line\">$.\/bind &amp; &#8211;\u7ee7\u7eed\u6311\u9009\u5076\u6570\u7aef\u53e3<\/div>\n<div class=\"line\">[8] 4170<\/div>\n<div class=\"line\">port number 1044<\/div>\n<div class=\"line\">port number 1042<\/div>\n<div class=\"line\">port number 1046<\/div>\n<div class=\"line\">port number 0 &#8211;\u5b9e\u5728\u6ca1\u6709\u4e86<\/div>\n<div class=\"line\">port number 0<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u53ef\u89c14.19\u5185\u6838\u4e0b\u6bcf\u6b21port\u662f+2\uff0c\u57283.10\u5185\u6838\u7248\u672c\u4e2d\u662f+1. \u5e76\u4e14\u90fd\u662f\u9012\u589e\u7684\uff0c\u540c\u65f6\u5373\u4f7fport\u4e0d\u4f7f\u7528\uff0c\u4e5f\u4f1a\u968f\u7740\u65f6\u95f4\u7684\u53d8\u5316\u8fd9\u4e2a\u8d77\u59cbport\u589e\u5927\u3002<\/p>\n<p>Port Range\u6709\u70b9\u50cf\u96f7\u8fbe\u8f6c\u76d8\u6570\u5b57\uff0c\u65f6\u95f4\u5c31\u50cf\u662f\u96f7\u8fbe\u4e0a\u7684\u626b\u63cf\u6307\u9488\uff0c\u8fd9\u4e2a\u6307\u9488\u4e0d\u505c\u5730\u65cb\u8f6c\uff0c\u5982\u679c\u8fd9\u4e2a\u65f6\u5019\u521a\u597d\u6709\u5e94\u7528\u8981\u7533\u8bf7Port\uff0c\u90a3\u4e48\u5c31\u4ece\u6307\u9488\u6b63\u597d\u6307\u5411\u7684Port\u5f00\u59cb\u5411\u540e\u641c\u7d22\u53ef\u7528port<\/p>\n<h2 id=\"tcp-max-tw-buckets\">tcp_max_tw_buckets<\/h2>\n<p>tcp_max_tw_buckets: \u5728 TIME_WAIT \u6570\u91cf\u7b49\u4e8e tcp_max_tw_buckets \u65f6\uff0c\u65b0\u7684\u8fde\u63a5\u65ad\u5f00\u4e0d\u518d\u8fdb\u5165TIME_WAIT\u9636\u6bb5\uff0c\u800c\u662f\u76f4\u63a5\u65ad\u5f00\uff0c\u5e76\u6253\u5370warnning.<\/p>\n<p>\u5b9e\u9645\u6d4b\u8bd5\u53d1\u73b0 \u5728 TIME_WAIT \u6570\u91cf\u7b49\u4e8e tcp_max_tw_buckets \u65f6 \u65b0\u7684\u8fde\u63a5\u4ecd\u7136\u53ef\u4ee5\u4e0d\u65ad\u5730\u521b\u5efa\u548c\u65ad\u5f00\uff0c\u8fd9\u4e2a\u53c2\u6570\u5927\u5c0f\u4e0d\u4f1a\u5f71\u54cd\u6027\u80fd\uff0c\u53ea\u662f\u5f71\u54cdTIME_WAIT \u6570\u91cf\u7684\u5c55\u793a\uff08\u5f53\u7136 TIME_WAIT \u592a\u591a\u5bfc\u81f4local port\u4e0d\u591f\u9664\u5916\uff09, \u8fd9\u4e2a\u503c\u8bbe\u7f6e\u5c0f\u4e00\u70b9\u4f1a\u907f\u514d\u51fa\u73b0\u7aef\u53e3\u4e0d\u591f\u7684\u60c5\u51b5<\/p>\n<blockquote><p>tcp_max_tw_buckets &#8211; INTEGER<br \/>\nMaximal number of timewait sockets held by system simultaneously.If this number is exceeded time-wait socket is immediately destroyed and warning is printed. This limit exists only to prevent simple DoS attacks, you\u00a0<em>must<\/em>\u00a0not lower the limit artificially, but rather increase it (probably, after increasing installed memory), if network conditions require more than default value.<\/p><\/blockquote>\n<h2 id=\"SO-LINGER\"><a href=\"https:\/\/notes.shichao.io\/unp\/ch7\/\" target=\"_blank\" rel=\"external noopener\">SO_LINGER<\/a><\/h2>\n<p>SO_LINGER\u9009\u9879<strong>\u7528\u6765\u8bbe\u7f6e\u5ef6\u8fdf\u5173\u95ed\u7684\u65f6\u95f4\uff0c\u7b49\u5f85\u5957\u63a5\u5b57\u53d1\u9001\u7f13\u51b2\u533a\u4e2d\u7684\u6570\u636e\u53d1\u9001\u5b8c\u6210<\/strong>\u3002 \u6ca1\u6709\u8bbe\u7f6e\u8be5\u9009\u9879\u65f6\uff0c\u5728\u8c03\u7528close() \u540e\uff0c\u5728\u53d1\u9001\u5b8cFIN\u540e\u4f1a\u7acb\u5373\u8fdb\u884c\u4e00\u4e9b\u6e05\u7406\u5de5\u4f5c\u5e76\u8fd4\u56de\u3002 \u5982\u679c\u8bbe\u7f6e\u4e86SO_LINGER\u9009\u9879\uff0c\u5e76\u4e14\u7b49\u5f85\u65f6\u95f4\u4e3a\u6b63\u503c\uff0c\u5219\u5728\u6e05\u7406\u4e4b\u524d\u4f1a\u7b49\u5f85\u4e00\u6bb5\u65f6\u95f4\u3002<\/p>\n<p>\u5982\u679c\u628a\u5ef6\u65f6\u8bbe\u7f6e\u4e3a 0 \u65f6\uff0cSocket\u5c31\u4e22\u5f03\u6570\u636e\uff0c\u5e76\u5411\u5bf9\u65b9\u53d1\u9001\u4e00\u4e2a\u00a0<code>RST<\/code>\u00a0\u6765\u7ec8\u6b62\u8fde\u63a5\uff0c\u56e0\u4e3a\u8d70\u7684\u662f RST \u5305\uff0c\u6240\u4ee5\u5c31\u4e0d\u4f1a\u6709\u00a0<code>TIME_WAIT<\/code>\u00a0\u4e86\u3002<\/p>\n<blockquote><p>This option specifies how the\u00a0<code>close<\/code>\u00a0function operates for a connection-oriented protocol (for TCP, but not for UDP). By default,\u00a0<code>close<\/code>\u00a0returns immediately, but ==if there is any data still remaining in the socket send buffer, the system will try to deliver the data to the peer==.<\/p><\/blockquote>\n<p>SO_LINGER \u6709\u4e09\u79cd\u60c5\u51b5<\/p>\n<ol>\n<li>l_onoff \u4e3afalse\uff080\uff09\uff0c \u90a3\u4e48 l_linger \u7684\u503c\u6ca1\u6709\u610f\u4e49\uff0csocket\u4e3b\u52a8\u8c03\u7528close\u65f6\u4f1a\u7acb\u5373\u8fd4\u56de\uff0c\u64cd\u4f5c\u7cfb\u7edf\u4f1a\u5c06\u6b8b\u7559\u5728\u7f13\u51b2\u533a\u4e2d\u7684\u6570\u636e\u53d1\u9001\u5230\u5bf9\u7aef\uff0c\u5e76\u6309\u7167\u6b63\u5e38\u6d41\u7a0b\u5173\u95ed(\u4ea4\u6362FIN-ACK\uff09\uff0c\u6700\u540e\u8fde\u63a5\u8fdb\u5165<code>TIME_WAIT<\/code>\u72b6\u6001\u3002<strong>\u8fd9\u662f\u9ed8\u8ba4\u60c5\u51b5<\/strong><\/li>\n<li>l_onoff \u4e3atrue\uff08\u975e0\uff09\uff0c l_linger \u4e3a0\uff0c\u4e3b\u52a8\u8c03\u7528close\u7684\u4e00\u65b9\u4e5f\u662f\u7acb\u523b\u8fd4\u56de\uff0c\u4f46\u662f\u8fd9\u65f6TCP\u4f1a\u4e22\u5f03\u53d1\u9001\u7f13\u51b2\u4e2d\u7684\u6570\u636e\uff0c\u800c\u4e14\u4e0d\u662f\u6309\u7167\u6b63\u5e38\u6d41\u7a0b\u5173\u95ed\u8fde\u63a5\uff08\u4e0d\u53d1\u9001FIN\u5305\uff09\uff0c\u76f4\u63a5\u53d1\u9001<code>RST<\/code>\uff0c\u8fde\u63a5\u4e0d\u4f1a\u8fdb\u5165 time_wait \u72b6\u6001\uff0c\u5bf9\u7aef\u4f1a\u6536\u5230\u00a0<code>java.net.SocketException: Connection reset<\/code>\u5f02\u5e38<\/li>\n<li>l_onoff \u4e3atrue\uff08\u975e0\uff09\uff0c l_linger \u4e5f\u4e3a\u975e 0\uff0c\u8fd9\u8868\u793a\u00a0<code>SO_LINGER<\/code>\u9009\u9879\u751f\u6548\uff0c\u5e76\u4e14\u8d85\u65f6\u65f6\u95f4\u5927\u4e8e\u96f6\uff0c\u8fd9\u65f6\u8c03\u7528close\u7684\u7ebf\u7a0b\u88ab\u963b\u585e\uff0cTCP\u4f1a\u53d1\u9001\u7f13\u51b2\u533a\u4e2d\u7684\u6b8b\u7559\u6570\u636e\uff0c\u8fd9\u65f6\u6709\u4e24\u79cd\u53ef\u80fd\u7684\u60c5\u51b5\uff1a\n<ul>\n<li>\u6570\u636e\u53d1\u9001\u5b8c\u6bd5\uff0c\u6536\u5230\u5bf9\u65b9\u7684ACK\uff0c\u7136\u540e\u8fdb\u884c\u8fde\u63a5\u7684\u6b63\u5e38\u5173\u95ed\uff08\u4ea4\u6362FIN-ACK\uff09<\/li>\n<li>\u8d85\u65f6\uff0c\u672a\u53d1\u9001\u5b8c\u6210\u7684\u6570\u636e\u88ab\u4e22\u5f03\uff0c\u8fde\u63a5\u53d1\u9001<code>RST<\/code>\u8fdb\u884c\u975e\u6b63\u5e38\u5173\u95ed<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<div class=\"line\">2<\/div>\n<div class=\"line\">3<\/div>\n<div class=\"line\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\">struct linger {<\/div>\n<div class=\"line\">int l_onoff; \/* 0=off, nonzero=on *\/<\/div>\n<div class=\"line\">int l_linger; \/* linger time, POSIX specifies units as seconds *\/<\/div>\n<div class=\"line\">};<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h3 id=\"NIO\u4e0b\u8bbe\u7f6e-SO-LINGER-\u7684\u9519\u8bef\u6848\u4f8b\">NIO\u4e0b\u8bbe\u7f6e SO_LINGER \u7684\u9519\u8bef\u6848\u4f8b<\/h3>\n<p>\u5728\u4f7f\u7528NIO\u65f6\uff0c\u6700\u597d\u4e0d\u8bbe\u7f6e<code>SO_LINGER<\/code>\u3002\u6bd4\u5982Tomcat\u670d\u52a1\u7aef\u63a5\u6536\u5230\u8bf7\u6c42\u521b\u5efa\u65b0\u8fde\u63a5\u65f6\uff0c\u505a\u4e86\u8fd9\u6837\u7684\u8bbe\u7f6e\uff1a<\/p>\n<figure class=\"highlight plain\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"line\">SocketChannel.setOption(SocketOption.SO_LINGER, 1000)<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p><code>SO_LINGER<\/code>\u7684\u5355\u4f4d\u4e3a<code>\u79d2<\/code>\uff01\u5728\u7f51\u7edc\u73af\u5883\u6bd4\u8f83\u597d\u7684\u65f6\u5019\uff0c\u4f8b\u5982\u5ba2\u6237\u7aef\u3001\u670d\u52a1\u5668\u90fd\u90e8\u7f72\u5728\u540c\u4e00\u4e2a\u673a\u623f\uff0cclose\u867d\u7136\u4f1a\u88ab\u963b\u585e\uff0c\u4f46\u65f6\u95f4\u6781\u77ed\u53ef\u4ee5\u5ffd\u7565\u3002\u4f46\u5f53\u7f51\u7edc\u73af\u5883\u4e0d\u90a3\u4e48\u597d\u65f6\uff0c\u4f8b\u5982\u5b58\u5728\u4e22\u5305\u3001\u8f83\u957f\u7684\u7f51\u7edc\u5ef6\u8fdf\uff0cbuffer\u4e2d\u7684\u6570\u636e\u4e00\u76f4\u65e0\u6cd5\u53d1\u9001\u6210\u529f\uff0c\u90a3\u4e48\u95ee\u9898\u5c31\u51fa\u73b0\u4e86\uff1a<code>close\u4f1a\u88ab\u963b\u585e\u8f83\u957f\u7684\u65f6\u95f4\uff0c\u4ece\u800c\u76f4\u63a5\u6216\u95f4\u63a5\u5f15\u8d77NIO\u7684IO\u7ebf\u7a0b\u88ab\u963b\u585e<\/code>\uff0c\u670d\u52a1\u5668\u4f1a\u4e0d\u54cd\u5e94\uff0c\u4e0d\u80fd\u5904\u7406accept\u3001read\u3001write\u7b49\u4efb\u4f55IO\u4e8b\u4ef6\u3002\u4e5f\u5c31\u662f\u5e94\u7528\u9891\u7e41\u51fa\u73b0\u6302\u8d77\u73b0\u8c61\u3002\u89e3\u51b3\u65b9\u6cd5\u5c31\u662f\u5220\u6389\u8fd9\u4e2a\u8bbe\u7f6e\uff0cclose\u65f6\u7acb\u5373\u8fd4\u56de\uff0c\u7531\u64cd\u4f5c\u7cfb\u7edf\u63a5\u624b\u540e\u9762\u7684\u5de5\u4f5c\u3002<\/p>\n<p>\u8fd9\u65f6\u4f1a\u770b\u5230\u5982\u4e0b\u8fde\u63a5\u72b6\u6001<\/p>\n<p><a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220721100246598.png\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220721100246598.png\" alt=\"image-20220721100246598\" \/><\/a><\/p>\n<p>\u4ee5\u53ca\u5bf9\u5e94\u7684\u5806\u6808<\/p>\n<p><a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220721100421130.png\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220721100421130.png\" alt=\"image-20220721100421130\" \/><\/a><\/p>\n<p>\u67e5\u770b\u5176\u4e2d\u4e00\u4e2aIO\u7ebf\u7a0b\u7b49\u5f85\u7684\u9501\uff0c\u53d1\u73b0\u9501\u662f\u88abHTTP\u7ebf\u7a0b\u6301\u6709\u3002\u8fd9\u4e2a\u7ebf\u7a0b\u6b63\u5728\u6267\u884c<code>preClose0<\/code>\uff0c\u5c31\u662f\u5728\u8fd9\u91cc\u7b49\u5f85\u8fde\u63a5\u7684\u5173\u95ed<a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220721100446521.png\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220721100446521.png\" alt=\"image-20220721100446521\" \/><\/a><\/p>\n<p>\u6bcf\u6b21HTTP\u7ebf\u7a0b\u5728\u5173\u95ed\u8fde\u63a5\u88ab\u963b\u585e\u65f6\uff0c\u540c\u65f6\u6301\u6709\u4e86<code>SocketChannelImpl<\/code>\u7684\u5bf9\u8c61\u9501\uff0c\u800cIO\u7ebf\u7a0b\u5728\u628a\u8fd9\u4e2a\u8fde\u63a5\u79fb\u9664\u51fa\u5b83\u7684selector\u7ba1\u7406\u961f\u5217\u65f6\uff0c\u4e5f\u8981\u83b7\u5f97\u540c\u4e00\u4e2a<code>SocketChannelImpl<\/code>\u7684\u5bf9\u8c61\u9501\u3002IO\u7ebf\u7a0b\u5c31\u8fd9\u4e48\u4e00\u6b21\u6b21\u7684\u88ab\u963b\u585e\uff0c\u60b2\u5267\u7684\u65e0\u4ee5\u590d\u52a0\u3002\u6709\u4e9bNIO\u6846\u67b6\u4f1a\u8ba9IO\u7ebf\u7a0b\u53bb\u505aclose\uff0c\u8fd9\u65f6\u5019\u5c31\u66f4\u52a0\u60b2\u5267\u4e86\u3002<\/p>\n<p><strong>\u603b\u4e4b\u8fd9\u91cc\u7684\u9519\u8bef\u539f\u56e0\u6709\u4e24\u70b9\uff1a1\uff09\u7f51\u7edc\u72b6\u6001\u4e0d\u597d\uff1b2\uff09\u9519\u8bef\u7406\u89e3\u4e86l_linger \u7684\u5355\u4f4d\uff0c\u662f\u79d2\uff0c\u4e0d\u662f\u6beb\u79d2\u3002 \u5728\u8fd9\u4e24\u4e2a\u539f\u56e0\u7684\u5171\u540c\u4f5c\u7528\u4e0b\u5bfc\u81f4\u4e86\u6570\u636e\u8fdf\u8fdf\u4e0d\u80fd\u53d1\u9001\u5b8c\u6bd5\uff0cl_linger \u8d85\u65f6\u53c8\u9700\u8981\u5f88\u4e45\uff0c\u6240\u4ee5\u670d\u52a1\u4f1a\u51fa\u73b0\u4e00\u76f4\u963b\u585e\u7684\u72b6\u6001\u3002<\/strong><\/p>\n<h2 id=\"\u4e3a\u4ec0\u4e48\u8981\u6709-time-wait-\u72b6\u6001\">\u4e3a\u4ec0\u4e48\u8981\u6709 time_wait \u72b6\u6001<\/h2>\n<blockquote><p>TIME-WAIT &#8211; represents waiting for enough time to pass to be sure the remote TCP received the acknowledgment of its connection termination request.<\/p><\/blockquote>\n<p><a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220721093116395.png\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220721093116395.png\" alt=\"alt text\" \/><\/a><\/p>\n<h2 id=\"\u7531Nginx-SY-CPU\u9ad8\u8d1f\u8f7d\u5f15\u53d1\u5185\u6838\u63a2\u7d22\u4e4b\u65c5\"><a href=\"https:\/\/mp.weixin.qq.com\/s\/njpdTW5TndO4-H7nbEpXAA\" target=\"_blank\" rel=\"external noopener\">\u7531Nginx SY CPU\u9ad8\u8d1f\u8f7d\u5f15\u53d1\u5185\u6838\u63a2\u7d22\u4e4b\u65c5<\/a><\/h2>\n<p>\u8fd9\u4e2a\u6848\u4f8b\u6765\u81ea\u817e\u8baf7\u5c42\u7f51\u5173\u56e2\u961f\uff0c\u7f51\u5173\u7528\u7684Nginx\uff0c\u8bf7\u6c42\u8f6c\u53d1\u7ed9\u540e\u9762\u7684\u88ab\u4ee3\u7406\u673a\u5668(RS:real server)\uff0c\u53d1\u73b0 sys CPU\u5f02\u5e38\u9ad8\uff0cCPU\u90fd\u7528\u5728\u641c\u7d22\u53ef\u7528\u7aef\u53e3.<\/p>\n<p><a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/640-8259033.png\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/640-8259033.png\" alt=\"Image\" \/><\/a><\/p>\n<p><a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/640-20221112211814567.png\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/640-20221112211814567.png\" alt=\"Image\" \/><\/a><\/p>\n<p>local port \u4e0d\u591f\u7684\u65f6\u5019inet_hash_connect \u4e2d\u7684spin_lock \u4f1a\u6d88\u8017\u8fc7\u9ad8\u7684 sys\uff08\u7279\u522b\u6ce8\u610f4.6\u5185\u6838\u540e local port \u5206\u5947\u5076\u6570\uff0c\u6bcf\u6b21loop+2\uff0c\u6240\u4ee5\u66f4\u5bb9\u6613\u89e6\u53d1port\u4e0d\u591f\u7684\u573a\u666f\uff09<\/p>\n<p>\u6838\u5fc3\u539f\u56e0\u603b\u7ed3: 4.6\u540e\u5185\u6838\u628a\u672c\u5730\u7aef\u53e3\u5206\u6210\u5947\u5076\u6570\uff0c\u5947\u6570\u7ed9connect, \u5076\u6570\u7ed9listen\uff0c\u672c\u6765\u7aef\u53e3\u67096\u4e07\uff0c\u8fd9\u6837connect\u53ea\u5269\u4e0b3\u4e07\uff0c\u5f53\u8fd93\u4e07\u7528\u5b8c\u540e\u4e5f\u4e0d\u4f1a\u62a5\u627e\u4e0d\u5230\u672c\u5730\u53ef\u7528\u7aef\u53e3\u7684\u9519\u8bef(\u8fd9\u91cc\u62a5\u9519\u53ef\u80fd\u66f4\u597d)\uff0c\u800c\u662f\u5728\u5947\u6570\u91cc\u627e\u4e0d\u5230\u5c31\u627e\u5076\u6570\u91cc\u7684\uff0c\u6bcf\u6b21\u90fd\u8fd9\u6837\u3002 \u6ca1\u6539\u4ee5\u524d\uff0c\u603b\u51716\u4e07\u7aef\u53e3\uff0c\u7528\u63893\u4e07\uff0c\u4e0d\u5206\u5947\u5076\u7684\u8bdd\u90a3\u4e48\u6bcf\u627e\u4e24\u4e2a\u7aef\u53e3\u5c31\u6709\u4e00\u4e2a\u80fd\u7528\uff0c\u4e5f\u5c31\u662f50%\u7684\u6982\u7387\u3002\u4f46\u662f\u6539\u4e86\u65b0\u7684\u5b9e\u73b0\u65b9\u6848\u540e\uff0c\u6bcf\u6b21\u5148\u8981\u627e\u5947\u6570\u76843\u4e07\u4e2a\uff0c\u5168\u90e8\u5728\u7528\uff0c\u7136\u540e\u5230\u5076\u6570\u91cc\u7ee7\u7eed\u627e\u5230\u7b2c30001\u4e2a\u624d\u662f\u53ef\u7528\u7684\uff0c\u4e5f\u5c31\u662f\u627e\u5230\u7684\u6982\u7387\u53d8\u6210\u4e863\u4e07\u5206\u4e4b\u4e00\uff0c\u4e00\u4e0b\u5b50\u590d\u6742\u5ea6\u9ad8\u4e8615000\u500d\uff0c\u4e0d\u6162\u624d\u602a \u5982\u679c\u4f60\u5bf9<\/p>\n<p>\u6211\u7684\u770b\u6cd5\uff0c\u8fd9\u4e2a\u5206\u5947\u5076\u6570\u7684\u5b9e\u73b0\u5c31\u662f\u5751\u7239\u8d27\uff0c\u5728\u5185\u6838\u91cc\u80e1\u4e71\u641e\uff0c\u4e3a\u4e86\u4e00\u4e2a\u5c0f\u573a\u666f\u641e\u5d29\u5927\u591a\u6570\u6b63\u5e38\u573a\u666f\uff0c\u771f\u6ca1\u5fc5\u8981\uff0c\u5f53\u7136\u6211\u8fd9\u662f\u4e8b\u540e\u8bf8\u845b\u4eae\uff0c\u5982\u679c\u5f53\u65f6\u8fd9\u79cdfeature\u62ff\u7ed9\u6211\u770b\u6211\u4e5f\u4f1a\u8ba4\u4e3a\u5f88\u4e0d\u9519\uff0c\u60f3\u4e0d\u5230\u8fd9\u4e2a\u5751\u70b9\uff01<\/p>\n<h2 id=\"\u4eceSTGW\u6d41\u91cf\u4e0b\u964d\u63a2\u79d8\u5185\u6838\u6536\u5305\u673a\u5236\"><a href=\"https:\/\/mp.weixin.qq.com\/s?__biz=MjM5ODYwMjI2MA==&amp;mid=2649745268&amp;idx=1&amp;sn=f72f164847060d7b19cba272a38485e5&amp;scene=21#wechat_redirect\" target=\"_blank\" rel=\"external noopener\">\u4eceSTGW\u6d41\u91cf\u4e0b\u964d\u63a2\u79d8\u5185\u6838\u6536\u5305\u673a\u5236<\/a><\/h2>\n<p>listen port search\u6d88\u8017CPU\u5f02\u5e38\u9ad8<\/p>\n<p><a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/640-9840722.jpeg\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/640-9840722.jpeg\" alt=\"\u56fe\u7247\" \/><\/a><\/p>\n<p>\u5728\u6b63\u5e38\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u5668\u7684listen port\u6570\u91cf\uff0c\u5927\u6982\u5c31\u662f\u51e0w\u4e2a\u8fd9\u6837\u7684\u91cf\u7ea7\u3002\u8fd9\u79cd\u91cf\u7ea7\u4e0b\uff0c\u4e00\u4e2aport\u5bf9\u5e94\u4e00\u4e2asocket\uff0c\u54c8\u5e0c\u6876\u5927\u5c0f\u4e3a32\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\u3002<\/p>\n<p>\u7136\u800c\u5728\u5185\u6838\u652f\u6301\u4e86reuseport\u5e76\u4e14\u88ab\u5e7f\u6cdb\u4f7f\u7528\u540e\uff0c\u60c5\u51b5\u5c31\u4e0d\u4e00\u6837\u4e86\uff0c<strong>\u5728\u591a\u8fdb\u7a0b\u67b6\u6784\u91cc\uff0clisten port\u5bf9\u5e94\u7684socket\u6570\u91cf\uff0c\u662f\u4f1a\u88ab\u51e0\u5341\u500d\u7684\u653e\u5927\u7684\u3002<\/strong>\u4ee5\u5e94\u7528\u5c42\u76d1\u542c\u4e865000\u4e2a\u7aef\u53e3\uff0creuseport \u4f7f\u7528\u4e8650\u4e2acpu\u6838\u5fc3\u4e3a\u4f8b\uff0c5000*50\/32\u7ea6\u7b49\u4e8e7812\uff0c\u610f\u5473\u7740\u6bcf\u6b21\u63e1\u624b\u5305\u5230\u6765\u65f6\uff0c\u5149\u662f\u67e5\u627elisten socket\uff0c\u5c31\u9700\u8981\u904d\u53867800\u591a\u6b21\u3002\u968f\u7740\u673a\u5668\u786c\u4ef6\u6027\u80fd\u8d8a\u6765\u8d8a\u5f3a\uff0c\u5e94\u7528\u5c42\u4f7f\u7528\u7684cpu\u6570\u91cf\u589e\u591a\uff0c\u8fd9\u4e2a\u95ee\u9898\u8fd8\u4f1a\u7ee7\u7eed\u52a0\u5267\u3002<\/p>\n<p><strong>\u6b63\u56e0\u4e3a\u4e0a\u8ff0\u539f\u56e0\uff0c\u5e76\u4e14\u6211\u4eec\u73b0\u7f51\u673a\u5668\u5f00\u542f\u4e86reuseport\uff0c\u5728\u7aef\u53e3\u6570\u91cf\u8f83\u591a\u7684\u673a\u5668\u91cc\uff0cinet_lookup_listener\u7684\u54c8\u5e0c\u6876\u5927\u5c0f\u592a\u5c0f\uff0c\u904d\u5386\u8fc7\u7a0b\u6d88\u8017\u4e86cpu\uff0c\u5bfc\u81f4\u51fa\u73b0\u4e86\u51fd\u6570\u70ed\u70b9\u3002<\/strong><\/p>\n<h2 id=\"\u77ed\u8fde\u63a5\u7684\u5f00\u9500\">\u77ed\u8fde\u63a5\u7684\u5f00\u9500<\/h2>\n<p>\u7528ab\u901a\u8fc7\u77ed\u8fde\u63a5\u8d70 lo \u7f51\u5361\u538b\u672c\u673a nginx\uff0cCPU0\u662f ab \u8fdb\u7a0b\uff0cCPU3\/4 \u662f Nginx \u670d\u52a1\uff0c\u53ef\u4ee5\u770b\u5230 si \u975e\u5e38\u9ad8\uff0cQPS 2.2\u4e07<\/p>\n<p><a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220627154822263.png\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220627154822263.png\" alt=\"image-20220627154822263\" \/><\/a><\/p>\n<p>\u518d\u5c06 ab \u6539\u7528\u957f\u8fde\u63a5\u6765\u538b\uff0c\u53ef\u4ee5\u770b\u5230si\u3001sy\u90fd\u6709\u4e0b\u964d\uff0c\u5e76\u4e14 si \u4e0b\u964d\u5230\u77ed\u8fde\u63a5\u768420%\uff0cQPS \u8fd8\u80fd\u63d0\u5347\u5230 5.2\u4e07<\/p>\n<p><a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220627154931495.png\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/image-20220627154931495.png\" alt=\"image-20220627154931495\" \/><\/a><\/p>\n<h2 id=\"\u4e00\u6761\u8fde\u63a5\u7684\u5f00\u9500\"><a href=\"https:\/\/mp.weixin.qq.com\/s\/BwddYkVLSYlkKFNeA-NUVg\" target=\"_blank\" rel=\"external noopener\">\u4e00\u6761\u8fde\u63a5\u7684\u5f00\u9500<\/a><\/h2>\n<p>\u4e3b\u8981\u662f\u5185\u5b58\u5f00\u9500(\u5982\u56fe\uff0c\u6765\u6e90\u89c1\u6c34\u5370)\uff0c\u53e6\u5916\u5c31\u662f\u6bcf\u4e2a\u8fde\u63a5\u90fd\u4f1a\u5360\u7528\u4e00\u4e2a\u6587\u4ef6\u53e5\u67c4\uff0c\u53ef\u4ee5\u901a\u8fc7\u53c2\u6570\u6765\u8bbe\u7f6e\uff1afs.nr_open\u3001nofile\uff08\u5176\u5b9e nofile \u8fd8\u5206 soft \u548c hard\uff09 \u548c fs.file-max<\/p>\n<p><a class=\"fancybox fancybox.image\" href=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/640-20220413134252639\" rel=\"group\"><img decoding=\"async\" src=\"https:\/\/plantegg.github.io\/images\/951413iMgBlog\/640-20220413134252639\" alt=\"Image\" \/><\/a><\/p>\n<p>\u4ece\u4e0a\u56fe\u53ef\u4ee5\u770b\u5230\uff1a<\/p>\n<ul>\n<li>\u6ca1\u6709\u6536\u53d1\u6570\u636e\u7684\u65f6\u5019\u6536\u53d1buffer\u4e0d\u7528\u63d0\u524d\u5206\u914d\uff0c3K\u591a\u70b9\u7684\u5185\u5b58\u662f\u6307\u4e00\u4e2a\u8fde\u63a5\u7684\u5143\u4fe1\u606f\u6570\u636e\u7a7a\u95f4\uff0c\u4e0d\u5305\u542b\u4f20\u8f93\u6570\u636e\u7684\u5185\u5b58buffer<\/li>\n<li>\u5ba2\u6237\u7aef\u53d1\u9001\u6570\u636e\u540e\uff0c\u4f1a\u6839\u636e\u6570\u636e\u5927\u5c0f\u5206\u914dsend buffer\uff08\u4e00\u822c\u4e0d\u8d85\u8fc7wmem\uff0c\u9ed8\u8ba4kernel\u4f1a\u6839\u636e\u7cfb\u7edf\u5185\u5b58\u538b\u529b\u6765\u8c03\u6574send buffer\u5927\u5c0f)<\/li>\n<li>server\u7aefkernel\u6536\u5230\u6570\u636e\u540e\u5b58\u653e\u5728rmem\u4e2d\uff0c\u5e94\u7528\u8bfb\u8d70\u540e\u5c31\u4f1a\u91ca\u653e\u5bf9\u5e94\u7684rmem<\/li>\n<li>rmem\u548cwmem\u90fd\u4e0d\u4f1a\u91cd\u7528\uff0c\u7528\u65f6\u5206\u914d\u7528\u5b8c\u91ca\u653e<\/li>\n<\/ul>\n<p>\u53ef\u89c1\uff0c\u5185\u6838\u5728 socket \u5185\u5b58\u5f00\u9500\u4f18\u5316\u4e0a\u91c7\u53d6\u4e86\u4e0d\u5c11\u65b9\u6cd5:<\/p>\n<ul>\n<li>\u5185\u6838\u4f1a\u5c3d\u91cf\u53ca\u65f6\u56de\u6536\u53d1\u9001\u7f13\u5b58\u533a\u3001\u63a5\u6536\u7f13\u5b58\u533a\uff0c\u4f46\u9ad8\u7248\u672c\u505a\u7684\u66f4\u597d<\/li>\n<li>\u53d1\u9001\u63a5\u6536\u7f13\u5b58\u533a\u6700\u5c0f\u5e76\u4e00\u5b9a\u4e0d\u662f rmem \u5185\u6838\u53c2\u6570\u91cc\u7684\u6700\u5c0f\u503c\uff0c\u5b9e\u9645\u5927\u90e8\u5206\u65f6\u95f4\u90fd\u662f0<\/li>\n<li>\u5176\u5b83\u72b6\u6001\u4e0b\uff0c\u4f8b\u5982\u5bf9\u4e8eTIME_WAIT\u8fd8\u4f1a\u56de\u6536\u975e\u5fc5\u8981\u7684 socket_alloc \u7b49\u5bf9\u8c61<\/li>\n<\/ul>\n<h2 id=\"\u53ef\u7528-local-port-\u4e0d\u591f\u5bfc\u81f4\u5bf9\u7aeftime-wait-\u8fde\u63a5\u91cd\u7528\u8fdb\u800c\u5361\u987f\u6848\u4f8b\"><a href=\"https:\/\/ata.alibaba-inc.com\/articles\/251853\" target=\"_blank\" rel=\"external noopener\">\u53ef\u7528 local port \u4e0d\u591f\u5bfc\u81f4\u5bf9\u7aeftime_wait \u8fde\u63a5\u91cd\u7528\u8fdb\u800c\u5361\u987f\u6848\u4f8b<\/a><\/h2>\n<p>A\u8fdb\u7a0b\u9009\u62e9\u67d0\u4e2a\u7aef\u53e3\uff0c\u5e76\u8bbe\u7f6e\u4e86 reuseaddr opt\uff08\u8868\u793a\u5176\u5b83\u8fdb\u7a0b\u8fd8\u80fd\u7ee7\u7eed\u7528\u8fd9\u4e2a\u7aef\u53e3\uff09\uff0c\u8fd9\u65f6B\u8fdb\u7a0b\u9009\u4e86\u8fd9\u4e2a\u7aef\u53e3\uff0c\u5e76\u4e14bind\u4e86\uff0cB\u8fdb\u7a0b\u7528\u5b8c\u540e\u628a\u8fd9\u4e2abind\u7684\u7aef\u53e3\u91ca\u653e\u4e86\uff0c\u4f46\u662f\u5982\u679c A \u8fdb\u7a0b\u4e00\u76f4\u4e0d\u91ca\u653e\u8fd9\u4e2a\u7aef\u53e3\u5bf9\u5e94\u7684\u8fde\u63a5\uff0c\u90a3\u4e48\u8fd9\u4e2a\u7aef\u53e3\u4f1a\u4e00\u76f4\u5728\u5185\u6838\u4e2d\u8bb0\u5f55\u88abbind\u7528\u6389\u4e86\uff08\u80fdbind\u7684\u7aef\u53e3 \u662f65535\u4e2a\uff0c\u56db\u5143\u7ec4\u4e0d\u91cd\u590d\u7684\u8fde\u63a5\u4f60\u7406\u89e3\u53ef\u4ee5\u65e0\u9650\u591a\uff09\uff0c\u8fd9\u6837\u7684\u7aef\u53e3\u8d8a\u6765\u8d8a\u591a\u540e\uff0c\u5269\u4e0b\u53ef\u4f9b A \u8fdb\u7a0b\u53d1\u8d77\u8fde\u63a5\u7684\u672c\u5730\u968f\u673a\u7aef\u53e3\u5c31\u8d8a\u6765\u8d8a\u5c11\u4e86(\u4e5f\u5c31\u662f\u672c\u6765A\u8fdb\u7a0b\u9009\u62e9\u7aef\u53e3\u662f\u6309\u56db\u5143\u7ec4\u7684\uff0c\u4f46\u56e0\u4e3a\u524d\u9762\u6240\u8bf4\u7684\u539f\u56e0\uff0c\u5bfc\u81f4\u4e0d\u6309\u56db\u5143\u7ec4\u4e86\uff0c\u53ea\u6309\u7aef\u53e3\u672c\u8eab\u8fd9\u4e2a\u4e00\u5143\u7ec4\u6765\u6392\u91cd)\uff0c\u8fd9\u65f6\u4f1a\u9020\u6210\u65b0\u5efa\u8fde\u63a5\u7684\u65f6\u5019\u8fd9\u4e2a\u56db\u5143\u7ec4\u9ad8\u6982\u7387\u91cd\u590d\uff0c\u4e00\u822c\u8fd9\u4e2a\u65f6\u5019\u5bf9\u7aef\u5927\u6982\u7387\u8fd8\u5728 time_wait \u72b6\u6001\uff0c\u4f1a\u5ffd\u7565\u6389\u63e1\u624b syn \u5305\u5e76\u56de\u590d ack \uff0c\u8fdb\u800c\u9020\u6210\u5efa\u8fde\u63a5\u5361\u987f\u7684\u73b0\u8c61<\/p>\n<h2 id=\"\u7ed3\u8bba\">\u7ed3\u8bba<\/h2>\n<ul>\n<li>\u5728\u5185\u5b58\u3001\u6587\u4ef6\u53e5\u67c4\u8db3\u591f\u7684\u8bdd\u4e00\u53f0\u670d\u52a1\u5668\u4e0a\u53ef\u4ee5\u521b\u5efa\u7684TCP\u8fde\u63a5\u6570\u91cf\u662f\u6ca1\u6709\u9650\u5236\u7684<\/li>\n<li>SO_REUSEADDR \u4e3b\u8981\u7528\u4e8e\u5feb\u901f\u91cd\u7528 TIME_WAIT\u72b6\u6001\u7684TCP\u7aef\u53e3\uff0c\u907f\u514d\u670d\u52a1\u91cd\u542f\u5c31\u4f1a\u629b\u51faAddress Already in use\u7684\u9519\u8bef<\/li>\n<li>SO_REUSEPORT\u4e3b\u8981\u7528\u6765\u89e3\u51b3\u60ca\u7fa4\u3001\u6027\u80fd\u7b49\u95ee\u9898<\/li>\n<li>\u5168\u5c40\u8303\u56f4\u53ef\u4ee5\u7528 net.ipv4.tcp_max_tw_buckets = 50000 \u6765\u9650\u5236\u603b time_wait \u6570\u91cf\uff0c\u4f46\u662f\u4f1a\u63a9\u76d6\u95ee\u9898<\/li>\n<li>local port\u7684\u9009\u62e9\u662f\u9012\u589e\u641c\u7d22\u7684\uff0c\u641c\u7d22\u8d77\u59cbport\u968f\u65f6\u95f4\u589e\u52a0\u4e5f\u53d8\u5927<\/li>\n<\/ul>\n<h2 id=\"\u53c2\u8003\u8d44\u6599\">\u53c2\u8003\u8d44\u6599<\/h2>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000002396411\" target=\"_blank\" rel=\"external noopener\">https:\/\/segmentfault.com\/a\/1190000002396411<\/a><\/p>\n<p><a href=\"https:\/\/blog.csdn.net\/a364572\/article\/details\/40628171\" target=\"_blank\" rel=\"external noopener\">linux\u4e2dTCP\u7684socket\u3001bind\u3001listen\u3001connect\u548caccept\u7684\u5b9e\u73b0<\/a><\/p>\n<p><a href=\"https:\/\/ops.tips\/blog\/how-linux-tcp-introspection\/\" target=\"_blank\" rel=\"external noopener\">How Linux allows TCP introspection The inner workings of bind and listen on Linux.<\/a><\/p>\n<p><a href=\"https:\/\/idea.popcount.org\/2014-04-03-bind-before-connect\/\" target=\"_blank\" rel=\"external noopener\">https:\/\/idea.popcount.org\/2014-04-03-bind-before-connect\/<\/a><\/p>\n<p><a href=\"https:\/\/mp.weixin.qq.com\/s\/C-Eeoeh9GHxugF4J30fz1A\" target=\"_blank\" rel=\"external noopener\">TCP\u8fde\u63a5\u4e2d\u5ba2\u6237\u7aef\u7684\u7aef\u53e3\u53f7\u662f\u5982\u4f55\u786e\u5b9a\u7684\uff1f<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/plantegg\/linux\/commit\/9b3312bf18f6873e67f1f51dab3364c95c9dc54c\" target=\"_blank\" rel=\"external noopener\">\u5bf9\u5e944.19\u5185\u6838\u4ee3\u7801\u89e3\u6790<\/a><\/p>\n<p><a href=\"https:\/\/blog.cloudflare.com\/how-to-stop-running-out-of-ephemeral-ports-and-start-to-love-long-lived-connections\/\" target=\"_blank\" rel=\"external noopener\">How to stop running out of ephemeral ports and start to love long-lived connections<\/a><\/p>\n<\/div>\n<div><\/div>\n<div><\/div>\n<div><\/div>\n<footer class=\"post-footer\">\n<div class=\"post-tags\"><a href=\"https:\/\/plantegg.github.io\/tags\/Linux\/\" rel=\"tag\"># Linux<\/a>\u00a0<a href=\"https:\/\/plantegg.github.io\/tags\/TCP\/\" rel=\"tag\"># TCP<\/a>\u00a0<a href=\"https:\/\/plantegg.github.io\/tags\/SO-REUSEADDR\/\" rel=\"tag\"># SO_REUSEADDR<\/a>\u00a0<a href=\"https:\/\/plantegg.github.io\/tags\/ip-local-port-range\/\" rel=\"tag\"># ip_local_port_range<\/a><\/div>\n<\/footer>\n","protected":false},"excerpt":{"rendered":"<p>cc from &nbsp; \u7ecf\u5e38\u542c\u5230\u6709<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[24],"tags":[121],"class_list":["post-7003","post","type-post","status-publish","format-standard","hentry","category-value_docs","tag-05-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7003","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=7003"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7003\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=7003"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=7003"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=7003"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}