`
jishublog
  • 浏览: 868678 次
文章分类
社区版块
存档分类
最新评论

UNIX网络编程--原始套接字(二十八)

 
阅读更多

UNIX网络编程---原始套接字(二十八)

一、概述

1) 有了原始套接字,进程可以读写ICMPv4、IGMPv4和ICMPv6等分组。举例来说,ping程序就使用原始套接字发送ICMP回射请求并接受ICMP回射应答。多播路由守护程序mrouted也使用原始套接字发送和接受IGMPv4分组。

2) 进程可以读写内核不处理其协议字段的IPV4数据报。

3) 进程可以使用IP_HDRINCL套接字自行构造IPV4首部。这个能力可用于构造譬如说TCP或UDP分组。

二、原始套接字创建

创建的步骤如下:

1) 把第二个参数指定为SOCK_RAW并调用socket函数,以创建一个原始套接字。第三个参数(协议)通常不为0.

Int sockfd;

Sockfd=socket(AF_INET,SOCK_RAW,protocol);

其中protocol参数是形如IPPROTO_XXX的某个常值,定义在<netinet/in.h>头文件中,如IPPROTO_TGMP.

2) 可以在这个原始套接字上按以下方式开启IP_HDRINCL套接字选项

Const int on=1;

If(setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on))<0)

出错处理

3) 可以在这个原始套接字上调用bind函数,不过比较少见。Bind函数仅仅设置本地地址,因为原始套接字不存在端口号的概念。调用bind设置的是将用于从这个原始套接字发送的所有数据报的源IP地址。如果不调用bind,内核就把源IP地址设置为外出接口的IP地址。

4) 可以在这个原始套接字上调用connect函数

三、原始套接字输出

输出的规则有:

1) 普通输出通过调用sendto或sendmsg并指定目的IP地址完成。如果套接字已经连接,那么也可以调用write、writev或send

2) 如果IP_HDRINCL套接字选项为开启,那么由进程让内核发送的数据的其实地址指的是IP首部之后的第一个字节,因为内核将构造IP首部并把它置于来自进程的数据之前。

3) 如果IP_HDRINCL套接字选项已开启,那么由进程让内核发送的数据的其实地址指的是IP首部的第一个字节。进程调用输出函数写出的数据量必须包括IP首部的大小

4) 内核会对超出外出接口MTU的原始分组执行分片。

对于IPV4,计算并设置IPV4首部之后所含的任何首部校验和是用户进程的责任。举例来说,在我们的ping 程序中,我们必须在调用sendto之前计算ICMPv4校验和并将它存在ICMPv4首部。

四、原始套接字输入

内核把哪些接收到的IP数据报传递到原始套接字?遵循的规则如下:

1) 接收到的UDP分组和TCP分组绝不传递到任何原始套接字。如果一个进程想要读取含有UDP分组或TCP分组的IP数据报,它就必须在数据链路层读取这些分组。

2) 大多数ICMP分组在内核处理完其中的ICMP消息后传递到元是套接字。

3) 所有IGMP分组内核完成处理其中的IGMP消息后传递到原始套接字

4) 内核不认识其协议字段的所有IP数据报传递到元是套接字。内核对这些分组执行的唯一处理时针对某些IP首部字段的最小验证:IP版本、IPV4首部校验和、首部长度以及目的地址

5) 如果某个数据报以片段形式到达,那么在它的所有片段均到达且重组出该数据吧之前,不传递任何片段分组到原始套接字。

当内核有一个需传递到原始套接字的IP数据报时,它将检查所有进程上的所有原始套接字,以寻找所有匹配的套接字。每个匹配的套接字将被递送以该IP数据报的一个副本。内核对每个原始套接字均执行如下3个测试:

1) 如果创建这个原始套接字时指定了非0的协议参数(socket的第三个参数),那么接受到的数据报的协议字段必须匹配该值,苟泽该数据报不递送到这个套接字

2) 如果这个原始套接字已由bind调用绑定了某个本地IP地址,那么接收到的数据报的目的IP地址必须匹配这个绑定地址,否则数据报不递送到这个套接字。

3) 如果这个原始套接字已由connect调用指定了某个外地IP地址,那么接受到的数据包的源IP地址必须匹配这个已连接地址,否则该数据报不递送到这个套接字。

五、Ping程序

Ping程序的操作非常简单,往某个IP地址发送一个IDMP回射请求,该节点则以一个ICMP回射应答响应。

在这里有一个关于ping程序代码的解析


上面是ping程序的各个函数以及调用关系的概貌。


关于源代码部分等待更新……

六、Traceroute程序

Traceroute运行我们确定IP数据报从本地主机游历到某个远程主机所经过的路径。

同样是程序源代码的分析…

七、一个icmp消息守护进程

八、这里也是一个程序源代码的分析….

分享到:
评论

相关推荐

    UNIX网络编程 卷1:套接字联网API

    第28章 原始套接字 第29章 数据链路访问 第30章 客户/服务器程序设计范式 第31章 流 附录A IPv4、IPv6、ICMPv4和ICMPv6 附录B 虚拟网络 附录C 调试技术 附录D 杂凑的源代码 附录E 精选习题答案 ...

    Win32平台下的UNIX原始套接字编程及应用

    网络通信编程主要是在UNIX下使用C语言进行,在Windows平台上不能 直接使用...文章介绍了Windows下的UNIX仿真平台Cygwin,在Cygwin下讨论了 UNIX原始套接字的编程应用,实现了数据包的生成和发送以及对数据包的截获和分析。

    UNIX网络编程卷1:套接字联网API(第3版)part1 共2部分

    第28章 原始套接字 第29章 数据链路访问 第30章 客户/服务器程序设计范式 第31章 流 附录A IPv4、IPv6、ICMPv4和ICMPv6 附录B 虚拟网络 附录C 调试技术 附录D 杂凑的源代码 附录E 精选习题答案 参考文献 索引

    UNIX网络编程卷1套接字联网API.part1.rar

     本书是为那些希望能够通过套接字接口实现程序间的相互通信的人而编写的,旨在为网络编程的初学者以及专家提供指导。要建立高度分布式、网络化的应用程序和服务,就需要对套接字和其他关键的网络API有深入的理解。...

    UNIX网络编程卷1套接字联网API.part2.rar

     本书是为那些希望能够通过套接字接口实现程序间的相互通信的人而编写的,旨在为网络编程的初学者以及专家提供指导。要建立高度分布式、网络化的应用程序和服务,就需要对套接字和其他关键的网络API有深入的理解。...

    UNIX网络编程第二版(第一卷套接字API)

    全书从对套接口api的综合讨论开始,论述了基本编程内容后,即转入高级套接口编程的相关主题,包括ipv4与ipv6的互操作性、unix域协议、非阻塞i/o、路由套接口、广播、多播、线程、原始套接口、数据链路访问等,对于...

    UNIX网络编程_卷1_套接字联网API[3th][中文版].part1.rar

    全书从对套接口API的综合讨论开始,论述了基本编程内容后,即转入高级套接口编程的相关主题,包括IPv4与IPv6的互操作性、UNIX域协议、非阻塞I/O、路由套接口、广播、多播、线程、原始套接口、数据链路访问等,对于...

    网络编程课件 Socket编程

    原始套接字,具有最小的封装,最大的灵活性。 Stream socket应用例子 --telnet --http --tcp …… Datagram socket应用例子 --udp --tftp --bootp …… Raw socket --如果需要开发自己的协议或发送特殊的包,需要...

    UNIX网络编程卷2进程间通信

     本书是为那些希望能够通过套接字接口实现程序间的相互通信的人而编写的,旨在为网络编程的初学者以及专家提供指导。要建立高度分布式、网络化的应用程序和服务,就需要对套接字和其他关键的网络API有深入的理解。...

    W in32 平台下的UN IX 原始套接字编程及应用

    UN IX 原始套接字的编程应用, 实现了数据包的生成和发送以及对数据包的截获和分析。 关键词: Cygw in; 原始套接字; IP; TCP; 数据包 中图分类号: TP393 文献标识码:A UNIX raw socket program and apply onW in32 ...

    UNIX 编程技术与实例分析

    一本非常好的介绍网络编程,tcp/ip,协议具体实现的好书.16章.360页 第一部分 网络基础 ...第12章 原始套接字 第13章 数据链路访问 第14章 多接口设计 第15章 路由套接字 第16章 简单路由器实例分析

    网络编程实用教程(第三版).zip

    2.5.3 原始套接字应用实例 49 习题 51 第3章 WinSock编程 53 3.1 WinSock概述 53 3.2 WinSock库函数 55 3.2.1 WinSock的注册与注销 55 3.2.2 WinSock的错误处理函数 58 3.2.3 主要的WinSock函数 61 ...

    网络编程教程,很好的一本写linux网络编程书,这是我上传的源码

     第十四章 原始套接字编程实践  14.1 原始套接字  14.1.1 原始套接字的创建  14.1.2 原始套接字的使用  14.1.3 IP包头和ICMP报文的C语言描述  14.2 Ping应用程序  14.2.1 程序设计  ...

    socketjava源码-demo-sockets-io-nio-nio2:“Java套接字I/O:阻塞,非阻塞和异步”文章和源代码

    java原始码Java套接字I / O:阻塞,非阻塞和异步 介绍 在描述I / O时,术语“非阻塞”和“异步”通常可以互换使用,但是它们之间存在显着差异。 本文描述了Java中非阻塞和异步套接字I / O操作之间的理论和实践差异。...

    基于java的局域网聊天系统-毕业设计.doc

    若取 SOCK_STREAM表示要创建的套接字是流套接字,取SOCK_DGRAM创建的是数据报套接字,取 SOCK_RAW表示创建原始套接字。 参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议 ,则置为0,...

    Tcl_TK编程权威指南pdf

    该函数库实现了基本的解释器,它有一套实现变量、流程控制和过程的核心脚本命令,而且还有一组用来存取操作系统服务以运行其他程序、存取文件系统和使用网络套接字的命令。Tcl和Tk提供了一台可以在UNIX、Windows和...

    linux网路编程 中文 23M 版

    第2 章Linux编程环境....................................................................................................14 2.1 Linux环境下的编辑器................................................. 14 ...

    Endpoint C++ Socket Library-开源

    端点是一个可移植的C ++套接字库,可在Unix或Win32上运行,利用IPv4或IPv6,并支持TCP,UDP和原始套接字作为客户端或服务器。 对于初学者或高级套接字编程人员而言,端点易于使用。

Global site tag (gtag.js) - Google Analytics