关于linux 网络编程最权威的书是<<unix网络编程>>,但是看这本书时有些内容你可能理解的不是很深刻,或者说只知其然而不知其所以然,那么如果你想搞懂的话那么我建议你可以看看网络协议栈的实现。

函数原型是  int socket(int domain, int type, int protocol); 

其中domain 中AF_INET , AF_UNIT 较为常用,分别创建inet 域套接字和unix域套接字,unix套接字与文件相关。平时80%用的套接字都是AF_INET。这里说的有点多。

type 字段 原始套接字为SOCK_RAW

protocol字段 其他协议已经占用的该字段不能使用, 系统保留的也不能使用。

当接受到一份ip 数据包时,在向L4层递交的过程中会查看ip层报头中上层协议字段,如果是tcp udp icmp  则交给tcp udp  icmp的处理函数来处理.如果找不到相应的处理函数(应该说找不到相应的struct proto ),那么就把相应的数据包发给原始套接字,但是不是每一个原始套接字都接受这样的数据包,必须同使满足三个要求:(来自<<unix 网络编程>>)

1.ip 数据包首部的上层协议字段必须好创建套接字时的第三个字段相同。

2.创建原始套接字时使用了bind (其实主要是为了绑定ip地址),ip数据包中的目的地址必须和套接字绑定的地址相同

3.如果发送数据是用了sendto 那么sendto中的目的地址必须套接字的地址一样。

下面来说下原始套接字的发送和接受的数据都是从哪个地方开始的(可以参考前面linux c ping 实现一文)

发送的时候 ip首部后的第一个字节为发送的起点。

接收的时候 接收完整的ip数据包包括ip头部

有人可能会问有没有办法获取tcp udp 的数据

答案当然是有

这时候你需要原始ip套接字。现在来谈论下原始套接字和原始ip的不同。从名字上原始套接字,原始的数据是ip的载荷(L4层),原始ip套接字原始的L2载荷(L3层),所以在发送的时候,原始套接字只需要发送完整的L4层内容。原始ip套接字发送的时候需要发送完整的L3层内容,其ip报头的大部分内容需要自己来指定。

在接受的时候原始套接字接受完整的ip 层, 原始ip套接字接收完整L2层内容,这样你出去以太网头部,ip层头部,L4头部,那么剩下啦的就是tcp 或者 udp 的数据。

关于linux 原始套接字编程的更多相关文章

  1. Linux Socket 原始套接字编程

    对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...

  2. Linux网络编程——原始套接字编程

    原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据.区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有 ...

  3. Linux原始套接字实现分析---转

    http://blog.chinaunix.net/uid-27074062-id-3388166.html 本文从IPV4协议栈原始套接字的分类入手,详细介绍了链路层和网络层原始套接字的特点及其内核 ...

  4. Linux原始套接字抓取底层报文

    1.原始套接字使用场景 我们平常所用到的网络编程都是在应用层收发数据,每个程序只能收到发给自己的数据,即每个程序只能收到来自该程序绑定的端口的数据.收到的数据往往只包括应用层数据,原有的头部信息在传递 ...

  5. Python原始套接字编程

    在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_R ...

  6. Python原始套接字编程-乾颐堂

    在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_R ...

  7. linux原始套接字(4)-构造IP_UDP

    一.概述                                                    同上一篇tcp一样,udp也是封装在ip报文里面.创建UDP的原始套接字如下: (soc ...

  8. linux原始套接字(3)-构造IP_TCP发送与接收

    一.概述                                                    tcp报文封装在ip报文中,创建tcp的原始套接字如下: sockfd = socket ...

  9. linux原始套接字(2)-icmp请求与接收

    一.概述                                                    上一篇arp请求使用的是链路层的原始套接字.icmp封装在ip数据报里面,所以icmp请 ...

随机推荐

  1. shell脚本—根据文件个数定时备份

    最近在了解Jenkins时,出现这样一个问题:linux ext3系统目录下的子目录个数不能超过31998个(参考:http://www.xshell.net/linux/1267.html),但je ...

  2. 红帽/CentOS ext4无法格式化大分区 补充ext4格式化方式

    普通情况下,XFS出现丢数据的情况为海量小文件IO场景.在该场景下,inode占用教大. 通过上文的方式进行格式化,inode数量较小.通过大量測试,能够使用例如以下方法提升mkfs.ext4后文件系 ...

  3. poj 1699 Best Sequence(AC自己主动机+如压力DP)

    id=1699" target="_blank" style="">题目链接:poj 1699 Best Sequence 题目大意:给定N个D ...

  4. 建立ORACLE10G DATA GUARD---&gt;Physical Standby

    下面是我自己建Physical Standby,按照下面的步骤一步我一步,当然,打造成功,以下步骤可以作为建筑物Data Guard结构操作手册. HA和DG差额:HA:可以做IP切换自己主动  DG ...

  5. UVA10375 Choose and divide 质因数分解

    质因数分解: Choose and divide Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %l ...

  6. hdu 1159 Common Subsequence (dp乞讨LCS)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. axure & Markman

    axure & Markman学习总结 最近学了几款有意思的软件,一款是axure,另一款是Markman.接下来聊聊自己的学习心得吧. 关于axure,百度上的解释是:是一个专业的快速原型设 ...

  8. 基于hadoop的电影推荐结果可视化

    数据可视化 1.数据的分析与统计 使用sql语句进行查询,获取所有数据的概述,包括电影数.电影类别数.人数.职业种类.点评数等. 2.构建数据可视化框架 这里使用了前端框架Bootstrap进行前端的 ...

  9. AIX6.1/11.2.0.3在有关数据库SWAP一个BUG

    昨天南京到客户服务数据库的优化调整,其中新上线,经过审查alert.log当日志现在是在过去一段时间内取得,每隔几个小时的时间滞后,班会报似的内容: Thu Aug 21 09:01:26 2014 ...

  10. ORA-00838: Specified value of MEMORY_TARGET is too small(转)

    1. 测试环境OS: RHEL5U5(32bit)DB: Oracle 11.2.0.3.0(32bit) 2.   异常原因. 2.1 oracle 11g默认sga_target为0,如下图, O ...