原创 linux下ip協議(V4)的實現(二)

這次主要介紹下forward和local delivery。 上次我們提到當ip_rcv_finish完成後後調用相關的發送函數ip_forward或者ip_local_deliver.這次就主要介紹這兩個函數。 先來看forward。 

原创 linux下的網橋介紹

網橋用來連接不同的網段。使不同的網段能夠相互通信,看起來很像三層的路由。它能夠有多個port,從而能夠將數據幀從一個port複製到另一個port。 這裏要注意一點,linux下的網橋只能用於以太網。 來看下示意圖:  其中一個是bridg

原创 linux下ip協議(V4)的實現(四)

這次主要介紹的是ip層的切片與組包的實現。  首先來看一下分片好的幀的一些概念:  1 第一個幀的offset位非0並且MF位爲1  2 所有的在第一個幀和最後一個幀之間的幀都擁有長度大於0的域  3 最後一個幀MF位爲0 並且o

原创 tcp connection setup的實現(二)

首先來看下內核如何處理3次握手的半連接隊列和accept隊列(其實也就是server端的三次握手的狀態變換).而半連接隊列和accept隊列在內核如何表示,我們上次已經介紹過了,這裏就不介紹了.  首先我們知道當3層的數據包到達之後會

原创 網橋在內核的實現

我們知道netdevice有一個priv域,這個域用來保存設備的私有數據,當這個設備是一個網橋的時候,priv域也就指向一個struct net_bridge. 接下來看net_bridge以及相關的數據結構:  Java代碼  

原创 linux下ip層的一些概念

首先來看這個ip層的結構: 這裏看到非常多的netfilter hook,這是因爲netfilter主要是針對ip層的。 ip層的主要任務有下面5個方面: 1 ip數據包的校驗 2 防火牆的處理(也就是netfilter子系統) 3 處理

原创 tcp connection setup的實現(一)

bind的實現:  先來介紹幾個地址結構.  struct sockaddr 其實相當於一個基類的地址結構,其他的結構都能夠直接轉到sockaddr.舉個例子比如當sa_family爲PF_INET時,sa_data就包含了端口號

原创 linux下ip協議(V4)的實現(三)

這次我們來看數據包如何從4層傳遞到3層。  先看下面的圖,這張圖表示了4層和3層之間(也就是4層傳輸給3層)的傳輸所需要調用的主要的函數:    我們注意到3層最終會把幀用dst_output函數進行輸出,而這個函數,我們上一次已

原创 ip層和4層的接口實現分析

首先來看一下基於3層的ipv4以及ipv6實現的一些4層的協議: 這裏要注意並沒有IGMPV6,這是因爲在ipv6中,它是作爲iCMPv6的一部分實現的. 首先我們要知道輸入數據包的ip頭中的protocol域標識了,將要傳遞的4層協議

原创 Spanning Tree Protocol介紹

Spanning Tree Protocol(STP)主要是用在網橋上,用來避免網絡迴路,並製造冗餘連接(也就是保證網絡的可靠性). 這裏只是一個大概的介紹,具體的還是要去看IEEE 的 802.1D STP的文檔。 先看下面的圖: 我

原创 linux下ip協議(V4)的實現(一)

首先來看校驗相關的一些結構: 1 net_device結構: 包含一個features的域,這個表示設備的一些特性(比如控制校驗),下面的幾個flag就是用來控制校驗:  Java代碼   #define NETIF_F_IP_CS

原创 Sys文件系統分析

還記得上篇講到的platform總線、設備、驅動的知識??這裏我們先來看一段documentation/filesystems/sysfs.txt裏關於sysfs文件系統的描述:   sysfs is a ram-based file

原创 鏈路層到網絡層的數據傳遞

我們知道在tcp/ip模型中,基本每一層都可以處理多重協議類型,那麼當一個輸入幀到達後,內核的每一層是如何來取得相應的處理函數呢?也就是說當我要把包傳遞給上層的時候,如何取得相應協議的處理函數。 我們這裏先來看從二層如何把把數據傳遞給三層

原创 linux 內核tcp數據發送的實現

在分析之前先來看下SO_RCVTIMEO和SO_SNDTIMEO套接口吧,前面分析代碼時沒太注意這兩個.這裏算是個補充.  SO_RCVTIMEO和SO_SNDTIMEO套接口選項可以給套接口的讀和寫,來設置超時時間,在unix網絡編程

原创 linux 內核tcp接收數據的實現

相比於發送數據,接收數據更復雜一些。接收數據這裏和3層的接口是tcp_v4_rcv(我前面的blog有介紹3層和4層的接口的實現).而4層和用戶空間,也就是系統調用是socket_recvmsg(其他的讀取函數也都會調用這個函數).而這個