TCP/IP 背景和介绍

上世纪 70 年代,随着计算机技术的发展,计算机使用者意识到:要想发挥计算机更大的作用,就要将世界各地的计算机连接起来。但是简单的连接是远远不够的,因为计算机之间无法沟通。因此设计一种通用的“语言”来交流是必不可少的,这时 TCP/IP 协议就应运而生了。

TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。

TCP/IP 不是一个协议,而是一个协议族的统称,里面包括了 IP 协议、ICMP 协议、TCP 协议、以及 httpftppop3 协议等。网络中的计算机都采用这套协议族进行互联。

网络协议栈架构

提到网络协议栈结构,最著名的当属 OSI 七层模型,但是 TCP/IP 协议族的结构则稍有不同,它们之间的层次结构有如图对应关系:

此处输入图片的描述

可见 TCP/IP 被分为 4 层,每层承担的任务不一样,各层的协议的工作方式也不一样,每层封装上层数据的方式也不一样:

  • (1)应用层:应用程序通过这一层访问网络,常见 FTP、HTTP、DNS 和 TELNET 协议;

  • (2)传输层:TCP 协议和 UDP 协议;

  • (3)网络层:IP 协议,ARP、RARP 协议,ICMP 协议等;

  • (4)网络接口层:是 TCP/IP 协议的基层,负责数据帧的发送和接收。

此处输入图片的描述

本门课程,就是从底向上分层次对 TCP/IP 的各协议做介绍。

预备知识

IP 地址

  网络上每一个节点都必须有一个独立的 IP 地址,通常使用的 IP 地址是一个 32bit 的数字,被 . 分成 4 组,例如,255.255.255.255 就是一个 IP 地址。有了 IP 地址,用户的计算机就可以发现并连接互联网中的另外一台计算机。

在 Linux 系统中,可以用 ifconfig -a 命令查看自己的 IP 地址:

ifconfig -a

在Windows 系统中,可以在命令行下用 ipconfig  命令查看自己的 IP 地址:

          

域名

用 12 位数字组成的 IP 地址很难记忆,在实际应用时,用户一般不需要记住 IP 地址,互联网给每个 IP 地址起了一个别名,习惯上称作域名。

域名与计算机的 IP 地址相对应,并把这种对应关系存储在域名服务系统 DNS(Domain Name System) 中,这样用户只需记住域名就可以与指定的计算机进行通信了。

常见的域名包括 com、net 和 org 三种顶级域名后缀,除此之外每个国家还有自己国家专属的域名后缀(比如我国的域名后缀为 cn)。目前经常使用的域名诸如百度(www.baidu.com)、Linux 组织(www.lwn.net)等等。

可以使用命令 nslookup 或者 ping 来查看与域名相对应的 IP 地址

例如:

MAC 地址

MAC(Media Access Control)地址,或称为物理地址、硬件地址,用来定义互联网中设备的位置。

在 TCP/IP 层次模型中,网络层管理 IP 地址,链路层则负责 MAC 地址。因此每个网络位置会有一个专属于它的 IP 地址,而每个主机会有一个专属于它 MAC 地址。

端口号

IP 地址是用来发现和查找网络中的地址的,但是不同程序如何互相通信呢,这就需要端口号来识别了。如果把 IP 地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是端口采用 16 比特的端口号标识,一个 IP 地址的端口可以有 65536(即:2^16)个之多!

服务器的默认程序一般都是通过人们所熟知的端口号来识别的。例如,对于每个 TCP/IP 实现来说,SMTP(简单邮件传输协议)服务器的 TCP 端口号都是 25,FTP(文件传输协议)服务器的 TCP 端口号都是 21,TFTP(简单文件传输协议)服务器的 UDP 端口号都是 69。任何 TCP/IP 实现所提供的服务都用众所周知的 1-1023 之间的端口号。这些人们所熟知的端口号由 Internet 端口号分配机构(Internet Assigned Numbers Authority, IANA)来管理。

常用协议对应端口号:

  • SSH 22
  • FTP 20 和 21
  • Telnet 23
  • SMTP 25
  • TFTP 69
  • HTTP 80
  • SNMP 161
  • Ping 使用ICMP,无具体端口号

封装和分用

