http://blog.sina.com.cn/s/blog_1533e35800102wyqd.html

http://blog.sina.com.cn/s/blog_1533e35800102wyqd.html

http://blog.sina.com.cn/s/blog_1533e35800102wyqd.html

最近读者反映文章还要普及一下基础知识,比如专业术语,比如网络包是如何从一台电脑发送出去,网络包如何到达目的地,又如何从目的地网卡接收到,再传输到应用程序。如果把专业术语单独拎出来,没有上下文,同学们一定会觉得很突兀、也很枯燥,所以我还是喜欢讲一个例子,在这个例子中用到的专业术语一一解释,今天我们来讲同一网段的两台电脑如何ping通对方,那第一个问题就来了。

Ping是什么?

操作系统里的一种小程序,可以用来检测两台主机的连通性,如果可以ping通,表示网络可达,否则,网络不可达,网络出故障,需要排错了。先来看一个例子,在主机10.0.0.2上ping主机10.0.0.3,从第一个图可以看出可以ping 通,发出4个echo request,返回对应的4个echo reply;第二个图可以看出全部的8个ping报文,第三个图可以看到具体的ping报文的怎么构成的。

同学们一定很好奇,ping 是如何生成这些ICMP报文的,那下一个问题又来了;

什么是ICMP?

Internet Control Message Protocol,如名字所暗示,这是一个网络控制协议,当网络发生一些或大或小的问题,通过该协议可以告知通信的发起方,比如,当一个IP包太大,比如1500字节,到达一个路由器的接口,接口最大传输单元MTU=1476字节,由于IP包1500>MTU1476,这个IP包必须分成两片才可以从接口发送出去,问题来了,IP包里有一个标志位DF=1,不熟悉这个标志位可以看我的文章:IP协议,意思是这个IP包不能分片,IP包的发起方意思很明显,要么完整给我转发,要么丢,就是不能分片!那路由器只有无奈地丢弃这个IP包,如果没有消息告知这个IP发起者,会发生什么?IP包都被默默丢弃了,而IP包发起方并不知道,还以为数据已经到达了目的地,其实都被丢了,这就是流量黑洞,所以需要一种消息机制告知IP包的发起者,这个消息就是用ICMP来发送的,那发送什么样的消息呢?

ICMP协议里有type字段,还有code字段,发送type=3,code=4,MTU=1476的消息就可以了,当这个ICMP消息到达IP包的发起者,发起者知道原来是IP太大了,那最大可以发送多大的呢?消息里有,那就MTU=1476,于是IP包的发起方只要发送小于等于1476字节的就可以了。

好了,那我们继续我们的主题,ping的ICMP报文是如何生成的,这个是软件工程师最擅长的领域,因为这更像编程,好在车小胖做过七年的软件工程师,操纵Motorola MPC 860芯片,各种物理寄存器、BD表、发送缓存、接收缓存,还写过网卡驱动程序,写过二层HDLC协议,还写过更高一些的如DHCP、PPPoE等协议,所以应该能够给一个大体的框架,步骤如下:

1.  ping 10.0.0.3这条命令敲完回车,ping程序会调用一个发送函数,类似icmp_send(10.0.0.3,...),这种函数我们统称为Application ProgramInterface,简称API,这是操作系统提供的一种函数集合,准确地说是TCP/IP协议栈提供的函数集合,目的是什么呢?用来操作TCP/IP协议栈来发送和接收数据。比如Apple IPhone iOS也提供了很多API,各种APP通过这些API可以操纵手机的相机、喇叭、声音等可以编程,呈现出五彩缤纷的花花界面。好,回到正题,icmp_send(10.0.0.3,…),括号里的是传入参数,省略号表示这些可以是缺省参数,比如长度是length=32字节,发送次数count=4,DF=0,超时timeout=2 秒,如果你想发1500字节的数据,你只要敲以下命令:ping 10.0.0.3 -l 1500

那下面这条命令什么意思?

ping 10.0.0.3 -c 100 -f -l 1500

-c  count

-f  force

-l length

意思是发送100次、长度为1500字节、且不能分片ICMP Echo request。

