计算机网络笔记

1. 计算机网络概述

1.1 基本概念

  • 计算机网络是一种通信网络。

  • 关于因特网Internet。

  • 显然只靠硬件(主机、路由器、通信链路)不能保证应用数据的有序交付,还需要协议的支持。

  • 任何通信或信息交换过程都需要规则,也就是协议。

  • 协议规范了网络中所有信息的发送和接受过程,学习计算机网络,就是学习通信协议。

1.2 计算机网络结构

  • (1) 网络边缘

  • (2) 接入网络

  • 作用:将网络边缘接入核心网络(即边缘路由器等)

  • 接入网络示例1:数字用户线路DSL。

  • 一种典型的频分多路复用技术,不是时分多路复用。

  • 通过调制不同频率载波,实现不同信号的传输。更常见的是非对称数字用户线路(ADSL,Asymmetric Digital Subscriber Line),一种非对称的DSL技术,所谓非对称是指用户线的上行速率与下行速率不同,上行速率低,下行速率高。

  • 接入网络示例2:电缆网络(即有线电视网络)

  • cable modem 线缆调制器。

  • 网络是共享的,而DSL是独占的。

  • (3) 网络核心

  • 关键就是 路由+转发。

  • 互联的路由器网络。

1.3 Internet 结构

1.4 数据交换

  • 为什么需要数据交换
  • 数据交换可以分为三种类型
    • 电路交换
    • 报文交换
    • 分组交换

(1)电路交换

  • 最典型的电路交换网络:电话网络
  • 多路复用技术,是通信技术的基本概念。
  • 时分、频分、波分、码分多路复用。

(2)报文交换

(3)分组交换

(4)分组交换 vs 报文交换

  • 报文交换是一个串行的过程,必须等整个报文到达一个目的地,才能往下一个目的地转发。

  • 分组交换是一个并行的过程。

  • 以上面为例子,对于报文交换,所需的时间为15s

  • 对于分组交换,因为路由器无需缓存,达到即可往下一跳发送,故花费时间只有5.002s

  • 关于分组交换的交付时间,有以下的一般性计算公式。

  • 可以看到,分组交换对比报文交换,不仅花费是时间更小,对路由器的缓存大小需求也更小。

(5)分组交换 vs 电路交换

  • 但也不能说分组交换绝对优于电路交换。否则现在电话就不会有存在的意义了。

1.5 计算机网络性能

  • (1)速率
  • (2)带宽
  • (3)时延
  • 一共有4种时延
    • 结点处理延迟
    • 排队延迟
    • 传输延迟:假定分组以先到先服务的方式传输——这在分组交换网络中是常见的方式,仅当所有已经到达的分组被传输后,才能传输我们的分组。用L比特表示分组的长度,用R bps表示从路由器A到路由器B的链路传输速率。传输时延是L/R。这是将该分组的所有比特推向链路所需要的时间。实际的传输时延通常在毫秒到微秒级。
    • 传播延迟:一旦一个比特被推向链路,该比特需要向路由器B传播,从该链路的起点到路由器B的传播所需要的时间是传播时延。该比特以该链路的传播速率传播,该传播速率取决于该链路的物理媒介,其速率范围是 m/s,这等于或略小于光速。传播时延等于两台路由器之间的距离除以传播速率,即传播时延是d/s,期中d是两台路由器之间的距离,s是该链路的传播速率。传播时延在毫秒级。
  • 需要注意的是,传输时延是路由器将分组推出所需要的时间,它是分组长度和链路传输速率的函数,而与两台路由器之间的距离无关。传播时延是一个比特从一台路由器向另一台路由器传播所需要的时间,它是两台路由器之间距离的函数,但与分组的长度或链路的传输速率无关。
  • (4)时延带宽积
  • 通俗理解,这段链路的比特容量。
  • (5)丢包率
  • (6)吞吐量

1.5 计算机网络体系结构

1.5.1 分层结构

  • 使用分层结构

1.5.2 OSI参考模型

  • 理论成功,市场失败,学习的好模型。
  • 中间系统(路由器等)只需要实现物理层、数据链路层和网络层。
  • 每一层的加头或加尾的数据封装的作用是什么呢?
  • (1) 物理层:解决单个bit传输的问题
  • (2) 数据链路层:以作为单位,加头加尾
  • (3) 网络层:目的主机,路由+分组转发
  • (4) 传输层:进程间的端到端通信
  • (5) 会话层
  • (6) 表示层
  • (7) 应用层

1.5.3 TCP/IP 参考模型

  • TCP/IP只有四层,是从实际得到的模型,而不像OSI模型先理论。
  • TCP/IP说明只要封装了ip,即可作为互联网一部分。

1.5.4 5层参考模型

  • 现代网络的一个非常好的参考。
  • 应用层:报文 message
  • 传输层:**报文段 segment **
  • 网络层:数据报 datagram
  • 数据链路层:帧 frame
  • 物理层:比特 bit

1.6 计算机网络发展历史

2. 应用层

2.1 网络应用的体系结构

  • 不同于单机系统。

2.2 网络应用进程通信

  • 核心:本地网络应用进程与服务器的进程需要通信。
  • P2P架构的应用也存在客户机/ 服务器之分。
  • 如何寻址:IP地址+端口号
  • 关于应用层协议及其内容

2.3 网络应用的需求与传输层服务

  • 数据丢失
  • 时延
  • 带宽

2.4 Web应用

2.4.1 概述

  • World Wide Web 万维网

  • 对象寻址URL:协议://主机号:端口号/路径

  • Scheme://host:port/path

  • web应用层使用的是http超文本传输协议。

  • web传输层使用的是TCP传输协议。

2.4.2 http 连接

  • http连接分为持久性连接和非持久性连接两种。

  • (1) 非持久性连接

  • http1.0,每个对象都需要2个RTT(对象本身1个+请求断开连接的1个)

  • (2) 持久性连接

  • http1.1

    • 无流水:连接保持,每个对象均要1个RTT,最后加上建立断开连接的1个RTT。
    • 有流水:连接保持,对于引用对象接连短时间发送(即约只花费1个RTT)。

2.4.3 http 消息格式

  • 分为请求消息 request 和响应消息 response
  • (1) 请求消息
  • 有人会问,都建立tcp连接了,还需要Host吗。对于缓存和代理服务器的时候,Host就是有用的;不需要缓存和代理服务器,Host就没有作用。
  • (2) 响应消息
  • http 协议是无状态的。
  • 但有时候我们需要记录用户的会话状态。
  • Cookie 是架设在http上的组件。
  • Cookie 存在隐私问题。

2.4.5 Web 缓存 / 代理服务器技术

  • 不访问服务器前提下满足客户端的http请求。

  • Cookie 解决的是功能问题;缓存/代理服务器是解决性能问题。

  • 能够改善哪些性能呢?

  • 以下是没使用代理服务器的时延例子。很显然,利用率过高,会导致时延过高。

  • 解决办法(1):升级带宽,升级为10Mb。存在成本高的新问题。

  • 解决办法(2):添加Web缓存。

  • 但是如何保证缓存和服务器的内容更新一致呢。

  • 通过该条件下GET方法。

2.5 Email 应用

2.5.1 Email 应用的构成

  • 使用邮件服务器,允许邮件的收发双方可以同时不在线。

  • 端口号25,基于TCP传输协议。

  • SMTP采用命令/响应交互模式。而http采用请求/响应交互模式。两者并不区别。

2.5.2 Email 消息格式

  • SMTP协议是客户端到服务器发送邮件的协议。但是从服务器获取邮件需要采用邮件访问协议 POP3 或 IMAP 协议 或 http协议。
  • POP3是无状态的协议,但是IMAP是有状态的。

2.6 DNS 域名解析系统

2.6.1 DNS 概述

  • Domain Name System。

  • 解决域名和IP地址的映射问题。

  • DNS 协议是一种应用层协议。基于UDP 协议。

  • DNS 是一个分布式层次式的数据库,而不是集中式的数据库。

  • 根域名服务器-> 顶级域名服务器 -> 权威域名服务器

  • 本地域名服务器

2.6.2 DNS 查询

  • 一般的dns查询如下图所示。
  • 根据查询对象不同,DNS解析可分为递归解析和迭代解析两种方式。实践中,查询一般如上图所示,从请求主机到本地DNS服务器采用递归查询,而从本地DNS服务器到其他服务器是迭代查询。
  • (a) 迭代查询:服务器和服务器的查询
  • (b) 递归查询:请求主机到本地DNS服务器。

2.6.3 DNS 记录和消息格式

2.7 P2P 应用

  • Web、Email、DNS都是C/S架构。
  • P2P 架构比较复杂,难以管理。

2.7.1 文件分发

  • 以文件分发为例。
  • (1)客户机-服务器的时间
  • (2)P2P 架构
  • BitTorrent 文件分发协议。
  • BitTorrent协议是架构于TCP/IP协议之上的一个P2P文件传输协议,处于TCP/IP结构的应用层。 BitTorrent协议本身也包含了很多具体的内容协议和扩展协议。

2.7.2 索引技术

  • 索引应该如何设计。
  • (1)集中式索引
  • (2)分布式架构:洪泛式查询 Query Flooding
  • 缺点:查询消息会覆盖网络,给网络带来很大的负担。
  • (3)层次式覆盖网络
  • Skype,用户间直接通信,但是索引采用的是层次式覆盖网络。

2.8 Socket 套接字编程

2.8.1 概述

  • 应用编程接口 API

2.8.2 Socket API

  • 对外:IP+端口号
  • 对内:套接字描述符
  • 地址族设置为 AF_INET