封装:当应用程序发送数据的时候,数据在协议层次当中从顶向下通过每一层,每一层都会对数据增加一些首部或尾部 信息,这样的信息称之为协议数据单元(Protocol Data Unit,缩写为PDU),在分层协议系统里,在指定的协议层上传送的数据单元,包含了该层的协议控制信息和用户信息。如下图所示:

  • 物理层(一层)PDU指数据位(Bit)
  • 数据链路层(二层)PDU指数据帧(Frame)
  • 网络层(三层)PDU指数据包(Packet)
  • 传输层(四层)PDU指数据段(Segment)
  • 第五层以上为数据(data)

05

分用:当主机收到一个数据帧时,数据就从协议层底向上升,通过每一层时,检查并去掉对应层次的报文首部或尾部,与封装过程正好相反。

RFC

RFC(Request for Comment)文档是所有以太网协议的正式标准,并在其官网上面公布,由 IETF 标准协会制定。大量的 RFC 并不是正式的标准,出版的目的只是为了提供信息。RFC 的篇幅不一,从几页到几百页不等。每一种协议都用一个数字来标识,如 RFC 3720 是 iSCSI 协议的标准,数字越大说是 RFC 的内容越新或者是对应的协议(标准)出现的比较晚。

所有的 RFC 文档都可以从网络上找到,其官网为IETF。在网站上面可以通过分类以及搜索快速找到目标协议的 RFC 文档。目前在 IETF 网站上面的 RFC 文档有数千个,但是不需要全部掌握,在工作或学习中如果遇到可以找到对应的解释,理论与实际结合会有更好地效果,单纯阅读 RFC 的效果一般。

链路层介绍

简介

网络层协议的数据单元是 IP 数据报 ,而数据链路层的工作就是把网络层交下来的 IP 数据报 封装为 (frame)发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。

为达到这一目的,数据链路必须具备一系列相应的功能,主要有:

  • 将数据封装为帧(frame),帧是数据链路层的传送单位;

  • 控制帧的传输,包括处理传输差错,调节发送速率与接收方相匹配;

  • 在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。

数据帧的结构是这样的:

01

控制帧的传输

差错控制

通信系统必须具备发现差错的能力,并采取措施纠正之,使差错控制在所能允许的尽可能小的范围内,这就是差错控制过程,也是数据链路层的主要功能之一。

反馈重发

接收方通过对差错编码(奇偶校验码或 CRC 码)的检查,可以判定一帧在传输过程中是否发生了差错。一旦发现差错,一般可以采用反馈重发的方法来纠正。这就要求接受方收完一帧后,向发送方反馈一个接收是否正确的信息,使发送方据此做出是否需要重新发送的决定。发送方仅当收到接收方已正确接收的反馈信号后才能认为该帧已经正确发送完毕,否则需要重发直至正确为止。

计时器

如果某一帧发送出现问题,一直不能发送成功,为了避免传输过程停滞不前,通常引入 计时器 (Timer) 来限定接收方发回反馈消息的时间间隔。当发送方发送一帧的同时也启动计时器,若在限定时间间隔内未能收到接收方的反馈信息,即计时器超时(Timeout),则可认为传出的帧以出错或丢失,就要重新发送。

序号

由于同一帧数据可能被重复发送多次,就可能引起接收方多次收到同一帧并将其递交给网络层的情况。为了防止这种情况,可以采用对发送的帧编号的方法,即赋予每帧一个序号,从而使接收方能从该序号来区分是新发送来的帧还是重发的帧,以此来确定要不要将接收到的帧递交给网络层。

 流量控制

由于收发双方各自使用的设备工作速率和缓冲存储空间的差异,可能出现发送方的发送能力大于接收方接收能力的现象,此时若不对发送方的发送速率做适当的限制,前面来不及接收的帧将被后面不断发送来的帧“淹没”,从而造成帧的丢失而出错。

由此可见,流量控制实际上是对发送方数据流量的控制,使其发送速率不超过接收方的速率。所以需要一些规则使得发送方知道在什么情况下可以接着发送下一帧,而在什么情况下必须暂停发送,以等待收到某种反馈信息后再继续发送。这就是流量控制。

以太网

以太网(Ether-net)是指 DEC 公司、Intel 公司和 Xerox 公司在 1982 年联合公布的一个标准,这个标准里面使用了一种称作 CSMA/CD 的接入方法。而 IEEE802 提供的标准集 802.3(还有一部分定义到了 802.2 中)也提供了一个 CSMA/CD 的标准。

