当前位置:首页 > 每日看点 > 正文内容

ping 没有端口号, 如何保证数据的正确接收?

卡卷网1年前 (2024-12-29)每日看点226

简单说,网卡只是总线上插着的一块普通设备;这个设备可以接受来自网线的、高低起伏的电压,并把这些电压解读为二进制流。

ping 没有端口号, 如何保证数据的正确接收?  第1张

如果“网卡”是简单的COM口通讯,那么二进制流可能使用0x7F表示数据报文开始,0xF7表示数据报文结束。

如果数据中本身就存在7F/F7,则需要做“转义”,就好像在C字符串中不能直接敲NUL,而要用\转义阿拉伯数字0,从而表示出一个全零字节一样——当然,\字符本身也要转义,比如\\就代表\自身。


我们常用的网卡叫“以太网卡”,它的报文有稍微复杂一些的格式,叫做以太网帧:

ping 没有端口号, 如何保证数据的正确接收?  第2张

前导码:Ethernet II是由8个8‘b10101010构成,IEEE802.3由7个8‘b10101010+1个字节SFD..
目的地址:目的设备的MAC物理地址。
源 地址 :发送设备的MAC物理地址。
类型(Ethernet II):以太网首部 后面所跟数据包的类型,例如Type为0x8000时为IP协议包,Type为8060时,后面为ARP协议包。
长度(IEEE802.3):当长度小于1500时,说明该帧为IEEE802.3帧格式,大于1500时,说明该帧为Ethernet II帧格式。
数据:数据长度最小为46字节,不足46字节时,填充至46字节。因为最小帧长度是64字节,所以,46+6+6+2+4=64。(不算前导码)
FCS: 就是CRC校验值
以太网数据格式与封装解封 - SevenFormer - 博客园


和COM口通讯一样,以太网的驱动程序(可以直接固化在网卡固件里,从而不需要驱动,而是直接用网卡自带的芯片解码)通过“前导码”从位流中识别出以太网帧、查看其中的目的地址MAC,确认它是不是给自己的——如果不是,就丢弃它(当然,如果网卡被设置到混杂模式Promiscuous Mode,则数据并不会自动丢弃;此时你可以直接在以太网层监控局域网本地交换机下的所有通信)。

然后,IP报文等就在以太网帧的“载荷”,也就是那46~1500字节的“数据”中。


这个“载荷”会交给IP协议栈(一组驱动程序,也可以是网卡上的芯片)处理。

第一步,仍然是把数据按IP报文解析:

ping 没有端口号, 如何保证数据的正确接收?  第3张

注意这里做了一定的简化:实质上,ARP协议虽然是IP协议的一部分,但它是一个单独的、不带IP头的封包。换句话说,并不是所有以太网数据都是IP报文。这要通过首字节的版本号等信息区分。


IP数据报文又分为三种子格式,也就是ICMP、TCP、UDP。它们都有一个IP头。

换句话说,ICMP、TCP、UDP都是IP报文的数据。

这是IP报文:

ping 没有端口号, 如何保证数据的正确接收?  第4张

里面可能是如下三种数据之一:

TCP报文:

ping 没有端口号, 如何保证数据的正确接收?  第5张

UDP报文:

ping 没有端口号, 如何保证数据的正确接收?  第6张

ICMP报文:

ping 没有端口号, 如何保证数据的正确接收?  第7张


注意它们都是IP报文的载荷;也就是说,在IP栈内部,要根据IP头格式识别数据格式,然后派发给ICMP、TCP、UDP模块处理。


其中,ICMP相关信息直接在驱动层处理就可以了,也就是停留在操作系统空间就可以,不需要用户空间的应用参与处理,它会按照协议规定自动动作。

当然,用户层也可以访问它,使用SOCK_RAW建立socket链接即可。ping命令就是这样编写的,可参考:

通信编程:基于 ICMP 编写 ping 程序


注意它和TCP/UDP不同。

后两者是通过专门的处理模块、和用户空间应用直接对应的。对应方式就是源端口/目的端口,也就是通过一个四元组 (源地址,目标地址,源端口,目标端口) 唯一的标记一条“虚拟链路”。

而ICMP并没有约定端口号之类东西;对它的读写都直接在IP层进行(SOCK_RAW),是和TCP/UDP不同的另外一套机制。


