TCP SO_LINGER 选项对Socket.close的影响

Java中通过Socket.setSoLinger设置SO_LINGER选项,有三种组合形式:

  • Socket.setSoLinger(false, linger)

设置为false,这时linger值被忽略。摘自unix network programming:

The default action of close with a TCP socket is to mark the socket as closed and return to the process immediately. The socket descriptor is on longer usable by the process: it can’t be used as an argument to read or write. TCP will try to send any data that is already queued to be sent to the other end, and after this occurs, the normal TCP connection termination sequence takes place.

如果设置为false,socket主动调用close时会立即返回,操作系统会将残留在缓冲区中的数据发送到对端,并按照正常流程关闭(交换FIN-ACK),最后连接进入TIME_WAIT状态。

我们可以写个演示程序,客户端发送较大的数据包后,立刻调用close,而server端将Receive Buffer设置的很小。close会立即返回,客户端的Java进程结束,但是当我们用tcpdump/Wireshark抓包会发现,操作系统正在帮你发送数据,内核缓冲区中的数据发送完毕后,发送FIN包关闭连接。

  • Socket.setSoLinger(true, 0)

TCP discards any data still remaining in the socket send buffer and sends an RST to the peer, not the normal four-packet connection termination sequence.

主动调用close的一方也是立刻返回,但是这时TCP会丢弃发送缓冲中的数据,而且不是按照正常流程关闭连接(不发送FIN包),直接发送RST,对端会收到java.net.SocketException: Connection reset异常。同样使用tcpdump抓包可以很容易观察到。

另外有些人会用这种方式解决主动关闭放方有大量TIME_WAIT状态连接的问题,因为发送完RST后,连接立即销毁,不会停留在TIME_WAIT状态。一般不建议这么做,除非你有合适的理由:

If the a client of your server application misbehaves (times out, returns invalid data, etc.) an abortive close makes sense to avoid being stuck in CLOSE_WAIT or ending up in the TIME_WAIT state.

  • If you must restart your server application which currently has thousands of client connections you might consider setting this socket option to avoid thousands of server sockets in TIME_WAIT (when calling close() from the server end) as this might prevent the server from getting available ports for new client connections after being restarted.
  • On page 202 in the aforementioned book it specifically says: “There are certain circumstances which warrant using this feature to send an abortive close. One example is an RS-232 terminal server, which might hang forever in CLOSE_WAIT trying to deliver data to a stuck terminal port, but would properly reset the stuck port if it got an RST to discard the pending data.”
  • Socket.setSoLinger(true, linger > 0)

if there is any data still remaining in the socket send buffer, the process will sleep when calling close() until either all the data is sent and acknowledged by the peer or the configured linger timer expires. if the linger time expires before the remaining data is sent and acknowledged, close returns EWOULDBLOCK and any remaining data in the send buffer is discarded.

如果SO_LINGER选项生效,并且超时设置大于零,调用close的线程被阻塞,TCP会发送缓冲区中的残留数据,这时有两种可能的情况:

  1. 数据发送完毕,收到对方的ACK,然后进行连接的正常关闭(交换FIN-ACK)
  2. 超时,未发送完成的数据被丢弃,连接发送RST进行非正常关闭

类似的我们也可以构造demo观察这种场景。客户端发送较大的数据包,server端将Receive Buffer设置的很小。设置linger为1,调用close时等待1秒。注意SO_LINGER的单位为,好多人被坑过。假设close后1秒内缓冲区中的数据发送不完,使用tcpdump/Wireshark可以观察到客户端发送RST包,服务端收到java.net.SocketException: Connection reset异常。