2.8.3 WinSock 网络编程示例

  • (1) 总体流程

  • (2) socket 函数

  • (3) Closesocket 函数

  • 作用:关闭一个套接字。

  • 多进程有引用计数;一个进程的多线程没有引用计数。

  • (4) bind 函数

  • 作用:绑定地址。

  • 服务器端绑定 地址通配符。

  • (5) listen 函数

  • 只用于服务器端,且只用于流套接字。

  • (6) connect 函数

  • 仅用于客户端。

  • TCP会建立连接,但是UDP只是指定了服务器的端点地址,并没有连接。

  • (7) accept 函数

  • 只用于服务器端,只用于TCP套接字。

  • 服务器端一个套接字已经创建成功,绑定本地地址和端口号,并通过listen函数处于监听状态,接下来就需要调用accept函数。

  • 取走一个连接请求,会创建一个新的套接字用于连接,以后都是用这个新的套接字和请求的客户机进行通信,而不是用本身的套接字进行连接,从而可以实现并发的TCP连接。

  • (8) send sendto 函数

  • (9) recv recvfrom 函数

  • (10) setsockopt getsockopt 函数

  • (11) 总结

2.8.4 网络字节序

  • “大端”和”小端”表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序;具体的说:

    ①大端字节序(Big Endian):最高有效位存于最低内存地址处,最低有效位存于最高内存处; ②小端字节序(Little Endian):最高有效位存于最高内存地址,最低有效位存于最低内存处。

  • 如下图:当以不同的存储方式,存储数据为0x12345678时:

  • 网络字节序:大端字节序 网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题。

  • TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节。所以:网络字节序就是大端字节序

  • 有些系统的本机字节序是小端字节序, 有些则是大端字节序, 为了保证传送顺序的一致性, 所以网际协议使用大端字节序来传送数据。现代PC一般都是小端字节序。

2.8.5 客户端软件设计

  • (1) 解析域名或点分十进制IP地址。

  • 得到的网络字节序的IP地址结构体。

  • (2) 解析端口号。

  • 用户可能给出的是服务名如http,这时候我们需要标识对应的端口号。

  • (3) 解析协议号。

  • 把协议名转换为对应的协议号。

  • (4) TCP 客户端软件流程

  • (5) UDP 客户端软件流程

2.8.6 服务器软件设计

  • 一般分为四种服务器。
  • (1) 循环无连接服务器
  • 基于UDP。
  • (2) 循环面向连接服务器
  • (3) 并发无连接服务
  • 子线程处理,主线程反复接受客户请求。
  • (4) 并发面向连接服务

3. 传输层

3.1 概述

  • PC主机具备应用层、传输层、网络层、数据链路层、物理层5层协议栈。

  • 路由器只具备网络层、数据链路层、物理层3层协议栈。

  • 传输层协议为运行在不同主机上的进程提供了一种逻辑通信机制。

  • 传输层:Segment 报文段。

3.2 多路复用和多路分用

  • 传输层对应的是多个进程,所以必须要进行多路复用和多路分用。

  • 接收端进行多路分用。

  • 发送端进行多路复用。

  • Socket是应用层和传输层之间的门。

  • (1) 无连接分用——UDP

  • UDP 的 Socket 使用二元组(目的IP地址,目的端口号)标识。

  • 只要目的IP地址和目的端口号相同,不同主机发出的数据报会导向同一个进程的Socket。

  • 以下A、B主机都发送到进程P3。SP提供返回的端口号。

  • (2) 面向连接的分用——TCP

  • 使用四元组标识

    • 源IP地址
    • 源端口号
    • 目的IP地址
    • 目的端口号
  • TCP连接是一对一的,一个客户机进程对应一个Socket服务器进程/线程。

  • 在于源IP地址、源端口号的不同。

3.3 UDP 协议

  • User Datagram Protocol 用户数据报协议。
  • 尽力而为 Best Effort。
  • DNS 、SNMP 使用的就是UDP。
  • UDP 的头部信息——8个字节
  • 源端口号:发送方将UDP数据包通过源端口发送出去。
  • 目的端口号:接收方从目的端口号接收UDP数据包。
  • UDP长度:UDP头部长度(8字节)加上数据包的长度。
  • UDP校验和:用于UDP差错检测,确认从发送方到接收方传输的过程中,有没有比特位发生变化。
  • UDP校验和:检测UDP段在传输中是否发现位翻转。需要注意的是,如果存在偶数个比特位翻转了,校验和无法检测出来。
  • 接受方把所有字段加起来+校验和,不全为1即存在差错。不需要比对校验和。

3.4 可靠数据传输原理

  • 可靠:不错,不丢,不乱。
  • 实现以下服务抽象是 可靠数据传输协议(reliable data transfer protocol)rdt 协议。
  • 由于rdt协议的下层协议也许是不可靠的,因此这是一项困难的任务。例如 TCP 是在不可靠的(IP)端到端网络层之上实现的可靠数据传输协议。
  • 上层网络应用单向的调用rdt_send()和deliver_data()。但是在可靠信道上,是双向的控制数据流动,可以明显看到,上图的udt_send()和rdt_rcv()是双向箭头。

3.4.1 rdt 1.0

  • 用于完全可靠信道的协议。

3.4.2 rdt 2.0

  • 产生位错误的信道,但没有丢包。
  • ARQ 自动重传请求 协议。
  • 此时的有限状态机,发送端有两个状态,接收端还是一个状态。
  • rdt 2.0 也叫做停等协议

3.4.3 rdt 2.1

  • rdt2.0 没有针对如果ACK/NAK 错误的情况。

  • 可以有以下三种选择:

  • (1)为ACK/NAK 增加校验和,进行检错并纠错。但这种代价很大,因为需要百分百的检错纠错机制。

  • (2)为ACK/NAK 添加额外的控制信息:这个并不能治本,因为额外信息也有可能是错误的。

  • (3)如果ACK/NAK 坏了,重传。但是简单的重传,会产生重复分组,因此需要想其他的方法解决重复分组。

  • 使用序列号解决重传产生重复分组的问题。

    • 发送方给每个分组增加序列号
    • 接受方丢弃重复分组
  • 处理重复:

    • 发送方在每个分组中加入序号;
    • 如果ACK/NAK出错,发送方重传当前分组;
    • 接收方丢弃(不发给上层)重复分组【有可能出现重复的分组,但是接收方是能够检测出重复的分组的,因为增加了序号,重复了就扔了,扔了仍然发一个ACK,从而发送方再发一个新的】【在ACK/NAK本身出错的情况下,把刚刚放送的packet重新放送一遍,有可能出现重复,但是由于在packet当中有序号,是能检查出重复,重复就丢掉,然后仍然发ACK,让发送方发新的packet,然后双方又重新回到一个同步的状态】
  • 发送方的FSM

  • 接收方的FSM

  • 希望收到序号为0的状态+希望收到序号为1的状态

  • 当接收方接收到失序的分组时候,接受方对所接收的分组发送一个肯定确认,从而让发送方发送新的分组。

3.4.4 rdt 2.2

  • 在rdt 2.1 协议的前提下,取消NAK消息。

3.4.5 rdt 3.0

  • 在rdt 2.0 时候,我们假设信道会存在位错误,但是不存在丢包错误。
  • 现在我们假设信道既会存在位错误,也会存在丢包错误,推导rdt3.0。
  • 发送方的FSM
  • 校验和+序列号+ACK+重传+定时器
  • rdt3.0 是一个可靠数据传输协议。
  • 但是rdt3.0的信道利用率很低。
  • 定义发送方(或信道)的利用率为:发送方实际忙于将发送比特送进信道的那部分时间和总的发送时间之比,因为是停等协议,总的发送时间还有等的时间。

3.4.6 流水线机制和滑动窗口协议

  • 可见流水线机制显著提高了带宽利用率。
  • 要实现流水线机制,显然只是0和1的序号是不够的,需要更大的序列号范围,同时需要中间的路由设备有更大的缓存空间。
  • 在计算机网络中,要想实现流水线机制,我们需要滑动窗口协议 Sliding-window protocol。
  • 包括GBN协议和SR协议。

3.4.7 GBN 协议

  • GBN 的发送方需对以下三种情况作出应对:

    • ①上层调用发送数据;
    • ②超时事件;
    • ③收到一个ACK事件;
  • GBN 的接受方的操作比较简单。乱序到达的分组直接丢弃不缓存即可。

  • GBN 发送方收到的都是最大已经确认接收的,剩下都是没确认的。

  • GBN的窗口大小和序号大小也是有要求的。

  • 无论是GBN设置为 $2^n - 1$,还是SR设置为 $2^{n - 1}$ 均是为了超时重传接受方能够区分到底是新数据还是老数据。

  • 关于GBN的窗口大小的解释。

  • (1)假设我们的数据编号为00,01,10,11,一共四个编号(0,1,2,3),如果我们我们设置发送窗口的值为 即4,那么当我们设置发送方的发送序号为0~3的四个数据包的时候,此时会发生两种情况:

    **第一种情况:**接收方正确接收了所有数据,然后返回接收到的最大序号,即3。(GBN返回此时接收到的序号的最大值)然后发送方发送新的4个数据。

    **第二种情况:**接收方发送的确认没有正确回传,所以发送方需要重传原本的4个数据包。

    无论是发生了第一种情况还是第二种情况,我们的接受方再一次收到4个数据的时候,都无法判断这是新的4个数据,还是重发的四个数据,此时就会产生错误。

  • (2)如果我们的窗口大小是3:

    此时我们只会发送0~2的3个数据包,并且等待确认,此时接受方有两种情况:

    第一种情况:接受方正确接收了数据,并且对最大序号2进行返回。

    第二种情况:接受方发送的确认没有正确回传,此时发送方需要重传3个数据包。

    当第一种情况发生的时候,回传的确认正确的被发送方接收,那么下次发送的数据的序号会是3,0,1。如果发生了第二种情况,此时发送方回传的数据会是0,1,2这三个序号,那么此时就不会发生混淆。

3.4.8 SR 协议

  • Selective Repeat 选择重传协议。

  • GBN协议本身存在着性能问题,单个分组的出错会引起GBN重传大量分组,但实际上很多分组没必要重传;如果大量重传重复分组,流水线会被这些不必要的重传分组所充斥。

  • SR协议具有一个更聪明的接受方。

  • 发送方有一个窗口,接受方也有一个窗口。

  • SR协议也有一个缺点。窗口大小和序列号空间大小需要满足具体的要求。

  • 显然,窗口长度必须小于等于序号空间大小的一半(发送窗口和接收窗口的大小默认是相等)。

  • 如果序号尺寸以k位比特空间表示,那么发送方窗口尺寸+接受方窗口尺寸小于等于2的k次方。

