ftp關鍵技術五 限制鏈結數

2021-08-21 19:04:42 字數 2385 閱讀 2697

通常在一些**中,為了防止惡意大量的訪問和超大量訪問導致記憶體佔滿,會對單個鏈結的連線數和總鏈結數做出乙個限制。
​ 以本ftp服務端為例,假設每個客戶鏈結,我們都需要兩個程序來處理它,假設了乙個客戶需要分配總共1m的棧記憶體出來,1000個鏈結,接近1g的記憶體就沒有了。另一方面,如果單個ip大量鏈結服務端,會占用大量的頻寬、記憶體和檔案控制代碼,實際上每個使用者(ip)只需要兩三個鏈結就可以解決問題,所以對單個ip連線數進行限制,有助於維持服務端的效能穩定和防止惡意訪問。

​ 在系統自帶vsftpd中有如下的配置檔案

max_clients=300 最大客戶端連線數為300

max_per_ip=10 每個ip最大連線數

​ 現在我們知道,我們需要乙個資料結構來儲存ip和ip對應的鏈結數,所以我們首先想到的就是用鍵值對模型,即每個ip對應乙個鏈結數,並儲存起來,並且我們需要能夠快速插入、刪除和查詢,適合的就是樹和hash表。但是連線數真的能解決問題嗎?

​ ​ 首先,何時鏈結,我們何時增加乙個連線數這個毋容置疑,但是,我們要如何知道這個鏈結結束了呢?我們可以在程序結束的時候,獲得程序結束的訊號,從而感知到乙個程序的結束,所以這個時候,我們就不能單單依靠連線數,而是依靠程序的pid來對應ip。

​ 所以我們需要兩個hash表,乙個hash表是pid to ip,另乙個表是ip to conn。

​ 至於hash_table我們可以自己定製寫乙個,也可以用stl庫中的,但是還是自己寫乙個吧,我們只需要用到hash_table的部分功能。

​ 下面的函式只是對主要的成員函式進行注釋,方便理解(這裡並沒用泛型,而是借鑑了redis的實現方式用void *實現的hashtable)。

void* hash_lookup_entry(void* key, unsigned int key_size);

//尋找並返回key所對應的value, 如value為空,則返回空。

void hash_add_entry(void *key, unsigned int key_size,

void *value, unsigned int value_size);

//新增乙個key-value

void hash_free_entry(void *key, unsigned int key_size);

//刪除乙個key-value

​ 下面我們需要兩個表

static hash* s_ip_conn_hash;

static hash* s_pid_ip_hash;

​ 在接受鏈結成功後,我們可以獲得乙個unsigned int型別的ip,我們可以根據這個ip,找到ip所對應的p_count,再對p_count進行操作就完成了ip-conn的建立和增長。

unsigned int ip = addr.sin_addr.s_addr;

sess.num_this_ip = handle_ip_count(&ip);

......

unsigned int handle_ip_count(void *ip)

else

return count;

}

為了減少主程序的工作,我們將檢測鏈結過限制放到子程序中。

if (pid == 0)    //子程序

void check_limits(session_t *sess)

if (tunable_max_per_ip > 0 && sess->num_this_ip > tunable_max_per_ip)

}

​ 在鏈結數的刪除上,我們需要明白乙個流程。

​ 1.建立/增加 ip-value

​ 2.在父程序中建立pid-ip鍵值對

​ 3.在父程序中檢測到子程序的退出

​ 4.查詢pid對應的ip,刪除ip對於的兩個鍵值對。

​ 那如何實現檢測呢?我們可以設定乙個訊號,當檢測到sigchld時候,執行操作四。

signal(sigchld, handle_sighid);

//接受鏈結後

if (pid == 0)    //子程序

//檢測到子程序退出後執行

void handle_sighid(int sig)

drop_ip_count(ip);    //對ip-value減一或者刪除操作

s_pid_ip_hash->hash_free_entry(&pid, sizeof(pid));}}

​        void drop_ip_count(void *ip)

​            count = *p_count;

if (count <= 0)

--count;

*p_count = count;

if (count == 0)

}​

完整的專案在 :

cookie關鍵技術

一 cookie是在服務端建立。二 cookie是儲存在瀏覽器端,存放路徑如下截圖。三 cookie的生命週期可以設定,如果不設定生命週期,當瀏覽器關閉時,cookie就消亡。四 cookie可以被同一臺機器的多個瀏覽器共享。五 可以把cookie看成一張表,表字段由 名字,值 組成。六 如果伺服器...

RTOS關鍵技術指標

評價乙個實時作業系統的優劣可以用一下幾個技術指標來衡量。1 任務排程演算法 乙個實時作業系統的任務排程演算法,在很大程度上決定了其系統實時性和其多任務排程能力。常用的任務排程演算法有優先順序排程策略和時間片輪轉排程策略 排程的方式可分為搶占式 不可搶占式和選擇可搶占式等 常用的排程演算法有rate ...

LTE關鍵技術介紹

我們來交流一下lte的關鍵技術。其實說到關鍵技術,主要還是物理層的關鍵技術,lte在物理層採用了ofdm和mimo等技術,極大地提高了系統的系統和吞吐量。1 網路架構 3gpp lte接入網在能夠有效支援新的物理層傳輸技術的同時,還需要滿足低時延 低複雜度 低成本的要求。原有的網路結構顯然已無法滿足...