换句话说,它所依赖的IP报文总是可以被正确的投递(到ARP绑定的MAC地址所在的那个网段)、并被预设机制自动响应。

但,如果你想写一个ping程序、支持“同时启动N个ping进程ping远程主机、却又不相互干扰”的话,你需要自己设计一个机制,避免接收不属于自己的echo报文。


另外,如果你很熟悉TCP/UDP通讯,就会知道每次从socket读取一个报文,这个报文就会从协议链上被移除;但SOCK_RAW的行为是不一样的:

It is important to understand that some sockets of typeSOCK_RAWmay receive many unexpected datagrams. For example, a PING program may create a socket of typeSOCK_RAWto send ICMP echo requests and receive responses. While the application is expecting ICMP echo responses, all other ICMP messages (such as ICMP HOST_UNREACHABLE) may also be delivered to this application. Moreover, if severalSOCK_RAWsockets are open on a computer at the same time, the same datagrams may be delivered to all the open sockets. An application must have a mechanism to recognize the datagrams of interest and to ignore all others. For a PING program, such a mechanism might include inspecting the received IP header for unique identifiers in the ICMP header (the application's process ID, for example).
TCP/IP raw sockets - Win32 apps

根据微软的说明,所有的icmp消息都会返回给每一个试图读取它的应用。也就是你的读取并不会导致ICMP数据从协议链上被删除,每一个报文,不管是不是给你的,都会被你接收到——如果你写了一个ping,然后用户启动了这个ping的100个实例,那么100倍的icmp报文会无遗漏的被每一个ping进程获取。

因此,你必须自己识别你发出去的ping包;ICMP要求echo服务必须复制请求者发来的任何数据载荷,因此你可以在自己的ping包中放入自己的进程ID (pid),从而把每个进程发出去的ping包区分开来。

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/12/5910.html

分享给朋友:

相关文章

普通人一部手机用多久?

普通人一部手机用多久?

各位知友,你们的现在的手机用了多久了呢?回看国外分析机构TechInsights的报告,目前大家的用机周期是越来越长了,在国内,也达到了「40个月」,就是很多人至少三年半才会换一次手机。仔细想想,不对呀,现在新机不是一直出吗?为什么大家都不...

b站真的能自学PS吗?

b站真的能自学PS吗?

看你想达到哪一种程度了,如果你只是平常用PS扣图、调整照片大小、尺寸、简单调个色这样,自学真的挺简单的,B站很多免费的教程都可以教会你这些技巧。但是如果说你想成为专业的设计师或者是商业修图师,无师自通真的非常难,首先你会走很多弯路,不知道怎...

打印速度慢,是不是打印机cpu不行?

打印速度慢,是不是打印机cpu不行?

打印机是机械设备,cpu内存硬盘它也有但这只是它的电控部分,打印机类似于汽车属于机电一体化设备和电脑不是一个类型的产品。很多人总是认为打印机和电脑是一类产品,实际上这是一个误区,电脑是it(Information Technology)信息...

如何判断 Java 工程师的基础知识是否扎实?

我来给你出几道大题,能答对70%,你就算基础扎实了。第一部分 Java基础(27)1. 程序本质:代码是如何被执行的?CPU、操作系统、虚拟机各司何职?2. 基础语法:从CPU角度看变量、数组、类型、运算、跳转、函数等语法3. 引用类型:同...

如何做电商行业?

如何做电商行业?

“如何做电商*开网店”跟“如何找老婆”一样,没概况条件、没明确标准,就是扯犊子。我把话题具体一点说:具备“两三万”启动资金、掌握“选品+上架优化”基础技能,小则月入三五千、多则上万。跟摆地摊一样,有进货的钱、也不怕苦不怕累、稍微有点生意头脑...

抖音上有一些账号搬运别人的视频,几乎一模一样,也没判搬运,他们是怎么做到的??

对于任何短视频平台来说,如何用最低的成本快速实现伪原创搬运都是需要解决的问题。所有的短视频平台,包括抖音、快手、tiktok、视频号、小红书、B站,甚至是FB、推特、INS、YouTube,它们的查重技术都是类似的,只要你在网络环境设置得当...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。