概述

应用程序可以绕过传输层而直接使用IPv4和IPv6,这称为原始套接口(raw socket)。http://www.cnblogs.com/nufangrensheng/p/3583435.html

原始套接口是一种对原始网络报文进行处理的套接口。原始套接口主要应用在底层网络编程上,同时也是网络黑客的必备手段。例如sniffer、拒绝服务(DoS)、IP地址欺骗等都需要在原始套接字的基础上实现。

与原始套接字对应,之前的TCP/UDP的套接字称为标准套接字,如下图所示,为标准套接字与原始套接字之间的关系。标准套接字与网络协议栈的TCP、UDP层打交道,而原始套接字则与IP层级网络协议栈核心打交道。

原始网络套接口提供普通的TCP和UDP套接口不提供的以下3个功能:

1、有了原始套接口,进程可以读与写ICMPv4、IGMPv4和ICMPv6等分组。

2、有了原始套接口,进程可以读与写内核不处理其协议字段的IPv4数据报。

3、有了原始套接口,进程还可以使用IP_HDRINCL套接口选项自行构造IPv4头部。

原始套接口的创建

创建一个原始套接口涉及如下步骤:

1、把第2个参数指定为SOCK_RAW调用socket函数,以创建一个原始套接口。第3个参数(协议类型)通常不为0。

只有超级用户才能创建原始套接口。

2、可以在这个原始套接口上如下开启IP_HDRINCL套接口选项:

const int on = 1;
if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)
出错处理

3、可以在这个原始套接口上调用bind函数,不过比较少见。bind函数仅仅设置本地地址,因为原始套接口不存在端口的概念。

4、可以在这个原始套接口上调用connect函数,不过也比较少见。connect函数仅仅设置远地地址,同样因为原始套接字不存在端口的概念。

原始套接口输出

原始套接口的输出遵循以下规则:

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

2、如果IP_HDRINCL套接口选项未开启,那么由进程让内核发送的数据的起始地址指的是IP头部之后的第一个字节,因为内核将构造IP头部并把它置于来自进程的数据之前。内核把所构造的IPv4头部的协议字段设置成来自socket调用的第3个参数。

3、如果IP_HDRINCL套接口选项已开启,那么由进程让内核发送的数据的起始地址指的是IP头部的第一个字节。进程调用输出函数写出的数据量必须包括IP头部的大小。整个IP头部由进程构造,不过:(a)IPv4标识字段可置为0,从而告知内核设置该值;(b)IPv4头部校验和字段总是由内核计算并存储;(c)IPv4选项字段是可选的。

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

原始套接口输入

原始套接口输入遵循以下规则:

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

2、大多数ICMP分组在内核完成处理其中的ICMP消息后传递到原始套接口。

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

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

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

UNIX网络编程读书笔记:原始套接口的更多相关文章

  1. UNIX网络编程读书笔记:套接口选项

    概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...

  2. UNIX网络编程读书笔记:套接口地址结构

    前言 大多数套接口函数都需要一个指向套接口地址结构的指针作为参数.每个协议族都定义它自己的套接口地址结构.这些结构的名字均以"sockaddr_"开头,并以对应每个协议族的唯一后缀 ...

  3. UNIX网络编程读书笔记:简介

    认知套接口编程接口 理解原始套接口(raw socket)的概念   值得注意的是,客户和服务器是典型的用户进程,而TCP和IP协议则通常是系统内核协议栈的一部分. 上图中在TCP和UDP之间留有间隙 ...

  4. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  5. UNIX网络编程读书笔记:基本TCP套接口编程

    编写一个完整的TCP客户和服务器程序所需要的基本套接口函数: 1.socket函数(客户端.服务器端都必须调用) 参数family指明协议族(family),该参数也往往被称为协议域(domain). ...

  6. UNIX网络编程读书笔记:基本SCTP套接口编程

    概述 SCTP是一个较新的传输协议,于2000年在IETF得到标准化(TCP是在1981年标准化的).它最初是为满足不断增长的IP电话市场设计的:具体地说,就是穿越因特网传输电话信令. SCTP是一个 ...

  7. UNIX网络编程读书笔记:基本UDP套接口编程

    概述 使用UDP编写的一些流行的应用程序有:DNS(域名系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 如下图所示,给出了典型的UDP客户/服务器程序的函数调用: 客户不与服务器建立连 ...

  8. UNIX网络编程读书笔记:端口号、套接口对和套接口

    端口号 端口号(port number):16位整数,用来区分不同的进程. 服务器使用的端口号:TCP和UDP定义了一组众所周知的端口(well-known port),用于标识众所周知的服务. 客户 ...

  9. UNIX网络编程读书笔记:I/O模型(阻塞、非阻塞、I/O复用、信号驱动、异步)

    I/O模型 UNIX下可用的5种I/O模型: (1)阻塞I/O (2)非阻塞I/O (3)I/O复用(select和poll) (4)信号驱动I/O(SIGIO) (5)异步I/O 对于一个套接口上的 ...

随机推荐

  1. 【BZOJ 4380】4380: [POI2015]Myjnie (区间DP)

    4380: [POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗 ...

  2. [SDOI2014]数数 --- AC自动机 + 数位DP

    [SDOI2014]数数 题目描述: 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串. 例如当S=(22,333,0233)时,233是幸运数,2333 ...

  3. [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)

    1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 802  Solved: 344[Submit][Sta ...

  4. uva 6952 Cent Savings dp

    Cent Savings Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/vie ...

  5. Oracle密码忘记了解决办法

    Oracle密码忘记了怎么办?有时候我们可能忘记了一个用户的密码,但是又需要以这个用户做一些操作,又不能去修改掉这个用户的密码,这个时候,就可以利用一些小窍门,来完成操作.采用如下方法可以修改密码: ...

  6. Ubuntu下deb包的安装方法 - kevinhg的博客 - 博客频道 - CSDN.NET

    Ubuntu下deb包的安装方法 - kevinhg的博客 - 博客频道 - CSDN.NET dpkg -i

  7. XY8782S00 BL-W8782 BL-R8782MS1 SDIO接口 高性能、低功耗、体积小 wifi无线模块

    1.产品简介 BL-8782是一款高性能.低功耗.体积小SDIO接口无线模组,符合IEEE802.11N标准,并向下兼容IEEE802.11B/G标准,支持IEEE 802.11i安全协议,以及IEE ...

  8. Appium+python自动化54-appium-doctor报错已解决(SyntaxError: Unexpected token ...)

    前言 由于新版的appium desktop版本是不带appium-doctor这个包的,所以想用appium-desktop检查环境的话需要另外的安装了,在安装的时候小编又遇到了一个坑 报错信息:S ...

  9. poj 3130 How I Mathematician Wonder What You Are! - 求多边形有没有核 - 模版

    /* poj 3130 How I Mathematician Wonder What You Are! - 求多边形有没有核 */ #include <stdio.h> #include ...

  10. 9.线程通信wait、notify

    线程之间通信 1.线程是操作系统的独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体. 2.使用wait.notify,方法实现线程通信(2个方法都是需要object方法) 3.wait(释放 ...