这两个标准稍有不同,因此链路层数据帧的的封装格式也有所不同(数据帧中的地址为 MAC 地址):

02

PPP(点对点协议)

PPP(点到点协议)是为在同等单元之间传输数据设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据。设计目的主要是用来通过 拨号或专线 方式建立 点对点 连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。

点对点协议(PPP)为在点对点连接上传输多协议数据包提供了一个标准方法。PPP 最初设计是为两个对等节点之间的 IP 流量传输提供一种封装协议。在 TCP/IP 协议集中它是一种用来同步调制连接的数据链路层协议。

SLIP 与 PPP

SLIP 协议

SLIP 的全称为 Serial Line IP(串行线路 IP)。它是一种对 IP 数据报进行封装的简单形式。

SLIP 协议规定的帧格式规则:

  • IP 数据报以一个称作 END(0xc0)的特殊字符结束。同时为了防止数据报传输之前的线路噪音被误认为是数据报内容,在数据报开始处添加一个 END 字符;

  • 如果 IP 数据报中含有 END 字符,就连续传输 0xdb 和 0xdc 来取代它。0xdb 是 SLIP 的 ESC 字符,但它的值与 ASCⅡ码中的 ESC(0x1b)不同;

  • 如果 IP 数据报中含有 ESC 字符,就连续传输 0xdb 和 0xdd 来取代它。

此处输入图片的描述

SLIP 的缺陷:

  • 每一端必须知道对端的 IP 地址,没有办法把本端 IP 地址传递给对端;

  • 数据帧中无类型字段,当一条串行线路使用 SLIP 时则不能使用其他协议;

  • SLIP 数据帧中无 checksum,只能依靠上层协议来发现和纠正错误。

PPP 协议

PPP 协议修改了 SLIP 协议中的缺陷,包括以下三个部分:

  • PPP 封装 IP 数据报既支持数据为 8 位和无奇偶校验的异步模式,又支持面向比特的同步链接;

  • 通过 LCP(链路控制协议)允许双方进行协商;

  • 通过 NCP(网络控制协议)允许双方在网络层上进行协商。

PPP 协议的字符规则与 SLIP 有所不同:

  • PPP 帧以标志字符 0x7e 开始和结束,紧接着是一个值为 0xff 的地址字节,然后是一个值为 0x03 的控制字节;

  • 由于标志字符是 0x7e,当它出现在信息字段中时,需要连续传送 0x7d 和 0x5e 来替代它;

  • 当在信息字段中遇到 0x7d 时,需要连续传送 0x7d 和 0x5d 来替代它。

  • 默认情况下,如果字符的值小于 0x20,需要连续传送 0x7d 和 0x21 来替代它。

PPP 与 SLIP 相比具有下列优点:

  • PPP 支持在单根串行线路上运行多种网络层协议;

  • 每一帧都有 CRC 校验;

  • 通信双方可以用 NCP 进行 IP 地址的动态协商;

  • 可以类似于 CSLIP 对 TCP 和 IP 首部进行压缩;

  • LCP 可以对多个数据链路选项进行设置。

MTU

为了提供足够快的响应时间,以太网和 IEEE802.3 对数据帧长度都有限制,其最大值分别为 1500 字节和 1492 字节,链路层的这个特性称作 MTU ,即 最大传输单元

当网络层传下来一个 IP 数据报,并且其长度比链路层的 MTU 大,那么网络层就需要对数据报进行分片,使每一片都小于 MTU。

MTU 分为接口 MTU 和路径 MTU:接口 MTU 是所指定的接口所允许发送的最大数据长度;路径 MTU 指两台通信主机路径中最小的 MTU 值。路径 MTU 是不对称的,它在两个方向上不一定一致。

用命令 netstat -in 可以查看网络接口的 MTU:

IP 网际协议

