---------------------------------------------------------------------------------------------------------------------
这篇文章写于三年前,当时手中拿着Stevens的三本巨著 TCP v1/v2/v3 的摸不着头脑-因为它们太厚了。我知道我不需要那么多,那么详细。于是有了自己分析源代码的想法......
我不对文中的内容提供任何保证,但欢迎与我联系以便不断的修改它,最终给需要知道关于Linux TCP/IP实现的人提供短小精悍的文章内容。
-- 水元素
---------------------------------------------------------------------------------------------------------------------
第一部分:Linux的TCP/IP实现概述
Linux通过同时对多种通信协议的支持来提供通用的底层基础服务。它的第一个网络模型的版本是4.3 BSD,也称为Net/1,今天的Linux已经使用Net/4 (Linux 2.2),其中大多数代码已经完全和BSD的版本不同,但是它依然支持UINX平台之间程序的移植。
Linux网络套接字实现的模式是UNIX下的普遍标准。同时,Net/4的网络层是完全另起炉灶重写的。首先,新的网络层尽可能地实行并行处理, 因此其伸缩性比起以前的版本,不可同日而语。其次,它包括了许多的优化,以便绕过不少流行操作系统网络实现中的不合理处(例如Windows)。到目前为止,Linux 是唯一与IPv4和IPv6协议标准完全保持兼容的操作系统,而Linux2.4的IPv4伸缩性又大有提高。
Linux支持的六种不同通信协议族:
1) TCP/IP (使用TCP/IP的Internet 协议族),本文讨论的重点。
2) UNIX域协议 (一种进程间通信的协议)
3) X25协议
4) AX25协议 (业余无线X25)
5)IPX协议 (Novell IPX)
6) APPLETALK协议 (AppleTalk DDP)
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 所示。
待续......