Linux/UNIX网络编程 甘刚 第13章 原始套接字与数据链路访问编程

Linux/UNIX网络编程 甘刚 第13章 原始套接字与数据链路访问编程

ID:40238844

大小:960.00 KB

页数:66页

时间:2019-07-28

Linux/UNIX网络编程 甘刚 第13章 原始套接字与数据链路访问编程_第1页
Linux/UNIX网络编程 甘刚 第13章 原始套接字与数据链路访问编程_第2页
Linux/UNIX网络编程 甘刚 第13章 原始套接字与数据链路访问编程_第3页
Linux/UNIX网络编程 甘刚 第13章 原始套接字与数据链路访问编程_第4页
Linux/UNIX网络编程 甘刚 第13章 原始套接字与数据链路访问编程_第5页
资源描述:

《Linux/UNIX网络编程 甘刚 第13章 原始套接字与数据链路访问编程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第13章原始套接字与数据链路访问编程IPv4数据报格式几点说明:首部长度是以32位(即4字节)为单位;16位的标识用于分片和重组;DF位(不分片);MF(还有片段);协议字段表示封装在IP报文中的上层协议,典型的有:ICMP(1)、IGMP(2)、TCP(6)、UDP(17);头部校验和只对IP头部(包括选项)计算,校验算法是标准的因特网校验和算法,即简单的16位反码求和。版本总长度(字节长度)标识片段偏移首部长度服务类型0DFMF存活时间(TTL)头部校验和协议32位源地址32位目的地址选项(如果有的话)数据首部数据0371531IP数据报分片例子IP数据报是指指IP层

2、端到端的传输单元(在分片之前和重新组装之后),分组是指在IP层和链路层之间传送的数据单元。需要重申的是,任何传输层首部只出现在第1片数据中。原始套接字(概述)原始套接字提供了一些使用tcp和udp协议不能实现的功能,如:使用原始套接字可以读/写ICMPv4、IGMPv4分组。如Ping程序,mroute程序等;使用原始套接字可以读/些特殊的IPv4数据包,内核不处理这些数据报的IPv4协议字段。如大多数内核只处理ICMP、IGMP、TCP、UDP的数据报。但协议字段还可以为其他值,如OSPF直接使用IP协议,将IP数据报的协议字段设为89,此时,就必须有专门的程序通过原始

3、套接字来处理它们;利用原始套接字还可以创建自定义的IP数据报首部,编写基于IP协议的高层网络协议。原始套接字创建#include#includeintsocket(AF_INET,SOCK_RAW,intprotocol);protocol参数一般不能为0,如:IPPROTO_ICMP。另外,只有超级用户才能创建原始套接字。用户可以通过设置IP_HDRINCL选项来编写自己的IP数据报首部:constinton=1;setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(

4、on));可以调用bind函数绑定原始套接字的本地IP地址,此时,所有输出的数据报将用到源IP地址(仅当IP_HDRINCL未设置时);如果不调用bind函数,由内核将源IP地址设成外出接口的主IP地址;可以调用connect函数设置数据报的目的地址(注意并不需要真正的连接)。此后,可直接调用write或send。注意:bind和connect时,端口已经没有意义了。通过原始套接字发送数据报原始套接字的输出遵循以下规则:如果套接字已经连接,可以调用write、writev、send来发送数据,否则需要调用sendto或sendmsg;如果IP_HDRINCL选项未设置,则

5、内核写的数据起始地址指IP头部之后的第一个字节。因为这种情况下,内核构造IP头部,并将它安在来自进程的数据之前。内核将IPv4头部的协议字段设置成用户在调用socket函数所给的第三个参数;如果设置了IP_HDRINCL,则内核写的数据起始地址指IP头部的第一个字节。用户所提供的数据大小值必须包括头部的字节数。此时进程构造除了以下两项外的整个IP头部;(a)IPv4标识字段可以设为0,要求内核设置该值;(b)IPv4头部校验和由内核来计算和存储。IPv4数据报首部各个字段的内容均是网络字节序(对linux而言)对于超出外出接口的MTU的分组,内核将其分片。通过原始套接字接

6、收数据报内核通过原始套接字接收数据报,遵循以下规则:接收到的tcp和udp分组决不会传递给原始套接字,如果一个进程希望读取包含tcp或udp分组的IP数据报,那么它们必须在数据链路层读入;当内核处理完ICMP消息后,绝大部分ICMP分组将传递给原始套接字。对源自Berkeley的实现,除了回射请求、时间戳请求和地址掩码请求将完全由内核处理以外,所有收到的ICMP分组将传递给某个原始套接口;当内核处理完IGMP消息后,所有IGMP分组都将传递给某个原始套接字;所有带有内核不能识别的协议字段的IP数据报都将传递给某个原始套接字。如果数据报以分片形式到达,则该分组将在所有片段到

7、达并重组后才传给原始套接字。通过原始套接字接收数据报(续)在将一个IP数据报传递给某个套接字之前,内核需要选择匹配的原始套接字:如果在创建原始套接字时,所指定的protocol参数不为0,则接收到的数据包的协议字段应与该值匹配,否则该数据报将不传递给该套接字;如果此原始套接字之上绑定了一个本地IP地址,那么接收到的数据报的目的IP地址应与该绑定地址相匹配,否则该数据报将不传递给该套接字;如果此原始套接字通过调用connect指定了一个对方的IP地址,那么接收到的数据报的源IP地址应与该已连接地址相匹配,否则该数据报将不传递给该

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。