IP 协议位于网络层,它是 TCP/IP 协议族中最为核心的协议,所有的 TCP、UDP、ICMP 及 IGMP 数据都以 IP 数据报格式传输。IP 协议提供的是 不可靠无连接 的数据报传送服务。

  • 不可靠(unreliable):IP 协议不能保证数据报能成功地到达目的地,它仅提供传输服务。当发生某种错误时,IP 协议会丢弃该数据报。传输的可靠性全由上层协议来提供。

  • 无连接(connectionless):IP 协议对每个数据报的处理是相互独立的。这也说明, IP 数据报可以不按发送顺序接收。如果发送方向接收方发送了两个连续的数据报(先是 A,然后是 B),每个数据报可以选择不同的路线,因此 B 可能在 A 到达之前先到达。

IP 数据报

首先看一下 IP 数据报的格式,其中没有一个字段是多余的,学习 IP 协议就应从学习它的报文字段意义和作用开始。

01

如上图所示,普通的 IP 数据报的报头长度 20 字节(除非有选项字段),各个部分的作用:

  • 版本号 :4 位,用于标明 IP 版本号,0100 表示 IPv4,0110 表示 IPv6。目前常见的是 IPv4。

  • 首部长度 :4 位,表示 IP 报头长度,包括选项字段。

  • 服务类型(TOS) :分别有:最小时延、最大吞吐量、最高可靠性、最小花费 4 种服务,如下图所示。4 个标识位只能有一个被置为 1 :

02

  • 总长度 :16 位,报头长度加上数据部分长度,便是数据报的总长度。IP 数据报最长可达 65535 字节。

  • 标识 :16 位,接收方根据分片中的标识字段相不相同来判断这些分片是不是同一个数据报的分片,从而进行分片的重组。通常每发送一份报文它的值就会加 1。

  • 标志 :3 位,用于标识数据报是否分片。其中的第 2 位是不分段(DF)位。当 DF 位被设置为 1 时,则不对数据包进行分段处理;第 3 位是分段(MF)位,除了最后一个分段的 MF 位被设置为 0 外,其他的分段的 MF 位均设置为 1。

  • 偏移 :13 位,在接收方进行数据报重组时用来标识分片的顺序。

  • 生存时间(TTL) :8 位,用于设置数据报可以经过的最多的路由器个数。TTL 的初始值由源主机设置(通常为 32 或 64),每经过一个处理它的路由器,TTL 值减 1。如果一个数据报的 TTL 值被减至 0,它将被丢弃。

  • 协议 :8 位,用来标识是哪个协议向 IP 传送数据。ICMP 为 1,IGMP 为 2,TCP 为 6,UDP 为 17,GRE 为 47,ESP 为 50。

  • 首部校验和 :根据 IP 首部计算的校验和码。

  • 源 IP 和目的 IP :数据报头还会包含该数据报的发送方 IP 和接收方 IP。

  • 选项 :是数据报中的一个可变长、可选的信息,不常用,多用于安全、军事等领域。

IP 地址分类

为了便于寻址以及层次化构造网络,每个 IP 地址可被看作是分为两部分,即 网络号主机号 。同一个区域的所有主机有相同的网络号(即 IP 地址的前半部分相同),区域内的每个主机(包括路由器)都有一个主机号与其对应。

IP 地址被分为 A,B,C,D,E 五类,其中 A 类给大型网络或政府机构等,B 类分配给中型网络、跨国企业等,C 类分配给小型网络,D 类用于多播,E 类用于实验,各类可容纳的地址数目不同。其中我们最常见的为 A,B,C 这三类。

IP 地址用 32 位二进制数字表示的时候,A,B,C 类 IP 的网络号长度分别为 8 位、16 位、24 位:

03

A 类地址

  • A 类地址网络号范围:1.0.0.0---127.0.0.0

  • A 类 IP 地址范围:1.0.0.0---127.255.255.255

  • A 类 IP 的私有地址范围:10.0.0.0---10.255.255.255 (所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)

  • 127.X.X.X 是保留地址,用做循环测试用的

  • 因为主机号有 24 位,所以一个 A 类网络号可以容纳 2^24-2=16777214 个主机号

B 类地址

  • B 类地址网络号范围:128.0.0.0---191.255.0.0

  • B 类 IP 地址范围:128.0.0.0---191.255.255.255

  • B 类 IP 的私有地址范围:172.16.0.0---172.31.255.255

  • 169.254.X.X 是保留地址;191.255.255.255 是广播地址

  • 因为主机号有 16 位,所以一个 B 类网络号可以容纳 2^16-2=65534 个主机号