3.4.9 总结

  • 这里需要说明,GBN和SR的ACK都是确认收到的ACK(已经收到);
  • 但是TCP的ACK是希望收到的ACK(尚未收到),因为采用累计确认的机制,更合理与高效。

3.5 TCP 协议

3.5.1 概述

  • TCP (Transmission Control Protocol) 是一个面向连接的协议,用于数据可靠传输。

  • 传输控制协议。

  • TCP 既不是百分比的GBN,也不是百分比的SR。

  • TCP的头部结构。

  • 固定长度为20字节。

  • 序列号(Sequence Number):占32位(bit),表示本报文段所发送数据的第一个字节的编号。每发送一次数据,就累加一次该数据字节数的大小。序列号不会从0或1开始,而是在建立连接时由计算机生成的随机数作为其初始值。

  • 确认号(Acknowledgement Number):占32位(bit),表示下一次应该收到的数据的序列号。

  • 标志位字段:

    • URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
    • ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
    • PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
    • RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
    • SYN:在建立连接时使用,用来同步序号。
      • 当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段。
      • 当 SYN=1,ACK=1 时,表示对方同意建立连接。
      • SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
    • FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
  • RST、SYN、FIN 这三个标志位字段用于连接的建立和拆除的标志位。

  • 窗口大小字段(Receive Window Size):

    • 占16位,TCP流量控制,表示目前还有多少空间,能接收多少数据量。
    • 作用:用于流量控制
  • TCP 校验位(TCP Checksum):

    • 占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。
  • 紧急指针(Urgent Pointer):

    • 占 16 位。仅当前面的 URG 控制位为 1 时才有意义,它指出本数据段中为紧急数据的字节数,当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。

3.5.2 TCP 可靠数据传输

  • (1)预估往返时间RTT:

  • RTT(Round-Trip Time):往返时延。是指数据从网络一端传到另一端再收到接收端确认所需的时间。

  • TCP 维持一个EstimatedRTT的更新。一旦获得一个新的SampleRTT,会根据公式进行迭代更新。

  • 除了预估稳定值,还需要预估变化值DevRTT来应付网络波动。

  • 最终的定时器超时时间等于TimeoutInterval = EstimatedRTT + 4*DevRTT。

  • (2)TCP 发送方

  • TCP发送方需要应对三种事件。

  • (3)TCP 接收方

  • 因此,ACK有延迟确认机制,这样做是因为ACK是可以合并的,也就是指如果连续收到两个TCP包,并不一定需要ACK两次,只要回复最终的ACK就可以了,这样可以降低网络流量。

3.5.3 超时间隔加倍

  • 在大多数TCP实现中,每次TCP重传时都会将下一次的超时间隔设为先前值的两倍,而不是用从EstimetedRTT和DevRTT推算出的值。
  • 例如,假设当定时器第一次过期时,与最早的未被确认的报文段相关联的TimeoutInterval是0.75秒。TCP就会重传该报文段,并把新的过期时间设置为1.5秒。如果1.5秒后定时器又过期了,则TCP将再次重传该报文段,并把过期时间设置为3.0秒。因此,超时间隔在每次重传后会呈指数型增长。
  • 然而,每当定时器在另两个事件(即收到上层应用的数据和收到ACK)中的任意一个启动时,TimeoutInterval由最近的EstimatedRTT值与DevRTT值推算得到。

3.5.4 快速重传机制

  • 为什么是3个重复的ACK呢,这个需要看到接收方是如何产生ACK的。
  • 一次两次duplicated ACK时很可能是乱序造成的! 三次duplicated ACK时很可能是丢包造成的! 四次duplicated ACK更更更可能是丢包造成的!但是这样的响应策略太慢。
  • 一次或两次重复ACK在多级多路由的复杂网络中很容易出现,所以协议制定方最终确定将这个系数取为3。
  • 收到三个冗余ACK,即收到了4个,第4个收到即触发快速重传机制。

3.5.5 流量控制

  • 为什么要流量控制,为了避免发送方发送太多数据,接收方正忙于其他任务无法读取数据,进而导致缓存溢出。

  • 流量控制是为了消除发送方使接收方缓存溢出的可能性。

  • 当rwnd等于0的时候,如果发送方还有数据需要发送,发送方可以继续发送只有一个字节数据的报文段,这些报文会被接收方确认,从而返回一个非0位rwnd值,避免发送方被阻塞而不能发送数据。

3.5.6 三次握手

  • 采用3次握手。

  • 客户端SYN报文段->服务器SYNACK报文段->客户端再次回复一个确认报文(ACK),表示已经收到服务器的确认。

  • 第一步:客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报文段中不包含应用层数据。但是在报文段的首部中的SYN标志位被置为1,ACK标志位为0。因此,这个特殊报文段被称为SYN报文段。另外,客户会随机地选择一个初始序号(client_isn),并将此编号放置于该起始的TCP SYN报文段的序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。

  • 第二步:一旦包含TCP SYN报文段的IP数据报到达服务器主机(假定它的确到达了!),服务器会从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向该客户TCP发送允许连接的报文段。这个允许连接的报文段也不包含应用层数据。但是,在报文段的首部却包含3个重要的信息。首先,SYN标志位被置为1,同时ACK标志位也是1。其次,该TCP报文段首部的确认号字段被置为client_isn+1。最后,服务器选择自己的初始序号 server_isn,并将其放置到TCP报文段首部的序号字段中。这个允许连接的报文段实际上表明了:“我收到了你发起建立连接的SYN分组,该分组带有初始序号client_isn。我同意建立该连接。我自己的初始序号是server_isn。”该允许连接的报文段被称为SYNACK报文段(SYNACK segment)。

  • 第三步:在收到SYNACK报文段后,客户机也要给该连接分配缓存和变量。客户主机则向服务器发送另外一个报文段;这最后一个报文段对服务器的允许连接的报文段进行了确认(该客户通过将值server_isn+1放置到TCP报文段首部的确认字段中来完成此项工作)。因为连接已经建立了,所以该SYN位被置为0但是ACK标志位在以后的传输过程都是1。该三次握手的第三个阶段可以在报文段负载中携带客户到服务器的数据

  • seq表示序列号,ack表示应答号,SYN 和 ACK 是标志位。 ①客户端随机生成一个序列号seq = x,向服务端发送该请求(SYN = 1,seq = x, ACK = 0, ack = ?); ②服务端接收到客户端的请求之后,同样生成一个随机序列号seq = y,向客户端发送应答及其序列号(SYN = 1, seq = y, ACK = 1, ack = x+1); ③客户端接收到接收的消息之后,向服务端发送一个应答消息(SYN = 0, seq = x+1,ACK = 1,ack = y+1)。

  • 在第一次,第二次握手中,是不允许携带数据的,而SYN = 1表示默认消耗一个数据,所以第二次握手中消息中的ack = x+1。

  • 而第三次握手一般是不携带数据的,所以三次握手后客户端向服务端发送的第一个消息的seq = x+1。

  • (1)为什么需要三次握手,如果只进行两次握手行不行

    • 1.无法保证连接的可靠性。如果只进行两次握手,那么服务器只能确认客户端的请求,但是客户端无法确认服务器是否已经收到自己的请求,从而无法保证连接的可靠性

    • 2.可能存在旧的重复连接。我们可以设想一个情况来说明这个问题:某个网络有多条路径,客户端请求建立连接的第一个包跑到一条延迟严重的路径上了,所以迟迟没有到达服务器。因此,客户端只能当作这个请求丢失了,不得不再请求一次。由于第二个请求走了正确的路径,所以很快完成工作并关闭了连接。对于客户端来说,事情似乎已经结束了。没想到它的第一个请求经过跋山涉水,还是到达了服务器。服务器并不知道这是一个旧的无效请求,所以按照惯例回复了,但是这个连接打开后就没有关闭的请求了,就相当于在这里空转。假如TCP只要求两次握手,服务器上就这样建立了一个无效的连接。而在三次握手的机制下,客户端收到服务器的回复时,知道这个连接不是它想要的,所以就发一个RST拒绝包。服务器收到这个包后,也放弃这个连接。如果是两次握手,就无法阻止历史连接,因为客户端没有中间状态 RST 给服务端来阻止连接,导致会建立一个历史连接,造成资源浪费。

    • 3.无法同步双方初始序列号。TCP是一种全双工协议,TCP 协议通信的双方,都必须维护一个序列号,序列号是可靠传输的一个关键因素,作用是:

      接收方可以去除重复的数据; 接收方可以根据数据包的序列号按序接收; 发送方可以标识发送出去的数据包中,哪些是已经被对方收到的; 客户端发送携带 [初始序列号] SYN 报文给服务端后,服务端也需要回一个 ACK 应答报文,标识客户端发送的报文已被成功接收;当服务端发送 [初始序列号] 给客户端时,依然也需要客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。

      但如果是两次握手,就不能无法保证同步双方的初始序列号。

  • sequence number:表示的是我方(发送方)这边,这个packet的数据部分的第一位在整个data stream中所在的位置。传输无错误就是接收到的ack。

  • acknowledge number:确认号,表示接受确认已经收到了发送方的哪些字节。比如甲发送了“Seq:x Len:y”的数据段给乙,那乙回复的确认号就是x+y,这意味着它收到了x+y之前的所有字节。

  • 注意,SYN/FIN标志位的传输虽然没有data,但是会让下一次传输的packet的seq增加一;但是,ACK标志位的传输,不会让下一次的传输packet的seq加一,而是保持原样。

  • 利用wireshrak抓包的示例,可见存在SYN标志位,Seq会加1;但是只存在ACK,Seq不会加1:

