通常在一些**中,為了防止惡意大量的訪問和超大量訪問導致記憶體佔滿,會對單個鏈結的連線數和總鏈結數做出乙個限制。 以本ftp服務端為例,假設每個客戶鏈結,我們都需要兩個程序來處理它,假設了乙個客戶需要分配總共1m的棧記憶體出來,1000個鏈結,接近1g的記憶體就沒有了。另一方面,如果單個ip大量鏈結服務端,會占用大量的頻寬、記憶體和檔案控制代碼,實際上每個使用者(ip)只需要兩三個鏈結就可以解決問題,所以對單個ip連線數進行限制,有助於維持服務端的效能穩定和防止惡意訪問。
在系統自帶vsftpd中有如下的配置檔案
max_clients=300 最大客戶端連線數為300 現在我們知道,我們需要乙個資料結構來儲存ip和ip對應的鏈結數,所以我們首先想到的就是用鍵值對模型,即每個ip對應乙個鏈結數,並儲存起來,並且我們需要能夠快速插入、刪除和查詢,適合的就是樹和hash表。但是連線數真的能解決問題嗎?max_per_ip=10 每個ip最大連線數
首先,何時鏈結,我們何時增加乙個連線數這個毋容置疑,但是,我們要如何知道這個鏈結結束了呢?我們可以在程序結束的時候,獲得程序結束的訊號,從而感知到乙個程序的結束,所以這個時候,我們就不能單單依靠連線數,而是依靠程序的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; 在接受鏈結成功後,我們可以獲得乙個unsigned int型別的ip,我們可以根據這個ip,找到ip所對應的p_count,再對p_count進行操作就完成了ip-conn的建立和增長。static hash* s_pid_ip_hash;
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接入網在能夠有效支援新的物理層傳輸技術的同時,還需要滿足低時延 低複雜度 低成本的要求。原有的網路結構顯然已無法滿足...