目录:
第1章 本书的计划1
1.1基本路线和要求1
技术要点:分析路线服务器程序学习要求
1.2 TCP/IP协议层的划分与基本知识4
技术要点:协议层知识服务器与客户端的通信路线
1.3函数到系统调用的过程6
技术要点:库函数的真实定义系统调用的总入口及传值
1.4网络文件系统11
技术要点:网络文件系统的特点initcall机制网络文件系统的安装
第2章 socket的创建15
2.1本章几个重要数据结构15
技术要点:socket结构、sock结构、sk_buff结构、tcp_sock结构的定义
2.2分配并初始化socket结构23
技术要点:分配socket结构空间分配文件节点
2.3使用协议族的函数表初始化socket27
技术要点:登记函数表定义、注册及初始化协议族结构
2.4分配并初始化sock结构38
技术要点:分配结构空间初始化sock结构及数据包队列头
2.5TCP协议对sock结构初始化43
技术要点:TCP协议的初始化函数tcp_sock等结构的关联
2.6socket与文件系统的关联46
技术要点:分配文件指针和文件号指定文件操作表
第3章 socket地址设置51
3.1地址设置接口51
技术要点:地址设置过程查找socket和文件指针复制数据到内核
3.2地址结构定义54
技术要点:结构的定义及赋值协议族的设置函数网络空间结构
3.3地址类型58
技术要点:地址类型的概念 查验地址类型获取路由函数表
3.4设置地址和端口62
技术要点:地址与端口的队列结构地址与端口的查找与建立
3.5网络空间总管init_net73
技术要点:init_net结构的初始化 队列头的初始化
第4章 路由78
4.1路由函数表结构及关系图78
技术要点:fib_table结构、fn_zone结构、fib_node结构及fib_info结构的关系
4.2路由函数表的初始化78
技术要点:路由表队列、路由函数表队列的初始化路由规则结构、路由函数表结构、路由区结构的定义子网掩码的作用
4.3通过路由函数表查找路由信息100
技术要点:路由区及路由节点的匹配和查找路由信息、路由跳转结构的查找
4.4路由的设置及相关结构的初如化109
技术要点:设置路由的三条路线路由配置结构的定义路由区的建立路由信息的创建和调整队列节点的链入与摘除路由跳转结构的初始化路由函数表的查找
路由别名结构的建立路由表的冲刷与释放
4.5基于输出方向的路由表查找与创建156
技术要点:路由键值结构的定义路由表结构的定义路由表队列的轮询路由表的创建与查找
4.6基于输入方向的路由表查找与创建189
技术要点:为数据包查找路由表创建转发的路由表
第5章 通知链200
5.1设备通知链节点的挂入200
技术要点:通知链节点结构的定义设备配置结构的定义设备通知链的建立
5.2地址通知链节点的挂入206
技术要点:地址通知链的定义和链入
5.3通知链的调用和执行207
技术要点:网络设备结构的登记注册通知节点函数的调用
第6章 netlink概述212
6.1netlink的创建212
技术要点:netlink的sock结构定义及初始化
6.2注册路由的netlink217
技术要点:路由的netlink结构定义及注册
6.3通过netlink通信219
技术要点:netlink的信息结构、消息头结构、路由消息结构的定义及初始化netlink数据包的建立及发送
第7章 监听连接请求234
7.1内核的监听函数234
技术要点:协议族监听函数的调用连接数的控制监听结构的建立及定义连接请求结构及队列
7.2内核的监听队列241
技术要点:监听队列的链入过程监听队列的睡眠等待和唤醒
第8章 接收连接请求245
8.1接收连接函数245
技术要点:协议族接收函数的调用定时等待连接请求
8.2异步接收方式253
技术要点:异步接收实例异步唤醒路线查询客户端sock结构和连接请求结构
8.3获取连接请求257
技术要点:客户端socket、sock结构的对接获取客户端的地址INET协议族结构的定义
第9章 准备连接请求262
9.1内核的连接函数263
技术要点:客户端程序及服务器程序的通信效果协议族连接函数的调用源路由的分类和查找TCP协议的socket结构定义端口的查找与复用SYN数据包的建立路由项结构的定义MTU、MSS的作用及设置滑动窗口的初始化
9.2分配数据包结构和数据块空间286
技术要点:创建并初始化数据包共享结构的定义及数据块的分类TCP的控制结构发送队列的链入和计数数据包的结构示意图
9.3构建、发送TCP数据包299
技术要点:TCP头部的定义TCP层的发送过程克隆数据包的建立重发数据包的依据拥塞报告的建立
9.4进化成IP数据包312
技术要点:IP层的发送过程IP选项的定义IP头部的定义及初始化ID编号的生成和设置链路层头部缓存结构的定义邻居子系统的发送函数
9.5进化成以太网数据包330
技术要点:链路层头部及其缓存结构的初始化以太网头部结构的定义及初始化
9.6发送以太网数据包335
技术要点:分段发送的检测网卡驱动程序的发送过程
第10章 邻居子系统345
10.1邻居子系统的初始化345
技术要点:ARP的邻居表结构、邻居结构的定义邻居表的链入查找、创建ARP的邻居函数表
10.2查找邻居结构355
技术要点:邻居结构的查找过程
10.3邻居子系统的发送事件356
技术要点:邻居结构的状态类型及检测邻居结构的定时器、定时函数ARP包的建立及初始化ARP头部的定义ARP包的发送
10.4邻居子系统的接收处理366
技术要点:ARP数据包类型结构ARP数据包的接收和处理解包获取客户端地址
更新邻居结构
第11章 流量控制374
11.1排队规则的初始化374
技术要点:排队规则的定义网卡设备结构的登记与注册排队规则的创建及初始化
排队规则函数表的定义
11.2排队规则的入队和发送382
技术要点:排队规则的入队操作排队规则对数据包的流量控制和发送过程
第12章 建立连接的过程388
12.1驱动程序接收并建立数据包388
技术要点:网卡驱动程序的接收过程构建数据包软中断数据结构的运用软中断函数的接收过程
12.2查找数据包类型且调用其处理函数400
技术要点:数据包类型结构的定义IP数据包类型及数据包类型队列IP层的接收过程
12.3接收或转发IP数据包408
技术要点:IP选项的检查源路由的执行路由表的转发和接收过程
12.4TCP数据包的处理415
技术要点:传输层函数表结构的定义TCP协议的函数表注册TCP层的接收过程
查找与唤醒服务器进程
12.53次握手过程427
技术要点:查找、创建客户端sock结构建立连接请求结构创建并发送ACK包连接请求的转接
第13章 Internet控制信息的传输446
13.1发送ICMP信息446
技术要点:ICMP的作用ICMP的发送函数 ICMP信息结构、头部结构、缓存结构的定义 ICMP控制结构数组 ICMP发送速率的设置
13.2接收ICMP信息458
技术要点:ICMP协议的函数表 ICMP协议的接收过程
第14章 数据包的分段与重组461
14.1数据包的分段发送461
技术要点:数据包的分段示意图 IP层的分段函数 快发送、慢发送过程 分段数据的复制
14.2数据包的分段接收和重组472
技术要点:IP层的重组函数 整理、合并分段数据包过程
14.3分段数据包的接收队列482
技术要点:IP分段队列结构INET协议族的分段队列头结构 网络空间、INET协议族的分段管理结构
14.4查找与创建分段队列485
技术要点:IPv4分段信息结构查找、创建INET分段队列头初始化IP分段队列结构
14.5释放和销毁分段队列489
技术要点:清除分段队列释放分段数据包和队列头
第15章 发送和接收数据包494
15.1内核的发送、接收函数494
技术要点:3种发送、接收的系统调用过程网络文件系统的发送、接收函数
15.2客户端发送数据包501
技术要点:消息结构、缓冲区结构的定义与初始化 构建发送数据包 TCP层的发送过程TCP层的分段发送阻塞的检测
15.3服务器接收数据包529
技术要点:TCP层的接收过程预处理队列的链入和处理预处理进程的接收过程
复制数据到程序的缓冲区 处理后备队列的数据包
//z 2014-05-31 21:04:24 L.214\'10536 BG57IV3@BYH T2618339684.K.F519279140 [T8,L116,R1,V14]
第16章 socket的关闭551
16.1内核的关闭函数551
技术要点:网络文件系统的关闭函数删除、释放异步结构 释放接收队列的数据包 释放、销毁sock结构、连接请求结构
16.2服务器与客户端的共同关闭563
技术要点:服务器与客户端FIN、ACK、RST包的交互过程状态改变与强制关闭
索引569
参考文献579
//z 2014-07-27 17:24:46 L.157\'23714 BG57IV3@BYH T3001405310.K.F353856064 [T4,L54,R1,V15]
关于网络的一些参考书:
其他一些程序该读之书
开源的TCP/IP协议栈资料
1、BSD TCP/IP协议栈,BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈)是BSD栈派生的。这是因为 BSD栈在BSD许可协议下提供了这些专业栈的雏形,BSD许用证允许BSD栈以修改或未修改的形式结合这些专业栈的代码而无须向创建者付版税。同时, BSD也是许多TCP/IP协议中的创新(如广域网中饿拥塞控制和避免)的开始点。
ftp://ftp.freebsd.org/pub/FreeBSD/
2、uC/IP是由Guy Lancaster编写的一套基于uC/OS且开放源码的TCP/IP协议栈,亦可移植到其它操作系统,是一套完全免费的、可供研究的TCP/IP协议栈,uC/IP大部分源码是从公开源码BSD发布站点和KA9Q(一个基于DOS单任务环境运行的TCP/IP协议栈)移植过来。uC/IP具有如下一些特点:带身份验证和报头压缩支持的PPP协议,优化的单一请求/回复交互过程,支持IP/TCP/UDP协议,可实现的网络功能较为强大,并可裁减。 UCIP协议栈被设计为一个带最小化用户接口及可应用串行链路网络模块。根据采用CPU、编译器和系统所需实现协议的多少,协议栈需要的代码容量空间在
30-60KB之间。
http://ucip.sourceforge.net
3、LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP的含义是Light Weight(轻型)IP协议,相对于uip。LwIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。LwIP TCP/IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM就可以运行,这使 LwIP协议栈适合在低端嵌入式系统中使用。LwIP的特性如下:支持多网络接口下的IP转发,支持ICMP协议,包括实验性扩展的的UDP(用户数据报协议),包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议),提供专门的内部回调接口(Raw
API)用于提高应用程序性能,并提供了可选择的Berkeley接口API。
http://sics.se/~sdam/lwip/
4、uIP是专门为8位和16位控制器设计的一个非常小的TCP/IP栈。完全用C编写,因此可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行。uIP中还包括一个HTTP服务器作为服务内容。许可:BSD许用证 http://dunkels.com/adam/uip/
5、TinyTcp 栈是TCP/IP的一个非常小和简单的实现,它包括一个FTP客户。TinyTcp是为了烧入ROM设计的并且现在开始对大端结构似乎是有用的(初始目标是68000芯片)。TinyTcp也包括一个简单的以太网驱动器用于3COM多总线卡
个人认为选择一个开源协议栈可以从四个方面来考虑:一个是是否提供易用的底层硬件API,即与硬件平台的无关性;一个是与操作系统的内核API。协议栈需要调用的系统函数接口是否容易构造,另一个对于应用支持程度。最关键的是占用的系统资源是否在可接受范围内,有裁减优化的空间否?
其中, BSD 栈可完整实现TCP/IP协议,但代码庞大,70KB-150KB之间,裁减优化有难度,uIP和TinyTcp代码容量小巧,实现功能精简,限制了在一些较高要求场合下的应用,如可靠性与大容量数据传输。LwIP和uC/IP是同量级别的两个开源协议栈,两者代码容量和实现功能相似,LwIP没有操作系统针对性,它将协议栈与平台相关的代码抽象出来,用户如果要移植到自己的系统,需要完成该部分代码的封装,并为网络应用支持提供了API接口的可选性。 uC/IP协议最初是针对uC/OS设计,为方便用户移植实现,同样也抽象了协议栈与平台相关代码,但是协议栈所需调用的系统函数大多参照uC/OS内核函数原型设计,并提供了协议栈的测试函数,方便用户参考,其不足在于该协议栈对网络应用支持不足。
根据以上分析,从应用和开发的角度看,似乎 LWIP更得到了网上很多朋友使用的青睐;uC/IP在文档支持与软件升级管理上有很多不足,但是它最初是针对UC/OS而设计,如果选用UC/OS作为软件基础的话,在系统函数构造方面有优势。当然你选择其他操作系统的话,可参照OS_NULL文件夹下的文件修改。
以上的这些开源协议栈也并非免费,拿来就可以用,据我所知,UC/OS的母公司推出UC/OS-TCP/IP花了6人*2年的工作量,国内某公司使用LWIP作为移植的参照,花了4-5人*2年的工作量来测试与优化协议,使用商用TCP/IP栈的高费用就不足为奇了。
作为广大的爱好者学习而言,如果只是跑跑原型,实验一下效果,以上的几种开源协议栈都提供了测试的例子,应该是不错的选择。个人的看法:LWIP可优先考虑,至少网上有很多的人一块研究,参考的资料较多;UC/IP其次,如果你想深入学习TCP/IP的话,移植UC/IP是一种挑战性的工作,它尚需完善。
转自:http://blog.21ic.com/user1/1993/archives/2006/17272.html
(1)bsd tcp/ip stack--最经典的tcp/ip stack
Wright 和 Stevens 在《TCP/IP详解 卷2:实现》中详细剖析了其源代码,该书十分精彩!
(2)lwip( http://savannah.nongnu.org/projects/lwip/ , http://www.sics.se/~adam/lwip/index.html )
lwIP is a small independent implementation of the TCP/IP protocolsuite that has been developed by Adam Dunkels at the Computer and Networks Architectures (CNA) lab at the Swedish Institute of Computer Science (SICS).
The focus of the lwIP TCP/IP implementation is to reduce resource usage while still having a full scale TCP. This making lwIP suitable for use in embedded systems with tens of kilobytes of free RAM and room for around 40 kilobytes of code ROM.
lwIP features:
- IP (Internet Protocol) including packet forwarding over multiple network interfaces
- ICMP (Internet Control Message Protocol) for network maintenance and debugging
- UDP (User Datagram Protocol) including experimental UDP-lite extensions
- TCP (Transmission Control Protocol) with congestion control, RTT estimation and fast recovery/fast retransmit
- Specialized raw API for enhanced performance
- Optional Berkeley-alike socket API
- DHCP (Dynamic Host Configuration Protocol)
- PPP (Point-to-Point Protocol)
- ARP (Address Resolution Protocol) for Ethernet
License : Modified BSD License
Registration Date : Thursday 10/17/02 at 21:13 UTC
Development Status : 5 - Production/Stable
设计文档:Adam Dunkels, Design and Implementation of the lwIP TCP/IP Stack(pdf)
Adam Dunkels 在 http://www.sics.se/~adam/lwip/links.html 上给出的一些tcp/ip实现及其它重要信息:
Other small TCP/IP implementations:
- uIP - My own very small free TCP/IP implementation, suitable for systems with hundreds of bytes free RAM and a few kilobytes of free code space.
- Picnic - A hardware design with a PIC and an Ethernet chip that includes software for running a web server.
- CMX Micronet - A commercial small TCP/IP implementation for 8-bit systems.
- InterNiche NicheStack - A commercial TCP/IP stack for embedded systems.
- LiveDevices Embedinet - A small commercial TCP/IP stack for PIC and H8S.
- Kadak KwikNet - A commercial TCP/IP stack for embedded systems.
- uC/IP - uC/IP is a BSD-based TCP/IP protocol stack for microcontrollers.
- TinyTCP - A very slim TCP, IP, and FTP implementation.
- WWWpic2 - Small HTTP/TCP/IP implementation for a PIC.
- PIC Web Server - Small HTTP/TCP/IP/SLIP PIC implementation.
- Liquorice - Liquorice includes a TCP/IP stack.
- CPC/IP - A TCP/IP stack for Amstrad CPCs.
- LUnix - LUnix contains a small TCP/IP stack.
- JOS - JOS includes a TCP/IP implementation.
Very small web servers:
Related RFCs:
- J. Postel, Internet Protocol , RFC791, September 1981.
- J. Postel, Internet Control Message Protocol , RFC792, September 1981.
- J. Postel, User Datagram Protocol , RFC768, August 1980.
- J. Postel, Transmission Control Protocol , RFC793, September 1981.
- D. D. Clark, Window and Acknowledgement Strategy in TCP , RFC813, July 1982.
- D. D. Clark, Modularity and Efficiency in Protocol Implementation , RFC817, July 1982.
- R. Braden, Requirements for Internet Hosts -- Communication Layers , RFC1122, October 1989.
- T. Mallory and A. Kullberg, Incremental Updating of the Internet Checksum , RFC1141, January 1990.
- A. Rijsinghani, Computation of the Internet Checksum via Incremental Update , RFC1624, May 1994.
- R. Braden, TIME-WAIT Assasination Hazards in TCP , RFC1337, May 1992.
- B. Carpenter, Architectural Principles of the Internet , RFC1958, June 1996.
- M. Allman, V. Paxson and W. Stevens, TCP Congestion Control , RFC2581, April 1999.
- S. Parker and C. Schmechel, Some Testing Tools for TCP Implementors , RFC2398, August 1998.
Related publications:
- V. Jacobson. Congestion avoidance and control. In Proceedings of the SIGCOMM \'88 Conference , Stanford, California, August 1988.
- V. Jacobson. 4.3BSD TCP header prediction. ACM Computer Communications Review , 20(2), April 1990.
- P. Karn and C. Partridge. Improving round-trip time estimates in reliablie transport protocols. In Proceedings of the SIGCOMM \'87 Conference , Stowe, Vermont, August 1987.
- J. Kay and J. Pasquale. Profiling and Reducing Processing Overheads in TCP/IP. IEEE/ACM Transactions of Networking , 4(6), December 1996.
- L. Larzon, M. Degermark, and S. Pink. UDP Lite for real-time multimedia applications. In Proceedings of the IEEE International Conference of Communications , Vancouver, British Columbia, Canada, June 1999.
- P. E. McKenney and K. F. Dove. Efcient demultiplexing of incoming TCP packets. In Proceedings of the SIGCOMM \'92 Conference , Baltimore, Maryland, August 1992.
- C. Partridge and S. Pink. A faster UDP. IEEE/ACM Transactions in Networking , 1(4), August 1993.
(3)SSFNet的java实现( www.ssfnet.org )
本文引用通告地址:http://lionwq.spaces.eepw.com.cn/articles/trackback/item/17265
1. 焦海波版
lwip的设计和实现(中文).pdf
2.果农版
Lwip 协议栈的设计与实现.pdf
另:英文原版
Design and Implementation of the lwIP TCPIP Stack.pdf