i p _ i n s e r t o p t i o n s函数
i p _ o u t p u t函数接收一个分组和选项。当 i p _ f o r w a r d调用该函数
时,选项已经是分组的一部分,所以 i p _ f o r w a r d总是把一个空选项指针传给 i p _ o u t p u t。
但是,运输层协议可能会把由 i p _ i n s e r t o p t i o n s中的i p _ o u t p u t调用合并到
分组中的选项传递给i p _ f o r w a r d。i p _ i n s e r t o p t i o n s希望选项在i p o p t i o n结构中被格式化,如图所示。

9 2 - 9 5 该结构只有两个成员:i p o p t _ d s t,如果选项表中有源路由,则其中有第一跳目的
地,i p o p t _ l i s t,是一个最多4 0 (M A X _ I P O P T L E N)字节的选项矩阵,其格式我们在本章中
已做了描述。如果选项表中没有源路由,则 i p o p t _ d s t全为0。
注意, i p _ s r c r t结构和由 i p _ s r c r o u t e返回的 m b u f都符合由
i p o p t i o n结构所指定的格式。如图把结构i p _ s r c r t和i p o p t i o n作了比较。

函数i p _ i n s e r t o p t i o n s如图所示。


3 5 2 - 3 6 4 i p _ i n s e r t o p t i o n s有三个参数:m,外出的分组;o p t,在结构中格式化的选
项;p h l e n,一个指向整数的指针,在这里返回新首部的长度 (在插入选项之后)。如果插入
选项分组长度超过最大分组长度 65 535( I P _ M A X P A C K E T)字节,则自动将选项丢弃。
i p _ d o o p t i o n s认为i p _ i n s e r t o p t i o n s永远都不会失败,所以无法报告差错。幸好,很
少有应用程序会试图发送最大长度的数据报,更别说选项了。

3 6 5 - 3 6 6 如果i p o p t _ d s t . s _ a d d r指定了一个非零地址,则选项中包括了源路由,并且
分组首部的i p _ d s t被源路由中的第一跳目的地代替。
如图显示了在第3 6 7 ~ 3 7 8行代码执行之前,一个T C P报文段的m b u f结构。

如果被插入的选项占据了多于 1 6的字节数,则第 3 6 7行的测试为真,并调用 M G E T H D R分
配另一个m b u f。上图显示了选项被复制到新的m b u f后,该缓存的结构。
3 6 7 - 3 7 8 如果分组首部被存放在一簇,或者第一个缓存中没有多余选项的空间,则
i p _ i n s e r t o p t i o n s分配一个新的分组首部 m b u f,初始化它的长度,从旧的缓存中把该 I P
首部截取下来,并把该首部从旧缓存中移动到新缓存中。
i p _ i n s e r t o p t i o n s函数的更多相关文章
- 笔记+R︱Logistics建模简述(logit值、sigmoid函数)
本笔记源于CDA-DSC课程,由常国珍老师主讲.该训练营第一期为风控主题,培训内容十分紧凑,非常好,推荐:CDA数据科学家训练营 ---------------------------------- ...
- 读书笔记_Effective_C++_条款四十六:需要类型转换时请为模板定义非成员函数
这个条款可以看成是条款24的续集,我们先简单回顾一下条款24,它说了为什么类似于operator *这样的重载运算符要定义成非成员函数(是为了保证混合乘法2*SomeRational或者SomeRat ...
- 读书笔记_Effective_C++_条款二十五: 考虑写出一个不抛出异常的swap函数
在之前的理论上调用对象的operator=是这样做的 void swap(A& x) { std::swap(a, x.a); } A& operator=(const A& ...
- r语言之生成规则序列,规则序列函数及用法
在生成序列时,“:”的优先级最高 (1)从1到20的整数序列: > 1:20 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (2) ...
- R语言:利用caret包中的dummyVars函数进行虚拟变量处理
dummyVars函数:dummyVars creates a full set of dummy variables (i.e. less than full rank parameterizati ...
- R语言使用过程中出现的问题--attach()函数的使用
使用attach(file)时,一定要配合使用detach(file),否则再此运行程序时极易出现问题,The following objects are masked ... 此外工作空间中不能有与 ...
- R语言学习笔记(七): 排序函数:sort(), rank(), order()
sort() sort()函数直接对函数进行排序,并返回排序结果. > a <- c(12,4,6,5) > sort(a) [1] 4 5 6 12 rank() rank()函数 ...
- R语言:实现SQL的join功能的函数
library(dplyr) ribao <- full_join(ribao,result,by = '渠道',copy = T) ribao <- full_join(ribao,se ...
- R语言 which() 、 which.min() 、 which.max() 函数
函数 which() 可以用来找到满足条件的下标,如 x <- c(3, 4, 3, 5, 7, 5, 9) which(x > 5) 5 7 seq(along=x)[x > 5] ...
随机推荐
- bootstrapvalidator API 文档地址: http://bootstrapvalidator.votintsev.ru/api/
bootstrap验证插件 bootstrapvalidator 文档API 地址 (原始作者英文):http://bootstrapvalidator.votintsev.ru/api/ 具体使用( ...
- Java面试 - 在Java中, 既然构造方法是一个方法,那么为什么不使用void 定义呢?
Java程序编译器是根据代码结构来进行编译处理的,执行的时候也是根据代码结构来处理的. 如果在构造方法上使用void,那么此结构就会与普通方法的结构相同,这样编译器会认为此方法是一个 普通方法,而普通 ...
- 封装一个Model或者Vender类
Model <?php /** * User: Eden * Date: 2019/3/21 * 共有内容 */ class WxPayModel extends Model { protect ...
- MySQL(六) 索引
索引与优化 1.选择索引的数据类型 MySQL支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响.通常来说,可以遵循以下一些指导原则: (1)越小的数据类型通常更好:越小的数据类型通常在磁 ...
- JVM -- 虚拟机中的对象
一.HotSpot虚拟机 它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机.我们大致知道虚拟机内存的概况,也许更想了解这些虚拟机内存的数据的其他细节,誓如它们是如 ...
- java日志框架系列(9):logback框架过滤器(filter)详解
过滤器放在了logback-classic模块中. 1.logback-classic模块中过滤器 分类(2种):常规过滤器.TurboFilter过滤器. 1.常规过滤器 常规过滤器可以通过自定义进 ...
- LC 33. Search in Rotated Sorted Array
问题描述 Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ...
- ORACLE 的前后台进程
关于oracle用户进程,服务进程,后台进程 用户进程(User Process) 是一个需要与Oracle Server交互的程序 运行于客户端 当用户运行某个工具或应用程序(如SQL*Plus)时 ...
- 利用Python进行数据分析_Pandas_绘图和可视化_Matplotlib
1 认识Figure和Subplot import matplotlib.pyplot as plt matplotlib的图像都位于Figure对象中 fg = plt.figure() 通过add ...
- 利用Python进行数据分析_Pandas_层次化索引
申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 层次化索引主要解决低纬度形式处理高纬度数据的问题 import pandas ...