重學TCP協議(12)SO_REUSEADDR、SO_REUSEPORT、SO_LINGER

1. SO_REUSEADDR

假如服務端出現故障,主動斷開連接以后,需要等 2 個 MSL 以后才最終釋放這個連接,而服務重啟以后要綁定同一個端口,默認情況下,操作系統的實現都會阻止新的監聽套接字綁定到這個端口上。啟用 SO_REUSEADDR 套接字選項可以解除這個限制。

2. SO_REUSEPORT

默認情況下,一個 IP、端口組合只能被一個套接字綁定,Linux 內核從 3.9 版本開始引入一個新的 socket 選項 SO_REUSEPORT,又稱為 port sharding,允許多個套接字監聽同一個IP 和端口組合。

2.1 多進程網絡模型

  • 主進程 + 多個 worker 子進程監聽相同的端口(導致驚群問題)

image.png

  • 多進程 + REUSEPORT

2.2 驚群問題

多進程/多線程同時監聽同一個套接字,當有網絡事件發生時,所有等待的進程/線程同時被喚醒,但是只有其中一個進程/線程可以處理該網絡事件,其它的進程/線程獲取失敗重新進入休眠。

2.3 accept系統調用的驚群問題

在Linux 2.6之前,會出現驚群問題。而在后面的版本中,引入了WQ_FLAG_EXCLUSIVE 選項解決了 accept 調用的驚群問題。

2.4 epoll系統調用的驚群問題

image.png

當有新的網絡事件發生時,阻塞在 epoll_wait 的多個進程同時被喚醒。在這種情況下,epoll 的驚群還是存在的。

2.5 SO_REUSEPORT原理

內核為處于 LISTEN 狀態的 socket 分配了大小為 32 哈希桶。監聽的端口號經過哈希算法運算打散到這些哈希桶中,相同哈希的端口采用拉鏈法解決沖突。

  1. 當收到客戶端的 SYN 握手報文以后,會根據目標端口號的哈希值計算出哈希沖突鏈表

  2. 對于設置了 SO_REUSEPORT 選項的 socket 經過二次哈希找到對應的 SO_REUSEPORT group,從中隨機選擇一個進行處理。

image.png

2.6 SO_REUSEPORT作用

  • 內核有數據到來的時候就會把請求均衡的分給不同的socket,也就是不同的線程了,這樣內核可以自動的做到負載均衡
  • 支持滾動升級
  1. 新啟動一個新版本 v2 ,監聽同一個端口,與 v1 舊版本一起處理請求。
  2. 發送信號給 v1 版本的進程,讓它不再接受新的請求
  3. 等待一段時間,等 v1 版本的用戶請求都已經處理完畢時,v1 版本的進程退出,留下 v2 版本繼續服務

2.7 SO_REUSEPORT安全性

出于安全性考慮,防止端口劫持

  • 只有effective-user-id相同的服務器進程才能監聽同一ip:port
  • 只有第一個啟動的進程啟用了 SO_REUSEPORT 選項,后面啟動的進程才可以綁定同一個端口。

3. SO_LINGER

設置函數close()關閉TCP連接時的行為。缺省close()的行為是,如果有數據殘留在socket發送緩沖區中則系統將繼續發送這些數據給對方,等待被確認,然后返回。

SO_LINGER選項使用如下結構:

struct linger {int l_onoff;int l_linger;
};
  1. l_onoff為0,則該選項關閉,l_linger的值被忽略,close()用上述缺省方式關閉連接。
  2. l_onoff非0,l_linger為0,close()用下面的a方式關閉連接。
  3. l_onoff非0,l_linger非0,close()用下面的b方式關閉連接。
  • a.立即關閉該連接,通過發送RST分組(而不是用正常的FIN|ACK|FIN|ACK四個分組)來關閉該連接。至于發送緩沖區中如果有未發送完的數據,則丟棄。主動關閉一方的TCP狀態則跳過TIMEWAIT,直接進入CLOSED。

  • b.將連接的關閉設置一個超時。如果socket發送緩沖區中仍殘留數據,進程進入睡眠,內核進入定時狀態去盡量去發送這些數據。

    在超時之前,如果所有數據都發送完且被對方確認,內核用正常的FIN|ACK|FIN|ACK四個分組來關閉該連接,close()成功返回。

    如果超時之時,數據仍然未能成功發送及被確認,用上述a方式來關閉此連接。close()返回EWOULDBLOCK。

參考文章

深入理解 TCP 協議:從原理到實戰

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390843.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

殘疾科學家_數據科學與殘疾:通過創新加強護理

殘疾科學家Could the time it takes for you to water your houseplants say something about your health? Or might the amount you’re moving around your neighborhood reflect your mental health status?您給植物澆水所需的時間能否說明您的健康狀況? 還是…

POJ 3660 Cow Contest [Floyd]

POJ - 3660 Cow Contest http://poj.org/problem?id3660 N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is un…

Linux 網絡相關命令

1. telnet 1.1 檢查端口是否打開 執行 telnet www.baidu.com 80,粘貼下面的文本(注意總共有四行,最后兩行為兩個空行) telnet [domainname or ip] [port]例如: telnet www.baidu.com 80 如果這個網絡連接可達&…

JSON.parseObject(String str)與JSONObject.parseObject(String str)的區別

