深度探索Linux核心之自動分配UDP本地埠

2021-06-02 19:49:53 字數 921 閱讀 7429

在sock_dgram型別的套接字的操作函式集的sendmsg成員函式中,每次呼叫對應的第4層協議的sendmsg成員函式時,都會進行埠號的檢查,如果沒有繫結就呼叫協議的成員函式get_port進行自動繫結。代表inet域網路層套接字的結構體struct inet_sock有兩個埠號相關的成員__u16 num和__u16 sport。它們都代表套接字的本地埠號。num是主機位元組序,sport是網路位元組序。當套接字型別為sock_raw時,它們代表的是協議號(icmp,igmp等)。套接字層的sendmsg檢查埠號繫結時,就是檢視num是否為零。

udp協議提供udp_v4_get_port函式用於自動獲取本地埠號。埠號有乙個固定的數值範圍,自動獲取必須在這個範圍內進行。陣列int sysctl_local_port_range[2]指定了本地埠號的範圍。其預設值為1024到4999。對於高可用性系統,它的值應該是32768到61000(在tcp協議進行初始化時,會進行這項設定)。可通過修改檔案/proc/sys/net/ipv4/ip_local_port_range的內容來修改這個範圍。

udp_hash是乙個list陣列,總共有128項,所有在協議棧中建立的udp socket全部以本地埠號為關鍵字被放入這個雜湊陣列中,全域性變數udp_port_rover記錄了最近一次被分配的埠號。尋找乙個新的可用的埠,總是從udp_port_rover開始找,檢查udp_hash[udp_port_rover & (udp_htable_size - 1)]的list是否為空,如果為空,則取udp_port_rover為新的埠,如果不為空,則記錄下這個list的size,同時儲存下該埠號,然後遍歷整個陣列,找到size最小的乙個list,取對應的埠號為我們所要獲得的埠。然後,檢查這個新獲得的埠號是否已經被使用(同樣,通過檢查udp_hash實現)。如果已在使用中,則把埠號加上udp_htable_size(128)再檢查。直至獲得未使用的埠號。

深度探索Linux核心之對組播的支援

對組播資料報的支援由如下幾項組成 若干裝置標誌,乙個裝置函式和乙個資料結構。下面分別對其進行介紹。net device結構體的成員flags是乙個unsigned short型的資料型別,儲存網路介面的一組裝置標誌。對於乙太網網路裝置,核心提供的預設的初始化函式中,這樣給flags賦值 dev fl...

深度探索Linux核心之傳送乙個UDP資料報

注 下面會好好幾篇文章,我都摘自同乙個作者,他是一位前輩,和高人。我在此先表示感謝,在文章的後面我會注出作者和位址。我這樣做,主要是防止自己以後找不到這些經典的好文章。出自 在socket程式設計中,傳送資料報文可供使用的api函式有send,sendto和sendmsg,下面是關於前兩個系統呼叫的...

Python Pytorch深度學習之自動微分

目錄 antograd包是pytorch中所有神經網路的核心。autograd為tensor上的所有操作提供自動微分,它是乙個由執行定義的框架,這意味著以 執行方式定義後向傳播,並且每一次迭代都可能不同 torch.tensor是包的核心。1.如果將屬性.requires grad設定為true,則...