3.5.7 SYN 洪泛攻击

  • 我们在TCP三次握手的讨论中已经看到,服务器为了响应一个收到的SYN,分配并初始化连接变量和缓存。然后服务器发送一个SYNACK进行响应,并等待来自客户的ACK报文段。如果某客户不发送ACK来完成该三次握手的第三步,最终(通常在一分多钟之后)服务器将终止该半开连接并回收资源。
  • 然而,这样就为Dos攻击即SYN洪泛攻击(SYN flood attack)提供了环境。在这种攻击中,攻击者发送大量的TCP SYN报文段,而不完成第三次握手的步骤。随着这种SYN报文段纷至沓来,服务器不断为这些半开连接分配资源(但从未使用),导致服务器的连接资源被消耗殆尽。这种SYN洪泛攻击是被记载的众多DoS攻击中的第一种。幸运的是,现在有一种有效的防御系统,称为SYN cookie,它们被部署在大多数主流操作系统中以抵御SYN洪泛攻击。

3.5.8 四次挥手

  • 假设客户应用程序决定要关闭该连接。(注意到服务器也能选择关闭该连接。)这引起客户TCP发送一个带有FIN比特被置为1的TCP报文段,并进人FIN_WAIT_1状态。当处在FIN_WAIT_1状态时,客户TCP等待一个来自服务器的带有确认的TCP报文段。当它收到该报文段时,客户TCP进人IN_WAT2状态。当处在FN_WAT2状态时,客户等待来自服务器的IN比特被置为1的另一个报文段;当收到该报文段后,客户TCP对服务器的报文段进行确认,并进人TIME_WAIT状态。假定ACK丢失,TIME_WAT状态使TCP客户重传最后的确认报文。在TIME_WAT状态中所消耗的时间是与具体实现有关的,而典型的值是30秒、1分钟或2分钟。

  • 为什么需要四次挥手

    • 试想一下,假如现在你是客户端你想断开跟Server的所有连接该怎么做?第一步,你自己先停止向Server端发送数据,并等待Server的回复。但事情还没有完,虽然你自身不往Server发送数据了,但是因为你们之前已经建立好平等的连接了,所以此时他也有主动权向你发送数据;故Server端还得终止主动向你发送数据,并等待你的确认。其实,说白了就是保证双方的一个合约的完整执行!
    • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
    • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
  • 客户机建立连接到断开连接的总体流程

  • 服务器从建立连接到断开连接的总体流程。

3.5.9 拥塞控制原理

(一) 拥塞的成因与代价

  • Congestion 拥塞。

  • 可靠数据传输保证的是软件协议,从而实现可靠传输,考虑的是个体,单个发送方和单个接受方。

  • 拥塞控制:更大可能是一种发送数据和设备性能的折中问题,发送方发送太多以致网络堵塞;考虑的是群体,多个发送方和多个接受方和网络带宽的协作。

  • 流量控制:发送方不要发送太快以致接受方处理不了,网络是没有问题的。

  • (1)场景1:两个发送方,两个接受方,路由器无限缓存,在一段容量为R的共享式输出链路上传输。

  • 因此,虽然从吞吐量角度看,运行在总吞吐量接近C的状态也许是一个理想状态,但从时延角度看,却远不是一个理想状态。甚至在这种(极端)理想化的情况中,我们已经发现了拥塞网络的一种代价,即当分组的到达速率接近链路容量C时,分组经历巨大的排队时延

  • (2)场景2:两个发送方,两个接受方,路由器有限缓存,在一段容量为R的共享式输出链路上传输。

  • ①发送方通过某种魔法能够知道路由器的buffer缓存信息,有空闲才发,故不会丢包;

  • ②丢失后重发。发送方仅当在确定一个分组丢失才重传。这种一般为 x+x/2 = R/2,即 x = R/3。拥塞的代价:发送方必须执行重传以补偿因为缓存溢出而丢弃的分组。

  • ③分组丢失和定时器超时都重传。这种一般为 x+x = R/2,即 x = R/4。拥塞的代价:发送方在遇到提前超时所进行的不必要重传。

  • (3)场景3:四个发送方和具有有限缓存的多台路由器及多跳路径。有4台主机发送分组,每台通过交叠的两跳路径传输。所有路由器的链路容量都是C字节/秒。

  • 可以看到,A-C和B-D连接共享路由器R2。即下图的红线和绿线发生竞争。

  • 所以,我们在此又看到了由于拥塞而丢弃分组的另一种代价,即当一个分组沿一条路径被丢弃时,每个上游路由器用于转发该分组到丢弃该分组而使用的传输容量最终被浪费掉了。

(二) 拥塞控制方法

  • 实际中一般采用两种主要的拥塞控制方法。
  • (1)端到端拥塞控制,网络层没有为传输层拥塞控制提供显式支持。TCP采用这种方法。
  • (2)网络辅助的的拥塞控制。在网络辅助的拥塞控制中,路由器向发送方提供关于网络中拥塞状态的显式反馈信息。如ATM网络拥塞控制。
  • 默认因特网版本的IP和TCP采用端到端拥塞控制方法。然而,最近IP和TCP也能够选择性地实现网络辅助拥塞控制。
  • 对于网络辅助的拥塞控制,拥塞信息从网络反馈到发送方通常有两种方式。直接反馈信息可以由网络路由器发给发送方。这种方式的通知通常采用了一种阻塞分组(choke packet)的形式(主要是说:“我拥塞了!”)。更为通用的第二种形式的通知是,路由器标记或更新从发送方流向接收方的分组中的某个字段来指示拥塞的产生。一旦收到一个标记的分组后,接收方就会向发送方通知该网络拥塞指示。注意到后一种形式的通知至少要经过一个完整的往返时间。

(三) ATM ABR 拥塞控制

  • ATM是Asynchronous Transfer Mode(ATM)异步传输模式的缩写,是实现B-ISDN(宽带综合业务数字网)的业务的核心技术之一,为了多种业务设计的通用的面向连接的传输模式。ATM是以信元为基础的一种分组交换和复用技术。

  • ATM 是在 LAN 或 WAN 上传送声音、视频图像和数据的宽带技术。它是一项信元中继技术,数据分组大小固定。你可将信元想象成一种运输设备,能够把数据块从一个设备经过 ATM 交换设备传送到另一个设备。

  • ATM是一个面向虚电路的网络。

  • 在ATM可用比特率(Available Bite Rate,ABR)拥塞控制中,路由器显式地通知发送方它(路由器)能在输出链路上支持的最大主机发送速率。

(四) TCP拥塞控制

  • TCP 传输的两个关键点就是,一个是可靠数据传输,一个就是拥塞控制。从以下三个问题解决。

  • (1)TCP发送方如何限制它向连接发送流量的速率?

  • 在流量控制里面,我们看到TCP连接的每一端都是由一个接收缓存、一个发送缓存和几个变量(LastByteRead、rwnd)等组成。

  • 而在拥塞控制里面,运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,即拥塞窗口(congestion window ,缩写cwnd)。

  • 特别是,在一个发送方中未被确认的数据量不会超过cwnd与rwnd中的最小值,即 LastByteSent-LastByteAcked <= min {cwnd,rwnd}。

  • 忽略rwnd,我么可以粗略的认为,发送方的发送速率大概为 cwnd/RTT(往返时间)。通过调节cwnd的值,发送方可以调整它的发送速率。

  • (2)TCP发送方如何感知拥塞?

  • 要么出现超时,要么收到来自接收方的3个冗余ACK。超时的拥塞情况更严重。

  • (3)采用何种算法改变发送速率?

  • 采用TCP拥塞控制算法(TCP congestion control algorithm)。

  • 分为三个主要部分:①慢启动(slow start,SS);②拥塞避免;③快速恢复。

  • ①慢启动

  • 初始化cwnd为1个MSS(Maximum Segment Size 最大报文段长度),然后指数型增长。

  • ②拥塞避免

  • TCP的拥塞避免控制机制,又称为AIMD,加性增-乘性减。

  • 何时由指数增长转为线性增长,进入拥塞避免状态呢。当cwnd达到Loss事件前值的1/2时,进入拥塞避免。根据阈值Threshold。

  • 一旦进入拥塞避免状态,cwd的值大约是上次遇到拥塞时的值的一半,即距离拥塞可能并不遥远!因此,TCP无法每过一个RTT再将cwd的值翻番,而是采用了一种较为保守的方法,每个RTT只将cwd的值增加一个MSS。

  • 那么何时结束拥塞避免的线性增长状态呢?当发生Loss事件时,Threshold变为当前cwnd的一半。若是超时事件,cwnd重新变为1,重复慢启动;若是收到3个冗余ACK,cwnd变为当前的一半,进入快速恢复状态。

  • ③快速恢复

  • 在拥塞避免状态,收到3个冗余ACK,Threshold变为当前cwnd的一半,cwnd也变为当前的一半,进入快速恢复状态,线性增加cwnd重新进入拥塞避免状态。

  • 总结:

  • (1)慢启动ss,指数增长,CongWin = 1 MSS;

  • (2)拥塞避免,线性增长;

  • (3)3个冗余ACK,Threshold = CongWin/2,CongWin = Threshold ,线性增长。

  • (4)超时事件,Threshold = CongWin/2,CongWin = 1 MSS ,进入慢启动,指数增长。

3.5.10 TCP 的性能

  • (1) 吞吐率

  • (2)如何实现经由高带宽路径的TCP

  • 这时候的丢包率是多少呢(丢包数/发送包的总数)

  • 这是一个非常小的数,高到不现实。

  • 因此,告诉环境下,需要设计新版的TCP。

  • (3)公平性

  • TCP具有公平性。

4. 网络层

4.1 网络层概述

  • 主机和主机之间的通信。
  • 网络层不再是一个端到端的层次。每一个主机、每一个路由器都需要运行网络层的协议。
  • 网络层两个最重要的功能就是转发forwarding路由routing
  • 某些网络的网络层还有连接建立的功能,如ATM、帧中继等。
  • 因特网采用的是best-effort尽力服务模型。ATM有四种服务模型:CBR(固定比特率检测型)、VBR(可变比特率检测型)、ABR(可用比特率检测型)、UBR(不保证比特率检测型)。
  • 数据报网络和虚电路网络,典型的两类分组交换网络。

