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函数的更多相关文章

  1. 笔记+R︱Logistics建模简述(logit值、sigmoid函数)

    本笔记源于CDA-DSC课程,由常国珍老师主讲.该训练营第一期为风控主题,培训内容十分紧凑,非常好,推荐:CDA数据科学家训练营 ---------------------------------- ...

  2. 读书笔记_Effective_C++_条款四十六:需要类型转换时请为模板定义非成员函数

    这个条款可以看成是条款24的续集,我们先简单回顾一下条款24,它说了为什么类似于operator *这样的重载运算符要定义成非成员函数(是为了保证混合乘法2*SomeRational或者SomeRat ...

  3. 读书笔记_Effective_C++_条款二十五: 考虑写出一个不抛出异常的swap函数

    在之前的理论上调用对象的operator=是这样做的 void swap(A& x) { std::swap(a, x.a); } A& operator=(const A& ...

  4. 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) ...

  5. R语言:利用caret包中的dummyVars函数进行虚拟变量处理

    dummyVars函数:dummyVars creates a full set of dummy variables (i.e. less than full rank parameterizati ...

  6. R语言使用过程中出现的问题--attach()函数的使用

    使用attach(file)时,一定要配合使用detach(file),否则再此运行程序时极易出现问题,The following objects are masked ... 此外工作空间中不能有与 ...

  7. R语言学习笔记(七): 排序函数:sort(), rank(), order()

    sort() sort()函数直接对函数进行排序,并返回排序结果. > a <- c(12,4,6,5) > sort(a) [1] 4 5 6 12 rank() rank()函数 ...

  8. R语言:实现SQL的join功能的函数

    library(dplyr) ribao <- full_join(ribao,result,by = '渠道',copy = T) ribao <- full_join(ribao,se ...

  9. 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] ...

随机推荐

  1. react native 中 Demensions的坑

    简单描述下碰到的问题:Demensions.get('window').height,一般拿来获取屏幕高度的.但是在小米mix3上面(其他安卓机型可能也会有)无论底部的虚拟物理键盘显示与否(底部的返回 ...

  2. 六种Socket I/O模型幽默讲解

    老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系.他们的信会被邮递员投递到他们的信箱里.这和Socket模型非常类似.下面就以此为例讲解Socket I/O模型. 零:阻塞模型 老陈非常 ...

  3. [转帖]支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么?

    支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么? https://mp.weixin.qq.com/s?__biz=MzA3OTg5NjcyMg==&mid=2661671930 ...

  4. 数据结构 -- 二叉树(Binary Search Tree)

    一.简介 在计算机科学中,二叉树是每个结点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用于实现二叉查找树和二叉堆. ...

  5. MySQL的sql语言分类DML、DQL、DDL、DCL

    SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 1.数据定义语言DDL(Data Definition Language) 对象: 数据库和表 ...

  6. c++设计原则:继承与组合

    “优先使用对象组合,而不是继承”是面向对象设计的原则之一. 组合也叫“对象持有”,就是在类中定义另一类型的成员,继承会破坏类的独立性,增加系统的复杂性,一般系统的继承层次不超过3层.组合拥有良好的扩展 ...

  7. pandas中的argsort

    直接通过例子看比较好理解. import pandas as pd data = [[1, 2, 3], [2, 2, 2], [7, 8, 9]] df = pd.DataFrame(data, i ...

  8. java——数据类型和运算符

    强类型语言 Java语言是一门强类型语言.强类型包含两方面的含义:①所有的变量必须先声明.后使用:②指定类型的变量只能接受类型与之匹配的值.强类型语言可以在编译过程中发现源代码的错误,从而保证程序更加 ...

  9. 剑指offer(5)——从尾到头打印链表

    题目: 输入一个链表的头结点,从尾到头反过来打印出每个结点的值.结点定义如下: public class ListNode { int val; ListNode next = null; ListN ...

  10. SVN操作出现locked错误解决办法

    SVN操作出现locked错误解决办法:在SVN中执行 commit 操作时,在更新过程中,中断过,或者因为其他原因导致SVN 出现 locked 异常. 解决办法:1. 选中出现异常的文件,右键 - ...