- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7 原始套接口和数据链路访问
目录 TCP/IP协议族结构 IP数据报格式 原始套接字 Ping协议的ICMP版本 TCP/IP协议族结构 网络概貌原理图 --通过路由器连接的两个网络 网络概貌原理图 --数据进入协议栈时的封装 IPv4数据报格式 几点说明:首部长度是以32位(即4字节)为单位;16位的标识用于分片和重组;DF位(不分片);MF(还有片段);协议字段表示封装在IP报文中的上层协议,典型的有:ICMP(1)、IGMP(2)、TCP(6)、UDP(17);头部校验和只对IP头部(包括选项)计算,校验算法是标准的因特网校验和算法,即简单的16位反码求和。 IP报头格式数据结构(netinet/ip.h) ---- struct ip struct ip { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ip_hl:4; /* header length */ unsigned int ip_v:4; /* version */ #endif #if __BYTE_ORDER == __BIG_ENDIAN unsigned int ip_v:4; /* version */ unsigned int ip_hl:4; /* header length */ #endif u_int8_t ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */ ………………………………… u_int8_t ip_ttl; /* time to live */ u_int8_t ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src, ip_dst; /* source and dest address */ }; 原始套接字(概述) 原始套接字提供了一些使用tcp和udp协议不能实现的功能,如: 使用原始套接字可以读/写ICMPv4分组: 目的地址不可达(http://××××) Ping程序实现; 使用原始套接字可以读/写特殊的IPv4数据包,内核不处理这些数据报的IPv4协议字段。 如大多数内核只处理ICMP、IGMP、TCP、UDP的数据报。 但协议字段还可以为其他值 如OSPF直接使用IP协议,将IP数据报的协议字段设为89,此时,就必须有专门的程序通过原始套接字来处理它们; 利用原始套接字还可以创建自定义的IP数据报首部,编写基于IP协议的高层网络协议。 原始套接字创建 #include sys/socket.h #include netinet/in.h int socket(AF_INET, SOCK_RAW, int protocol); protocol参数一般不能为0,如:IPPROTO_ICMP。 只有超级用户才能创建原始套接字。 用户可以通过设置IP_HDRINCL选项来编写自己的IP数据报首部: const int on = 1; setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, on, sizeof(on)); 可以调用bind函数绑定原始套接字的本地IP地址,此时,所有输出的数据报将用到源IP地址(仅当IP_HDRINCL未设置时);如果不调用bind函数,由内核将源IP地址设成外出接口的主IP地址; 可以调用connect函数设置数据报的目的地址(注意并不需要真正的连接)。此后,可直接调用write或send。 注意:bind和connect时,端口已经没有意义了。 通过原始套接字发送数据报 原始套接字的发送遵循以下规则: 如果套接字已经连接,可以调用write、writev、send来发送数据,否则需要调用sendto或sendmsg; 如果IP_HDRINCL选项未设置,则写入的数据(用户程序数据)起始地址指IP头部之后的第一个字节。 内核构造IP头部,并将它安在来自进程的数据之前。 内核将IPv4头部的协议字段设置成用户在调用socket函数所给的第三个参数; 如果设置了IP_HDRI
文档评论(0)