原创 TCP的重傳退避與公平

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

原创 隧道而言, TCP-In-TCP會發生什麼

上週晚上在家中,當我搭起熟悉的ss梯子時, 發現不可用了T.T。登陸到控制檯查看,發現國內的IP被Block了。 昨天瞎逛,看到一個開源項目:udp2raw-tunnel,他實現的是將一個IP報文僞裝成TCP報文,目的是穿過網絡中

原创 TCP Metrics--remove per-destination timestamp cache

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

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

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

原创 Cisco思科網絡插件Contiv (三) Plugin 實現原理

Contiv網絡結構 上圖爲Contiv的網絡模型,大體上可分爲Master和Host Agent兩個組件,其中Plugin運行在每臺宿主機上, 主要負責1. 與Container Runtime交互實現插件邏輯. 2. 配置

原创 走進Linux內核網絡 報文是什麼—sk_buff

前言 今天來聊下sk_buff。如果把內核網絡協議棧比作一個人,那麼sk_buff就是流淌在他體內血管裏紅血球,它運輸養分(數據)走遍全身(協議棧每一層)。一個sk_buff就是一個報文。 報文的表示方式 在協議棧層次模型中,我們

原创 走進Linux內核網絡 序

前言 很早就準備寫這樣一個系列,但是遲遲也沒有動筆,一是因爲這部分內容已經算比較成熟了,網上資料很多;二是因爲還是擔心自己水平不夠誤人子弟。但今天下定決心開始動筆,一是因爲網絡上的資料水平真的是良莠不齊,回想自己當初研究這塊的時候

原创 走進Linux內核網絡 高屋建瓴—stack layer model

前言 作爲本系列的第一篇文章,讓我們首先聊聊協議棧模型(stack layer model)。還記得在大學課堂裏的時候學TCP/IP的時候,我其實並不能分清楚ISO/OSI分層模型和TCP/IP分層模型二者的區別. 就是下面這幅圖

原创 Linux中TCP listen套接字的查找的變化

內核TCP在收到SYN報文時,會根據報文的目的IP和Port,在本地匹配處於LISTEN狀態的套接字進行握手過程。 4.17版本以前的listen套接字查找 The current listener hashtable is hashed

原创 Linux內核中reuseport的演進

SO_REUSEPORT選項在Linux 3.9被引入內核,在這之前也有一個很像的選項SO_REUSEADDR。如果你不太清楚這兩者的區別和聯繫,建議閱讀How do SO_REUSEADDR and SO_REUSEPORT differ

原创 Netfilter是如何工作的(一) HOOK點

寫在前面 本系列不是介紹How to配置iptables的文章。因爲網絡上已經有很多這類型的教程了,其中一些還不錯(比如鏈接). 本系列也不是一般意義上的Netfilter源碼分析文章。因爲大段粘貼代碼也會讓人心生畏懼和厭煩! 本

原创 TAILQ 之一二事

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

原创 inet socket 與 packet socket

[外鏈圖片轉存失敗(img-jGyWSBRz-1569142979995)(https://s2.ax1x.com/2019/08/17/muuRUg.png)] 調試過網絡程序的人大多使用過tcpdump,但你知道tcpdump

原创 鎖與無鎖

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

原创 Netfilter是如何工作的(二) 表(table)與規則(rule)

在(一)中說到,報文在內核協議棧中會途經5個HOOK點,在每個HOOK點上會依次執行鏈表上的鉤子函數,那麼這些鉤子函數是如何與用戶使用iptables下發的各個rule聯繫起來的呢?這些rule又是如何存儲的呢? 本文詳細描述這個