把这三个协议放到一起学习是因为这三个协议处于同一层,ARP 协议用来找到目标主机的 Ethernet 网卡 Mac 地址,IP 则承载要发 送的消息。数据链路层可以从 ARP 得到数据的传送信息,而从 IP 得到要传输的数据信息。

IP 协议

IP 协议是 TCP/IP 协议的核心,所有的 TCP,UDP,IMCP,IGCP 的数据都以 IP 数据格式传输。要注意的是,IP 不是可靠的协议,这是 说,IP 协议没有提供一种数据未传达以后的处理机制--这被认为是上层协议--TCP 或 UDP 要做的事情。所以这也就出现了 TCP 是一个可靠的协议,而 UDP 就没有那么可靠的区别。这是后话,暂且不提。

IP 协议头

如图所示:

挨个解释它是教科书的活计,我感兴趣的只是那八位的 TTL 字段,还记得这个字段是做什么的么?这个字段规定该数据包在穿过 多少个路由之后才会被抛弃 (这里就体现出来 IP 协议包的不可靠性,它不保证数据被送达),某个 ip 数据包每穿过一个路由器,该数 据包的 TTL 数值就会减少1,当该数据包的 TTL 成 为零,它就会被自动抛弃。这个字段的最大值也就是255,也就是说一个协议包也就 在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一 样,一般是32或者是64,Tracerouter 这个工具就是用这个 原理工作的,tranceroute 的-m 选项要求最大值是255,也就是因为这个 TTL 在 IP 协议里面只有8bit。

现在的 ip 版本号是4,所以也称作 IPv4。现在还有 IPv6,而且运用也越来越广泛了。

IP 路由选择

当一个 IP 数据包准备好了的时候,IP 数据包(或者说是路由器)是如何将数据包送到目的地的呢?它是怎么选择一个合适的路 径来"送货"的呢?

最特殊的情况是目的主机和主机直连,那么主机根本不用寻找路由,直接把数据传递过去就可以了。至于是怎么直接传递的,这 就要靠 ARP 协议了,后面会讲到。稍微一般一点的情况是,主机通过若干个路由器(router)和目的主机连接。那么路由器就要通过 ip 包的信息来为 ip 包寻找到一 个合适的目标来进行传递,比如合适的主机,或者合适的路由。

路由器或者主机将会用如下的方式来处理某一个 IP 数据包:

  •  如果IP数据包的TTL(生命周期)以到,则该IP数据包就被抛弃。
  •  搜索路由表,优先搜索匹配主机,如果能找到和IP地址完全一致的目标主机,则将该包发向目标主机
  •  搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要“子网掩码(1.3.)”的协助。如果找到路由器,则将该包
  • 发向路由器。
  •  搜索路由表,如果匹配同子网路由器失败,则匹配同网号(第一章有讲解)路由器,如果找到路由器,则将该包发向路由器。  搜索路由表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包
  •  如果都失败了,就丢掉这个包。

这再一次证明了,ip 包是不可靠的。因为它不保证送达。

子网寻址

IP 地址的定义是网络号+主机号。但是现在所有的主机都要求子网编址,也就是说,把主机号在细分成子网号+主机号。最终一个IP 地址就成为 网络号码+子网号+主机号。例如一个 B 类地址:210.30.109.134。一般情况下,这个 IP 地址的红色部分就是网络号, 而蓝色部分就是子网号,绿色部分就是主机号。至于有多少位代表子网号这个问题上,这没有一个硬性的规定,取而代之的则是子网 掩码, 校园网相信大多数人都用过,在校园网的设定里面有一个255.255.255.0的东西,这就是子网掩码。子网掩码是由32bit 的二进 制数字序列,形式 为是一连串的1和一连串的0,例如:255.255.255.0(二进制就是11111111.11111111.11111111.00000000) 对于刚才 的那个 B 类地址,因为210.30是网络号,那么后面的109.134就是子网号和主机号的组合,又因为子网掩码只有后八 bit 为0,所以主 机号 就是 IP 地址的后八个 bit,就是134,而剩下的就是子网号码--109。

ARP 协议

还记得数据链路层的以太网的协议中,每一个数据包都有一个 MAC 地址头么?我们知道每一块以太网卡都有一个 MAC 地址,这个 地址是唯一的,那么 IP 包是如何知道这个 MAC 地址的?这就是 ARP 协议的工作。