2. icmp_send(10.0.0.3,…)到达TCP/IP协议栈,栈查找自己的路由表,路由表是什么?下图可以看出主机上路由表大概是什么样子的,为什么要查找路由表?通过查找路由表可以知道该把这个ICMP消息从哪个接口发送出去,那怎么查找?

最长匹配!把10.0.0.3和路由表里的每一个表相进行匹配,匹配长度最长的胜出,在这张路由表里最长的匹配就是第二条路由:10.0.0.0 255.255.255.0 Wi-Fi,栈知道这是和自己在一个网段10.0.0.0/24的主机,可以通过Wi-Fi接口到达,于是发送ARP来解析10.0.0.3的硬件地址,也称为MAC地址,那ARP又是什么呢,还有什么叫同一网段?

什么是同一网段?

比如一个地址,10.0.0.3/24,也可以写成10.0.0.3 255.255.255.0,子网掩码是24位即255.255.255.0,10.0.0.3
和255.255.255.0“按位与”操作得到网段地址,即10.0.0.0 ,剩下的3为主机地址,操作如下:

IP地址10.0.0.3 的二进制:

00001010.00000000.00000000.00000011

子网掩码255.255.255.0的二进制:

11111111.11111111.11111111.00000000

按位与得到的网段地址:

00001010.00000000.00000000.00000000

换算成十进制就是:

10.0.0.0

所谓按位与运算,就是每一位比对,如果都是1得到的结果是1,否则为0。

那10.0.0.2 和10.0.0.3就属于同一网段,同一网段意味着在一个广播域里,ARP就是工作在广播模式下,那ARP又做些什么呢?

什么是ARP?

Address Resolution Protocol,简称为ARP,用来解析IP地址所对应主机的硬件地址,即网卡地址,我们也统称MAC地址,MAC,Media Access Control的缩写,于是栈发了一个ARP请求,地址10.0.0.3是谁的?吭一声,对应图中的第一个包,因为这是一个广播包,所以这个网段的所有主机都可以接收到,于是10.0.0.3就吭了一声,对应图中得第二个包,于是我们就知道了10.0.0.3的MAC地址为:00:30:67:1b:ec:a5

到这里栈有了所有的信息,包括二层以太网目的地址、三层IP目的地址,打包成一个ICMP包发送给网卡,怎么发?当然也是调用网卡驱动程序API,各位同学又看到了API,没错!下层提供给它上层的服务是通过API来实现的,这里相当于调用类似ethernet_send()接口函数,于是ICMP到达网卡。

3. 网卡计算整个以太网帧的校验和,四个字节长,放在以太网帧的最后,我们称之为CRC,然后把这个以太网帧从接口发送出去,为何要CRC?为了怕在传输过程中因为线路质量、或噪音引起数据的丢失或者改变,发送方计算一个CRC,覆盖范围为整个以太网帧,接收方收到一个帧,先把最后四个字节CRC拷贝出来,然后去掉CRC,再计算CRC,如果计算出的CRC和接收到的CRC一致,说明帧是完好的,可以接收,否则直接丢弃!好,现在ICMP已经发到网络上去了。

4. 10.0.0.3这台主机发现这个帧的目的地址和自己的一样,哦,这是我的地址,于是接收,步骤参见步骤三,网卡把这个帧放在自己的缓存,发一个CPU中断,意思是收到一个帧,需要您老人家照顾一下,于是TCP/IP栈把这个帧移到自己的缓存空间,交由ICMP进程来处理

5.  ICMP进程分析这个ICMP echo 请求,生成了回答ICMP echo reply报文,然后…剩下的步骤和以上的雷同,就不再罗嗦了。

6. ICMP echo reply 到达10.0.0.2主机,然后ping把这个消息输出到屏幕,这就完成了同一网段主机的通信。

