原创 Netfilter是如何工作的(三) 規則的匹配(match)

每一條iptables配置的rule都包含了匹配條件(match)部分和動作(target)。當報文途徑HOOK點時,Netfilter會逐個遍歷掛在該鉤子點上的表的rule,若報文滿足rule的匹配條件,內核就會執行動作(tar

原创 tcp: remove per-destination timestamp cache

2017年3月,內核主線將TCP Metrics表項中的時間戳緩存,補丁詳見patch---tcp: remove per-destination timestamp cache struct tcp_metrics_block {

原创 Linux內核TCP Metrics框架

TCP是一個複雜的協議,這種複雜來源於對報文傳輸的可靠性承諾。對每條TCP連接來說,除了有獨立的狀態機、定時器之外,還有擁塞控制相關的一些運行變量,比如RTT、CWND、SSTHRESH等,這些運行參數同樣也是每連接(Per-Connect

原创 Linux內核中的udp隧道框架

起源 TCP雖然能保證傳輸的可靠性,但其繁瑣的狀態機以及複雜的擁塞控制機制讓它難以作爲隧道報文的外層封裝,詳見TCP-in-TCP。 相對而言,UDP就沒這個困擾了,丟包的事情交給應用層處理就行。因而,不少隧道協議都是將UDP作爲外層報文的

原创 小談 TCP-In-TCP

前天晚上在家中,當我搭起熟悉的ss梯子時, 發現不可用了T.T。登陸到控制檯查看,發現國內的IP被Block了。問問身邊朋友,也是一樣的現象,聽說是因爲網絡安全周?!看來只能寄希望於一周後能恢復吧.... 昨天瞎逛,看到一個開源項目:udp

原创 XFRM -- IPsec協議的內核實現框架

IPsec協議幫助IP層建立安全可信的數據包傳輸通道。當前已經有了如StrongSwan、OpenSwan等比較成熟的解決方案,而它們都使用了Linux內核中的XFRM框架進行報文接收發送。 XFRM的正確讀音是transform(轉換)

原创 IPsec與NAT Traversal(NAT-T)

背景 IPsec在兩個通信實體之間建立安全的數據傳輸通道, 但它卻與網絡中廣泛存在的NAT設備(以及PAT)有天生的不兼容性(incompatible)。 我們以一個TCP報文爲例來看看在不同IPsec的不同模式(Transport和Tu

原创 聊聊TCP的重傳退避與公平

TCP在發送報文後,如果沒有收到對端應答,那麼在重傳定時器超時後會觸發重傳,超時時間遵循二進制退避原則,也就是{1,2,4,8,16}這樣成倍地擴大超時時間。退避是因爲TCP認爲丟包意味着網絡有擁塞,爲了不加重網絡的擁塞,TCP選擇等待更

原创 Linux路由緩存的前世今生

3.6版本一定算得上是Linux網絡子系統中一個特別的版本, 這個版本(補丁patch)移除了查找FIB之前的緩存查找。本文就來談談路由緩存的前世今生。 幾個基本概念 爲了讓本文的閱讀曲線更加平緩我決定還是將本文涉及的一些術語作個說明。

原创 那些年,我們忽略的socket參數

調試過網絡程序的人大多使用過tcpdump,那你知道tcpdump是如何工作的嗎? tcpdump這類工具也被稱爲Sniffer,它可以在不影響應用程序正常報文的情況下,將流經網卡的報文複製一份給Sniffer,然後經過加工過濾,最後呈現

原创 IP地址是主機的還是網卡的 ?

讀大學時,宿舍每個人都買了電腦,爲了節約網費,整個宿舍又從二手市場淘了臺TP-LINK路由器。這樣每個人的電腦就通過路由器連接到學校網管中心,再連接到外網。從路由器後臺界面可以看到,路由器爲每個人的電腦分配了一個IP地址。這看上去IP是屬

原创 鎖和無鎖

當我們在編寫多線程程序時,常常會涉及到多個線程對共享數據的訪問。如果不對這種訪問加以限制,往往會導致程序運行結果與預期不符 鎖 編寫代碼時,我們以及習慣了用鎖去保護數據。那麼,這裏的鎖是什麼?爲什麼它能滿足我們的要求?它存在於哪裏? 讓我

原创 Netfilter 是如何工作的(五):初識連接跟蹤(connection track)

報文過濾和連接跟蹤可以說是Netfilter提供的兩大基本功能。前者被大多數人熟知,因爲我們對防火牆的第一印象就是可以阻止有害的報文傷害計算機;而後者就沒這麼有名了,很多人甚至不知道Netfilter有這項功能。 Why 使用連接跟蹤

原创 Netfilter 是如何工作的(四):動作(target)

每一條iptables配置的規則(rule)都包含了匹配條件(match)部分和動作(target)。當報文途徑HOOK點時,Netfilter會逐個遍歷掛在該鉤子點上的表的rule,若報文滿足rule的匹配條件,內核就會執行動作(targ

原创 TAILQ 隊列之一二事

TAILQ隊列是FreeBSD內核中的一種隊列數據結構,在一些著名的開源庫中(如DPDK,libevent)有廣泛的應用。 TAILQ隊列的定義 TAILQ隊列有HEAD和ENTRY兩種基本的數據結構 #define TAILQ