最详细的Linux TCP/IP 协议栈源码分析( 六 )


7)ip_rcv、ip_rcv_finish:从以太网接收数据 , 放到skb里 , 作ip层的一些数据及选项检查 , 调用ip_route_input()做路由处理,判断是进行ip转发还是将数据传递到高一层的协议.调用skb->dst->input函数指针,这个指针的实现可能有多种情况,如果路由得到的结果说明这个数据包应该转发到其他主机,这里的input便是ip_forward;如果数据包是给本机的,那么input指针初始化为ip_local_deliver函数./net/ipv4/ip_input.c
8)ip_local_deliver、ip_local_deliver_finish:入口参数skb存放需要传送到上层协议的数据,从ip头中获取是否已经分拆的信息,如果已经分拆,则调用函数ip_defrag将数据包重组 。 然后通过调用ip_prot->handler指针调用tcp_v4_rcv(tcp) 。 ip_prot是inet_protocol结构指针,是用来ip层登记协议的 , 比如由udp,tcp,icmp等协议 。/net/ipv4/ip_input.c
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
【最详细的Linux TCP/IP 协议栈源码分析】Socket层、传输层、网络层 , 和链路层构成 。 应用程序使用系统调用向内核函数传递参数和数据从而进入内核空间 , 由内核中注册的内核函数对相应的数据结构进行处理 。 Linux的TCP/IP层次结构和实现方式如图所示 。
最详细的Linux TCP/IP 协议栈源码分析文章插图