课程名称:网络程序设计9.ppt

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课程名称:网络程序设计9

课程名称:网络程序设计 主讲教师:胡亮 Email:hul@ 第9章 原始套接口和数据链路访问 原始套接口提供三种TCP和UDP套接口一般不提供的功能。 使用原始套接口可以读写ICMPv4、IGMPv4及ICMPv6分组。例如,Ping程序就使用原始套接口发送ICMP回射请求,并接收ICMP回射应答。用于多播路由的守护进程mrouted同样利用原始套接口来发送和接收IGMPv4分组。上述功能同样允许使用ICMP或IGMP构造的应用程序完全作为用户进程处理,而不必再增加过多的内核编码。例如,路由器发现守护进程即以这种方式构造,它处理内核完全不知道的两个ICMP消息(路由器通告和路由器征求)。 使用原始套接口可以读写特殊的IPv4数据报,内核不处理这些数据报的IPv4协议字段。大多数内核只处理值为1(ICMP)、2(IGMP)、6(TCP)和17(UDP)的数据报,但协议字段还可以是其它值,RFC1700列出了所有值。例如,OSPF路由协议就不使用TCP或UDP,而直接使用IP,它将IP数据报的协议字段设置为89。因此,由于这些数据报包含内核完全不知道的协议字段,实现OSPF协议的gated守护程序就必须使用原始套接口来读写数据报。此项同样适用于IPv6。 利用原始套接口,使用IP_HDRINCL套接口选项可以构造自己的IPv4头部。用户可以使用这个特性来构造自己的TCP或UDP分组。 9.1 原始套接口创建 创建一个原始套接口涉及以下几步: 1 调用socket函数创建一个原始套接口,其中第二个参数为SOCK_RAW。这时,第三个参数一般不应为0。例如,为了创建一个IPv4原始套接口,可以使用下面语句: int sockfd; sockfd=socket(AF_INET, SOCK_RAW, protocol); 其中protocol参数值为形如IPPROTO_xxx的常值,由netinet/in.h头文件定义,例如IPPROTO_IGMP。这里需要注意的是头文件中定义的一个协议名,例如IPPROTO_EGP,并不意味着内核肯定支持它。因此,为了防止普通用户向网络写自己的IP数据报,只有超级用户才有权创建原始套接口。 2 可以设置IP_HDRINCL套接口选项。 3 可以对原始套接口调用bind函数,但并不常用。该函数仅用来设置本地地址,对于一个原始套接口而言端口没有什么意义。当进行输出的时候,bind设置在原始套接口上所发送的数据报中将用到的源IP地址(仅当IP_HDRINCL套接口选项未设置时);若不调用bind,则由内核将源IP地址设置成外出接口的主IP地址。 4 在原始套接口上可以调用connect函数,但不常用。Connect函数仅设置目的地址。对于输出而言,调用connect函数之后,由于目的地址已经指定,用户可以调用write或read,而不是sendto了。 影响原始套接字行为的选项 IP_TTL选项:使用该选项用户可以设置或者获取原始套接字的生存时间的值。获取生存时间可以使用以下代码实现: int ttl; getsockopt (ip_fd, IPPROTO_IP, IP_TTL, ttl, sizeof(int)); IP_TOS选项:使用这个选项可以设置或者获取IP数据报头的服务类型字段。需要注意的是函数getsockopt只能返回发送IP数据报的TOS域,而不是接收到的IP数据报的TOS域。接收到的IP数据报的TOS域,可以使用上面代码,通过struct ip类型的指针来获取ip_tos域。 IP_OPTIONS选项:使用该选项可以设置IP选项。 IP_HDRINCL选项:如果原始套接字上设置了该选项,则IP协议将只为IP数据报头部作如下工作:IP协议为IP数据报头计算校验和;如果标识域被填写为0,则IP协议来设置标识域(标识域用于分段时使用);如果IP地址被设置为INADDR_ANY,则IP协议将以实际发送的网络接口的IP地址来填写这个域。设置了IP_HDRINCL选项的原始套接字上发送的每个数据报必须自己建立IP数据报头部。 9.2 原始套接口输出 原始套接口上的输入和输出函数是内核中最简单的一部分,原始套接口的输出遵循以下规则: 普通输出通过调用sendto或sendmsg并指定目的IP地址来完成。如果套接口已经连接,也可以调用write、writev或send。 如果IP_HDRINCL选项未设置,则内核写的数据起始地址指IP头部之后的第一个字节。因为这种情况下,内核将构造IP头部,并将它安在来自进程的数据之前。内核将IPv4头部的协议字段设置成用户在调用socket函数时所给的第三个参数。 如果IP_H

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档