C 类地址

  • C 类地址网络号范围:192.0.0.0---223.255.255.0

  • C 类 IP 地址范围:192.0.0.0---223.255.255.255

  • C 类 IP 的私有地址范围:192.168.0.0---192.168.255.255

  • 因为主机号有 8 位,所以一个 C 类网络号可以容纳 2^8-2=254 个主机号

子网划分

IP 地址如果只使用 ABCDE 类来划分,会造成大量的浪费:一个有 500 台主机的网络,无法使用 C 类地址。但如果使用一个 B 类地址,6 万多个主机地址只有 500 个被使用,造成 IP 地址的大量浪费。

因此,可以在 ABC 类网络的基础上,进一步划分子网:占用主机号的前几个位,用于表示子网号

这样 IP 地址就可看作 IP = 网络号 + 子网号 + 主机号

子网号的位数没有硬性规定,于是我们用 子网掩码 来确定一个 IP 地址中哪几位是主机号,具体使用方法如图:

04

子网掩码中的 1 标识了 IP 地址中相应的网络号,0 标识了主机号。将 IP 地址和子网掩码进行 逻辑与运算 ,结果就能区分网络号和子网号。

IP 路由选择

如果发送方与接收方直接相连(点对点)或都在一个共享网络上(以太网),那么 IP 数据报就能直接送达。

而大多数情况则是发送方与接收方通过若干个路由器(router)连接,那么数据报就需要经过若干个路由器的转发才能送达,它是怎么选择一个合适的路径来"送货"的呢?

IP 层在内存中有一个路由表(输入命令 route -n 可以查看路由表),当收到一份数据报并进行发送时,都要对该表进行搜索:

  • 1、搜索路由表,如果能找到和目的 IP 地址完全一致的主机,则将 IP 数据报发向该主机;

  • 2、搜索路由表,如果匹配主机失败,则匹配同子网的路由器(这需要子网掩码的协助)。如果找到路由器,则将 IP 该数据报发向该路由器;

  • 3、搜索路由表,如果匹配同子网路由器失败,则匹配同网络号路由器,如果找到路由器,则将该 IP 数据报发向该路由器;

  • 4、如果以上都失败了,就搜索默认路由,如果默认路由存在,则发报;

  • 6、如果都失败了,就丢掉这个包;

  • 7、接收到数据报的路由器再按照它自己的路由表继续转发,直到数据报被转发到目的主机;

  • 8、如果在转发过程中,IP 数据报的 TTL(生命周期)已经被减为 0,则该 IP 数据报就被抛弃。

NAT 技术

当你用 ifconfig 查看 IP 地址时,有时你会发现自己的 IP 地址是这样的———192.168.X.X 或 172.16.X.X
这是 C 类网和 B 类网的私有地址,这就是俗称的内网 IP。这是因为你的路由器采用了 NAT 技术。

NAT(Network Address Translation,网络地址转换)是 1994 年提出的。当在专用网内部的一些主机本来已经分配到了内网 IP 地址,但现在又想和因特网上的主机通信时,NAT 技术将其内网 IP 地址转换成全球 IP 地址,然后与因特网连接,也就是说,内网的数台主机使用了同一个全球 IP 地址在上网。

NAT 技术实现了宽带共享,而且有助于缓解 IP 地址空间枯竭的问题。

IP 的未来

现在使用的 IPv4 协议版本从理论上讲,可以编址 1600 万个网络、40 亿台主机。但采用 A、B、C 三类编址方式后,可用的网络地址和主机地址的数目大打折扣,以至 IP 地址 已于 2011 年 2 月 3 日分配完毕

其中北美占有 3/4,约 30 亿个,而人口最多的亚洲只有不到 4 亿个,中国截止 2010 年 6 月 IPv4 地址数量达到 2.5 亿,落后于 4.2 亿网民的需求。地址不足,严重地制约了中国及其他国家互联网的应用和发展。

随着网络技术的发展,计算机网络将进入人们的日常生活,可能身边的每一样东西都需要连入全球因特网,在这样的环境下,IPv6 应运而生。

IPv6 的地址长度是 128 位,通常将这 128 位的地址按每 16 位划分为一个段,将每个段转换成十六进制数字,并用冒号隔开,比如:2000:0000:0000:0000:0001:2345:6789:abcd 就是一个 IPv6 地址。