[转]车小胖谈网络(基础篇):同一网段的主机如何通信相关推荐

  1. 智能车浅谈——过程通道篇

    文章目录 前言 过程通道 模拟量输入通道 模拟量输出通道 开关量输入/输出通道 小结 模拟信号的调理 信号放大电路 滤波限幅电路 开关量信号调理 信号转换电路 滤波电路 保护电路 触点消抖 光耦隔离 ...

  2. 智能车浅谈——控制规律篇

    文章目录 前言 计算机控制系统 常用控制规律 PID控制 比例(P)控制器 比例积分(PI)控制器 比例积分微分(PID)控制 位置式PID 增量式PID 数字PID控制算法的改进 PID参数整定 小 ...

  3. 智能车浅谈——方向控制篇

    文章目录 前言 自动控制理论 人工控制系统 自动控制 方向控制 典型环节对应 典型环节分析 给定环节与给定量 比较环节与偏差量 控制环节与控制量 执行机构 舵机 PWM技术 舵机中值及限幅 转向控制 ...

  4. 智能车浅谈——电机控制篇

    文章目录 前言 运动控制系统 被控对象 执行机构 控制器 反馈环节 M法测速: T法测速 小结 直流调速系统 桥式可逆PWM变换器 (1)正向运行 (2)反向运行 总结 智能车系列文章汇总 前言 之前 ...

  5. IOS、安卓IM语音聊天开发初探部分心得——网络基础篇

    今儿是个还债的日子,没错,承诺了许久的网络传输篇虽然没有千呼万唤,不过我还是厚着脸皮始出来,继上两篇文章总结了一下开发IM语音功能时所遇到的音频问题,而今天就让我们来看看这个让我们看似近在眼前,确始终 ...

  6. Python3 与 C# 网络编程之~ 网络基础篇

    最新版本查看:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入门篇 官方文档:https://docs.python.org/3/library ...

  7. Bridge网络模式下Linux虚拟机和主机进行通信

    我的VMware版本是8.0.3.其他版本的设置应该大致相同. 1.注意我们的网络模式是Bridge 2.我们的网卡设置 3.目标虚拟机(Linux)的IP 4.我的主机的IP地址 5.网络调试助手的 ...

  8. linux网络报文接收发送浅析_Docker容器网络-基础篇

    Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/Netfilter.网桥.路由等.接下来, ...

  9. docker 启动时指定需要绑定的网卡_Docker容器网络-基础篇

    Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/Netfilter.网桥.路由等.接下来, ...

最新文章

  1. xmind快速上手使用教程,提高工作效率
  2. 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念
  3. [vue] 如何实现一个虚拟DOM?说说你的思路
  4. 招聘 | 大疆算法类未来大咖招聘
  5. SAP License:ERP系统license过期了怎么办?
  6. flex连接mysql_java与flex结合做的登陆(连接数据库)
  7. ubuntu 上搭建lanp环境
  8. yy神曲url解析php_用PHP如何实现解析抖音无水印视频
  9. 怎么把框架栏变颜色 html,如何修改easyui框架颜色,求指点_html/css_WEB-ITnose
  10. 企业微信本地测试环境搭建
  11. This inspection finds all usages of methods that have @since tag in their documentation.
  12. IT通过什么途径去美国工作?
  13. “数据源“SqlServer ”包含无法用于处理操作的 ImpersonationMode。不能与名称为“SqlServer ”的数据源进行连接。”
  14. html制作过程总结经验,网页基础制作教程:学习HTML经验总结
  15. HTML代码via浏览器logo,Via浏览器怎么定制首页 几步轻松完成
  16. 经纬度转换XY坐标,并计算距离
  17. 我司何晓磊续签立命馆大学的客座研究员
  18. 你不知道的Windows小技巧~~
  19. 斯坦福大学的产学研之路
  20. 亚马逊云科技与格雷西司,助力卡洛哈应对全球运营挑战

热门文章

  1. line vty 0 4 什么意思
  2. Uni.me免费域名申请注册和使用教程
  3. OSChina 周六乱弹 —— 到底谁是小公猫……
  4. oracle binary6,Oracle Binary Options 说明
  5. css绘画虚线 竖的 横的
  6. 贿赂囚犯 Bribe the prisoners DP
  7. 请教:Java字符串内部的大括号,与方法参数中的...,代表什么意思呢?
  8. 打通企业的“韧”督二脉,戴尔科技赋能数智远见者
  9. 构建RAID5磁盘阵列
  10. LINUX下的各种游戏