4.2 虚电路网络

  • virtual vircuit network 虚电路网络。
  • 适用于帧中继、ATM网络。
  • 类似电路交换的分组交换。
  • 和电路交换最大的区别就是,电路交换利用多路复用技术,只占用链路的一部分物理资源,比如频率带宽等等。
  • 而虚电路传输每一个分组的时候,利用的是链路的全部带宽。

4.3 数据报网络

  • 网络层提供无连接的网络。
  • datagram network。
  • 但是显然,32位约有20亿IP地址,一个路由器维护这么多显然不现实,因此采用聚合方式,维护一系列IP地址的范围。
  • 如果多个端口满足,按照最长前缀匹配优先原则,选择最终的转发端口。

4.4 IP 协议

4.4.1 IP 数据报

  • 实现IP协议,也需要实现ICMP协议,才能实现差错报告。
  • IPv4数据报格式如下。固定长度为20字节。
  • 标识、标志位、片偏移和IP分片有关,下部分细讲。

4.4.2 IP 分片

  • MTU (Maximum Transmission Unit) 最大传输单元。
  • 以太网帧能够承载不超过1500字节的数据,即MTU为1500字节。
  • 因此同一个IP分组,可能会因为大于MTU而进行IP分组。
  • 这里需要说明MTU和MSS的区别。在因特网中,概括来讲,MTU是以太网数据链路层中约定的数据载荷部分最大长度,数据不超过它时就无需分片。MSS (Maximum Segment Size 最大报文段长度)是传输层的概念,由于数据往往很大,会超出MTU,所以我们在网络层需要进行IP分片,将很大的数据载荷分割为多个分片发送出去。
  • 一个等式可见他两关系匪浅: MSS = MTU - IP header头大小 - TCP 头大小。即MSS = MTU - 40。
  • 总长度:头部(20)+数据;
  • 标识:所有分片都用同一个分组的标识;
  • 标志位:占3位,两位有效,切片的确认信息;
  • 片偏移量:片偏移量不包括头部长度,距离数据开始的偏移量,以8字节为单位。
  • 注意片偏移量不包括头部长度。

4.4.3 IP 编址

  • 显然,为接口分配IP地址需要一定的策略。
  • 分为5类地址,ABCDE。
  • D类IP地址 :用于多点广播(Multicast)。它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。224.0.0.0到239.255.255.255用于多点广播 。
  • 还有一个注意点就是,全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。
  • 在A类地址里面,0和127起始的IP地址大部分有特殊含义的,不能随便作为主机IP地址。比如典型的127.0.0.1,你发送出去,会环一圈然后回到当前主机。
  • 除了以上地址,有一些私有IP地址,不能作为公网IP,这部分地址所有企业、组织都能用于自身的局域网。

4.4.4 子网划分与子网掩码

  • 子网划分:把一个大的IP地址划分为更小的区域。
  • 如何进行子网划分,借用主机号。

4.4.5 CIDR 与路由聚合

  • 无类域间路由(CIDR: Classless InterDomain Routing)
  • 提高ABC类IP地址的分配效率,提高IP地址的利用率。同时还可以提高路由效率。
  • 路由聚合可能存在部分子网不在当前的聚合子网之内,如下图的200.23.18.0/23,如何避免路由的黑洞现象,采用最长前缀匹配优先原则,在另外一个路由器添加多的路由,以确定转发方向。

4.4.6 DHCP 动态主机配置协议

  • 这里说明一下,尽管在网络层我们解释什么是DHCP协议,但实际上DHCP是应用层的协议

  • 可以通过静态配置 ip地址。

  • 动态地址配置:DHCP 协议,动态主机配置协议,Dynamic Host Configuration Protocol。

  • DHCP 是一种面向无连接的协议。

  • DHCP 是一个客户-服务器协议。DHCP协议是一个4步骤的过程。

  • DHCP服务器一般可以是路由器、网络交换机或者是独立的服务器。

4.4.7 NAT 网络地址转换协议

  • 属于网络层的协议。

  • Network Address Translation,NAT,网络地址转换。

  • NAT的作用在于,将子网中的ip地址转换为公网ip地址,以和互联网进行通信。

  • 关于NAT穿透的3种典型解决方案。

4.4.8 ICMP 互联网控制报文协议

  • ICMP是网络层的协议。

  • 互联网控制报文协议 ICMP (Internet Control Message Protocol)支持主机或路由器。

  • ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。

  • 在互联网中,对于损坏的IP数据报,会把该IP数据报丢弃,但是丢弃的同时,会向发送该IP数据报的源主机发送ICMP差错报文。

  • ICMP报文分为ICMP差错报告报文和ICMP网络探询报文。

  • ICMP报文有8字节的报头和可变长度的数据部分。虽然对每一种报文类型,报头的其他部分是不同的,但前4字节对所有类型都是相同的。

  • (1)ICMP报文的第一个字段是ICMP的类型,它定义了报文类型;

  • (2)代码字段指明了发送这个特定报文类型的原因;

  • (3)校验和字段用于检测报文的正确性;

  • (4)报头的其他部分对每一种类型报文都是不同的。在差错报告报文的数据部分所携带的信息可找出引起差错的原始IP报文;在查询报文的数据部分则携带了基于查询类型的额外信息。

  • ICMP的应用举例。

  • (1)ping:分组网间探测PING (Packet InterNet Groper),用来测试两台主机之间的连通性,PING使用了ICMP回送请求与回送回答报文。PING是应用层直接使用网络层ICMP的一个例子,没有通过运输层的TCP或UDP。

    • 使用 **回声应答(类型0 编码0)**和 **回声请求(类型8 编码0)**两种报文。
  • (2)Traceroute:

  • UNIX操作系统中为traceroute,Windows操作系统中是tracert,它用来跟踪一个分组从源点到终点的路径,利用IP数据报中TTL字段(跳数)和ICMP时间超过差错报文实现,停止准则为目的端口不可达。

  • 使用 TTL超期(类型11 编码0)目的端口不可达(类型3 编码3) 两种报文。

4.4.9 IPv6 简介

  • IPv6不允许路由器进行数据分片,要分片必须是发送主机进行主动分片。
  • IPv6的表达方式,使用冒号分割8组16位,可以允许有一组双冒号表示连续的0。
  • 嵌入IPv4,前80位表示0,然后接下来16位表示1,剩下32位为原本的IPv4地址。
  • IPv6不再使用掩码,而是全部使用CIDR的后缀斜杠数字形式(::8:0:8/48)。
  • 隧道机制:IPv4和IPv6共存的方法。

4.5 路由算法

4.5.1 概述

  • 本质问题就是 最小费用路径问题。

4.5.2 链路状态LS路由算法

  • Link State---LS算法。
  • 本质上是一种Dijkstra算法。贪心。

4.5.3 距离向量DV路由算法

  • DV算法。

  • Distance Vector 距离向量

  • 基本思路就是动态规划。

  • 链路费用增大,会导致无穷计数问题。

  • 如何避免无穷计数的问题呢,其中一种方法就是毒性逆转方法

  • 什么叫毒性逆转,以上图的xyz为例,如果z通过y路由选择到目的地x,则z将通告y,它(即z)到x的距离是无穷大,也就是z将向y通告Dz(x)=无穷大(即使z实际上知道Dz(x)= 5)。只要z经y路由选择到x,z就持续地向y讲述这个善意的小谎言。

  • 但是毒性逆转并不能彻底解决无穷计数的问题。涉及3个或更多节点(而不只是两个直接相连的邻居节点)的环路将无法用毒性逆转技术检测到。

  • 还有一种解决无穷计数问题的方法是——定义最大度量方法

  • 会在有限的跳数内到达收敛。

4.6 层次路由

  • 扁平化网络,不可取。

  • 划分为 自治系统内的路由协议 和 自治系统间的路由协议。

  • 在多AS间选择网关,热土豆路由。

  • AS 内部路由协议也称为IGP协议。

4.7 AS 内部路由协议之 RIP 协议

  • 路由信息协议RIP(Routing Information Protocol)是基于距离向量算法的路由协议,利用跳数来作为计量标准。
  • 最大跳步15跳,16跳步为无穷大。定义最大度量方法,解决无穷计数问题。
  • RIP协议的路由表里面包含了下一跳的目的路由器,运用毒性逆转的思想,尽量避免无穷计数问题。

4.8 AS 内部路由协议之 OSPF 协议

  • Open Shortest Path First 开发最短路径优先协议。
  • 采用链路状态路由算法。
  • OSPF协议是很复杂的,以下只是简介。
  • 视为RIP算法的改进,也被视为更先进的IGP协议
  • OSPF支持AS分层。
  • 以下是两层OSPF的示例。

4.9 AS 间路由协议 BGP 协议

  • 边界网关协议BGP (Border Gateway Protocol)
  • 下一跳这个属性很重要。

4.10 例题

  • 例1:
  • (1)
  • (2)
  • 域名服务器很特殊,因为前32位都可以看为前缀。
  • 互联网路由应该描述为缺省路由。
  • (3)

5. 数据链路层

5.1 概述

  • 帧 frame
  • 组帧:封装数据报构造帧,加首部和尾部。
  • MAC地址,是数据链路层的概念,不同于IP地址。
  • 链路层是硬件和软件的结合体。
  • 尽管大部分链路层是在硬件中实现的,但部分链路层是在运行于主机CPU上的软件中实现的。链路层的软件组件实现了高层链路层功能,如组装链路层寻址信息和激活控制器硬件。在接收端,链路层软件响应控制器中断(例如,由于一个或多个帧的到达),处理差错条件和将数据报向上传递给网络层。

5.2 差错编码

5.2.1 基本概念

  • 汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)01字符串对应位置的不同字符的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。

  • 汉明距离是以理查德·卫斯里·汉明的名字命名的。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:

    1011101 与 1001001 之间的汉明距离是 2。

  • 而编码集的汉明距离,指的是这个编码集内的所有有效码字,任意两个有效码字的最小汉明距离。

  • 依据汉明距离,可以给出两个差错编码的检错能力结论。