一、首先來說說fastjson fastjson 是一個性能很好的 Java 語言實現的 JSON 解析器和生成器,來自阿里巴巴的工程師開發。其主要特點是: ① 快速:fastjson采用獨創的算法,將parse的速度提升到極致,超過所有基于Java的jso…

jQuery Ajax POST方法

Sends an asynchronous http POST request to load data from the server. Its general form is:發送異步http POST請求以從服務器加載數據。 其一般形式為: jQuery.post( url [, data ] [, success ] [, dataType ] )url : is the only mandatory parameter. This…

spss23出現數據消失_改善23億人口健康數據的可視化

spss23出現數據消失District Health Information Software, or DHIS2, is one of the most important sources of health data in low- and middle-income countries (LMICs). Used by 72 different LMIC governments, DHIS2 is a web-based open-source platform that is used…

01-hibernate注解:類級別注解,@Entity,@Table,@Embeddable

Entity Entity:映射實體類 Entity(name"tableName") name:可選,對應數據庫中一個表,若表名與實體類名相同,則可以省略。 注意:使用Entity時候必須指定實體類的主鍵屬性。 第一步:建立實體類: 分別…

leetcode 1707. 與數組中元素的最大異或值

題目 給你一個由非負整數組成的數組 nums 。另有一個查詢數組 queries ,其中 queries[i] [xi, mi] 。 第 i 個查詢的答案是 xi 和任何 nums 數組中不超過 mi 的元素按位異或(XOR)得到的最大值。換句話說,答案是 max(nums[j] XO…

MySQL基礎入門學習【2】數據類型

數據類型:指列、存儲過程參數、表達式和局部變量的數據特征,它決定了數據的存儲格式,代表了不同的信息類型 (1) 整型(按存儲范圍分類):TINYINT(1字節) SAMLLINT(2字節&am…

昆西·拉森的凈資產是多少?

People ask me how much I get paid all the time. It comes up on podcast interviews, Quora questions, and face-to-face discussions.人們問我,我一直得到多少報酬。 它來自播客訪談,Quora問題和面對面的討論。 And people search this question a…

COVID-19研究助理

These days scientists, researchers, doctors, and medical professionals face challenges to develop answers to their high priority scientific questions.如今,科學家,研究人員,醫生和醫學專家面臨著挑戰,無法為其高度優先…

Node.js umei圖片批量下載Node.js爬蟲1.00

這個爬蟲在abaike爬蟲的基礎上改改圖片路徑和下一頁路徑就出來了,代碼如下: // // umei圖片批量下載Node.js爬蟲1.00 // 2017年11月13日 //// 內置http模塊 var httprequire("http");// 內置文件處理模塊,用于創建目錄和圖片文件 v…

交通銀行信息技術管理部副總經理張漫麗:交通銀行“大數據+人工智能”應用研究...

文 | 交通銀行信息技術管理部副總經理張漫麗 大數據隱含著巨大的社會、經濟、科研價值,已引起了各行各業的高度重視。如果能通過人工智能技術有效地組織和使用大數據,將對社會經濟和科學研究發展產生巨大的推動作用,同時也孕育著前所未有的機…

安軟件一勞永逸_如何克服一勞永逸地公開演講的恐懼

安軟件一勞永逸If you’re like most people, the idea of public speaking terrifies you (it terrifies me too). So how do you get over those jitters, get up on stage, and give an amazing talk? First, a disclaimer: this article is purely about your stage prese…

Go語言實戰 : API服務器 (8) 中間件

為什么需要中間件 我們可能需要對每個請求/返回做一些特定的操作,比如 記錄請求的 log 信息在返回中插入一個 Header部分接口進行鑒權 這些都需要一個統一的入口。這個功能可以通過引入 middleware 中間件來解決。Go 的 net/http 設計的一大特點是特別容易構建中間…

缺失值和異常值的識別與處理_識別異常值-第一部分

缺失值和異常值的識別與處理📈Python金融系列 (📈Python for finance series) Warning: There is no magical formula or Holy Grail here, though a new world might open the door for you.警告 : 這里沒有神奇的配方或圣杯,盡管…

SQL Server 常用分頁SQL

今天無聊和朋友討論分頁,發現網上好多都是錯的。網上經常查到的那個Top Not in 或者Max 大部分都不實用,很多都忽略了Order和性能問題。為此上網查了查,順帶把2000和2012版本的也補上了。 先說說網上常見SQL的錯誤或者說局限問題 12345select…

Word中摘要和正文同時分欄后,正文跑到下一頁,怎么辦?或Word分欄后第一頁明明有空位后面的文字卻自動跳到第二頁了,怎么辦?...

問題1:Word中摘要和正文同時分欄后,正文跑到下一頁,怎么辦?或Word分欄后第一頁明明有空位后面的文字卻自動跳到第二頁了,怎么辦? 答:在word2010中,菜單欄中最左側選“文件”->“選…

leetcode 664. 奇怪的打印機(dp)

題目 有臺奇怪的打印機有以下兩個特殊要求: 打印機每次只能打印由 同一個字符 組成的序列。 每次可以在任意起始和結束位置打印新字符,并且會覆蓋掉原來已有的字符。 給你一個字符串 s ,你的任務是計算這個打印機打印它需要的最少打印次數。…

SQL數據類型說明和MySQL語法示例

SQL數據類型 (SQL Data Types) Each column in a database table is required to have a name and a data type. 數據庫表中的每一列都必須具有名稱和數據類型。 An SQL developer must decide what type of data that will be stored inside each column when creating a tab…