http://www.cnblogs.com/better-zyy/archive/2012/03/16/2400811.html
http://blog.csdn.net/cz_hyf/article/details/602802
一.linux內核網絡棧代碼的准備知識
1. linux內核ipv4網絡部分分層結構:
BSD socket層: 這一部分處理BSD socket相關操作,每個socket在內核中以struct socket結構體現。這一部分的文件主要有:/net/socket.c /net/protocols.c etc
INET socket層:BSD socket是個可以用於各種網絡協議的接口,而當用於tcp/ip,即建立了AF_INET形式的socket時,還需要保留些額外的參數,於是就有了struct sock結構。文件主要
有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c etc
TCP/UDP層:處理傳輸層的操作,傳輸層用struct inet_protocol和struct proto兩個結構表示。文件主要有:
/net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c /net/ipv4//tcp_output.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_output.c /net/ipv4/tcp_timer.c
etc
IP層:處理網絡層的操作,網絡層用struct packet_type結構表示。文件主要有:/net/ipv4/ip_forward.c ip_fragment.c ip_input.c ip_output.c etc.
數據鏈路層和驅動程序:每個網絡設備以struct net_device表示,通用的處理在dev.c中,驅動程序都在/driver/net目錄下。
4.2 數據發送流程圖
4.3 數據接收流程圖
1.1 內核源代碼的組織
表1是本文要使用的Linux Net/4網絡源代碼的,其中大部分位於目錄/usr/src/linux-2.2.x/net,列表如下,
插口層
BSD Socket
/net/socket.c
/net/protocols.c
INET Socket
/ipv4/protocol.c
/ipv4/af_inet.c
/net/ipv4/core/sock.c
協議層
TCP/UDP
/net/ipv4/udp.c
/net/ipv4/datagram.c
/net/ipv4/tcp_input.c
/net/ipv4//tcp_output.c
/net/ipv4/tcp.c
/net/ipv4/tcp_minisocks.c
/net/ipv4/tcp_timer.c etc...
IP
/net/ipv4/ip_forward.c
/net/ipv4/ip_fragment.c
/net/ipv4/ip_input.c
/net/ipv4/ip_output.c
接口層
Ethernet
......
1.2 Linux中TCP/IP網絡層次結構與實現
Linux通過一組相鄰的軟件層實現了TCP/IP模型,它由BSD Socket層、INET Socket層、傳輸層、網絡層,和鏈路層構成。應用程序使用系統調用向內核函數傳遞參數和數據從而進入內核空間,由內核中注冊的內核函數對相應的數據結構進行處理。
Linux的TCP/IP層次結構和實現方式如圖 1 所示。