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

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

卡卷网12个月前 (12-29)每日看点176

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

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

分享给朋友:

相关文章

最让你震惊的网站有哪些?

压箱底的震惊来了,来波大的,一百个网站!这些都是我平时辛辛苦苦收集的,是真的牛逼,居然还有这种网站。1、实时地球网址:https://zoom.earth/实时图像每 10 分钟更新一次,提供风暴、天气预报、降水、火警等数据2、陕西博物馆...

Photoshop 有哪些使用技巧?

Photoshop 有哪些使用技巧?

不看后悔系列!本篇分享25个PS实用的技巧!不能保证每个都能让你惊艳,但是却是我用心写出来的,希望对你有帮助。另外我的知乎也写了接近200篇PS的技巧,超级合集分享!分享25个关于PS的技巧一、快速制作文字倒影1、新建文档,1500×100...

是什么让你抛弃了 Windows 而转向 Mac?

是什么让你抛弃了 Windows 而转向 Mac?

别的不说,这玩意儿是真抗造啊,我这2012年买的MacBook Pro,依然在用……这台电脑我博士最后两年用来写代码(只写不运行,运行要上集群)和写论文,工作之后就变成生活和娱乐了,因为我一直用架子和外接键盘(颈椎不好)所以电脑看起来很新,...

计算机专业不干互联网不热爱技术,还能转行干什么?

转行的思路,无非也就是那几个。我们顺着每个思路,一路捋一遍,基本上,大致可行的方向,也就有了。一、跟对口职业和岗位业务链条相邻的职业和岗位计算机专业如果找到了对口的技术岗位,跟技术工作联系最紧密的岗位是什么?产品经理。当然,大多数产品经理也...

提升自己最快的方式是什么?

提升自己最快的方式是什么?

1.稻盛和夫说过:“改变自己最快的方法就是做自己害怕的事,不敢做的事,认为自己做不到,觉得不可能的事。如果在自己的舒适区待久了,就会丧失斗志,如果想快速的改变,可以坚持去做一些对自己有益的事。2.早睡早起,坚持运动保持旺盛的精力,人生拼到最...

网易云音乐上看到过最触动的热评是什么?

网易云音乐上看到过最触动的热评是什么?

1.“昨天晚上洗澡的时候,我忘记拿毛巾了,喊了声妈妈帮我拿下毛巾,正当我伸出左手准备接毛巾的时候,我愣了一下,又换了右手。”希望你永远不会听懂这句话,永远都不要懂。——网易云热评《关键词》2.小时候跟着父亲去城里卖西瓜,害怕同学会看到我,就...

发表评论

访客

看不清,换一张

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