ARP(地址解析)协议是一种解析协议,本来主机是完全不知道这个 IP 对应的是哪个主机的哪个接口,当主机要发送一个 IP 包的 时候,会首先查一下自 己的 ARP 高速缓存(就是一个 IP-MAC 地址对应表缓存),如果查询的 IP-MAC 值对不存在,那么主机就向网络 发送一个 ARP 协议广播包,这个广播包 里面就有待查询的 IP 地址,而直接收到这份广播的包的所有主机都会查询自己的 IP 地址,如 果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包 含自己的 MAC 地址的 ARP 包传送给发送 ARP 广播的主机,而广播 主机拿到 ARP 包后会更新自己的 ARP 缓存(就是存放 IP-MAC 对应表的地方)。发送 广播的主机就会用新的 ARP 缓存数据准备好数据链 路层的的数据包发送工作。

一个典型的 arp 缓存信息如下,在任意一个系统里面用“arp -a”命令:

都会得到这样的结果。这样的高速缓存是有时限的,一般是20分钟(伯克利系统的衍生系统)。

IMCP 协议介绍

前面讲到了,IP 协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完 成。其中一个重要的模块就是 ICMP(网络控制报文)协议。

当传送 IP 数据包发生错误--比如主机不可达,路由不可达等等,ICMP 协议将会把错误信息封包,然后传送回给主机。给主机 一个处理错误的机会,这 也就是为什么说建立在 IP 层以上的协议是可能做到安全的原因。ICMP 数据包由8bit 的错误类型和8bit 的代 码和16bit 的校验和组成。而前 16bit 就组成了 ICMP 所要传递的信息。书上的图6-3清楚的给出了错误类型和代码的组合代表的意思。

尽管在大多数情况下,错误的包传送应该给出 ICMP 报文,但是在特殊情况下,是不产生 ICMP 错误报文的。如下:

  •  ICMP 差错报文不会产生 ICMP 差错报文(出 IMCP 查询报文)(防止 IMCP 的无限产生和传送)
  •  目的地址是广播地址或多播地址的IP数据报。
  •  作为链路层广播的数据报。
  •  不是IP分片的第一片。
  •  源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。 虽然里面的一些规定现在还不是很明白,但是所有的这一切规定,都是为了防止产生 ICMP 报文的无限传播而定义的。
  • ICMP 协议大致分为两类,一种是查询报文,一种是差错报文。其中查询报文有以下几种用途:
  •  ping 查询(不要告诉我你不知道 ping 程序)
  •  子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)
  •  时间戳查询(可以用来同步时间)

而差错报文则产生在数据传送发生错误的时候。就不赘述了。

ICMP 的应用--ping

ping 可以说是 ICMP 的最著名的应用,当我们某一个网站上不去的时候。通常会 ping 一下这个网站。ping 会回显出一些有用的信息。

一般的信息如下:

ping 这个单词源自声纳定位,而这个程序的作用也确实如此,它利用 ICMP 协议包来侦测另一个主机是否可达。原理是用类型码 为0的 ICMP 发请 求,受到请求的主机则用类型码为8的 ICMP 回应。ping 程序来计算间隔时间,并计算有多少个包被送达。用户就可 以判断网络大致的情况。我们可以看到, ping 给出来了传送的时间和 TTL 的数据。我给的例子不太好,因为走的路由少,有兴趣地 可以 ping 一下国外的网站比如 sf.net,就可以观察到一些 丢包的现象,而程序运行的时间也会更加的长。

ping 还给我们一个看主机到目的主机的路由的机会。这是因为,ICMP 的 ping 请求数据报在每经过一个路由器的时候,路由器都会把 自己的 ip 放到该数 据报中。而目的主机则会把这个 ip 列表复制到回应 icmp 数据包中发回给主机。但是,无论如何,ip 头所能纪录的 路由列表是非常的有限。如果要观察路由, 我们还是需要使用更好的工具,就是要讲到的 Traceroute(windows 下面的名字叫做 tracert)。

ICMP 的应用--Traceroute

Traceroute 是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。前面说到,尽管 ping 工具也可以进行 侦测,但是,因为 ip 头的限制,ping 不能完全的记录下所经过的路由器。所以 Traceroute 正好就填补了这个缺憾。

