第3章 网络安全协议基础
内容提要 本章介绍OSI七层网络模型 TCP/IP协议簇。 重点介绍IP协议、TCP协议、UDP协议和ICMP协议。
OSI参考模型 OSI参考模型是国际标准化组织ISO(International Standards Organization )制定的模型,把计算机与计算机之间的通信分成七个互相连接的协议层,结构如图3-1所示。
OSI参考模型 很少有产品是完全的OSI模式,然而OSI参考模型为网络的结构提供了可行的机制。
1、物理层(Physical Layer) 最底层是物理层,这一层负责传送比特流,它从第二层数据链路层接收数据帧,并将帧的结构和内容串行发送,即每次发送一个比特。 物理层只能看见0和1,只与电信号技术和光信号技术的物理特征相关。这些特征包括用于传输信号电流的电压、介质类型以及阻抗特征。该层的传输介质是同轴电缆、光纤、双绞线等,有时该层被称为OSI参考模型的第0层。 物理层可能受到的安全威胁是搭线窃听和监听,可以利用数据加密、数据标签加密,数据标签,流量填充等方法保护物理层的安全。
2、数据链路层(Data Link Layer) OSI参考模型的第二层称为数据链路层。与其他层一样,它肩负两个责任:发送和接收数据。 还要提供数据有效传输的端到端连接。在发送方,数据链路层负责将指令、数据等包装到帧中,帧是该层的基本结构。 帧中包含足够的信息,确保数据可以安全地通过本地局域网到达目的地。
3、网络层(Network Layer) 网络层(Network Layer)的主要功能是完成网络中主机间的报文传输。在广域网中,这包括产生从源端到目的端的路由。 当报文不得不跨越两个或多个网络时,又会产生很多新问题。例如第二个网络的寻址方法可能不同于第一个网络;第二个网络也可能因为第一个网络的报文太长而无法接收;两个网络使用的协议也可能不同等。网络层必须解决这些问题,使异构网络能够互连。 在单个局域网中,网络层是冗余的,因为报文是直接从一台计算机传送到另一台计算机的。
4、传输层(Transport Layer) 传输层的主要功能是完成网络中不同主机上的用户进程之间可靠的数据通信。 最好的传输连接是一条无差错的、按顺序传送数据的管道,即传输层连接是真正端到端的。 由于绝大多数主机都支持多用户操作,因而机器上有多道程序,这意味着多条连接将进出于这些主机,因此需要以某种方式区别报文属于哪条连接。识别这些连接的信息可以放入传输层的报文头中。
5、会话层(Session Layer) 会话层允许不同机器上的用户之间建立会话关系。会话层提供的服务之一是管理对话控制。 会话层允许信息同时双向传输,或限制只能单向传输。如果属于后者,类似于物理信道上的半双工模式,会话层将记录此时该轮到哪一方。 一种与对话控制有关的服务是令牌管理(Token Management)。有些协议保证双方不能同时进行同样的操作,这一点很重要。为了管理这些活动,会话层提供了令牌,令牌可以在会话双方之间移动,只有持有令牌的一方可以执行某种操作。
6、表示层(Presentation Layer) 表示层完成某些特定的功能,这些功能不必由每个用户自己来实现。 值得一提的是,表示层以下各层只关心从源端机到目标机可靠地传送比特,而表示层关心的是所传送的信息的语法和语义。 表示层服务的一个典型例子是用一种一致选定的标准方法对数据进行编码。 大多数用户程序之间并非交换随机的比特,而是交换诸如人名、日期、货币数量和发票之类的信息。这些对象是用字符串、整型数、浮点数的形式,以及由几种简单类型组成的数据结构来表示。
7、应用层(Application Layer) 应用层包含大量人们普遍需要的协议。虽然,对于需要通信的不同应用来说,应用层的协议都是必须的。 例如,PC(Personal Computer)机用户使用仿真终端软件通过网络仿真某个远程主机的终端并使用该远程主机的资源。 这个仿真终端程序使用虚拟终端协议将键盘输入的数据传送到主机的操作系统,并接收显示于屏幕的数据。
TCP/IP协议簇 TCP/IP协议簇模型 和其他网络协议一样,TCP/IP有自己的参考模型用于描述各层的功能。TCP/IP协议簇参考模型和OSI参考模型的比较如图所示。
TCP/IP协议簇 TCP/IP参考模型实现了OSI模型中的所有功能。 不同之处是TCP/IP协议模型将OSI模型的部分层进行了合并。
解剖TCP/IP模型 TCP/IP协议簇包括四个功能层:应用层、传输层、网络层及网络接口层。 这四层概括了相对于OSI参考模型中的七层。 1、网络接口层 网络接口层包括用于物理连接、传输的所有功能。OSI模型把这一层功能分为两层:物理层和数据链路层,TCP/IP参考模型把两层合在一起。 2、网络层(Internet层) 网络层由在两个主机之间通信所必须的协议和过程组成。这意味着数据报文必须是可路由的。
解剖TCP/IP模型 3、传输层 这一层支持的功能包括:为了在网络中传输对应用数据进行分段,执行数学检查来保证所收数据的完整性,为多个应用同时传输数据多路复用数据流(传输和接收)。这意味着该层能识别特殊应用,对乱序收到的数据进行重新排序。 当前的主机到主机层包括两个协议实体:传输控制协议(TCP)和用户数据报协议(UDP)。 4、应用层 应用层协议提供远程访问和资源共享。应用包括Telnet服务、FTP服务、SMTP服务和HTTP服务等,很多其他应用程序驻留并运行在此层,并且依赖于底层的功能。该层是最难保护的一层。
解剖TCP/IP模型 TCP/IP组的四层、OSI参考模型和常用协议的对应关系如图所示。
网络协议IP IP协议已经成为世界上最重要的网际协议。 IP的功能定义在由IP头结构的数据中。IP是网络层上的主要协议,同时被TCP协议和UDP协议使用。 TCP/IP的整个数据报在数据链路层的结构如表所示。 TCP/IP数据报的结构 以太网数据包头 IP头 TCP/UDP/ICMP/IGMP头 数据
IP头的结构 可以看出一条完整数据报由四部分组成 第三部分是该数据报采用的协议 第四部分是数据报传递的数据内容 其中IP头的结构如表所示。 版本(4位) 头长度(4位) 服务类型(8位) 封包总长度(16位) 封包标识(16位) 标志(3位) 片断偏移地址(13位) 存活时间(8位) 协议(8位) 校验和(16位) 来源IP地址(32位) 目的IP地址(32位) 选项(可选) 填充(可选) 数据
IP头的结构 IP头结构在所有协议中都是固定的,对上表的说明如下: (1)字节和数字的存储顺序是从右到左,依次是从低位到高位,而网络存储顺序是从左到右,依次从低位到高位。 (2)版本:占第一个字节的高四位。头长度:占第一个字节的低四位。 (3)服务类型:前3位为优先字段权,现在已经被忽略。接着4位用来表示最小延迟、最大吞吐量、最高可靠性和最小费用。 (4)封包总长度:整个IP报的长度,单位为字节。 (5)存活时间:就是封包的生存时间。
IP头的结构(续) (6)协议:定义了数据的协议,分别为:TCP、UDP、ICMP和IGMP。定义为: #define PROTOCOL_TCP 0x06 #define PROTOCOL_UDP 0x11 #define PROTOCOL_ICMP 0x06 #define PROTOCOL_IGMP 0x06 (7)检验和:校验的首先将该字段设置为0,然后将IP头的每16位进行二进制取反求和,将结果保存在校验和字段。 (8)来源IP地址:将IP地址看作是32位数值则需要将网络字节顺序转化位主机字节顺序。转化的方法是:将每4个字节首尾互换,将2、3字节互换。 (9)目的IP地址:转换方法和来源IP地址一样。
抓取Ping指令发送的数据包 使用Sniffer的设置抓取Ping指令发送的数据包,命令执行如图
抓取Ping指令发送的数据包
抓取Ping指令发送的数据包 其实IP报头的所有属性都在报头中显示出来,可以看出实际抓取的数据报和理论上的数据报一致,分析如图所示。
分类 IP 地址 每一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号 host-id,它标志该主机(或路由器)。 两级的 IP 地址可以记为: IP 地址 ::= { <网络号>, <主机号>} (4-1) ::= 代表“定义为”
IP 地址中的网络号字段和主机号字段 A 类地址 net-id 8 位 host-id 24 位 B 类地址 1 net-id 16 位 net-id 8 位 host-id 24 位 B 类地址 1 net-id 16 位 host-id 16 位 C 类地址 1 1 net-id 24 位 host-id 8 位 D 类地址 1 1 1 0 多 播 地 址 E 类地址 1 1 1 1 保 留 为 今 后 使 用
IP 地址中的网络号字段和主机号字段 A 类地址的网络号字段 net-id 为 1 字节 A 类地址 net-id 8 位 host-id net-id 8 位 host-id 24 位 B 类地址 1 net-id 16 位 host-id 16 位 C 类地址 1 1 net-id 24 位 host-id 8 位 A 类地址的网络号字段 net-id 为 1 字节 D 类地址 1 1 1 0 多 播 地 址 E 类地址 1 1 1 1 保 留 为 今 后 使 用
IP 地址中的网络号字段和主机号字段 B 类地址的网络号字段 net-id 为 2 字节 A 类地址 net-id 8 位 host-id net-id 8 位 host-id 24 位 B 类地址 1 net-id 16 位 host-id 16 位 C 类地址 1 1 net-id 24 位 host-id 8 位 B 类地址的网络号字段 net-id 为 2 字节 D 类地址 1 1 1 0 多 播 地 址 E 类地址 1 1 1 1 保 留 为 今 后 使 用
IP 地址中的网络号字段和主机号字段 C 类地址的网络号字段 net-id 为 3 字节 A 类地址 net-id 8 位 host-id net-id 8 位 host-id 24 位 B 类地址 1 net-id 16 位 host-id 16 位 C 类地址 1 1 net-id 24 位 host-id 8 位 C 类地址的网络号字段 net-id 为 3 字节 D 类地址 1 1 1 0 多 播 地 址 E 类地址 1 1 1 1 保 留 为 今 后 使 用
IP 地址中的网络号字段和主机号字段 A 类地址的主机号字段 host-id 为 3 字节 A 类地址 net-id 8 位 host-id net-id 8 位 host-id 24 位 B 类地址 1 net-id 16 位 host-id 16 位 C 类地址 1 1 net-id 24 bit host-id 8 位 A 类地址的主机号字段 host-id 为 3 字节 D 类地址 1 1 1 0 多 播 地 址 E 类地址 1 1 1 1 保 留 为 今 后 使 用
IP 地址中的网络号字段和主机号字段 B 类地址的主机号字段 host-id 为 2 字节 A 类地址 net-id 8 位 host-id net-id 8 位 host-id 24 位 B 类地址 1 net-id 16 位 host-id 16 位 C 类地址 1 1 net-id 24 位 host-id 8 位 B 类地址的主机号字段 host-id 为 2 字节 D 类地址 1 1 1 0 多 播 地 址 E 类地址 1 1 1 1 保 留 为 今 后 使 用
IP 地址中的网络号字段和主机号字段 C 类地址的主机号字段 host-id 为 1 字节 A 类地址 net-id 8 位 host-id net-id 8 位 host-id 24 位 B 类地址 1 net-id 16 位 host-id 16 位 C 类地址 1 1 net-id 24 位 host-id 8 位 C 类地址的主机号字段 host-id 为 1 字节 D 类地址 1 1 1 0 多 播 地 址 E 类地址 1 1 1 1 保 留 为 今 后 使 用
IP 地址中的网络号字段和主机号字段 D 类地址是多播地址 A 类地址 net-id 8 位 host-id 24 位 B 类地址 1 net-id 8 位 host-id 24 位 B 类地址 1 net-id 16 bit D 类地址是多播地址 host-id 16 位 C 类地址 1 1 net-id 24 位 host-id 8 位 D 类地址 1 1 1 0 多 播 地 址 E 类地址 1 1 1 1 保 留 为 今 后 使 用
IP 地址中的网络号字段和主机号字段 E 类地址保留为今后使用 A 类地址 net-id 8 位 host-id 24 位 B 类地址 1 net-id 8 位 host-id 24 位 B 类地址 1 net-id 16 bit E 类地址保留为今后使用 host-id 16 位 C 类地址 1 1 net-id 24 位 host-id 8 位 D 类地址 1 1 1 0 多 播 地 址 E 类地址 1 1 1 1 保 留 为 今 后 使 用
点分十进制记法 10000000000010110000001100011111 机器中存放的 IP 地址 是 32 位 二进制代码 10000000 00001011 00000011 00011111 每隔 8 位插入一个空格 能够提高可读性 将每 8 位的二进制数 转换为十进制数 128 11 3 31 采用点分十进制记法 则进一步提高可读性 128.11.3.31
常用的三种类别的 IP 地址 IP 地址的使用范围 网络 最大 第一个 最后一个 每个网络 类别 网络数 可用的 可用的 中最大的 网络 最大 第一个 最后一个 每个网络 类别 网络数 可用的 可用的 中最大的 网络号 网络号 主机数 A 126 (27 – 2) 1 126 16,777,214 B 16,383(214 1) 128.1 191.255 65,534 C 2,097,151 (221 1) 192.0.1 223.255.255 254
子网掩码 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。 最为简单的理解就是两台计算机各自的IP地址与子网掩码进行二进制“与”(AND)运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。 计算机A的IP地址为192.168.0.1,子网掩码为255.255.255.0,将转化为二进制进行“与”运算,运算过程如表所示。
子网掩码 计算机A的IP地址为192.168.0.1,子网掩码为255.255.255.0,将转化为二进制进行“与”运算,运算过程如表所示。 11010000.10101000.00000000.00000001 子网掩码 11111111.11111111.11111111.00000000 IP地址与子网掩码按位“与”运算 11000000.10101000.00000000.00000000 运算的结果转化为十进制 192.168.0.0
子网掩码 计算机B的IP地址为192.168.0.254,子网掩码为255.255.255.0,将转化为二进制进行“与”运算。运算过程如表所示。 IP地址 11010000.10101000.00000000.11111110 子网掩码 11111111.11111111.11111111.00000000 IP地址与子网掩码按位“与”运算 11000000.10101000.00000000.00000000 运算的结果转化为十进制 192.168.0.0
传输层为相互通信的应用进程提供了逻辑通信 AP1 AP4 5 4 3 2 1 AP2 AP3 5 4 3 2 1 端口 端口 运输层提供应用进程间的逻辑通信 IP 层 主机 A 主机 B 路由器 1 路由器 2 AP1 AP3 LAN1 WAN LAN2 AP2 AP4 IP 协议的作用范围 运输层协议 TCP 和 UDP 的作用范围
传输控制协议协议TCP TCP是传输层协议,提供可靠的应用数据传输。 TCP在两个或多个主机之间建立面向连接的通信。
TCP 报文段的首部格式 32 位 TCP 报文段 发送在前 IP 首部 IP 数据部分 位 0 8 16 24 31 源 端 口 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节的 固定首部 TCP 首部 确 认 号 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 TCP 报文段 TCP 首部 TCP 数据部分 发送在前 IP 首部 IP 数据部分
源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 数据偏移(即首部长度)——占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)。
保留字段——占 6 位,保留为今后使用,但目前应置为 0。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 保留字段——占 6 位,保留为今后使用,但目前应置为 0。
紧急 URG —— 当 URG 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 紧急 URG —— 当 URG 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
确认 ACK —— 只有当 ACK 1 时确认号字段才有效。当 ACK 0 时,确认号无效。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 确认 ACK —— 只有当 ACK 1 时确认号字段才有效。当 ACK 0 时,确认号无效。
位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 复位 RST (ReSeT) —— 当 RST 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
同步 SYN —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 同步 SYN —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文。
终止 FIN (FINis) —— 用来释放一个连接。FIN 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 终止 FIN (FINis) —— 用来释放一个连接。FIN 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。
检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
MSS (Maximum Segment Size) 比特 0 8 16 24 31 源 端 口 目 的 端 口 MSS (Maximum Segment Size) 是 TCP 报文段中的数据字段的最大长度。 数据字段加上 TCP 首部 才等于整个的 TCP 报文段。 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 选项字段 —— 长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”
其他选项 窗口扩大选项 ——占 3 字节,其中有一个字节表示移位值 S。新的窗口值等于TCP 首部中的窗口位数增大到(16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小。 时间戳选项——占10 字节,其中最主要的字段时间戳值字段(4 字节)和时间戳回送回答字段(4 字节)。 选择确认选项——在后面的 5.6.3 节介绍。
填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。 位 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 保 留 窗 口 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。
一次完整的FTP会话 首先开启目标主机的FTP服务,如图所示。
一次完整的FTP会话 启动Sniffer,然后在主机的DOS命令行下利用FTP指令连接目标主机上的FTP服务器,连接过程如图所示。
一次完整的FTP会话
一次完整的FTP会话 登录FTP的过程是一次典型的TCP连接,因为FTP服务使用的是TCP协议。分析TCP报头的结构如图所示。
TCP协议的工作原理 TCP提供两个网络主机之间的点对点通讯。TCP从程序中接收数据并将数据处理成字节流。
用三次握手建立 TCP 连接 TCP 的连接建立 A 的 TCP 向 B 发出连接请求报文段,其首部中的 客户 服务器 A B 主动打开 被动打开 CLOSED CLOSED SYN = 1, seq = x A 的 TCP 向 B 发出连接请求报文段,其首部中的 同步位 SYN = 1,并选择序号 seq = x,表明传送 数据时的第一个数据字节的序号是 x。
用三次握手建立 TCP 连接 TCP 的连接建立 B 的 TCP 收到连接请求报文段后,如同意,则 发回确认。 客户 服务器 A B 主动打开 被动打开 CLOSED CLOSED SYN = 1, seq = x SYN = 1, ACK = 1, seq = y, ack= x 1 B 的 TCP 收到连接请求报文段后,如同意,则 发回确认。 B 在确认报文段中应使 SYN = 1,使 ACK = 1, 其确认号ack = x 1,自己选择的序号 seq = y。
A 收到此报文段后向 B 给出确认,其 ACK = 1, 确认号 ack = y 1。 A 的 TCP 通知上层应用进程,连接已经建立。 客户 服务器 A B 主动打开 被动打开 CLOSED CLOSED SYN = 1, seq = x SYN = 1, ACK = 1, seq = y, ack= x 1 ACK = 1, seq = x + 1, ack = y 1
B 的 TCP 收到主机 A 的确认后,也通知其上层 应用进程:TCP 连接已经建立。 客户 服务器 A B 主动打开 被动打开 CLOSED CLOSED SYN = 1, seq = x SYN = 1, ACK = 1, seq = y, ack= x 1 ACK = 1, seq = x + 1, ack = y 1 数据传送
用三次握手建立 TCP 连接的各状态 TCP 的连接建立 SYN = 1, seq = x 客户 服务器 A B 主动打开 被动打开 CLOSED CLOSED SYN- SENT ESTAB- LISHED RCVD LISTEN SYN = 1, seq = x SYN = 1, ACK = 1, seq = y, ack= x 1 ACK = 1, seq = x + 1, ack = y 1 数据传送
TCP 的连接释放 数据传输结束后,通信的双方都可释放连接。 现在 A 的应用进程先向其 TCP 发出连接释放 客户 服务器 A B 主动关闭 ESTAB- LISHED 数据传送 ESTAB- LISHED FIN = 1, seq = u 数据传输结束后,通信的双方都可释放连接。 现在 A 的应用进程先向其 TCP 发出连接释放 报文段,并停止再发送数据,主动关闭 TCP 连接。 A 把连接释放报文段首部的 FIN = 1,其序号 seq = u,等待 B 的确认。 CLOSED CLOSED
从 A 到 B 这个方向的连接就释放了,TCP 连接 处于半关闭状态。B 若发送数据,A 仍要接收。 客户 服务器 A B 主动关闭 ESTAB- LISHED 数据传送 通知 应用 进程 ESTAB- LISHED FIN = 1, seq = u ACK = 1, seq = v, ack= u 1 B 发出确认,确认号 ack = u 1, 而这个报文段自己的序号 seq = v。 TCP 服务器进程通知高层应用进程。 从 A 到 B 这个方向的连接就释放了,TCP 连接 处于半关闭状态。B 若发送数据,A 仍要接收。
TCP 的连接释放 若 B 已经没有要向 A 发送的数据, 其应用进程就通知 TCP 释放连接。 FIN = 1, seq = u 客户 服务器 A B 被动关闭 主动关闭 通知 应用 进程 ESTAB- LISHED 数据传送 ESTAB- LISHED FIN = 1, seq = u ACK = 1, seq = v, ack= u 1 数据传送 FIN = 1, ACK = 1, seq = w, ack= u 1 若 B 已经没有要向 A 发送的数据, 其应用进程就通知 TCP 释放连接。
TCP 的连接释放 A 收到连接释放报文段后,必须发出确认。 FIN = 1, seq = u 客户 服务器 A B 被动关闭 主动关闭 通知 应用 进程 ESTAB- LISHED 数据传送 ESTAB- LISHED FIN = 1, seq = u ACK = 1, seq = v, ack= u 1 数据传送 FIN = 1, ACK = 1, seq = w, ack= u 1 ACK = 1, seq = u + 1, ack = w 1 A 收到连接释放报文段后,必须发出确认。
在确认报文段中 ACK = 1,确认号 ack w 1, 自己的序号 seq = u + 1。 TCP 的连接释放 客户 服务器 A B 被动关闭 主动关闭 通知 应用 进程 ESTAB- LISHED 数据传送 ESTAB- LISHED FIN = 1, seq = u ACK = 1, seq = v, ack= u 1 数据传送 FIN = 1, ACK = 1, seq = w, ack= u 1 ACK = 1, seq = u + 1, ack = w 1 在确认报文段中 ACK = 1,确认号 ack w 1, 自己的序号 seq = u + 1。
TCP 连接必须经过时间 2MSL 后才真正释放掉。 5.9.2 TCP 的连接释放 FIN = 1, seq = u 客户 服务器 A B 主动关闭 通知 应用 进程 ESTAB- LISHED 数据传送 ESTAB- LISHED FIN = 1, seq = u FIN- WAIT-1 ACK = 1, seq = v, ack= u 1 CLOSE- WAIT 数据传送 被动关闭 FIN- WAIT-2 FIN = 1, ACK = 1, seq = w, ack= u 1 LAST- ACK 等待 2MSL TIME- WAIT ACK = 1, seq = u + 1, ack = w 1 CLOSED CLOSED
TCP协议的三次“握手” 这个过程在FTP的会话过程中也明显的显示出来,如图所示。
第一次“握手” 首先分析建立“握手”第一个过程包的结构,如图所示。
第二次“握手” SYN为1,开始建立请求连接,需要对方计算机确认,对方计算机确认返回的数据包如图所示。
第三次“握手” 对方计算机返回的数据包中ACK为1并且SYN为1,说明同意连接。 这个时候需要源计算机的确认就可以建立连接了。确认数据包的结构如图所示。
TCP协议的四次“挥手” 需要断开连接的时候,TCP也需要互相确认才可以断开连接,四次交互过程如图所示。
第一次“挥手” 第一次交互过程的数据报结构如图所示。
第二次“挥手” 第一次交互中,首先发送一个FIN=1的请求,要求断开,目标主机在得到请求后发送ACK=1进行确认,如图所示。
第三次“挥手” 在确认信息发出后,就发送了一个FIN=1的包,与源主机断开,如图所示。
第四次“挥手” 随后源主机返回一条ACK=1的信息,这样一次完整的TCP会话就结束了。如图所示。
用户数据报协议UDP UDP为应用程序提供发送和接收数据报的功能。 某些程序(比如腾讯的OICQ)使用的是UDP协议,UDP协议在TCP/IP主机之间建立快速、轻便、不可靠的数据传输通道。
UDP和TCP的区别 UDP提供的是非连接的数据报服务,意味着UDP无法保证任何数据报的传递和验证。 UDP的结构如图所示。
UDP数据报分析 常用的网络服务中,DNS使用UDP协议。DNS是域名系统 (Domain Name System)的缩写 当用户在应用程序中输入DNS名称时,DNS服务可以将此名称解析为与此名称相关的IP地址。
设置DNS解析 需要在主机上设置DNS解析的主机,将主机的DNS的解析指向虚拟机,如图所示。
设置DNS解析 虽然虚拟机并没有设置DNS解析,但是只要访问DNS都可以抓到UDP数据报。设置完毕后,在主机的DOS界面中输入命令nslookup,如图所示。
UDP报头 查看Sniffer抓取的数据报,可以看到UDP报头,如图所示。
UDP报头的分析 对UDP报头的分析如图所示。
互联网控制消息协议ICMP 通过ICMP协议,主机和路由器可以报告错误并交换相关的状态信息。在下列情况中,通常自动发送ICMP消息: IP数据报无法访问目标。 IP路由器(网关)无法按当前的传输速率转发数据报。 IP路由器将发送主机重定向为使用更好的到达目标的路。 ICMP协议的结构如图所示。
ICMP协议的结构
ICMP数据报分析 使用Ping命令发送ICMP回应请求消息,使用Ping命令,可以检测网络或主机通讯故障并解决常见的TCP/IP连接问题。分析Ping指令的数据报,如图所示。
本章总结 本章需要重点理解OSI参考模型和TCP/IP协议簇的联系和区别 理解IP/TCP/UDP/ICMP协议头的结构并且学会使用Sniffer进行分析