本文链接:https://www.dzdvip.com/34575.html 版权声明:本文内容均来源于互联网。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 395045033@qq.com,一经查实,本站将立刻删除。
(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年7月11日 23:16
下一篇 2022年7月11日 23:20

相关推荐

  • 影视剪辑的技巧有哪些?

    剪辑就是将影片制作中所拍摄的大量素材,经过选择、取舍、分解与组接,最终完成一个连贯流畅、含义明确、主题鲜明并有艺术感染力的作品。

    2021年5月22日
    10
  • TVB怎么没落了(香港tvb现在怎么样了)

    《义不容情》、《神雕侠侣》、《创世纪》、《金枝欲孽》,这些耳熟能详的港剧经典,总是能勾起我们对香港影视黄金年代的回忆。 而在这些香港影视黄金影视剧集的背后,都有同一个令人印象深刻的蓝绿红三色标志,这就是著名的电视广播有限公司——香港TVB。 数十载风雨路,TVB是如何从最初起步,又经历了怎样的兴衰?触摸品质,发现未来,欢迎观看十万个品牌故事之《五十年兴衰——香港TVB》 1967年11月19日,利孝和、祁德尊、邵逸夫等人创办的电视广播有限公司(Television Broadcasts Limited)正式营业开播,这家公司的简称叫做TVB。 由于这家公司是香港首家获得免费无线电视牌照的电视台,因此也被称为“香港无线电视台”,从此被简称为“无线”,这就是半个世纪对我们曾经有过巨大影响的无线TVB。 到今天,无线TVB已到过了知天命的年纪,但是它并不是香港第一家电视台,香港第一家电视台是“丽的映声”,1957年成立,也就是香港亚洲电视台(简称亚视、ATV)的前身,这家香港最古老的电视台、无线TVB曾经的老对手,已经在2016年停播了,连60周年大庆都没能挺到。 虽然现在亚视已完,但是当时TVB初创的时候,双方还是劲敌。 1965年,香港政府有意发出地面电视牌照,吸引六个财团参与竞标,最后由香港电视集团(即无线电视)取得免费地面电视播放牌照,并于1967年9月1日在海运大厦进行为期一个月的试播。 1967年11月19日,无线电视正式启播,以微波科技直播澳门格兰披治大赛供香港观众欣赏。次日首播的节目《欢乐今宵》,日后更成为全球最长寿电视综艺节目之一。 虽然作为综合性电视台,TVB每年制作的新闻、综艺等节目多达上万小时,但是每年大约700集的无线电视剧集,始终是焦点中的焦点,现在只要一说起TVB,人们首先想到的是它制作的大批电视剧。 从1970年代开始,无线TVB正式调整了立台方针,把电视剧制作作为重头,从此开启了无线TVB港剧的黄金时代,电视剧成为无线TVB的明珠。 每年11月无线TVB台庆的时候,主要针对无线电视剧艺人颁奖的《万千星辉颁奖典礼》始终都是最重要的节目之一。这一切都离不开邵逸夫的努力。 邵逸夫在TVB做出的最大贡献无疑是培养了大批人才。 为了支撑自己的无线电视台电视剧业务,邵逸夫利用自己邵氏电影的基础,打造了一个庞大的演艺队伍。 他在1971年开办无线电视艺…

    2022年3月23日
    91
  • 提取盈余公积是什么意思(提取盈余公积计算公式)

    “提取盈余公积就是企业在经营过程中形成了净利润并且在弥补之前亏损之后仍然是有净利润,这种情况就需要按一定比例提取盈余公积(法定盈余公积,任意盈余公积)。” 盈余公积金是什么,其计算公式是怎么样的? 法定盈余公积按当年净利润计提,不是按营业利润,也不是按利润总额计提,净利润=利润总额-所得税; 计算公式是:法定盈余公积=当年净利润*10% 盈余公积是指公司按照规定从净利润中提取的各种积累资金。盈余公积是根据其用途不同分为公益金和一般盈余公积两类。公益金专门用于公司职工福利设施的支出。按现行规定,上市公司按照税后利润的5%至10%的比例提取法定公益金。 盈余公积金是指企业按照规定从税后利润中提取的积累资金。盈余公积金按其用途,分为法定公积金和任意公积金。盈余公积金主要用来弥补企业以前年度亏损和转增资本。 盈余公积根据其用途不同分为公益金和一般盈余公积两类。 公益金专门用于企业职工福利设施的支出,如购建职工宿舍、托儿所、理发室等方面的支出。现行制度规定,公司制企业按照税后利润的5%至10%的比例提取法定公益金。 一般盈余公积分为两种: 一是法定盈余公积。公司制企业的法定盈余公积按照税后利润的10%提取(非公司制企业也可按照超过10%的比例提取),法定盈公积已达注册资本的50%时可不再提取。 二是任意盈余公积金。任意盈余公积主要是是公司制企业按照股东大会的决议提取。 法定盈余公积和任意公积的主要区别就在于其各自计提的依据不同。前者以国家的法律或行政规章为依据提取;后者则由企业自得提取。企业提取盈余公积主要可以用于以下几个方面:一用于弥补亏损。二转增资本。 盈余公积(Features Surplus;Earned Surplus) 《公司法》第一百六十六条规定: 公司分配当年税后利润时,应当提取利润的百分之十列入公司法定公积金。公司法定公积金累计额为公司注册资本的百分之五十以上的,可以不再提取。 公司的法定公积金不足以弥补以前年度亏损的,在依照前款规定提取法定公积金之前,应当先用当年利润弥补亏损。 公司从税后利润中提取法定公积金后,经股东会或者股东大会决议,还可以从税后利润中提取任意公积金。 公司弥补亏损和提取公积金后所余税后利润,有限责任公司依照本法第三十五条的规定分配;股份有限公司按照股东持有的股份比例分配,但股份有限公司章程规定不按持股比例分配的除外。

    2022年8月13日
    38
  • iPad密码忘记了怎么办?(iOS设备忘记了密码)解锁详细步骤

    无论是忘记了苹果设备的屏幕数字密码,还是无法通过指纹进入手机系统,iOS解锁大师都能快速稳定地帮您移除数字密码、指纹密码和Face ID等密码,让您重新顺利进入系统。

    2021年9月11日
    44
  • 厕所堵了怎么通(厕所堵了怎么办最简单)

    “首先可以使用马桶塞,并将其对着马桶的出水口压着,然后等待至少两分钟之后大力拔出,并如此操作两三次后就能疏通了,也可以用厕所疏通剂,在购买厕所疏通剂之后,将其倒入出水口,就可以将马桶疏通,最后还可以尝试使用大量的水冲击马桶,将满满的一桶水从高处倒下,利用冲击力即可将马桶疏通。” 生活中你遇到过家里马桶堵塞吗?特别是自己上完厕所后遇到这种突发情况,是不是很尴尬啊?那找师傅上门疏通也很贵,很是尴尬,其实有两种疏通马桶的小妙招,就算女士也可以自己疏通完全不费力。下面跟安姐一起了解一下吧! 方法一:塑料袋疏通法 需要材料:马桶刷、塑料袋 我们准备好马桶刷和塑料袋,大家千万不要小瞧这两样东西,把它俩配合起来就可以快速疏通马桶。 首先将塑料袋套在马桶刷头上,一定要圆头的马桶刷(刷头跟下水口大小差不多)一个袋子太薄,我们也可以用两个袋子,套好之后袋子系好,完完全全包裹在马桶刷头上。 之后将刷头戳进下水口,用力戳动,速度要快并且来回戳动,这样可以形成压力,使堵塞马桶里的异物冲走,压力够大的时候异物就冲走了,这样马桶就可以疏通开了! 第二种方法:塑料瓶疏通法 材料:塑料瓶、剪刀、塑料袋 我们准备一个矿泉水瓶,将瓶子底部剪开,像上面图片那样,全部剪掉。 然后我们准备一个大一点的塑料袋,套在胳膊上,防止溅到手臂上。 准备就绪,我们把瓶子底部位置戳进下水口,要注意的点是瓶子的瓶盖不要拧掉,一定要带着,接下来同样用力戳动下水口,反复来回戳,大概30-60秒左右,马桶异物会被冲走,简单效果也好,原理很简单,瓶子戳进去会有水压,来回快速戳压力越来越大,所以堵在马桶的异物就被冲走了! 最后试一下流水,完全正常,以上两种方法原理基本上一样,只是材料不一样,不过都是废物利用,不仅省钱还变废为宝了! 注意事项:马桶经常使用,但是马桶可不是垃圾桶,什么东西都可以放里,像平时吃的果皮、火锅汤、菜汤、洗脸巾、等等都不可以放,很容易造成堵塞哦! 结束语:好了,今天分享的两种疏通马桶的方法大家学会了吗?简单又实用,以后遇到马桶堵塞再也不用花钱来疏通了!看完记得分享转发,让更多人知道!

    2022年5月26日
    14
  • 电商运营必会的10招,你会几招?

    一个合格的运营不仅要有老板的责任心、美工的审美、推广的市场洞察,还要有客服的一丝不苟。可以说,运营是一个店铺的灵魂。在如今这个电商发展如日中天的时 代,只要你敢说自己是运营,那绝对是非常的抢手。不管你是自己开店还是给别人打工,锻炼自己的运营能力是你必须要经历的一关。今天就给大家介绍一下作为一 名合格的运营该具有哪些能力。 01定位市场的能力 定位市场是从产品角度来说的。一个运营对于选品要有自己的见解,不能人云亦云,更不能盲目相信数据。这是肯定有人会反驳我,他们会说在淘宝做生意,不看数 据,那我们看什么?我没有否认数据的重要性,我只是说大家有的时候不要太迷信数据,因为数据不一定都是真实的。比如,按照市场数据来说,手机壳的市场要绝 对大于键盘膜,但如果你一头扎进手机壳这个行业里,你会发现事实不是自己想的那么简单。淘宝和线下生意的最大区别在于客户遍布全中国,所以,再小的行业在 淘宝也会有很大的市场需求。关键看我们如何定位和包装自己的产品。 02查看数据的能力 查看数据包括的范围很广,包括主图数据、详情数据、产品数据、客户数据、市场数据、推广数据、seo数据等等。而作为运营,对于这些数据不仅要明确其确切含 义,更要明确这些数据的应用意义。因为,店铺是个整体,任何一部分数据出问题都会反映出一些问题。而运营要做的就是,汇总观察数据,并根据数据得出结论, 为下一步的优化解决方案提供支持。比如,店铺流量上升和下滑,如果我们不去分析原因,那以后就不能避免再犯类似的错误,更不能提升我们的运营能力。 03诊断店铺的能力 诊断店铺的范围也比较广,包括访客走势、产品销量、营销策略、推广效果、活动绩效等。不仅需要我们具备数据分析能力,更重要的是要有明确的思路,我们要学会 从一些蛛丝马迹洞悉店铺问题。比如发现店铺的某一项动态评分无故降低,你会简单的认为仅仅是这一项出了问题吗?你要知道,买家评分是很盲目的,如果他的心 情不爽,往往不会仅仅对你某一项评分给出低分的。所以,我们要做的就是让买家只要买我们的东西就很爽,至于怎么爽,这就是你应该认真思考的问题了。 04布局产品的能力 产品是定期上新还是一次性布局好?产品是全店推广还是重点打造?产品是各自为战还是合纵联合?产品定价是越低越好还是走高端路线?这些都是运营需要认真思考 的问题。定期上新需要有很好的供应链,一次性布局产品是小卖家的做法,当然后续选款…

    2021年7月27日
    10