5.2.2 奇偶校验码

  • parity bit 奇偶校验位。
  • 分为奇校验和偶校验。
  • 奇偶校验码是奇校验码偶校验码的统称. 它们都是通过在要校验的编码上加一位校验位组成。
  • 校验方法:如果是奇校验加上校验位后,编码中1的个数为奇数个。如果是偶校验加上校验位后,编码中1的个数为偶数个
  • 采用单个奇偶校验位方式,接收方的操作也很简单。接收方只需要数一数接收的d+1比特中1的数目即可。
  • 如果在采用偶校验方案中发现了奇数个值为1的比特,接收方知道至少出现了一个比特差错。更精确的说法是,出现了奇数个比特差错
  • 在突发差错的情况下,使用单比特奇偶校验保护的一帧中未检测出差错的概率为50%。
  • 因此出现了二维的奇偶检验。
  • 使用二维奇偶校验方案,包含比特值改变的列和行的校验值都将会出现差错。因此接收方不仅可以检测到出现了单个比特差错的事实,而且还可以利用存在奇偶校验差错的列和行的索引来实际识别发生差错的比特并纠正它。

5.2.3 因特网校验和 CheckSum

  • checksum。

  • 求和(注意进位回卷)后取反,得到checksum。

  • 如何校验:全部求和+checksum,所有位数应该全为1。否则即有差错。

  • UDP、TCP都采用的checksum。

5.2.4 循环冗余校验码 CRC

  • 现今的计算机网络中广泛应用的差错检测技术基于循环冗余检测(Cyclic Redundancy Check,CRC)编码。CRC编码也称为多项式编码(polynomial code)。

  • CRC的检错能力很强。

  • 首先解释什么是模2运算,模2运算没有进位和借位,这是最重要的。

  • 模二加:0+0=0,0+1=1,1+0=1,1+1=0; e.g. 1010 + 1111 = 0101

    模二减:0-0=0,0-1=1,1-0=1,1-1=0; e.g. 1010 - 1111 = 0101

    可见模二加和模二减等价,都可以看做异或运算;

    模二乘: 0*0=0,0*1=0,1*0=0,1*1=1;(类似普通二进制运算,但部分和之间采用模二加/异或计算);

    **模二除:**类似普通二进制运算,注意点:1)如果某一步被除数最高位为1,则可除,即对应位商为1,否则为0; 2)中间数据用模二减做差。

  • 回过头来,我们看看如何进行计算CRC编码。

  • CRC编码操作如下。考虑d位比特的数据D,发送节点要将它发送给接收节点。发送方和接收方首先必须协商一个r+1位比特模式,称为生成多项式(generator),我们将其表示为G。我们将要求G的最高有效位的比特(最左边)是1。

  • 对于一个给定的数据段D,发送方要选择r个附加比特R,并将它们附加到D上,使得到的d+r比特模式用模2算术恰好能被G整除,即为我们所求的校验码R。

  • 关键是如何求校验码R呢。可以推导出,R = 余数((D*2^r)模2除(G))。

  • 国际标准已经定义了8、12、16和32比特生成多项式G。CRC-32 作为32比特的G标准被多种链路级IEEE协议采用,其生成式为=100000100110000010001110110110111。

5.3 多路访问控制(MAC)协议

5.3.1 基本概念

  • multiple access control protocol 协议。

  • 以太网和无线局域网是广播链路层技术的例子。但在广播链路中,如何协调多个发送和接收节点对一个共享广播信道的访问,这就是多路访问问题(multiple access problem)。

5.3.2 信道划分 MAC协议

(1)TDMA

  • 时分多址
  • TDMA消除了碰撞且十分公平,然而节点速率被限制到了(R/N)bps,且不能利用空隙时间。

(2)FDMA

  • FDMA的优缺点和TDMA相同。

(3)CDMA

  • 码分多址(Code Division Multiple Access,CDMA)。TDMA和FDMA分别为节点分配时隙和频率。
  • 而CDMA对每个节点分配一种不同的编码。然后每个节点用它唯一的编码来对它发送的数据进行编码(保证正交)。如果精心选择这些编码,CDMA网络具有一种奇妙的特性,即不同的节点能够同时传输,并且它们各自相应的接收方仍能正确接收发送方编码的数据比特(假设接收方知道发送方的编码),而不在乎其他节点的干扰传输。
  • CDMA已经在军用系统中使用了一段时间(由于它的抗干扰特性),目前已经广泛地用于民用,尤其是蜂窝电话中。

5.3.3 随机访问 MAC 协议

  • 随机访问,必然会导致冲突。

  • 解决冲突的常用方法是重传。

  • 在随机访问协议中,一个传输节点总是以信道的全部速率(即R bps)进行发送。当有碰撞时,涉及碰撞的每个节点反复地重发它的帧(也就是分组),到该帧无碰撞地通过为止。但是当一个节点经历一次碰撞时,它不必立刻重发该帧。相反,它在重发该帧之前等待一个随机时延。涉及碰撞的每个节点独立地选择随机时延。因为该随机时延是独立地选择的,所以下述现象是有可能的:这些节点之一所选择的时延充分小于其他碰撞节点的时延,并因此能够无碰撞地将它的帧在信道中发出。

(1) 时隙 ALOHA 协议

(2) ALOHA 协议

  • 纯ALOHA协议比 时隙ALOHA协议效率更差,因为冲突可能性增大了,发送成功的时隙是时隙ALOHA协议的两倍。

(3) CSMA 载波侦听多路访问协议

  • 说话之前先听。如果其他人正在说话,等到他们说完话为止。在网络领域中,这被称为载波侦听(carrier sensing),即一个节点在传输前先听信道。如果来自另一个节点的帧正向信道上发送,节点则等待直到检测到一小段时间没有传输,然后开始传输。

  • 尽管进行了载波侦听,但仍然会发生冲突。显然广播信道的端到端信道传播时延(channel propagation delay)(信号从一个节点传播到另一个节点所花费的时间)在决定发生冲突方面起着关键的作用。该传播时延越长,载波侦听节点不能侦听到网络中另一个节点已经开始传输的机会就越大

(4) CSMA/CD 具有碰撞检测的载波侦听多路访问协议。

  • 因此,以太网一般采用 CSMA/CD协议,但是无线局域网一般不能用CSMA/CD协议。
  • 为了能检测到冲突,链路带宽、节点距离和数据帧大小需要满足一定关系。

5.3.4 轮转访问 MAC 协议

  • (1) 轮询 polling

  • 轮询协议消除了困扰随机接入协议的碰撞和空时隙,这使得轮询取得高得多的效率。但是它也有一些缺点。第一个缺点是该协议引入了轮询时延,即通知一个节点“它可以传输”所需的时间。例如,如果只有一个节点是活跃的,那么这个节点将以小于R bps的速率传输,因为每次活跃节点发送了它最多数量的帧时,主节点必须依次轮询每一个非活跃的节点。第二个缺点可能更为严重,就是如果主节点有故障,整个信道都变得不可操作。IEEE 802.15 协议蓝牙协议就是轮询协议的例子。

  • (2) 令牌传递 token passing

  • 令牌传递是分散的,并有很高的效率。但是它也有自己的一些问题。例如,一个节点的故障可能会使整个信道崩溃。或者如果一个节点偶然忘记了释放令牌,则必须调用某些恢复步骤使令牌返回到循环中来。经过多年,人们已经开发了许多令牌传递协议,包括光纤分布式数据接口(FDDI)协议IEEE 802.5 令牌环协议,每一种都必须解决这些和其他一些棘手的问题。

5.3.5 总结

5.4 MAC 地址

  • 尽管称为物理地址,但是其不是在物理层的,而是在数据链路层发挥作用。
  • 链路层地址有各种不同的称呼:LAN地址(LAN address)、物理地址(physical address)或MAC地址(MAC address)。因为MAC地址似乎是最为流行的术语,所以我们将链路层地址称为MAC地址。
  • MAC地址是网络设备(如计算机、手机、路由器等)在物理网络通信中的唯一识别标识,其作用是在局域网中定位和识别其他设备,并进行数据包转发和交换
  • IP地址标识数据报,MAC地址标识帧。

5.5 ARP 协议

  • 因为存在网络层地址(例如,因特网的IP地址)和链路层地址(即MAC地址),所以需要在它们之间进行转换。对于因特网而言,这是地址解析协议**(Address Resolution Protocol,ARP)**的任务。

  • 那如何跨局域网传输数据呢?

  • MAC地址随数据传输是会变换的,IP地址一般是不变的,除非左侧内网右侧互联网,需要使用NAT进行IP地址的替换。

5.6 以太网 802.3

  • 统治地位的有线局域网LAN。

  • 对于星型结构:

    • 在20世纪90年代后期,大多数公司和大学使用一种基于集线器的星形拓扑以太网安装替代了它们的局域网。在这种安装中,主机(和路由器)直接用双绞对铜线与一台集线器相连。集线器(hub)是一种物理层设备,它作用于各个比特而不是作用于帧。当表示一个0或一个1的比特到达一个接口时,集线器只是重新生成这个比特,将其能量强度放大,并将该比特向其他所有接口传输出去。因此,采用基于集线器的星形拓扑的以太网也是一个广播局域网,即无论何时集线器从它的一个接口接收到一个比特,它向其所有其他接口发送该比特的副本。特别是,如果某集线器同时从两个不同的接口接收到帧,将出现一次碰撞,生成该帧的节点必须重新传输该帧。
    • 在21世纪初,以太网又经历了一次重要的革命性变化。以太网安装继续使用星形拓扑,但是位于中心的集线器被**交换机(switch)**所替代。在本章后面我们将深入学习交换以太网。眼下我们仅知道交换机不仅是“无碰撞的”,而且也是名副其实的存储转发分组交换机就可以了;但是与运行在高至第三层的路由器不同,交换机是数据链路层设备
  • NIC(Network Interface Card ,网络接口卡、网卡)

  • 以太网的 CSMA/CD 算法:

  • 在CSMA/CD协议中,一旦检测到冲突,为降低再冲突的概率,需要等待一个随机时间,然后再重复使用CSMA/CD方法试图传输。 为了保证这种退避维持稳定,采用了二进制指数退避算法的技术,其算法过程如下: 1.确定基本退避时间,一般为端到端的往返时间为2t,2t也称为冲突窗口或争用期(上述就是512比特)。 2.定义参数k,k与冲突次数有关,规定k不能超过10,k=Min[冲突次数,10]。在冲突次数大于10,小于16时,k不再增大,一直取值为10。 3.从离散的整数集合0,1,2,... ,(2^K-1)中随机的取出一个数r,等待的时延为r倍的基本退避时间,等于r×2t。r的取值范围与冲突次数k有关,可选的随机取值为2的K次方个、这也是称为二进制退避算法的起因。 4.当冲突次数大于10以后,都是从0-1023中随机选择一个作为等待时间。 5.当冲突次数超过16次后,发送失败,丢弃传输的帧,发送错误报告。

  • 关于以太网帧结构:

  • 数据帧的长度大小一般不算前导码这8个字节,他的作用是为了发送和接收的时钟同步。

  • 数据(Date)字段(46~1500字节)。这个字段承载了IP数据报。以太网的最大传输单元(MTU)是1500字节。这意味着如果IP数据报超过了1500字节,则主机必须将该数据报分片。数据字段的最小长度是46字节。这意味着如果IP数据报小于46字节,数据报必须被填充到46字节。当采用填充时,传递到网络层的数据包括IP数据报和填充部分。

  • 因此,不考虑前导码的以太网帧的最大长度是 1518字节,最长的以太帧包括6字节的目的地址(DMAC)、6字节的源地址(SMAC)、2字节的以太类型(EtherType)、1500字节的数据(Payload)、4字节的校验(FCS)。

