原始套接字 IP_HDRINCL 转

原始套接字可以访问ICMP和ICMP等协议包,可以读写内核不处理的IP数据包。可以创建自定义的IP数据包首部。一句话,使用原始套接字可以   编写基于IP协议的通讯程序。   1.创建原始套接字具体格式如下:int sockfd;sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);第一个参数:协议族 AF_INET 代表TCP/IP协议第二个参数:SOCKET类型第三个参数:协议类型注意:@如果指定协议为0时,原始套接字可以接收内核传递给原始套接字的任何IP数据包,且只有超级用户才可以创建原始套接字。   @当需要编写自己的IP数据包首部时,可以在原始套接字上设置套接字选项IP_HDRINCL.在不设置这个选项的情况下,IP协议自动填充IP数据包的首部。   int on = 1;if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)   { fprintf(stderr, "setsockopt IP_HDRINCL ERROR! /n");exit(1);}   原始套接字直接使用IP协议的套接字,所以是非面向连接的。在这个套接字上可以调用connect和bind函数,分别执行绑定对方和本地地址。   说明:   bind函数:调用bind函数后,发送数据包的源IP地址将是bind函数指定的地址。如是不调用bind,则内核将以发接口的主IP地址填充。如果设置了IP_HDRINCL,那么必须手工填充每个发送数据包的源IP地址。   connetc函数:调用connect函数后,可以用write和send发送数据包。内核将用这个绑定的地址填充IP数据包的目的IP地址。   发送数据包   使用原始套接字发送数据包必须遵循以下规则:1.如果没有用connect函数绑定对方地址时,则应使用sendto或sendmsg函数发送数据包,在函数参数中指定对方地址。如?饔昧薱onnect函数,则可以直接使用send,write或writev来发送数据包。   2.如果没有设置IP_HDRINCL选项时,包内可写的内容为数据部分,内核将自动创建IP首部。如果设置了IP_HDRINCL选项,则包内要填充的内容为IP数据包和首部。内核只负责填充下面两个域:。如果将IP数据包的标识域设置为0,内核将设置这个域。内核总是计算和填充IP数据包首部的校验和。   注意:IP数据包首部各个域的内容都是网络字节顺序。   接收数据包   内核遵循以下规则接收数据包:1.UDP和TCP数据包从不传送给一个原始套接字。如果要查看这两类数据包,只能通过直接访问数据链路层来实现。   2.大多数ICMP数据包的一个拷贝传送给匹配的原始套接字。   3.内核处理的所有其它类型的数据包的一个拷贝都传给匹配的原始套接字。   4.所有内核不能识别的协议类型的IP数据包都传送给匹配的原始套接字。对于这些IP数据包,内核只做必要的检验工作。   在将一个IP数据包传送给原始套接字之前,内核需要选择匹配的原始套接字1.数据包的协议域必须与接收原始套接字的协议类型匹配。   2.如果原始套接字调用了bind函数绑定了本地IP地址,那么到达的IP数据包的源IP地址必须和对方的IP相匹配。   3.如果原始套接字调用connect函数指定了对方的IP地址,则到达的IP数据包的源IP地址秘须与这它相同

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏媒矿工厂

可靠互联网传输协议(RIST)简介

视频压缩技术的进步和互联网基础设施的普及,使得流媒体在互联网上广泛传输。但是网络丢包一直是一个困扰人们的问题。市面上已经有许多私有的解决方案用于解决流媒体传输的...

27030
来自专栏佛系编程人

一个网络请求的冒险之旅

对于互联网,人们总是高谈阔论,却很少有人愿意去了解电脑、手机、电视这些设备到底是如何被“连接”起来的。

9620
来自专栏苏生不惑

微信分享开发

微信分享的文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

24520
来自专栏Super 前端

【HTTP】客户端识别与cookie机制

​ 然而,大多数产品都希望提供一个类“免责声明”的文档,然后主动管理该DNT。所以我们只能借助其他方式(这里常用的方式是第三方Cookie,见文档Co...

9550
来自专栏AI科技时讯

使用opencv实现实例分割,一学就会|附源码

无论是从酒店房间接听电话、在办公里楼工作,还是根本不想在家庭办公室等情况,电话会议模糊功能都可以让会议与会者专注于自己,这样的功能对于在家工作并希望保护其家庭成...

32830
来自专栏腾讯高校合作

【犀牛鸟·硬核】中科大-腾讯最新联合研究成果入选ACM SIGKDD顶级会议研究类长文

导语:在刚刚结束的ACM SIGKDD 2019顶级会议上,腾讯技术工程事业群数据平台部与中科大联合发表的最新研究成果入选SIGKDD 2019 Resear...

13930
来自专栏佛系编程人

Django | 创建我们的第一个应用

12630
来自专栏A周立SpringCloud

漫漫优化路,总会错几步!记一次接口优化!

点击上方"IT牧场",选择"设为星标"技术干货每日送达!来源:www.cnblogs.com/cjsblog/p/10573215.html

7540
来自专栏Python编程 pyqt matplotlib

PyQt5 对话框 数据验证

本篇介绍PyQt5对话框的数据合法性的验证。有两种验证方式:预防式验证(preventative)和 提交后验证 (post-mortem)。预防式验证适合于单...

9830
来自专栏kk大数据

数据分析:数据采集是根基

数据传输,指的是数据以何种方式流入到存储介质,比如日志是通过logstash还是filebeat采集到kafka的,前端的操作记录是通过http请求发送的

10710

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励