加入收藏 | 设为首页 | 会员中心 | 我要投稿 三明站长网 (https://www.0598zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[十四]:IP选项

发布时间:2016-09-28 22:37:56 所属栏目:Linux 来源:站长网
导读:副标题#e# 内核版本:2.6.34 在发送报文时,可以调用函数setsockopt()来设置相应的选项,本文主要分析IP选项的生成,发送以及 接收所执行的流程,选取了LSRR为例子进行说明,主要分为选项的生成、选项的转发、选项的接收三部分。 先看一个源站路 由选项的例
副标题[/!--empirenews.page--]

内核版本:2.6.34

在发送报文时,可以调用函数setsockopt()来设置相应的选项,本文主要分析IP选项的生成,发送以及 接收所执行的流程,选取了LSRR为例子进行说明,主要分为选项的生成、选项的转发、选项的接收三部分。

先看一个源站路 由选项的例子,下文的说明都将以此为例。

主机IP:192.168.1.99

源路由:192.168.1.1 192.168.1.2 192.168.1.100 [dest ip]

源站路由选项在各个主机上的情况:

Linux内核分析 - 网络[十四]:IP选项

该图与<TCP/IP卷一>上的示例不同,因为这里的选项[#R1, R2, D]是以实际传输中的形式标注的,下图是源站路由选项在此过程 中的具体形式:

Linux内核分析 - 网络[十四]:IP选项

创建socket时, 可以使用setsockopt()来设置创建socket的各种属性,setsockopt()最终调用系统接口sys_setsockopt()。

sys_setsockopt ()

level(级别)指定系统中解释选项的代码:通用的套接口代码,或某个特定协议的代码。level==SOL_SOCKET是通用的套接 口选项,即不是针对于某个协议的套接口的,使用通过函数sock_setsockopt()来设置选项;level其它值:IPPROTO_IP, IPPROTO_ICMPV6, IPPROTO_IPV6则是特定协议套接口的,使用sock->ops->setsockopt(套接字特定函数)来设置选项。

if (level == SOL_SOCKET)     
 err = sock_setsockopt(sock, level, optname, optval, optlen);     
else 
err = sock->ops->setsockopt(sock, level, optname, optval, optlen);

下面具体说明这个例子,生成选项 - 使用setsockopt()可以设置IP选项,形式如下:

setsockopt(fd, IPPROTO_IP, IP_OPTIONS, &opt, optlen);

其中传入的opt格式如下:

Linux内核分析 - 网络[十四]:IP选项

无论是何种报文(对应不同的sock),设置IP选项最终都会调用ip_setsockopt()。比如创建 的UDP socket,则调用流程为:sock->ops->setsockopt() => udp_setsockopt()  -> ip_setsockopt()。而 处理IP选项的主要是由do_ip_setsockopt()来完成的。

(编辑:三明站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读