Traceroute 的原理是非常非常的有意思,它受到目的主机的 IP 后,首先给目的主机发送一个 TTL=1(还记得 TTL 是什么吗?)的 UDP(后面就 知道 UDP 是什么了)数据包,而经过的第一个路由器收到这个数据包以后,就自动把 TTL 减1,而 TTL 变为0以后,路由 器就把这个包给抛弃了,并同时产生 一个主机不可达的 ICMP 数据报给主机。主机收到这个数据报以后再发一个 TTL=2的 UDP 数据报给目的主机,然后刺激第二个路由器给主机发 ICMP 数据 报。如此往复直到到达目的主机。这样,traceroute 就拿到了所有的路由器 ip。从而避开了 ip 头只能记录有限路由 IP 的问题。

有人要问,我怎么知道 UDP 到没到达目的主机呢?这就涉及一个技巧的问题,TCP 和 UDP 协议有一个端口号定义,而普通的网 络程序只监控少数的几个号码较 小的端口,比如说80,比如说23,等等。而 traceroute 发送的是端口号>30000(真变态)的 UDP 报,所以到 达目的主机的时候,目的 主机只能发送一个端口不可达的 ICMP 数据报给主机。主机接到这个报告以后就知道,主机到了,所以,说 Traceroute 是一个骗子一点也不为过

Traceroute 程序里面提供了一些很有用的选项,甚至包含了 IP 选路的选项,请察看 man 文档来了解这些,这里就不赘述了。

静态 IP 选路

一个简单的路由表

选路是 IP 层最重要的一个功能之一。前面的部分已经简单的讲过路由器是通过何种规则来根据 IP 数据包的 IP 地址来选择路由。 这里就不重复了。

首先来看看一个简单的系统路由表:

对于一个给定的路由器,可以打印出五种不同的 flag:

  •  U 表明该路由可用。
  •  G 表明该路由是到一个网关。如果没有这个标志,说明和 Destination 是直连的,而相应的 Gateway 应该直接给出 Destination
  • 的地址。
  •  H 表明该路由是到一个主机,如果没有该标志,说明 Destination 是一个网络,换句话说 Destination 就应该写成一个网络号和
  • 子网号的组合,而不包括主机号(主机号码处为0),例如 192.168.11.0
  •  D 表明该路由是为重定向报文创建的
  •  M 该路由已经被重定向报文修改

U 没啥可说的,G 说明这是一个网关,如果你要发数据给 Destination,IP 头应该写 Destination 的 IP 地址,而数据链路层的 MAC地址就应该是 GateWay 的 Mac 地址了;反之,如果没有 G 标志,那么数据链路层和 IP 层的地址应该是对应的。H 说明了 Destination 的 性质,如果是 H 的,则说明该地址是一个完整的地址,既有网络号又有主机号,那么再匹配的时候就既要匹配网络号,又要匹配主 机号;反 之,Destination 就代表一个网络,在匹配的时候只要匹配一下网络号就可以了。

这样,IP 选路的方式就可以更加具体化了。如下:

  •  首先用IP地址来匹配那些带H标志的DestinationIP地址。
  •  如果1失败就匹配那些网络地址。
  •  如果2失败就发送到Default网关

顺便提一下那个 GenMask(还记得子网掩码么),它指定了目的地址的子网号,例如第一条的子网就是11。

其他有关路由表的知识

一般,我们在配置好一个网络接口的时候,一个路由就被直接创建好了。当然我们也可以手动添加路由。用 route add 命令就可以了。而当一个 IP 包在某一个路由器的时候发现没有路由可走,那么该路由器就会给源主机发送“主机不可达”或者“网络不可达”的 ICMP包来报错。

注意,一般的操作系统默认是没有路由功能的,这需要自己配置。这些历史原因就不细说了。

ICMP 的 IP 重定向报文和路由发现报文

当 IP 包在某一个地方转向的时候,都回给发送 IP 报的源主机一个 ICMP 重定向报文,而源主机就可以利用这个信息来更新自己的路由表,这样,随着网络通信的逐渐增多,路由表也就越来越完备,数据转发的速度也会越来越快。我们需要注意的是:

  •  重定向报文只能由路由器发出。
  •  重定向报文为主机所用,而不是为路由器所用。