单从数量级上来说,IPv6 所拥有的地址容量是 IPv4 的约 8×10^28 倍,达到 2^128(算上全零的)个。这不但解决了网络地址资源数量的问题,同时也为除电脑外的设备连入互联网在数量限制上扫清了障碍。

随着 IPv4 不足,支持 IPv6 的网络迅速增长,现在全球已经有 5%的网络使用 IPv6

网络层其它协议

网络层不仅有 IP 协议,还有其它如 ARP、ICMP、IGMP、RARP 等其它协议

01

ARP(Address Resolution Protocol)地址解析协议

功能

当主机通过数据链路发送数据的时候, IP 数据报 会先被封装为一个 数据帧 ,而 MAC 地址 会被添加到数据帧的 报头 (链路层介绍时已讲过)。

ARP 便是在这个过程中通过目标主机的 IP 地址,查询目标主机的 MAC 地址。

原理

在你的电脑和路由器中都有一个 ARP 缓存表 ,其中保存的是近期(20 分钟)与自己有过通信的主机的 IP 地址与 MAC 地址的对应关系。

ARP 缓存表使用过程:

  • 当主机要发送一个 IP 数据报的时候,会首先查询一下自己的 ARP 缓存表;

  • 如果在 ARP 缓存表中找到对应的 MAC 地址,则将 IP 数据报封装为数据帧,把 MAC 地址放在帧首部,发送数据帧;

  • 如果查询的 IP-MAC 值对不存在,那么主机就向网络中广播发送一个 ARP 请求数据帧,ARP 请求中包含待查询 IP 地址;

  • 网络内所有收到 ARP 请求的主机查询自己的 IP 地址,如果发现自己符合条件,就回复一个 ARP 应答数据帧,其中包含自己的 MAC 地址;

  • 收到 ARP 应答后,主机将其 IP - MAC 对应信息存入自己的 ARP 缓存,然后再据此封装 IP 数据报,再发送数据帧。

你可以通过命令 arp -a 查看 ARP 缓存表(表项记录 20 分钟超时),这里还有其它 ARP 命令可以对缓存表做查看、修改:

02

ARP 代理

如果 ARP 请求是从一个网络上的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该 ARP 请求,这个过程称作 代理 ARP(Proxy ARP)。

当连接这两个网络的路由器收到该 ARP 请求时,它会发现自己有通向目的主机的路径,随后它会将自己(路由器)的 MAC 地址回复给源主机。源主机会认为路由器的 MAC 地址就是目的主机的 MAC 地址,而对于随后发来的数据帧,路由器会转发到它后面真实 MAC 地址的目的主机。

两个物理网络之间的路由器可以使这两个网络彼此透明化,在这种情况下,只要路由器设置成一个 ARP 代理,以响应一个网络到另一个网络主机的 ARP 请求,两个物理网络就可以使用相同的网络号。

ARP 欺骗

从 ARP 代理的原理可以看出来:IP - MAC 的对应信息很容易被伪造!黑客可以伪造 ARP 应答数据帧而欺骗 ARP 请求者,从而达到截获数据的目的。

RARP(Reverse Address Resolution Protocol)逆向地址解析协议

听名字就知道,RARP 与 ARP 是相反的关系,用于将 MAC 地址转换为 IP 地址。对应于 ARP,RARP 请求以广播方式传送,而 RARP 应答一般是单播传送的。

某些设备,比如无盘机在启动时可能不知道自己的 IP 地址,它们可以将自己的 MAC 地址使用 RARP 请求广播出去,RARP 服务器就会响应并回复无盘机的 IP 地址。

RARP 在目前的应用中已极少被使用,不再赘述了。

ICMP(Internet Control Message Protocol)控制报文协议

通信过程中的发生各种问题时,ICMP 将问题反馈,通过这些信息,管理者可以对所发生的问题作出诊断,然后采取适当的措施去解决它。

ICMP 报文由 8 位错误类型、8 位条件代码和 16 位校验和组成,被封装在一个 IP 数据报中:

03

报文的类型字段可以有 15 个不同的值,以便描述特定类型的 ICMP 报文,代码字段的值进一步描述不同的条件,各类型的报文及其处理方法如图所示:

04

