sk_reuse sk- >sk_state != TCP_LISTEN; 進行端口選擇和綁定: 端口綁定分為兩種,一種指定端口,一種隨機選擇。如果給 bind 傳 遞的地址參數中,port 字段為 0,那么就會自動選擇參數。 如代碼所示,當端口port沒有指定時,調用inet_csk_find_open_port(sk, port): if (!port) { head = inet_csk_" />

在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux內核分析 bind端口選擇

麥辣雞腿堡 ? 來源:技術簡說 ? 作者:董旭 ? 2023-07-31 11:08 ? 次閱讀

端口選擇

繼續看inet_csk_get_port函數:

在端口選擇前,先確定當前該socket的“屬性”,即是否可以端口復用,是否在TCP_LISTEN狀態,以便后面插入到桶隊列時設置fastreuse字段。

bool reuse = sk- >sk_reuse && sk- >sk_state != TCP_LISTEN;

進行端口選擇和綁定:

端口綁定分為兩種,一種指定端口,一種隨機選擇。如果給 bind 傳 遞的地址參數中,port 字段為 0,那么就會自動選擇參數。

如代碼所示,當端口port沒有指定時,調用inet_csk_find_open_port(sk, &tb, &port):

if (!port) {
  head = inet_csk_find_open_port(sk, &tb, &port);
  if (!head)
   return ret;
  if (!tb)
   goto tb_not_found;
  goto success;
 }

主要邏輯在net_csk_find_open_port實現,重點看端口指定,暫時不看端口不指定(其實邏輯差不多)。那么當用戶指定了端口,也就是port有值時:

head = &hinfo- >bhash[inet_bhashfn(net, port,hinfo- >bhash_size)];
inet_bind_bucket_for_each(tb, &head- >chain)
  if (net_eq(ib_net(tb), net) && tb- >port == port)
   goto tb_found;
tb_not_found:
 tb = inet_bind_bucket_create(hinfo- >bind_bucket_cachep,
         net, head, port);
 if (!tb)
  goto fail_unlock;
tb_found:
 if (!hlist_empty(&tb- >owners)) {
  if (sk- >sk_reuse == SK_FORCE_REUSE)
   goto success;

  if ((tb- >fastreuse > 0 && reuse) ||
      sk_reuseport_match(tb, sk))
   goto success;
  if (inet_csk_bind_conflict(sk, tb, true, true))
   goto fail_unlock;
 }
  • 1、通過指定的port端口號,計算哈希值,找到對應的inet_bind_hashbucket:
head = &hinfo- >bhash[inet_bhashfn(net, port,hinfo- >bhash_size)];
  • 2 、調用inet_bind_bucket_for_each遍歷該inet_bind_hashbucke中的chain鏈表
inet_bind_bucket_for_each(tb, &head- >chain)
  • 3、如果遍歷chain鏈表時,找到了指定port相同的桶結構,則跳轉到tb_found:
if (net_eq(ib_net(tb), net) && tb- >port == port)
   goto tb_found;
  • 4、在tb_found標簽中:判斷該桶結構中sock隊列是否為空,為空且當前套接字支持復用,則綁定成功。進入success標簽。
  • 5、在succeess完成對該port對應的桶結構的初始化或修改
  • 6、如果在3、中沒有找到對應的桶結構,進入tb_not_found標簽,在當前的chain鏈表中創建一個新的桶結構,再進行4、5操作:
tb_not_found:
 tb = inet_bind_bucket_create(hinfo- >bind_bucket_cachep,
         net, head, port);
 if (!tb)
  goto fail_unlock;

端口復用的解釋

還是要從文章開頭的圖說起,bind時端口號都會經過哈希計算分配在【相應的哈希桶結構inet_bind_hashbucket】上的chain鏈表節點的【桶結構inet_bind_bucket上】,inet_bind_bucket 結構就是用來描述端口和 sock 之間的綁定關系的。它的 port 字段表示一個綁定的端口,而 owners 則表示綁定到這個端口之上的所有 sock,因為端口可以重用,所以同一端口可能有多個 sock 綁定。

bind端口復用的實際用途基本上也就是:

防止服務器重啟時之前綁定的端口還未釋放或者程序突然退出而系統沒有釋放端口。這種情況下如果設定了端口復用,則新啟動的服務器進程可以直接綁定端口。如果沒有設定端口復用,綁定會失敗,提示ADDR已經在使用中!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210404
  • 端口
    +關注

    關注

    4

    文章

    990

    瀏覽量

    32211
  • Bind
    +關注

    關注

    0

    文章

    5

    瀏覽量

    7618
收藏 人收藏

    評論

    相關推薦

    Linux源碼分析bind系統調用

    眾所周知,一個Server端Socket的建立,需要socket、bind、listen、accept四個步驟。
    的頭像 發表于 10-16 11:08 ?3418次閱讀
    從<b class='flag-5'>Linux</b>源碼<b class='flag-5'>分析</b><b class='flag-5'>bind</b>系統調用

    linux內核分析及編程

    linux內核分析及編程
    發表于 04-20 08:26

    TCP server 不能 bind 80 端口

    后程序只開一個 AP 模式下的 TCP server ,測試。 ?但是發現 80 端口沒法 bind ,錯誤碼是 -98 ,意思是端口已被占用? 換一個其它端口號(比如 12345)就
    發表于 05-14 00:33

    Android內核分析

    介紹Android 移動平臺系統架構,通過對Android 源代碼的分析,將其與標準Linux 內核(2.6.27)源代碼相比較,詳細解析Android 內核的功能更新,
    發表于 10-29 16:17 ?116次下載

    linux內核啟動內核解壓過程分析

    linux啟動時內核解壓過程分析,一份不錯的文檔,深入了解內核必備
    發表于 03-09 13:39 ?1次下載

    基于Linux 2.6內核Makefile分析

    基于2.4內核的,可以說關于2.6內核Makefile相關的文章鳳毛麟角,筆者抽時間完成了這篇分析文章,讓讀者迅速熟悉Linux最新Makefile體系,從而加深對
    發表于 09-18 19:09 ?0次下載
    基于<b class='flag-5'>Linux</b> 2.6<b class='flag-5'>內核</b>Makefile<b class='flag-5'>分析</b>

    關于Linux 2.6內核Makefile的分析

    的介紹文章都是基于2.4內核的,可以說關于2.6內核Makefile相關的文章鳳毛麟角,筆者抽時間完成了這篇分析文章,讓讀者迅速熟悉Linux最新Makefile體系,從而加深對
    發表于 11-02 10:12 ?1次下載

    谷歌Android設備內核引入主線Linux內核難嗎?

    Android是基于Linux內核的操作系統,但是,運行在Android設備上的內核其實與Google選擇的LTS版本Linux
    的頭像 發表于 11-22 10:41 ?3098次閱讀
    谷歌Android設備<b class='flag-5'>內核</b>引入主線<b class='flag-5'>Linux</b><b class='flag-5'>內核</b>難嗎?

    Linux內核配置編譯分析的設計方案

    Linux內核配置編譯分析的設計方案
    發表于 07-08 16:53 ?18次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>配置編譯<b class='flag-5'>分析</b>的設計方案

    Linux內核GPIO操作函數的詳解分析

    本文檔的主要內容詳細介紹的是Linux內核GPIO操作函數的詳解分析免費下載。
    發表于 01-22 16:58 ?28次下載

    Linux內核SoftIrq源代碼分析

    我們在分析linux內核中斷剖析時,簡單的聊了一下SOFTIRQ, 而沒有進行深入分析. Linux內核
    發表于 06-23 15:22 ?639次閱讀

    什么是bind?你真的熟悉bind嗎?

    bind()方法創建一個新的函數,在bind()被調用時,這個新函數的this被指定 bind()的第一個參數,而其余參數將作為新函數的參數,供調用時使用。
    的頭像 發表于 07-13 09:56 ?2903次閱讀

    bind系統調用背后的端口管理復用

    bind系統調用進行分析,主要是了解一下bind背后,Linux內核是如何進行端口綁定、如何管
    的頭像 發表于 07-31 10:45 ?590次閱讀
    <b class='flag-5'>bind</b>系統調用背后的<b class='flag-5'>端口</b>管理復用

    Linux bind的核心執行函數

    不看,本文主要分析最重要的函數:inet_csk_get_port,從該函數出發了解本地綁定端口如何管理。 以下是原函數,通過下文章節逐步分段分析 int inet_csk_get_port
    的頭像 發表于 07-31 10:51 ?618次閱讀

    Linux內核分析 端口哈希桶

    是用來封裝各種協議的綁定哈希表,具體定義如下所示,這個結構體在[Linux內核角度分析服務器Listen細節中介紹過,具體地,struct inet_bind_hashbcket是
    的頭像 發表于 07-31 11:03 ?816次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b><b class='flag-5'>分析</b> <b class='flag-5'>端口</b>哈希桶
    主站蜘蛛池模板: 人人澡人人搞 | 亚洲天堂首页 | 免费视频爱爱 | 99热久久国产精品 | 激情综合网婷婷 | 一区在线视频 | 初恋视频黄色 | 九九热在线观看 | 色婷婷狠狠 | 成人性欧美丨区二区三区 | 日日爱网站 | 永久在线观看www免费视频 | 欧美伦理一区二区三区 | 亚洲欧美色鬼久久综合 | 五月天婷婷免费视频观看 | 欧美成人午夜片一一在线观看 | 黄色成人免费网站 | 黄色一级日本 | 国产盗摄女子私密保健视频 | 欧美亚洲综合另类型色妞 | 女人又色又爽又黄 | 欧美 日韩 中文字幕 | 色欲情狂 | 一卡二卡三卡四卡无卡在线 | 扒开双腿疯狂进出爽爽爽 | 亚洲高清日韩精品第一区 | 欧美午夜性刺激在线观看免费 | 欧美久操 | 亚洲国产欧美精品一区二区三区 | 人人免费人人专区 | 国产成人精品日本 | gogo亚洲肉体艺术100 | 午夜亚洲国产精品福利 | 欧美拍拍| 国产小视频在线 | 日本免费xxxx色视频 | 欧美另类69xxxxxhd| 香港经典a毛片免费观看爽爽影院 | 夜夜操操操 | 欧美日韩国产一区二区三区不卡 | 不卡视频一区 |