在主机引导的时候,一般会发送在网内广播一个路由请求的 ICMP 报文,而多个路由器则会回应一个路由通告报文。而且,路由其本身不定期的在网络内发 布路由通告报文,这样,根据这些报文,每一个主机都会有机会建立自己的路由表而实现网络通信。路由 器在一份通告报文中可以通告多个地址,并且给出每一个地 址的优先等级,这个优先等级是该 IP 作为默认路由的等级,至于怎么算 的就不深究了。

路由器一般会在450-600秒的时间间隔内发布一次通告,而一个给定的通告报文的寿命是30分钟。而主机在引导的时候会每三秒发 送一次请求报文,一旦接受到一个有效的通告报文,就停止发送请求报文。在 TCP/IP 详解编写的时候,只有 Solaris2.x 支持这两种报文,大多数系统还不支持这两种报文。(后面还会讲到一些有用的路由 报文)

动态选路协议

前面的选路方法叫做静态选路,简要地说就是在配置接口的时候,以默认的方式生成路由表项。并通过 route 来增加表项,或者 通过 ICMP 报文来更新表项(通常在默认方式出错的情况下)。 而如果上诉三种方法都不能满足,那么我们就使用动态选路。

动态选路协议是用于动态选路的重要组成部分,但是他们只是使用在路由器之间,相邻路由器之间互相通信。系统(路有选择程 序)选择比较合适的路有放到 核心路由表中,然后系统就可以根据这个核心路有表找到最合适的网路。也就是说,动态选路是在系统 核心网络外部进行的,它只是用一些选路的策略影响路由表, 而不会影响到最后通过路由表选择路由的那一部分。选路协议有一大类 常用的叫做内部网关协议(IGP),而在 IGP 中,RIP 就是其中最重要的协议。一种新 的 IGP 协议叫做开放最短路经优先(OSPF)协议,其意在取代 RIP。另一种最早用在网路骨干网上的 IGP 协议--HELLO,现在已经不用了。如今,任何支持动态选路的路由器都必须同时支持 OSPF 和 RIP,还可以选择性的支持其他的 IGP 协议。

Unix 选路程序

Unix 系统上面通常都有路由守护程序--routed。还有一个叫做 gate。gate 所支持的协议要比 routed 多,routed 只是支持 RIPv1

版本。而 gate 则支持 RIPv1、v2,BGPv1 等等。

RIP:选路信息协议

它的定义可以在 RFC1058内找到,这种协议使用 UDP 作为载体(也就是 UDP 的上层协议)。我们最关心的就是 RIP 其中的一个段,叫做度量的 段,这是一个以 hop 作为计数器(就是以走过多少路由为计数器)的段(IP 协议里面也有一个 TTL 不是么)。这个度 量段将最终影响到路由表的建立。

参考图:

一般说来 routed 要承担如下的工作:

  •  给每一个已知的路由器发送 rip 请求报文,要求其他路由器给出完整的路由表。这种报文的命令字段为1,地址字段为0,度量 地段为16(相当于无穷大)。
  •  接受请求,如果接收到刚才的那个请求,就把自己的完整的路由表交给请求者。如果没有,就处理 IP 请求表项,把表项中自 己有的部分添上跳数,没有的部分添上16。然后发给请求者。
  •  接受回应。更新自己的路由表。使用 hop 数小的规则。
  •  定期更新路由表,一般是30s(真频繁)给相邻的路有启发一次自己的路由表。这种形式可以使广播形式的。

这个协议看起来会工作的很好,但是,这里面其实有很多隐藏的忧患,比如说 RIP 没有子网的概念,比如说环路的危险。而且 hop数的上限也限制了网络的大小。因此,出现了很多 RIPv1的替代品,比如说 RIPv2,比如说 OSPF。

另外还有一些关于c++ Linux后台服务器开发的一些知识点分享:Linux,Nginx,MySQL,Redis,P2P,K8S,Docker,TCP/IP,协程,DPDK,webrtc,音视频等等视频。

喜欢的朋友可以后台私信【1】获取学习视频