5.7 交换机

  • 以太网交换机因为采用星型结构,能够保证每个连接的主机是独占一条信道的,所以它在传输数据的时候不会发生碰撞。而传统的以太网采用的是总线型信道,所有主机都是共享一条信道的,所以会发生碰撞。

  • 一般指的是以太网交换机,数据链路层设备。

  • 交换机自身对子网中的主机和路由器是透明的(transparent);这就是说,某主机/路由器向另一个主机/路由器发送一个帧(而不是向交换机发送该帧),顺利地将该帧发送到交换机,并不知道某交换机将会接收该帧并将它转发到另一个节点。这些帧到达该交换机的任何输出接口之一的速率可能暂时会超过该接口的链路容量。为了解决这个问题,交换机输出接口设有缓存,这非常类似于路由器接口为数据报设有缓存。

  • 交换机是通过自学习的方式创建和维护交换表的。

  • 交换机的主要功能就是帧过滤/转发。过滤(filtering)是决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能。转发(forwarding)是决定一个帧应该被导向哪个接口,并把该帧移动到那些接口的交换机功能。

  • 交换机的过滤和转发借助于**交换机表(switch table)**完成。该交换机表包含某局域网上某些主机和路由器的但不必是全部的表项。交换机表中的一个表项包含:①一个MAC地址;②通向该MAC地址的交换机接口;③表项放置在表中的时间。

  • 如下图所示,例如A要发送数据帧到G,假设此时S1,S2,S3,S4中交换表都为空。

  • S1接受到A发送的数据帧,记录A的MAC地址及端口,由于S1不知道G的MAC地址及端口,故S1泛洪,则有一份数据传送到S4;

  • S4记录A的MAC地址及端口后也泛洪,有一份数据到S3;

  • S3同理记录A的MAC地址及端口并泛洪,将一份数据传送到G,此时G回传确认数据,交换机进行选择性转发,不再泛洪,此时S1,S3,S4学习到G的MAC地址及端口。

  • 交换机和网桥都是数据链路层的设备,工作原理基本一样,没什么大差异,最大的差别就是网桥只有两个端口,交换机可以有多个端口。可以形象的说,交换机是多端口的网桥。

5.8 虚拟局域网 VLAN 802.1Q

  • VLAN:Virtula Local Network。

  • 现代机构的局域网常常是配置为等级结构的,每个工作组(部门)有自己的交换局域网,经过一个交换机等级结构与其他工作组的交换局域网互联。虽然这样的配置在理想世界中能够很好地工作,但在现实世界常常不尽如人意。在下图的配置中,能够发现3个缺点:

    • (1)缺乏流量隔离。尽管该等级结构把组流量局域化到一个单一交换机中,但广播流量(例如携带ARP和DHCP报文或那些目的地还没有被自学习交换机学习到的帧)仍然必须跨越整个机构网络。限制这些广播流量的范围将改善局域网的性能。也许更为重要的是,为了安全/隐私的目的也可能希望限制局域网广播流量。
    • (2)交换机的无效使用。如果该机构不止有3个组,而是有10个组,则将要求有10个第一级交换机。如果每个组都较小,比如说少于10个人,则单台96端口的交换机将足以容纳每个人,但这台单一的交换机将不能提供流量隔离。
    • (3)管理用户。如果一个雇员在不同组间移动,必须改变物理布线。这为管理用户带来困难。
  • 但完全隔离两个VLAN带来了新的困难!来自电子工程系的流量怎样才能发送到计算机科学系呢?解决这个问题的一种方式是将VLAN交换机的一个端口与一台外部的路由器相连,并且将该端口配置为属于EE VLAN和CS VLAN。在此情况下,即使电子工程系和计算机科学系共享相同的物理交换机,其逻辑配置看起来也仿佛是电子工程系和计算机科学系具有分离的经路由器连接的交换机。

  • 另外一个问题,如果一个VLAN跨越多个物理交换机的话,如何保证这个VLAN能正常的进行数据传输呢?

  • 为了跨越多个物理交换机,IEEE 定义了一种扩展的以太网帧格式一802.1Q,用于跨越VLAN干线的帧。即中继端口的以太网格式。

5.9 PPP 协议

  • 点对点协议。
  • PPP 协议并不仅仅面对因特网。
  • PPP 协议本身就保证先发先收。