也有一些出现差错而不产生 ICMP 报文的情况:

  • 1.ICMP 差错报文

  • 2 . 目的地址是广播或多播地址

  • 3.作为链路层广播的数据报

  • 4.不是 IP 分片的第一片

  • 5.源地址不是单个主机的数据报(源不能为零地址、环回地址、广播多播地址)

ping 程序

ping 程序和 traceroute 程序是两个常见的 基于 ICMP 协议 的工具。

 ping 简介

ping 程序是对两台主机之间连通性进行测试的基本工具,它只是利用 ICMP 回显请求和回显应答报文,而不用经过传输层(TCP/UDP)。

ping 程序通过在 ICMP 报文数据中存放发送请求的时间值来计算往返时间,当应答返回时,用当前时间减去存放在 ICMP 报文中的时间值,即是往返时间。

ping 程序使用方法为 ping IP 地址 ,ping 命令还可以加上参数,实现更多的功能:

  • -n 只输出数值。
  • -q 不显示任何传送封包的信息,只显示最后的结果。
  • -r 忽略普通的 Routing Table,直接将数据包送到远端主机上。通常是查看本机的网络接口是否有问题。
  • -R 记录路由过程。
  • -v 详细显示指令的执行过程。
  • -c 数目:在发送指定数目的包后停止。
  • -i 秒数:设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次。
  • -t 存活数值:设置存活数值 TTL 的大小。

TTL值

TTL 是 Time To Live的缩写,该字段指定 IP 包被路由器丢弃之前允许通过的最大网段数量。

此处输入图片的描述

TTL 是 IPv4 包头的一个8 bit 字段,它的作用是限制IP数据包在计算机网络中的存在的时间,即IP数据包在计算机网络中可以转发的最大跳数。

假如没有TTL字段,网络中的 IP 包将越来越多造成网络阻塞,TTL 避免 IP 包在网络中的无限循环和收发,节省了网络资源,并能使IP包的发送者能收到告警消息。

Ping 命令判断操作系统

ping 命令会返回一个 TTL 值,我们可以使用它来判断目标的操作系统类型。

常见操作系统缺省 TTL 值如下:

  • UNIX TTL: 255
  • Linux TTL: 64
  • WINDOWS 95/98 TTL: 32
  • Windows NT 4.0/2000/XP/2003/7/8/10 TTL:128

在shiyanlou环境里面 ping 127.0.0.1 查看自己的TTL值

此处输入图片的描述

TTL 为 64 ,实验楼环境为 linux,结果相符。

此方法主要用于粗略的判断,想更加准确的获取服务器操作系统信息请学习实验楼的 NMAP 相关课程。

traceroute 程序

traceroute

traceroute 程序是用来侦测主机到目的主机之间所经路由情况的重要工具。刚才 ping 程序中讲过,带 -R 参数的 ping 命令也可以记录路由过程,但是,因为 IP 数据报头的长度限制(最多能保存 9 个 IP 地址),ping 不能完全的记录下所经过的路由器,traceroute 正好就填补了这个缺憾。

实验楼环境没有 traceroute 程序,需要使用以下命令安装:

sudo apt-get install traceroute

traceroute 工作原理:

  • 它发送一份 TTL 为 1 的 IP 数据报给目的主机,经过第一个路由器时,TTL 值被减为 0,则第一个路由器丢弃该数据报,并返回一份超时 ICMP 报文,于此得到了路径中第一个路由器的地址;

  • 然后再发送一份 TTL 值为 2 的数据报,便可得到第二个路由器的地址;

-以此类推,一直到到达目的主机为止,这样便记录下了路径上所有的路由 IP。

由于实验楼网络限制,下述示例可能无法执行,建议使用traceroute github.com进行测试。

例子:我们尝试记录到 42.120.246.177 的路由过程,可见经过 5 步最终可以到达:

05

IGMP(Internet Group Management Protocol)组管理协议

IGMP 是用于管理多播组成员的一种协议,它的作用在于,让其他所有需要知道自己处于哪个多播组的主机和路由器知道自己的状态。只要某一个多播组还有一台主机,多播路由器就会把数据传输出去,这样,接受方就会通过网卡过滤功能来得到自己想要的数据。

为了知道多播组的信息,多播路由器需要定时的发送 IGMP 查询,各个多播组里面的主机要根据查询来回复自己的状态。路由器来决定有几个多播组,自己要对某一个多播组发送什么样的数据。