cdt规约报文用程序解析_程序员必备的学习笔记《TCP/IP详解(二)》相关推荐

  1. SPI 读取不同长度 寄存器_敏矽微电子Cortex-M0学习笔记10-SPI通信详解

    1.SPI简介 ME32F030支持扩展的 SPI (Serial Peripheral interface)接口,它可以支持标准的 SPI 操作,兼容 4 线的 SSI (SynchronousSe ...

  2. 《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  3. 【TCP/IP详解】UDP报文格式

    我将工作中用到的报文格式进行了汇总,方便查阅: [TCP/IP协议]各层报文首部数据格式汇总 解析: 16位源端口号:这个字段通常包含发送数据报的应用程序所使用的 UDP 端口.接收端的应用程序利用这 ...

  4. 【TCP/IP详解】ARP报文格式 | RARP报文格式

    我将工作中用到的报文格式进行了汇总,方便查阅: [TCP/IP协议]各层报文首部数据格式汇总 ARP报文格式: RARP报文格式: RARP分组的格式与ARP分组基本一致.它们之间主要的差别是RARP ...

  5. 程序员必备的基本算法:递归详解

    什么是递归? 递归,在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法.简单来说,递归表现为函数调用函数本身.在知乎看到一个比喻递归的例子,个人觉得非常形象,大家看一下: ❝ 递归 ...

  6. java 准备 解析_深入理解JAVA虚拟机学习笔记24——类加载的准备和解析

    每天进步一点点! 今天我们一起看一下类加载的准备阶段和解析阶段. 先看一下准备阶段:主要任务是在方法区中为类变量(仅static修饰变量,不包含实例变量)分配内存并设置类变量初始化的阶段. 这里面的区 ...

  7. 《TCP/IP详解》_卷一_ARP和RARP协议

    首先,我们要弄明白一个概念:网络实现当中的地址. 在网络中,只要提到地址,我们会马上想到IP地址.实际上,数据在以太网上传输的时候,并不是直接根据IP地址确定目的接口的,而是根据一个叫做以太网地址的东 ...

  8. 韩顺平 javascript教学视频_学习笔记34_js正则表达式详解

    内容介绍----正则表达式的详解 正则表达式对象: RegExp对象方法 我们来看一下RegExp对象都有哪些方法 例子不举了,很简单 String 对象与正则表达式有关的方法 这四个方法是属于Str ...

  9. cdt规约报文用程序解析_DNS协议(报文解析)

    一.概述 DNS通常由其他应用层协议使用(如HTTP.SMTP.FTP),将主机名解析为IP地址,其运行在UDP(非连接)之上,使用53号端口.DNS除了提供主机名到IP地址转换外,还提供如下服务:主 ...

最新文章

  1. vim 设置编码方式
  2. INFO:InstallShield InstallScript工程中自定义界面文本输入控件的两个注意事项
  3. C# Socket的粘包处理(转)
  4. 信息学奥赛一本通 2057:【例3.9 】星期几
  5. 小白入门使用Nginx基础的常用操作
  6. MATLAB 生成exe 的几种方法
  7. Ruby Tip:定义索引操作符
  8. VC6.0中使用Activex控件小结
  9. 商务英语计算机,怎样练习商务英语口语
  10. ios13 微信提示音插件_iOS13免越狱修改微信提示音方法!亲测有用!
  11. 智慧书-永恒的处世经典格言:201-240
  12. JIRA 6.3.6 详细安装图解
  13. 软件测试中系统的功能测试,软件测试中的43个功能测试点(下)
  14. Cloudera Manager环境搭建【二】
  15. 《MySQL DBA:SSL连接》
  16. (数字图像处理MATLAB+Python)第四章图像正交变换-第一节:离散傅里叶变换
  17. python打开chrome浏览器自动登录网站并发表说说批量
  18. PySide2 connect 时指定槽函数的参数
  19. linux 文件唯一标识符,详解Linux中获取全球唯一标示符UUID的方法
  20. 基于微信小程序的校园跑腿系统-计算机毕业设计

热门文章

  1. iis ftp 隔离账户
  2. MS SQL 语句中的字符串连接
  3. Java内部类相关问题的总结与体会
  4. 机器学习笔记(五)回归模型
  5. Flutter - 底部导航详解与案例示范
  6. 洛谷 P2181 对角线
  7. linux+vi+注掉代码,VI编辑器之删除操作(示例代码)
  8. oracle 转成sql server,怎样把Oracle查询转换为SQL Server
  9. c++优先队列小节(常常弄混)
  10. 小米扫地机器人原地不动_小米扫地机器人的4个不可思议