SO_REUSEADDR和SO_REUSEPORT作用

本文内容主要是对SO_REUSEADDR和SO_REUSEPORT异同 的理解和总结,重点记录linux下SO_REUSEADDR和SO_REUSEPORT的作用和区别

背景

SO_REUSEADDR和SO_REUSEPORT主要是影响socket绑定ip和port的成功与否。先简单说几点绑定规则
规则1:socket可以指定绑定到一个特定的ip和port,例如绑定到192.168.0.11:9000上;
规则2:同时也支持通配绑定方式,即绑定到本地"any address"(例如一个socket绑定为 0.0.0.0:21,那么它同时绑定了所有的本地地址);
规则3:默认情况下,任意两个socket都无法绑定到相同的源IP地址和源端口。

在了解了上述背景后下面简单说明一下linux中SO_REUSEADDR和SO_REUSEPORT对绑定的影响。由于大多数平台对SO_REUSEADDR和SO_REUSEPORT的实现都是BSD上的衍生版本,因此的先介绍BSD中这两个参数的作用。

SO_REUSEADDR

SO_REUSEADDR的作用主要包括两点
1、改变了通配绑定时处理源地址冲突的处理方式,其具体的表现方式为:未设置SO_REUSEADDR时,socketA先绑定到0.0.0.0:21,后socketB绑定192.168.0.1:21将失败,不符合规则3。但在设置SO_REUSEADDR后socketB将绑定成功。并且这个设置对于socketA(通配绑定)和socketB(特定绑定)的绑定是顺序无关的。下表总结了BSD在各个情况下的绑定情况

SO_REUSEADDR 先绑定socketA 后绑定socketB 绑定socketB的结果
无关 192.168.0.1:21 192.168.0.1:21 Error (EADDRINUSE)
无关 192.168.0.1:21 10.0.0.1:21 OK
无关 10.0.0.1:21 192.168.0.1:21 OK
disable 0.0.0.0:21 192.168.1.0:21 Error (EADDRINUSE)
disable 192.168.1.0:21 0.0.0.0:21 Error (EADDRINUSE)
enable 0.0.0.0:21 192.168.1.0:21 OK
enable 192.168.1.0:21 0.0.0.0:21 OK
无关 0.0.0.0:21 0.0.0.0:21 Error (EADDRINUSE)

对于linux,要使这个设置达到预期效果,对于绑定的顺序的有要求的,即在设置了SO_REUSEADDR,须先进行特定绑定,后进行通配绑定,后者才能成功;如果先进行通配绑定,后面的绑定(端口相同情况下)地址只要和通配绑定中的一个相同都将失败。

2、改变了系统对处于TIME_WAIT状态的socket的看待方式,要理解这个句话,首先先简单介绍以下什么是处于TIME_WAIT状态的socket?

socket通常都有发送缓冲区,当调用send()函数成功后,只是将数据放到了缓冲区,并不意味着所有数据真正被发送出去。对于TCP socket,在加入缓冲区和真正被发送之间的时延会相当长。这就导致当close一个TCP socket的时候,可能在发送缓冲区中保存着等待发送的数据。为了确保TCP的可靠传输,TCP的实现是close一个TCP socket时,如果它仍然有数据等待发送,那么该socket会进入TIME_WAIT状态。这种状态将持续到数据被全部发送或者发生超时(这个超时时间通常被称为Linger Time,大多数系统默认为2分钟)。

在未设置SO_REUSEADDR时,内核将一个处于TIME_WAIT状态的socketA仍然看成是一个绑定了指定ip和port的有效socket,因此此时如果另外一个socketB试图绑定相同的ip和port都将失败(不满足规则3),直到socketA被真正释放后,才能够绑定成功。如果socketB设置SO_REUSEADDR(仅仅只需要socketB进行设置),这种情况下socketB的绑定调用将成功返回,但真正生效需要在socketA被真正释放后。(这个地方的理解可能有点问题,待后续验证一下)。总结一下:内核在处理一个设置了SO_REUSEADDR的socket绑定时,如果其绑定的ip和port和一个处于TIME_WAIT状态的socket冲突时,内核将忽略这种冲突,即改变了系统对处于TIME_WAIT状态的socket的看待方式。

SO_REUSEPORT

SO_REUSEPORT作用就比较明显直观,即打破了上面的规则3
1、允许将多个socket绑定到相同的地址和端口,前提每个socket绑定前都需设置SO_REUSEPORT。如果第一个绑定的socket未设置SO_REUSEPORT,那么其他的socket无论有没有设置SO_REUSEPORT都无法绑定到该地址和端口直到第一个socket释放了绑定。

2、attention:SO_REUSEPORT并不表示SO_REUSEADDR,即不具备上述SO_REUSEADDR的第二点作用(对TIME_WAIT状态的socket处理方式)。因此当有个socketA未设置SO_REUSEPORT绑定后处在TIME_WAIT状态时,如果socketB仅设置了SO_REUSEPORT在绑定和socketA相同的ip和端口时将会失败。解决方案
(1)、socketB设置SO_REUSEADDR 或者socketB即设置SO_REUSEADDR也设置SO_REUSEPORT
(2)、两个socket上都设置SO_REUSEPORT

Linux 内核3.9加入了SO_REUSEPORT。除上述功能外其额外实现了
1、为了阻止port 劫持Port hijacking,限制所有使用相同ip和port的socket都必须拥有相同的有效用户id(effective user ID)。
2、linux内核在处理SO_REUSEPORT socket的集合时,进行了简单的负载均衡操作,即对于UDP socket,内核尝试平均的转发数据报,对于TCP监听socket,内核尝试将新的客户连接请求(由accept返回)平均的交给共享同一地址和端口的socket(监听socket)。

理解可能有误,可参考原文http://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-mean-t

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,083评论 18 139
  • 你所不知道的TIME_WAIT和CLOSE_WAIT 你遇到过TIME_WAIT的问题吗? 我相信很多都遇到过这个...
    meng_philip123阅读 2,424评论 0 14
  • 1、TCP状态linux查看tcp的状态命令:1)、netstat -nat 查看TCP各个状态的数量2)、lso...
    北辰青阅读 9,183评论 0 11
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,019评论 0 8
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 12,973评论 6 174