没有合适的资源?快使用搜索试试~ 我知道了~
首页TCP/IP卷二:伯克利联网程序代码详解
TCP/IP卷二:伯克利联网程序代码详解
需积分: 0 0 下载量 93 浏览量
更新于2024-07-20
收藏 36.37MB PDF 举报
"TCP/IP详解卷二:实现深入解析" 本章是TCP/IP详解系列书籍的第二卷,主要关注于实际的编程实现和协议栈操作。首先,章节以伯克利联网程序代码为例,通过展示源代码来介绍网络编程的基础。作者强调了代码的历史背景,指出读者可以从中了解所使用的编程接口,无论是Unix还是非Unix系统的TCP/IP协议实现。 在本节中,作者通过一个用户程序实例——向远程日期/时间服务器发送UDP数据报并接收响应,详细剖析了整个通信过程中的数据报传输和协议栈运作机制。这个示例不仅展示了数据结构和概念,如核心数据结构、数据报的路由和传输,还让读者理解了底层协议的交互方式。 源代码的表示形式非常注重清晰性和一致性,每行代码都有编号,且遵循特定的格式规则,如使用缩进和界线。尽管代码基于4.4BSD-Lite版本,但书中会指出可能存在的错误和编辑注释,以便读者理解其真实性和可能需要修正的地方。此外,一些简化处理也被提及,比如删除了针对特定应用(如路由器或多播路由器)的代码片段,以及省略了注册说明符。 这一章节的目的是为了帮助读者掌握TCP/IP协议的实现原理,通过实例学习编程接口的使用,理解数据包在网络中的流动路径,以及如何调试和优化网络通信。后续章节将更加深入地探讨这些主题,确保读者能全面掌握TCP/IP协议在实际环境中的应用和维护。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/9715351/bg10.jpg)
被传递到正确的主机(通过比较数据报的目标 I P地址与主机I P地址),并当系统被配置为一个路
由器,且数据报被表注为其他的 I P地址时,转发此数据报。如果 I P数据报到达它的最终目标,
调用I P首部中标识的协议的输入例程: I C M P,I G M P,T C P 或U D P。在我们的例子中,调用
U D P 输入例程去处理U D P数据报。
1.10.3 UDP输入
U D P 输入例程验证U D P 首部中的各字段(长度与可选的检验和),然后确定是否一个进程应
该接收此数据报。在第 2 3章我们要详细讨论这个检查是如何进行的。一个进程可以接收到一
指定U D P 端口的所有数据报,或让内核根据源与目标 I P 地址及源与目标端口号来限制数据报
的接收。
在我们的例子中, U D P 输入例程从一个全局变量 u d b (图1 - 5 ) 开始,查看所有 U D P 协议控
制块链表,寻找一个本地端口号 ( i n p _ l p o r t)与接收的U D P 数据报的目标端口号匹配的协议
控制块。这个P C B是由我们调用s o c k e t 创建的,它的成员i n p _ s o c k e t 指向相应插口结构,
并允许接收的数据在此插口排队。
在程序示例中,我们从未为应用程序指定本地端口号。在习题 2 3 . 3中,我们会看
到在写第一个 U D P 程序时创建一个插口而不绑定一个本地端口号会导致内核自动地
给此插口分配一个本地端口号 (称为短期端口 )。这就是为什么插口的 P C B成员
i n p _ l p o r t不是一个空值的原因。
因为这个U D P 数据报要传递给我们的进程,发送方的 I P 地址和U D P 端口号被放置到一个
m b u f 中,这个m b u f 和数据(在我们的例子中是 2 6 字节)被追加到此插口的接收队列中。图 1 - 11
所示的是被追加到这个插口的接收队列中的这两个 m b u f 。
图1 - 11 发送方地址和数据
比较这个链表中的第二个 m b u f ( M T _ D A T A 类型 )与图 1 - 1 0 中的 m b u f ,成员 m _ l e n 和
m _ p k t h d r . l e n都减小了 2 8字节( 2 0 字节的I P首部和8字节U D P首部),并且指针m _ d a t a 也减
小了2 8字节。这有效地将I P和U D P 首部删去,只保留了2 6 字节数据追加到插口接收队列。
16计计TCP/IP详解 卷2:实现
下载
指向链中下一个mbuf的指针
16字节sockaddr_in{}
带有发送方IP地址和端口号
插口的接
收队列
指向接口结构的指针
44字节(未用)
26字节(未用)
![](https://csdnimg.cn/release/download_crawler_static/9715351/bg11.jpg)
在链表的第一个 m b u f中包括一个 1 6 字节I n t e r n e t插口地址结构,它带有发送方 I P地址和
U D P 端口号。它的类型是 M T _ S O N A M E,与图1 - 6 中的m b u f类似。这个 m b u f 是插口层创建的,
将这些信息返回给通过调用系统调用 r e c v f o r m 或r e c v m s g 的调用进程。即使在这个链表的
第二个m b u f 中有空间( 1 6字节)存储这个插口地址结构,它也必须存放到它自己的 m b u f 中,因
为它们的类型不同(一个是M T _ S O N A M E,一个是M T _ D A T A )。
然后接收进程被唤醒。如果进程处于睡眠状态等待数据的到达 (我们例子中的情况),进程
被标志为可运行状态等待内核的调度。也可以通过 s e l e c t 系统调用或S I G I O信号来通知进
程数据的到达。
1.10.4 进程输入
我们的进程调用 r e c v f r o m 时被阻塞,在内核中处于睡眠状态,现在进程被唤醒。 U D P
层追加到插口接收队列中的 2 6 字节的数据(接收的数据报 )被内核从m b u f 复制到我们程序的缓
存中。
注意,我们的程序把 r e c v f o r m 的第5,第6个参数设置为空指针,告诉系统在接收过程
中不关心发送方的 I P 地址和U D P 端口号。这使得系统调用 r e c v f r o m时,略过链表中的第一
个m b u f (图1 - 11 ),仅返回第二个m b u f中的2 6字节的数据。然后内核的 r e c v f r o m代码释放图1 -
11中的两个m b u f,并把它们放回到自由 m b u f 池中。
1 . 11 网络实现概述(续)
图1 - 1 2 总结了在各层间为网络输入输出而进行的通信。图 1 - 1 2是对图1 - 3 进行了重画,它
只考虑I n t e r n e t协议,并且强调层间的通信。符号 s p l n e t 与s p l i m p在下一节讨论。
我们使用复数术语插口队列 (socket queues)和接口队列(interface queues),因为每个插口
第1章 概 述计计17
下载
进程
插口队列
软件中断@splnet
(由接口层产生)
协议层
(TCP, UDP, IP, ICMP, IGMP)
协议队列
(IP输入队列)
接口层
硬件中断@splimp
(由网络设备产生)
插口层
系统调用
函数调用
接口队列
函数调用
来启动输出
图1-12 网络输入输出的层间通信
![](https://csdnimg.cn/release/download_crawler_static/9715351/bg12.jpg)
和每个接口 (以太网、环回、 S L I P 、P P P 等)都有一个队列,但我们使用单数术语协议队列
(protocol queue),因为只有一个 I P 输入队列。如果考虑其他协议层,我们就会有一个队列用
于X N S协议,一个队列用于O S I协议。
1.12 中断级别与并发
我们在1 . 1 0 节看到网络代码处理输入分组用的是异步和中断驱动的方式。首先,一个设备
中断引发接口层代码执行,然后它产生一个软中断引发协议层代码执行。当内核完成这些级
别的中断后,执行插口代码。
在这里给每个硬件和软件中断分配一个优先级。图 1 - 1 3 所示的是8个优先级别的顺序,从
最低级别(不阻塞中断)到最高级别(阻塞所有中断)。
函 数 说 明
s p l 0 正常操作方式,不阻塞中断 (最低优先级)
S p l s o f t c l o c k 低优先级时钟处理
s p l n e t 网络协议处理
s p l t t y 终端输入输出
s p l b i o 磁盘与磁带输入输出
s p l i m p 网络设备输入输出
s p l c l o c k 高优先级时钟处理
s p l h i g h 阻塞所有中断 (最高优先级)
s p l x ( s ) (见正文)
图1-13 阻塞所选中断的内核函数
[ L e ffler et al. 1989]的表4 - 5显示了用于VA X 实现的优先级别。3 8 6的N e t / 3 的实现
使用图1 - 1 3所示的8个函数,但s p l s o f t c l o c k 与s p l n e t 在同一级别,s p l c l o c k
与s p l h i g h 也在同一级别。
用于网络接口级的名称 i m p 来自于缩写I M P ( 接口报文处理器),它是在A R PA N E T
中使用的路由器的最初类型。
不同优先级的顺序意味着高优先级中断可以抢占一个低优先级中断。看图 1 - 1 4所示的事
18计计TCP/IP详解 卷 2:实现
下载
被抢占
被抢占
插口
step 1 2 3
4
5 6
7
协议(IP输入)
协议(IP输入)
插口
SLIP设备驱动程序
以太网设备
驱动程序
图1-14 优先级示例与内核处理
![](https://csdnimg.cn/release/download_crawler_static/9715351/bg13.jpg)
件顺序。
1) 当插口层以级别 s p l 0 执行时,一个以太网设备驱动程序中断发生,使接口层以级别
s p l i m p 执行。这个中断抢占了插口层代码的执行。这就是异步执行接口输入例程。
2) 当以太网设备驱动程序在运行时,它把一个接收的分组放置到 I P输出队列中并调度一
个s p l n e t级别的软中断。软中断不会立即有效,因为内核正在一个更高的优先级 (s p l i m p )
上运行。
3) 当以太网设备驱动程序完成后,协议层以级别s p l n e t执行。这就是异步执行I P输入例程。
4) 一个终端设备中断发生 (完成一个S L I P 分组),它立即被处理,抢占协议层,因为终端
输入/输出(s p l t t y )优先级比图1 - 1 3中的协议层(s p l n e t )更高。
5) SLIP驱动程序把接收的分组放到 I P输入队列中并为协议层调度另一个软中断。
6) 当S L I P 驱动程序结束时,被抢占的协议层继续以级别 s p l n e t执行,处理完从以太网设备
驱动程序收到的分组后,处理从 S L I P驱动程序接收的分组。仅当没有其他输入分组要处理时,
它会把控制权交还给被它抢占的进程 (在本例中是插口层)。
7) 插口层从它被中断的地方继续执行。
对于这些不同优先级,一个要关心的问题就是如何处理那些在不同级别的进程间共享的
数据结构。在图1 - 2 中显示了三种在不同优先级进程间共享的数据结构
—
插口队列、接口队
列和协议队列。例如,当 I P 输入例程正在从它的输入队列中取出一个接收的分组时,一个设
备中断发生,抢占了协议层,并且那个设备驱动程序可能添加另一个分组到 I P 输入队列。这
些共享的数据结构(本例中的I P 输入队列,它共享于协议层和接口层 ),如果不协调对它们的访
问,可能会破坏数据的完整性。
N e t / 3的代码经常调用函数 s p l i m p 和s p l n e t 。这两个调用总是与 s p l x 成对出现,s p l x
使处理器返回到原来的优先级。例如下面这段代码,被协议层 I P 输入函数执行,去检查是否
有其他分组在它的输入队列中等待处理:
struct mbuf *m;
int s;
s = splimp ();
IF_DEQUEUE (&ipintrq, m);
splx(s);
if (m == 0)
return;
调用s p l i m p 把C P U 的优先级升高到网络设备驱动程序级,防止任何网络设备驱动程序中断发
生。原来的优先级作为函数的返回值存储到变量 s中。然后执行宏I F _ D E Q U E U E 把I P 输入队列
(i p i n t r q )头部的第二个分组删去,并把指向此 m b u f 链表的指针放到变量 m中。最后,通过
调用带有参数 s ( 其保存着前面调用 s p l i m p 的返回值 )的s p l x ,C P U 的优先级恢复到调用
s p l i m p 前的级别。
由于在调用s p l i m p 和s p l x之间所有的网络设备驱动程序的中断被禁止,在这两个调用
间的代码应尽可能的少。如果中断被禁止过长的时间,其他设备会被忽略,数据会被丢失。
因此,对变量m的测试(看是否有其他分组要处理)被放在调用s p l x 之后而不是之前。
当以太网输出例程把一个要输出的分组放到一个接口队列,并测试接口当前是否忙时,
若接口不忙则启动接口,这时例程需要调用这些 s p l调用。
第1章 概 述计计19
下载
![](https://csdnimg.cn/release/download_crawler_static/9715351/bg14.jpg)
在这个例子中,设备中断被禁止的原因是防止在协议层正在往队列添加分组时,设备驱
动程序从它的发送队列中取走下一个分组。设备发送队列是一个在协议层和接口层共享的数
据结构。
在整个源代码中到处都会看到 s p l 函数。
1.13 源代码组织
图1 - 1 5所示的是N e t / 3网络源代码的组织,假设它位于目录 / u s r / s r c / s y s。
图1-15 Net/3源代码组织
本书的重点在目录n e t i n e t ,它包含所有T C P / I P 源代码。在目录k e r n 和n e t 中我们也可
找到一些文件。前者是协议无关的插口代码,而后者是一些通用联网函数,用于 T C P / I P例程,
如路由代码。
20计计TCP/IP详解 卷 2:实现
下载
Intel 80x86专用
通用内核
通用联网
HDLC, X.25
TCP/IP协议
OSI协议
XNS协议
NFS
内核头文件
文件系统
虚拟存储器
剩余871页未读,继续阅读
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/4e693c5e53b0402999e3ee11f1a2d2ca_xixiangchui.jpg!1)
xixiangchui
- 粉丝: 2
- 资源: 8
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决本地连接丢失无法上网的问题
- BIOS报警声音解析:故障原因与解决方法
- 广义均值移动跟踪算法在视频目标跟踪中的应用研究
- C++Builder快捷键大全:高效编程的秘密武器
- 网页制作入门:常用代码详解
- TX2440A开发板网络远程监控系统移植教程:易搭建与通用解决方案
- WebLogic10虚拟内存配置详解与优化技巧
- C#网络编程深度解析:Socket基础与应用
- 掌握Struts1:Java MVC轻量级框架详解
- 20个必备CSS代码段提升Web开发效率
- CSS样式大全:字体、文本、列表样式详解
- Proteus元件库大全:从基础到高级组件
- 74HC08芯片:高速CMOS四输入与门详细资料
- C#获取当前路径的多种方法详解
- 修复MySQL乱码问题:设置字符集为GB2312
- C语言的诞生与演进:从汇编到系统编程的革命
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)