5.10 无线局域网 802.11

  • 802.11b

  • 802.11a

  • 802.11g

  • 802.11n

  • 802.11 采用的MAC协议是 CSMA/CA。因为无线信道无法像以太网那样采用 CSMA/CD 协议。

  • CSMA/CA(Carrier Sense Multiple Access with Collision Avoid,即带有冲突避免的载波侦听多路访问,是一种数据传输时避免各站点之间数据传输冲突的算法,其特点是发送包的同时不能检测到信道上有无冲突,只能尽量“避免”。

6. 物理层

6.1 数据通信基础

  • 物理层解决的就是一个一个比特传输的问题。
  • (1) 异步通信vs同步通信
  • 两者解决的都是发送方和接收方之间的时钟同步问题。
  • 显然,发送方和接收方时钟不同步,会导致传输错误。
  • (2) 异步通信
  • 异步的发送方和接收方的时钟相对独立;
  • 为了避免传输过程出现错误,我们要求异步通信一次只发送一个字符,典型长度是5-8 bit;
  • 在传输字符的过程中,时钟开始的时候对齐一下,后期虽然可能会有相对时钟的误差,但在引起大的传输误差之前,这个数据就传输完了;下一个传输又重新对齐时钟重新开始。
  • 作为异步通信,每一个字符传输结束后必须要有停止位;
  • 在idle状态,接受方观测电平由低电位跳转到高电位,以作为开始接收数据的标志;
  • 实现简单,成本低;
  • 每个字符都会有多加2-3个bit开销;
  • 适合间隙较大、短距离、低速率的数据传输,比如键盘和主机之间的通信;
  • (3) 同步通信
  • 显然因特网使用的就是同步通信。
  • 大块数据传输,没有开始结束位;
  • 时钟必须同步,如何做到?有两种方法
    • ①发送方和接受方使用相同的时钟信号、时钟线;但一般短距离是可以的,长距离会有问题;
    • ②时钟信号和数据本身编码到一起;如曼彻斯特编码,载波频率等。
  • 同步通信的传输效率是比异步通信高很多的。

6.2 物理介质

6.2.1 导引型传输介质

  • 导引型传输介质,包括有线介质和部分无线介质。
  • 架空明线、双绞线、同轴电缆、光纤。

6.2.2 非导引型传输介质

6.3 信道与信道容量

  • 恒参信道,参数不会随时间变。
  • 奈奎斯特公式是理想情况无噪声的信道容量上限的计算。
  • 香农公式,非理想信道,有噪声。

6.4 基带传输基础

  • 基带信号是不适合在无线中传输的。
  • 典型数字基带信号码型
  • (1)单级不归零码
  • 单极指只有正脉冲,没有负脉冲,不归零是指在一个bit周期(两虚线间)内,电位不会回归到0
  • (2)双极不归零码
  • (3)单级归零码
  • (4)双极归零码
  • (5)差分码
  • (6)AMI 信号交替反转码
  • (7)双向码-曼彻斯特码
  • 利用电平跳变进行编码
  • (8)双向码-差分曼彻斯特码
  • (9)nBmB码

6.5 频带传输基础

  • 信源产生的信号是基带信号,具有很多的低频成分,适合在有线介质上传输,不适合在无线介质上传输;

  • 而无线信道上传输,一般使用的是频带传输。

  • 正交幅值调制QAM

  • 扩频技术:载波频率是变化的-》跳频

  • 后来发展为直接序列扩频技术-》CDMA

6.6 物理层接口规程

7. 网络安全

7.1 基本概念

  • 什么是网络安全?
  • 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。

7.2 网络安全拟人模型

  • Bob、Alice和Trudy

7.3 Internet 网络威胁

  • (1) 映射 Mapping
  • (2) 分组 "嗅探" sniffing
  • (3) IP 欺骗 Spoofing
  • IP欺骗就是冒充其他人干坏事
  • (4) 拒绝服务DOS--Denial of service
  • SYN泛洪攻击,大量发送第一次握手信息。
  • 有效的策略就是SYN cookie技术。基础技术就是第二次握手的序列号y根据源ip和目的ip地址,使用哈希运算得出。而不是随机。

7.4 密码学基础

7.4.1 概述

  • 明文、加密秘钥、解密秘钥。

  • 根据加密秘钥和解密秘钥的相同与否,分为对称秘钥加密和公开秘钥加密(非对称秘钥加密)两种。

  • 而一般破解加密的方法,有以下三种:

  • (1)唯密文攻击

  • (2)已知明文攻击

  • (3)选择明文攻击

7.4.2 传统加密技术

  • 传统加密方法
  • (1)替代密码
  • (2)换位密码

7.4.3 现代加密技术

  • (1) 对称密钥加密
  • 关于公开秘钥加密,后面在讲。
  • (a) 流密码
  • 典型的运算是异或运算。
  • (b) 分组密码

7.4.4 数据加密标准 DES

  • DES是一种分组密码

7.4.5 高级加密标准 AES

  • 有很严格的数学支持,不属于Feistel结构。

7.4.6 公开秘钥加密 RSA

  • 最典型的公钥加密算法就是 RSA 算法。
  • 公钥加密私钥解密
  • 私钥加密公钥解密
  • 上面两种都是可以的。
  • RSA的实际应用一般都是利用公开秘钥进行对称秘钥的分发,然后基于这个秘钥进行对称秘钥加密从而进行大数据的传输。

7.5 身份认证 ap

  • ap (authentication protocol) 鉴别协议

  • ap 1.0 直接声明自己是谁

  • ap 2.0 声明自己是谁的同时,携带ip地址。

  • ap 3.0:在2.0的基础上,添加秘密口令(密码)

  • ap 3.1:使用加密的秘密口令。

  • ap 4.0:避免回放攻击,使用一次性随机数。

  • ap 5.0:不使用对称秘钥,而使用公钥加密。

7.6 报文完整性

  • 密码散列函数。
  • 网络层的校验和算法不是优秀的密码散列函数,尽管满足密码散列函数的部分性质。

7.6.1 报文验证码 MAC

  • MD5 和 SHA-1
  • 报文摘要,Message digest ,类似报文的指纹。
  • 验证报文完整性,可以通过报文摘要即可。
  • 报文认证码MAC:(Message Authentication Code)

7.6.2 数字签名 Digital signatures

  • Digital signatures 数字签名,注意作用就是防止抵赖的问题发生。

  • 报文验证码MAC实际上有一些其他的报文完整性问题还未解决。比如,涉及到下面这些问题。

    Q:如何解决下列与报文完整性相关的问题?

    否认:发送方不承认自己发送过某一报文。 伪造:接收方自己伪造一份报文,并声称来自发送方 冒充:某个用户冒充另一个用户接收后发送报文 篡改:接收方对收到的信息进行篡改。

  • 这些问题,简单依赖单一的报文认证码是很难解决的。目前比较有效的,也是在网络安全中使用比较广泛的解决方案,就是数字签名(Digital signatures)。

  • 正如手工签字一样,数字签名也应当以可鉴别的、不可伪造的方式进行。这就是说,必须能够证明由某个人在一个文件上的签名确实是由该人签署的(该签名必须是可证实的),且只有那个人能够签署那个文件(该签名无法伪造)。

  • 加密技术是数字签名的基础。

  • 不可能利用对称秘钥进行加密。因为对称加密算法接收和发送双方使用的是同一个密钥,也就是说接收方是可以利用这个密码对接收报文进行修改的,也就是我们所说的报文验证码MAC的问题。

  • 改进:不对源报文进行数字签名,而是对报文摘要进行数字签名。

7.7 秘钥分发中心 KDC

  • ap4.0 使用了对称秘钥。但是对称秘钥的问题就是:如何共享对称秘钥。
  • KDC 就是一个服务器。

7.8 认证中心 CA

  • ap 5.0 利用了公钥加密。
  • 但是公钥加密可能存在中间人攻击和比萨恶作剧的网络攻击问题。
  • 这两个问题,归根结底都是,公钥是不是真的还是假的。

7.9 安全电子邮件

  • 使用对称秘钥和公开秘钥两者结合进行安全电子邮件的发送。
  • 现代广泛采用的安全电子邮件标准是 PGP 标准。

7.10 Web 安全威胁

  • 在应用层实现Web安全
  • 在传输层实现Web安全——SSL、TLS
  • 在网络层实现Web安全——IPSec

7.11 安全套接字层 SSL

  • SSL(Secure Sockets Layer)安全套接层是Netscape公司率先采用的网络安全协议。
  • TCP连接是交互性双向的,而不像电子邮件那个是单向性的。因此SSL和PGP协议有相同的点,也有不同的点。

7.11.1 简化版 SSL

  • 简化版SSL(类SSL)分为以下四个步骤。

  • (1)握手:发送hello,发送公钥证书,根据公钥证书得到公钥加密主密钥

  • (2)秘钥派生

  • 一般需要派生4个秘钥。

  • 秘钥派生函数 KDF。

  • (3)数据记录

  • 但是攻击者还可以通过捕获记录,重新排序,打乱发送数据。

  • (4)总结

7.11.2 更完整的 SSL

  • (1) SSL 握手过程

  • (2)SSL 记录协议

  • (3)实际的 SSL 连接

  • 先建立TCP连接,才是SSL连接,最后再TCP断开。

  • (4)密钥派生

  • 客户端和服务器派生的密钥是一样的!因为是相同的算法,相同的随机数。

7.12 虚拟专用网 VPN

  • 什么是专用网 (Private Networks):

  • 优点:安全

  • 缺点:构建成本、维护成本比较大

  • VPN 比较核心的技术就是隧道技术。隧道就是封装,最终在互联网中表现出来的就是IP 数据报。

  • 隧道技术是VPN技术的底层支撑技术。隧道实质上是一种封装,就是将一种协议(协议X)封装在另一种协议(协议Y)中传输,从而实现协议X对公用网络的透明性。这里的协议X称为被封装协议,协议Y称为封装协议,封装时一般还要加上特定的隧道控制信息,因此,隧道协议的一般形式为(协议Y(隧道头(协议X)))。在公用网络(一般指互联网)上传输的过程中,只有VPN端口或网关的IP地址暴露在外边。

  • 隧道解决了专网与公网的兼容问题,其优点是能够隐藏发送者、接受者的IP地址以及其他协议信息。VPN采用隧道技术向用户提供了无缝的、安全的、端到端的连接服务,以确保信息资源的安全。

  • 隧道需要三种不同的协议:

    - 承载(传输)协议:用于传输最终封装的网络协议(IP、TCP/UDP)

    运载协议就是将我们新打包好的数据再次的进行传输

    - 封装协议:封装原始数据的协议(GRE、IPSec、L2F、PPTP、L2TP等)

    封装协议;封装协议是将原本的协议封装起来,封装原始数据的协议这里列出了一些我们已知的、常用的封装协议

    - 乘客协议:运载原始数据(IP、PPP、SLIP、IPX等等)

    乘客协议就是打包之前的原始数据,原本传输的是什么呢,大多数情况下是个IP的数据,或者是TCP/UDP的数据,通过一些封装的方法将它打包在它前面加一些新的信息,可能用GRE的方法去封装它,或者是用IPSec的协议去封装它。在它前面加一个新的东西,新的报头,这个新的报头产生了之后我们依然需要原本的这些IP或者是TCP/UDP协议,运输我们这个新产生的协议。所以乘客协议和运输协议往往是相同的。只是封装协议各有各的不同。

  • 隧道协议分为第二、第三层隧道协议;第二层隧道和第三层隧道的本质区别在于:用户的IP数据包被封装在不同的数据包在隧道中传输。

  • 第二层隧道协议(如L2TP、PPTP、L2F等)工作在OSI体系结构的第二层(即数据链路层);

  • 第三层隧道协议(如IPSec、GRE等)工作在OSl体系结构的第三层(即网络层);

  • 第二层隧道协议建立在点对点协议(PPP)的基础上,充分利用了PPP支持多协议的特点,先把各种网络协议(如IP、IPX等)封装到PPP帧中,再把整个数据包装入隧道协议。PPTP和L2TP协议主要用于远程客户机访问虚拟专用网。

  • 第三层隧道协议把各种网络协议直接装入隧道协议中,形成的数据包依靠网络层协议进行传输。主要用于网关到网关的隧道。

  • 无论从可扩展性,还是安全性和可靠性方面,第三层隧道协议均优于第二层隧道协议。IPSec是目前实现VPN功能的最佳选择。

7.13 IPSec

7.13.1 概述

  • 因此VPN可以使用IPSec技术实现。
  • IPSec有两种传输模式:①传输(主机)模式;②隧道模式
  • IPSec的两个核心协议:AH 和 ESP

7.13.2 SA、SAD、SPD

  • SA:安全关联。SA是单向的,因此双向的SA需要构建两个SA。
  • 在IPSec网络通信中,只要建立IPSec,就要建立SA。因此SA会有很多,这时候需要安全关联数据库SAD。

7.13.3 不同模式的传输数据报

  • (1)传输模式 AH
  • (2)隧道模式 AH
  • 和传输模式最大的不同就是,构造一个新的IP头
  • (3)传输模式 ESP
  • (4)隧道模式 ESP
  • (5)总结
  • 隧道模式是网关到网关或者路由器到路由器的。

7.13.4 数据报处理过程

  • 以隧道模式ESP为例。

7.13.5 SA 的建立和密钥管理

  • IKE 协议。

7.13.6 总结

7.14 无线局域网的安全

  • 无线局域网相比有线局域网,更容易被嗅探,也更容易被攻击。
  • WEP身份认证采用的就是 ap4.0 的做法。
  • WEP 被证实,是很不安全的。
  • 实际中如果需要更安全的无线局域网,不会使用WEP,而是使用 802.11i 服务。
  • 802.11i 使用的一个主要协议就是 EAP 协议。

7.15 防火墙

  • 一般包含三种类型防火墙:
    • 无状态分组
    • 有状态分组
    • 应用网关

8. 习题讲解

8.1

8.2

8.3

8.4

8.5

第一题

第二题

8.6

  • (3) 512B减去20B头部,498B,但是498不是8的倍数,所有最多是488字节,加上头部,即最多508B。offset以8字节为单位。
  • 而发送数据大小为 1500-20 = 1480。

8.7

8.8

8.9

第一题

第二题

第三题