第1章-计算机网络和因特网
Internet
Internet的具体构成
数以亿计的计算互连设备:
主机(host)= 端系统(end system)
运行网络应用程序
分组(packet)交换设备:
通信链路(link):
fiber, copper, radio, satellite
传输速率 = 带宽(bandwidth)
网络 (Networks):
设备、路由器、交换机和链路的集合,由机构组织管理
Internet的服务描述
提供网络应用基础架构
允许终端系统上运行分布式应用程序,并彼此交换数据:
Web, email, games, e-commerce, database, VOIP, P2P file sharing
为分布式应用程序提供通信服务接口
- 无连接服务connectionless
- 面向连接服务connection-oriented
- 不提供数据传递时间保证(发送端到接收端)的服务
协议
协议:定义了两个或多个通信实体间所交换报文的格式 (format)和次序 (order),以及在报文发送和/或接收或者其他事件方面所采取的行动(响应)(actions)。
**协议的基本要素:**语法、语义和同步
网络核心部分
虚电路网络一定是面向连接的。
**数据报网络既可以提供面向连接的服务也可以提供无连接的服务。**如:Internet为网络应用既提供面向连接的传输服务 (TCP),也提供无连接的传输服务(UDP)。
电路交换:
每次会话预留沿其路径(线路)所需的独占资源——电话网
(1)预先建立连接,预留资源,发送方以恒定速度发送数据
(2)电路和通信链路的区别
(3)链路带宽和一条电路的传输速率的关系
在两台主机A、B之间创建一条专用的端到端连接,分别占用每条链路中的一条电路;
该连接获得链路带宽的1/n,进行通信
发送一个文件时间 = 创建电路时间 + 文件传输时间
文件传输时间:文件长/电路的传输速率
每条电路的传输速率:链路传输速率/时隙数
(1.536M b/s) / 24 = 64kb/s
文件传输时间:640kb/(64kb/s) = 10s
A 到 B 的总发送时间:0.5s + 10s = 10.5s
(5)电路交换的优缺点:电路级的性能,时延小;效率低;创建连接过程复杂
分组交换:
数据以离散的数据块通过网络来发送
(1)报文:应用程序要传输的信息,包含控制或数据
(2)分组:报文拆分成若干的数据块,每个数据块加上头部信息,构成分组
(3)特点:每个分组使用全部链路带宽;传输过程采用存储转发;排队时延和分组丢失;转发表和路由选择协议
(1)报文分组,加首部(2)经路由器储存转发(3)在目的地合并
分组交换网络中的延迟、丢失和吞吐量
分组到达输出链路的速率超过输出链路的容量,产生延迟,甚至丢失
分组在缓冲区队列排队,按序等待
分组延迟的4种类型:
(1)节点处理时延:差错检测、选择输出链路,微秒级
(2)排队时延:路由器的拥塞程度
(3)传输时延:L/R
(4)传播时延:d/s,卫星250ms
分组丢失
•路由器输入链路和输出链路的缓冲区容量有限
•当分组到达路由器输入链路发现缓冲区已满,则路由器只好丢弃分组
•当分组在路由器内部要转发到输出链路时发现输出缓冲区队列已满,路由器只好丢弃分组
•丢失的分组可能被前路由节点、源节点重传,或不重传
吞吐量
接收端接收到数据的比特速率 (bps ),吞吐量是:min{Rs,Rc}
协议层及其服务模型
- 实体(entity) 表示任何可发送或接收信息的硬件或软件进程。
- 对等层:在网络体系结构中,通信双方实现同样功能的层.
- 协议是控制两个对等实体进行通信的规则的集合。
- **客户(client)和服务器(server)**都是指通信中所涉及的两个应用进程。客户是服务的请求方,服务器是服务的提供方。客户服务器方式所描述的是进程之间服务和被服务的关系。
- **协议栈:**指计算 机网络体系结构采用分层模型后,每层的主要功能由对等层协议的运行来实现,因而每层可用一些主要协议来表征,几个层次画在一起很像一个栈的结构.
- 协议数据单元:对等层实体进行信息交换的数据单位.
- **服务访问点:**在同一系统中相邻两层的实体进行交互.
协议和服务的的区分
(1)协议的实现保证了能够向上一层提供服务。本层的服务用户只能看见服务,而无法看见下面的协议。下 面的协议对上面的服务用户是透明的。
(2)协议是“水平的”,即协议是控制两个对等实体进行通信的规则。但服务是“垂直的”,即服务是由下层 通过层间接口向上层提供的。
因特网分层模型
(1)应用层:网络应用程序和应用层协议(Web应用【HTTP】、电子邮件【SMTP】、文件传输【FTP】);交换的分组(报文);
(2)运输层:应用程序端点之间传输应用层报文(TCP【面向连接、可靠传输、流量控制、拥塞控制】、UDP);不提供时间保证;运输层的分组(报文段)。
(3)网络层:将网络层分组(数据报)从一台主机传输到另一台主机(网际协议IP、路由选择协议)。
(4)链路层:将分组(帧)从一个节点(主机或路由器)传输到另一个节点(可靠交付、不同链路【以太网、Wifi、电缆】有不同协议,广播链路和点对点链路)
(5)物理层:将数据帧一个bit一个bit从一个节点移动到另一个节点(协议与传输媒体有关)。
各体系结构图
ISO/OSI RM:
表示层:允许应用程序解释数据的含义,实现数据格式的转换、数据压缩及加解密等。
会话层:对数据传输进行管理,包括数据交换的定界、同步,建立检查点等
第2章-应用层
套接字
套接字又叫做应用程序编程接口API
用户通过API对传输层的控制仅限于:
- 选择传输协议
- 设定几个参数
进程通过它的套接字在网络上发送和接收报文
HTTP协议
HTTP(hypertext transfer protocol):超文本传输协议
client/server模式
client: 浏览器browser请求, 接收, “解释显示” Web对象
server: Web服务器响应请求,发送 Web对象
响应时间模型
往返时间RTT(Round-Trip Time): 1个分组从客户主机到服务器再回到客户主机所花费的时间。
HTTP 响应时间 (每个对象):
1个RTT用于建立TCP连接
1个RTT用于HTTP请求/响应消息的交互
对象/文件的传输时间
三次握手
TCP连接的“三次握手”过程:
客户机发送一个TCP连接请求报文
服务器回送一个TCP确认响应报文
客户机向服务器发送一个包含“ HTTP请求”与“TCP确认”的报文
HTTP报文结构
开始行:用于区分是请求报文还是响应报文。
在请求报文中的开始行称为请求行;
响应报文中的开始行称为状态行;
开始行的三个字段之间都以空格分隔,最后的“CR"和“LF”分别代表“回车”和“换行”。
Cookie
HTTP协议本身是无状态的,通常使用Cookie 加数据库的方式来跟踪用户的活动
- cookie头部行可在HTTP请求消息和响应消息中
- cookie文件保存在用户主机中并被用户浏览器管理,cookie也保存在Web站点的后端数据库
电子邮件
3个主要组成部分:
-
用户代理 user agents:也就是邮件阅读器,允许用户阅读、回复、转发、保存、编辑邮件消息
-
邮件服务器 mail servers :传出/传入消息存储在服务器上
-
简单邮件传送协议 SMTP:邮件服务器之间以SMTP协议发送电子邮件
-
“client”: 发送邮件服务器
-
“server”: 接收邮件服务器
-
邮件访问协议
**发送方:**用户代理使用 SMTP 将邮件推入其邮件服务器 à 邮件服务器再用 SMTP 将邮件转发到接收方的邮件服务器
接收方通过用户代理使用从其邮件服务器上取回邮件(POP、IMAP、HTTP)
与HTTP的比较:
HTTP: 拉协议
用户使用HTTP从服务器拉取信息。其TCP连接是由想获取文件的机器发起。
SMTP: 推协议
发送邮件服务器把文件推向接收邮件服务器,其TCP连接是由要发送文件的机器发起。
- 都有ASCII 命令/应答交互, 状态码
- HTTP: 每个对象封装在它各自的HTTP响应消息中发送
- SMTP: 一个邮件内各个对象置于同一个邮件消息的多部分发送
DNS:域名系统Domain Name System
把便于人们记忆的具有特定含义的主机名(如www.web.com)转换为便于机器处理的IP地址。
域名服务器类型
- 根域名服务器(Root DNS servers):目前全球共有13套域名根服务器
- 顶级域名服务器(Top-level domain (TLD) servers):负责顶级域名 com, org, net, edu, etc, 和所有国家的顶级域名 uk, fr, ca, jp
- 权威域名服务器(Authoritative DNS servers):在因特网上具有公共可访问主机(如Web服务器和邮件服务器)的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。组织机构的权威DNS服务器负责保存这些DNS记录。
- 本地域名服务器(Local DNS server):每一个因特网服务提供商 ISP(住宅ISP、公司、大学、甚至一个大学的系)都可以拥有一个本地域名服务器。当一个主机发出DNS查询报文时,这个报文就首先被送往该主机的本地域名服务器。
DNS查询方法
递归查询(recursive query):
名字解析的负担交给被查询的名字服务器
迭代查询
被查询的名字服务器回复可以被查询的名字服务器的IP地址,“我不知道它的名字,但是你可以问服务器xx”
一旦名字服务器获得DNS映射, 它将缓存该映射到局部内存
- 服务器在一定时间后将丢弃缓存的信息
- 本地DNS服务器可以缓存TLD服务器的IP地址
- 因此根DNS服务器不会被经常访问
第3章-运输层
运输层服务
在两个不同的主机上运行的应用程序之间提供逻辑通信
发送方:
- 传递一个应用层消息
- 确定报文段头部域值
- 创建报文段
- 传递报文段到IP层
接收方:
- 从IP层接受报文段
- 检查头部值
- 提取应用层消息
- 通过套接字多路分解消息到应用层
多路复用和多路分解
在发送主机多路复用:
从多个套接字收集数据, 用首部封装数据,然后将报文段传递到网络层。
在接收主机多路分解
使用头部信息将接收到的报文段传递到正确的套接字。
多路分解如何工作?
主机收到IP数据报
- 每个数据报有源IP地址、目的IP地址
- 每个数据报搬运一个运输层报文段
- 每个数据段有源、目的端口号
主机用IP地址和端口号指明报文段属于哪个合适的套接字
面向连接的多路分解
TCP 套接字由4部分指定:
- 源IP地址
- 源端口号
- 目的IP地址
- 目的端口号
接收主机使用所有四个值将报文定位到合适的套接字
无连接多路分解
当创建套接字时,必须指定本地主机的端口号
当创建数据报发送到UDP套接字时,必须指定:
- 目的 IP 地址
- 目的端口号
请求报文段中提供返回地址(包括IP地址和端口号)
无连接传输UDP
为什么要有 UDP?:
不需要建立连接 (减少延迟)
简单:在发送者接受者之间不需要连接状态
很小的报文段首部
没有拥塞控制:UDP 能够用尽可能快地进行传递,可以在拥塞的情况下发挥作用
性质
“无修饰”,“不加渲染的”因特网传输协议
“尽力而为”服务,UDP报文段可能:
- 丢失
- 会将失序的报文交付到应用程序
无连接:
- 在UDP接收者、发送者之间没有握手
- 每个UDP 段的处理独立于其他段
UDP: 用户数据报协议
UDP 是面向报文的。面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。即应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。
UDP 首部格式
用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段有 8 个字节,由 4 个字段组成,每个字段都是两个字节。长度是首部和数据的总长度,故最小值为8 。
UDP校验和
在计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
接收方的累加和 + 传输过来的校验和 的结果全为1,表示传输正确
可靠数据传输原理
Rdt1.0: 完全可靠信道上的可靠数据传输
Rdt2.0: 具有bit错误的信道
下层信道可能让传输分组中的bit受损
利用校验和检测位错误
如何从错误中恢复
- 确认(ACKs): 接收方明确告诉发送方 分组接收正确
- 否认 (NAKs):接收方明确告诉发送方 分组接收出错
- 发送方收到NAK后重发这个分组
在 rdt2.0中的新机制 (在 rdt1.0中没有的):
- 差错检测
- 接收方反馈: 控制信息 (ACK,NAK) rcvr->sender
- 重传
rdt2.1
如果ACK/NAK发生错误/被破坏(corrupted)会怎么样?
发送方:
- 序号 加到分组上
- 两个序号 (0,1) 就可以满足
- 必须检查是否收到混淆的 ACK/NAK
- 状态加倍:状态必须记住当前的分组是1号还是0号
接收方:
- 必须检查分组是否重复:当前所处的状态提供了期望收到的分组。
- 注意:接收方并不知道它的上一个ACK/NAK 是否被发送方正确收到
rdt2.2: 无NAK的消息协议
- 同 rdt2.1一样的功能, 但只用 ACKs
- 接收方通过ACK告知最后一个被正确接收的分组
- 在ACK消息中显式地加入被确认分组的序列号
- 发送方收到重复ACK之后,采取与收到NAK消息相同的动作,重传当前分组
Rdt3.0: 具有出错和丢失的信道
新假设: 下层信道还要丢失报文 (数据或者 ACKs)。校验和, 序号, 确认, 重发将会有帮助,但是不够
发送者等待“合理的”确认时间
- 如果在这个时间内没有收到确认就重发
- 如果报文(或者确认)只是延迟 (没有丢失):
- 重发将导致重复,但是使用序号已经处理了这个问题
- 接受方必须指定被确认的报文序号
- 要求倒计时定时器:只有在定时器超时时才触发重发
性能问题
利用率 ——发送方忙于发送的时间部分的比率
Rdt3.0采用停等协议所以效率特别低,因此我们采用流水线技术(发送方允许发送多个、“传输中的”、还没有确认的报文)
流水线技术的两个通用形式:go-Back-N, 选择性重传
Go-Back-N:
发送方:
累积确认 cumulative ACK, ACK(n): 确认所有的分组,直到 (包括)序号 n
接收到 ACK(n): 移动窗口到 n+1 开始处
对最先(第一个)传输中的分组设定定时器
timeout(n):重传窗口中的分组 n 以及更高序号的分组(只有一个定时器记录最早的未被确认分组的发送时间)
接收方
总是为正确接收的最高序号的分组发送ACK
选择性重传
发送方
- 从上层收到数据 :
- 如果下一个可用的序号在发送方窗口内,则将数据打包并发送,启动定时器
- 超时(n):
- 重发分组n, 重启定时器
- 收到ACK(n)在[sendbase,sendbase+N-1]内:
- 标记分组n被接收
- 如果n是最小的未确认分组,则增加窗口基序号到下一个未被确认的序号
接收方
- 分组n的序号在[rcvbase, rcvbase+N-1]内
- 发送ACK(n)
- 失序分组: 缓冲
- 有序分组: 交付上层 (包括已经缓冲的有序分组), 提高窗口到下一个没有接收的分组
- 分组n在[rcvbase-N,rcvbase-1]内
- 发送ACK(n)
- 其他:
- 忽略
总结
面向连接的传输: TCP
概述
-
点到点:
一个发送者,一个接收者
-
可靠按序的字节流:
没有“信息边界”
-
流水线:
TCP 拥塞和流量控制设置窗口大小
-
收发缓冲区
-
全双工数据:
同一个连接上的双向数据流
MSS: 最大报文段长
-
面向连接:
在数据交换前握手(交换控制信息)
连接状态只在连接的两端中维护,在沿途节点中并不维护状态。
TCP连接包括:两台主机上的缓存、连接状态变量、socket等
-
流量控制:
发送方不会淹没接收方
TCP 报文段的首部格式
序号字段
。占4B。TCP是面向字节流的(即TCP传送时是逐个字节传送的),所以TCP连接传送的数据流中的每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。确认号字段
。占4B,是期望收到对方的下一个报文段的数据的第一个字节的序号。若确认号为N,则表明到序号N- 1为止的所有数据都已正确收到。数据偏移(即首部长度)
。占4位,这里不是IP数据报分片的那个数据偏移,而是表示首部长度,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移”的单位是32位(以4B为计算单位)。因此当此字段的值为15时,达到TCP首部的最大长度60B
TCP可靠数据传输
TCP在IP不可靠服务的基础上创建可靠数据传输服务
- 流水线发送报文段
- 累积确认
- 使用单个重传计时器
TCP 快速重传
超时周期往往太长,重传丢失报文之前要等待很长时间,因此增加了网络的时延
如果发送方收到相同数据的3个其他ACK(“三个重复ACK”),则重新发送具有最小序号的未确认的报文段,那么未确认的报文段很可能丢失了,所以不必等待超时
TCP 流量控制
接收方控制发送方,因此发送方不会由于发送太多、发送得太快而使接收方的缓冲区溢出
TCP 接收方通过在TCP头部中包含 rwnd 域,通告其接收缓冲区的剩余空间 (假设 TCP 接收方丢弃失序的报文段)
TCP 连接管理
发送方/接收方在进行数据交换之前,需先进行“握手” :
- 同意建立连接(彼此知道对方愿意建立连接)
- 同意连接参数(例如,初始序号 seq #, 接收缓冲区大小 rcvBuffer)
TCP 拥塞控制
TCP所采用的方法是端到端的拥塞控制:(另一种是路由器利用数据流通过拥塞的路由器,向发送/接收主机提供直接反馈)
- 不从网络中得到明确的反馈
- 从端系统根据观察到的时延和丢失现象推断出拥塞
AIMD
方法:发送方增加发送速率,直到丢包(拥塞)发生,然后在发生丢包事件时降低发送速率
TCP 发送方如何感知网络拥塞:
- 丢包事件:超时 或者 3个重复ACK
- 发生丢包事件后,TCP发送方降低速率 (拥塞窗口 cwnd)
TCP 慢启动 (slow start)
当连接开始的时候,以指数速率增加发送速率,直到第1次报文丢失事件发生为止:
- 初始,拥塞窗口值 cwnd = 1 MSS
- 每 RTT 倍增 cwnd
- 每收到一个ACK,增加 cwnd
TCP:从慢启动进入到拥塞避免
当 cwnd 达到慢启动阈值 ssthresh时变为线性增长
对拥塞事件的反应
当超时事件发生时:
-
CongWin 立即设置为 1个 MSS;
-
窗口开始指数增长(进入慢启动)
-
到达一个阈值后再线性增长
-
ssthresh = cwnd/2, cwnd = 1*MSS,进入慢启动状态
收到三个重复的确认时:
- CongWin 减半+3 (Reno版)
- 然后,窗口线性增长(快速恢复)
- ssthresh = cwnd/2, cwnd = ssthresh + 3*MSS, 进入快速恢复状态
第4章-网络层
网络层的功能
- 转发(forwarding): 将分组从路由器的输入端口转移到正确的路由器输出端口
- 路由(routing): 确定分组从发送方传输到接收方(目的主机)所经过的路径(或路由)
- 连接建立:指网络层数据分组开始传输前,在所选择的从源到目的地路径上的各路由器之间相互握手,建立连接状态
网络层的服务模型
传输层:面向连接服务在网络边缘的端系统中实现。
网络层:面向连接服务在端系统及网络核心的路由器中实现。
数据报
提供网络层的无连接服务,不事先为分组的传输确定路径,每个分组独立确定
路由器不需要维护端到端连接的状态
使用目的主机的地址进行分组转发
虚电路
提供网络层的连接服务,端系统每次建立虚电路时,选择一个未用过的虚电路号
分配给该虛电路,以区别于本系统中的其他虚电路。
虚电路之所以是“虚”的,是因为这条电路不是专用的,每个结点到其他结点之间的链路可能同时有若干虚电路通过,也可能同时与多个结点之间建立虚电路
路由器
路由器体系结构
输入输出端口
第一个线路端接模块:将一条物理链路端接到路由器的物理层;
第二个数据链路处理模块:实现路由器的数据链路层功能;
第三个查找与转发模块:实现查找与转发功能,以便分组通过路由器交换结构转发到适当的输出端口;
查找/转发模块
确定将一个到达的分组通过交换结构转发给哪个输出端口。 通过查找转发表实现,这里的转发表是存储在输入端口的内存中
转发表:每台路由器有一张。目的地址与链路接口的映射表。
最长匹配原则
对于给定的目的地址,使用最长地址前缀匹配来完成输出端口的查找
交换结构
将分组从输入端口缓存交换(转发)到恰当的输出端口缓存中
交换速率:数据包从输入传输到输出的速率
输入 / 输出端口排队
当交换结构的速度慢于输入端口的速度,就会在输入端口的缓冲区发生排队,进而会导致排队延时和由于输入缓冲区溢出导致的丢包!
当交换结构将分组交付给输出端口的速率超过输出链路速率,就需要排队与缓存管理功能。当输出端口的缓冲区溢出时,就会出现丢包。
IPv4
数据报结构
- 首部长度——占 4 位,可表示的最大数值是 15 个单位(一个单位为 4 字节),因此 IP 的首部长度的最大值是 60 字节
- 片偏移(13 位)指出:较长的分组在分片后,某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。
- 生存时间(8 位)记为 TTL (Time To Live),数据报在网络中可通过的路由器数的最大值。数据报每经过一台路由器,TTL值减1。若TTL=0,则该数据报必须丢弃。
- 标志(flag) 占 3 位,
- 第1位:保留,一般置为0
- 第2位:“不分片位”,DF (Don’t Fragment) 。只有当 DF = 0 时才允许分片。
- 第3位:“更多片位”,MF (More Fragment)。MF = 1 表示后面“还有分片”。MF = 0 表示最后一个分片。
- 上层协议(8位)字段:指出此数据报携带的数据使用何种协议,以便目的主机的 IP 层将数据部分上交给哪个处理过程
IP地址
IP 地址: 分配给主机或路由器接口的标识符
接口: 主机/路由器与物理链路之间的边界
- 路由器有多个接口
- 主机可以有多个接口
每个接口有一个IP地址
- IP地址有两种:IPV4和IPV6
- IPV4:32个二进制位长(4字节),常用点分十进制表示
- IPV6:128个二进制位长(16字节)常用冒号分隔表示
特殊IP地址段
- 本地回环地址
127.0.0.1-127.255.255.254
这是预留的一组IP地址,主要是用来识别主机本身的地址。也叫做“localhost”,一般用来测试。
- 私有地址(Private address)
10.x.x.x, 172.16.x.x-172.31.x.x, 192.168.x.x
这三个地址段被称为私有IP地址段,也就是局域网所使用的地址段,在公网上不能被路由
- 0.0.0.0
这个地址严格上来说都不是真正意义上的IP地址。主要是用来标识不清楚的网络和主机的。系统遇到无法识别的网络或主机的时候会统一的归纳到这个地址
- 255.255.255.255
这个地址是受限的广播地址。主要指一个网段内的所有主机
互联网中的IP地址
子网划分
划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。
从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位
划分子网只是把 IP 地址的主机号 host-id 这部分进行再划分,而不改变 IP 地址原来的网络号 net-id。
定义子网的方法
将每个接口与其主机或路由器分离,创建隔离网络的“孤岛”
每个隔离的网络称为一个子网
动态主机配置协议
DHCP概述:
- 主机广播 “DHCP DISCOVER” (发现报文)
- DHCP 服务器用 “DHCP OFFER” (提供报文)进行响应
- 主机请求IP地址: “DHCP REQUEST” (请求报文)
- DHCP 服务器分配IP地址 “DHCP ACK/NACK” (确认报文)
- DHCP 终止租用期”DHCP RELEASE”(终止报文)
DHCP分配的不仅仅是IP地址,还可分配:
- 客户的第一跳路由器的地址(网关)
- DNS服务器的IP地址或域名
- 子网掩码
DHCP是应用层协议
NAT: 网络地址转换
动机:
对外部网络来讲,本地网络中所有设备只用一个IP地址
- 不需要从 ISP分配一系列地址—— 只要一个IP地址用于所有设备
- 在本地网络,改变设备的IP地址不用通知外部世界
- 可以变更 ISP ,不用改变本地网络的设备的地址
- 本地网络内部设备不能被外部世界明确寻址,或是不可见 (增加了安全性)
实现:
(在NAT转换表中) 记录每个(源IP 地址, 端口号)到 (NAT IP地址, 新端口号) 转换配对
进来的分组:对每个进来的分组,用保存在NAT表中的对应的 (源IP 地址, 端口号) 替换分组中的目的域 (NAT IP 地址, 新端口号)
IPv6
IPv6首部
与 IPv4比较,
- 无首部长度:IPv6 首部长度固定为 40 字节
- 无校验和:全部去掉,减少每一跳的处理时间
- 无选项(使得首部固定为40字节):使用扩展首部来实现选项功能。
- 总长度 -> 有效载荷长度
- 协议字段 -> 下一个首部
- TTL 字段 -> 跳数限制
- 无分片/组装
IPv6地址表示
IPv6 使用冒号十六进制记法
在十六进制记法中,允许把数字前面的 0 省略。例如把 0000 中的前三个 0 省略,写成 1 个 0。
路由选路方法
控制平面
每个路由器中的各个路由算法组件都在控制平面中进行交互
路由算法分类
动态路由算法包含全局路由算法和分布式路由算法
链路状态选路算法
Dijkstra最低费用路径算法
- 所有节点知道网络拓扑,以及每条链路的费用信息
- 通过链路状态广播来实现
- 所有节点拥有相同的信息
- 计算任意一个节点(源节点)到所有其他节点的最低费用路径
- 给出该节点的转发表
- 迭代:通过k次迭代后可以知道到达k个目的节点的最低费用路径
- 基本思想:以源节点为起点,每次找出一个到源节点的费用最低的节点,直到把所有的目的节点都找到为止。
距离向量路由算法DV
距离向量路由算法是一种迭代的、异步的和分布式的算法。
- 分布式:每个节点都从其直接相连邻居接收信息,进行计算,再将计算结果分发给邻居。
- 迭代:计算过程一直持续到邻居之间无更多信息交换为止。
- 异步:不要求所有节点相互之间步伐一致地操作。
- 自我终结:算法能自行停止。
步骤:
对所有节点:
- 从邻居接收距离向量
- 计算它们的新的本地距离向量
- 将新的本地距离向量发送给邻居
层次选路
网络并不是“平面的”,一个区域内的路由器组成集合 “自治系统”(AS,autonomous system),同一个自治系统的路由器运行相同的路由协议——区域内路由协议,不同自治系统内的路由器可以运行不同的区域内路由协议
域(自治系统)内路由选择
使用域内路由协议,也被称作内部网关协议 (IGP)
标准的域内路由协议:
- RIP: 路由信息协议——使用UDP传输
- OSPF: 开放式最短路径优先——使用IP传输
- IGRP: 内部网关路由协议 (Cisco 所有)
OSPF (Open Shortest Path First)
OSPF 优点 (RIP所没有的)
-
安全:所有OSPF 消息需要认证 (防止恶意入侵)
-
允许多个相同开销的路径 (在 RIP中只有一条路径)
-
对于每个链路,有多个消费尺度用于不同的服务类型TOS (例如在尽力转发时卫星链路代价设置为 “低” ,而对实时应用设置为高)
-
单播和多播综合支持
-
在大的区域中使用层次 OSPF
Internet 域间选路: BGP
lBGP (Border Gateway Protocol):事实上的标准域间路由协议,将Internet “粘合”为一个整体的关键
lBGP 为每个 AS 提供了一种手段:
- eBGP:从相邻AS获取子网可达信息
- iBGP:向该AS内部的所有路由器传播这些子网的可达信息
- 基于该可达信息和AS策略,决定到达子网的“好”路由
- 允许一个子网向Internet的其他部分通告它的存在 “I am here”
AS互连与AS域间任务
转发表根据AS内和AS间选路算法而配置
- AS域内的选路项用于目的端在域内的选路。
- AS域内和AS域间的选路项用于目的端在域外的选路
AS1 需要知道:
- 通过AS2和AS3可以到达哪些目的端
- 将这些可达信息传播给AS1内的所有路由器
- 这就是域间选路的任务
BGP通道
当AS3通告一个前缀给AS1:
- AS3承诺能够将数据报转发该子网
- AS3能够在它的通告中汇聚网络前缀。
路径属性
当通告前缀时,通告包含了BGP属性.:前缀+属性=“路由”
两个重要的属性:
- AS-PATH: 包含了前缀的通告已经通告过的那些AS,如 AS67,AS17
- NEXT-HOP: 指出到达下一个AS的具体AS间边界路由器(可能存在多条从当前AS到达下一个AS的链路)
当网关路由器接收到路由通告时,使用输入策略来决定接收/舍弃该通告。
为什么AS内选路和AS间选路采用不同的协议 ?
策略:
- AS间:管理员想控制本AS内产生的通信流怎样选路,以及什么通信流穿过自己的网络
- AS内:单个管理者,因此不需要策略
规模:
- 层次路由节省了转发表的大小空间,减少了路由更新的流量
性能:
- AS内:集中在性能上
- AS间:策略可能比性能更加重要
SDN(软件定义网络)
SDN并不是一个具体的技术,它是一种网络设计理念,规划了网络的各个组成部分(软件、硬件、转发面和控制面)及相互之间的互动关系。
SDN的核心思想是建立一个通用转发体系 ——每个交换设备包含一个流表(flow table)。流表由一个逻辑上中心化的控制器(远程控制器)来计算和分发。
SDN体系结构和特征
特征:
- 基于流的转发:基于首部字段值进行转发
- 数据平面与控制平面分离:数据平面网络交换机组成,控制平面由服务器和管理流表软件构成。
- 网络控制功能:位于数据平面交换机外部,包括SDN控制器和若干网络控制程序。
- 可编程的网络:调用API定义和控制网络设备的数据平面。
SDN控制器的组件
第5章-数据链路层
链路层提供的服务
数据链路层的职责是将数据报从一个节点传送到与该节点直接有物理链路相连的另一个节点。
-
组帧 (framing):
封装数据报为数据帧,增加头部(e.g.,地址信息),尾部信息(e.g.,差错编码信息)帧同步(e.g.,帧定界符)
-
链路接入( link access)
如果是共享链路,需要解决信道接入(channel access)
在数据帧头部中,用MAC地址来标识源和目的,不同于IP地址
-
在相邻节点之间可靠传输数据帧(某些链路可能未实现)
在比特错误率很低的链路(光纤、双绞线)很少使用
无线链路:高比特错误率,需要可靠交付
-
流量控制(flow control):
用于控制发送节点向直接相连的接收节点发送数据帧的频率
-
差错检测(error detection):
差错可能由信号衰减、噪声引入
接收方检测是否出现错误:
通知发送方重传或丢弃数据帧
-
错误纠正(error correction):
接收方标识和纠正比特错误,而不需要请求重传
-
半双工和全双工(half-duplex and full-duplex):
在半双工模式,链路的两个节点都可以发送数据,但是不能同时发送
差错检测和纠错
三种主要差错检测技术
奇偶校验:最基本的方法。
一比特奇偶校验
发送方:
在要发送的信息D(d位)后面附加一个奇偶校验位,使“1”的个数是奇数(奇校验)或偶数(偶校验),一起传输发送(d+1位)。
接收方:
检测收到的信息(d+1位)中“1”的个数。偶校验:发现奇数个“1”,至少有一个比特发生差错(奇数个比特差错)。奇校验:发现偶数个“1”,至少有一个比特发生差错。
二维奇偶校验
基本思想:
将要传信息D(d比特)划分为i行j 列(i 个组,每组j位);对每行和每列分别计算奇偶值;结果的i+j+1个奇偶比特构成了帧的差错检测比特。
Internet校验和:常用于运输层
发送方:
将数据的每两个字节当作一个16位的整数,可分成若干整数;
将所有16 位的整数求和;
对得到的和逐位取反,作为检查和,放在报文段首部,一起发送。
接收方:
对接收到的信息 (包括检查和)按与发送方相同的方法求和。
全“1”:收到的数据无差错;
其中有“0”:收到的数据出现差错。
循环冗余检测CRC:常用于链路层
计算机网络中广泛采用
基本思想:
设发送节点要把数据D(d 比特)发送给接收节点。
发送方和接收方先共同选定一个生成多项式 G(r+1比特),最高有效位 (最左边)是1。
循环冗余检测CRC (cyclic redundancy check)编码:
即多项式编码,把要发送的比特串看作为系数是0或1的一个多项式,对比特串的操作看作为多项式运算。
发送方:
计算出一个 r 位附加比特 R,添加到D的后面产生DR(d+r 比特
DR 能被生成多项式 G 模2运算整除,一起发送。
接收方:
用生成多项式 G 去除接收到的 DR(d+r比特)
余数非0:传输发生差错;
余数为0:传输正确,去掉尾部 r 位,得所需数据 D。
模2运算:
按位异或 (XOR),1001 XOR 1101 = 0100
R的计算:将数据D后面添加 r 个0,除以给定的生成多项式G,所得余数即为R(r 位)。
多路访问链路和协议
两种网络链路:
- 点对点链路:链路两端各一个节点。一个发送和一个接收。如点对点协议P2P。
- 广播链路:多个节点连接到一个共享的广播信道。
广播:任何一个节点传输一帧时,信号在信道上广播,其他节点都可以收到一个拷贝。常用于局域网LAN中,如早期的以太网和无线局域网。
多路访问协议
-
信道划分协议
把信道划分为小“片” (时隙)
给节点分配专用的小“片”
时分多路访问TDMA (time division multiple access):
将时间划分为时间帧,每个时间帧再划分为N个时隙(长度保证发送一个分组),分别分配给N个节点。每个节点只在固定分配的时隙中传输。
频分多路访问FDMA (frequency division multiple access):
将总信道带宽 R b/s划分为 N 个较小信道(频段,带宽为R/N),分别分配给 N 个节点。
-
随机访问协议
不划分信道,允许冲突
发送节点以信道全部速率(R b/s)发送;
发生冲突时,冲突的每个节点分别等待一个随机时间,再重发,直到帧(分组)发送成功
节点间没有协调者
纯 ALOHA
帧一到达,立即传输,如果与其他帧产生冲突,在该冲突帧传完之后,以概率p立即重传该帧;
或等待一个帧的传输时间,再以概率p 传输该帧,或者以概率1-p 等待另一个帧的时间。
时隙ALOHA
所有帧大小相同
时间被划分为相同大小的时隙,一个时隙等于传送一帧的时间
节点只能在一个时隙的开始才能传送
假设有N个节点,每个节点在时隙以概率p发送
一个节点在一个时隙成功传送的概率 = p(1-p)N-1
-
轮流协议
通过轮流访问信道避免冲突,要发送的节点越多轮流时间越长
轮询(polling):
主节点“邀请”从节点依次传送
主节点首先向节点1发送一个报文,告诉它(节点1)能够传输的帧的最多数量。如果节点1有数据要发送,则最多可发送允许的最多数据的数据;
然后主节点会继续询问节点2,节点3。
令牌传递(token passing):
控制令牌顺序从一个节点传递到下一个节点。
当一个节点收到令牌时,仅当它有一些数据帧要发送时,它才持有这个令牌,否则,它立即向下一个节点转发该令牌。
当一个节点收到令牌时,如果它确实有数据帧要传输,它发送最大数目的帧数,然后把令牌转发给下一个节点。
多路访问控制协议的总结
信道划分:时分,频分,码分
随机接入:
- ALOHA, S-ALOHA, CSMA, CSMA/CD
- 载波侦听:在某些技术中容易实现(有线),在有些技术中比较困难(无线)
- CSMA/CD used in Ethernet
- CSMA/CA used in 802.11
轮流
- 来自中心站的轮询
- 令牌传递
局域网
局域网:Local Area Network ( LAN )
主要特点:网络为一个组织所拥有,且地理范围和站点数目均有限
网络拓扑结构
•辐射状连接
•中央结点集中式通信控制
•优点:结构简单,访问协议简单,单个节点的故障不会影响到整个网络。
•缺点:对中央结点的可靠性要求很高,一有故障,全网瘫痪。
•优点:结构简单,易于扩充
•缺点:故障检测比较困难
•站与站点之间首尾相接,形成一个环,数据只能沿单方向传输
•优点:这种结构适合于光纤介质。实时性较强
•缺点:如果处理不当,站点的故障会引起全网故障
它与星型结构相比降低了通信线路成本,增加了网络复杂性
链路层寻址和ARP
每个节点有网络层地址和链路层地址。
- 网络层地址:节点在网络中分配的一个唯一地址(IP地址)。用于把分组送到目的IP网络。长度为32比特(IPv4)。
- 链路层地址:又叫做MAC地址或物理地址、局域网地址。
用于把数据帧从一个节点传送到另一个节点(同一网络中)。
- MAC地址(LAN地址、物理地址):
节点“网卡”本身所带的地址(唯一)。
MAC地址长度通常为6字节(48比特),共248个。
6字节地址用16进制表示,每个字节表示为一对16进制数
网卡的MAC地址是永久的(生产时固化在其ROM里)
地址之间如何进行转换:
MAC地址
MAC 地址是平面结构:带有同一网卡的节点,在任何网络中都有同样的MAC地址。
IP地址具有层次结构:当节点移动到不同网络时,节点的IP地址发生改变。
MAC地址识别
- 广播信道的局域网中,一个节点发送的帧,在信道上广播传输,其他节点都可能收到该帧。
- 大多数情况,一个节点只向某个特定的节点发送。
- 由“网卡”负责MAC地址的封装和识别。
- 发送适配器:将目的MAC地址封装到帧中,并发送。所有其他适配器都会收到这个帧。
- 接收适配器:检查帧的目的MAC地址是否与自己MAC地址相匹配:
匹配:接收该帧,取出数据报,并传递给上层。
不匹配:丢弃该帧。
主机名 → IP地址 → MAC地址
DNS域名系统:将主机名解析到IP地址。
DNS为在因特网中任何地方的主机解析主机名。
ARP地址解析协议:将IP地址解析到MAC地址。
ARP只为在同一个LAN上的节点解析IP地址。
ARP协议: 地址解析协议
ARP表: 局域网上的每个节点(主机、路由器)都有这个表 < IP address; MAC address; TTL>
为某些局域网节点进行 IP <-> MAC地址映射:
TTL (存活时间): 地址映射将被删除的时间(通常为20分钟)
两个主机位于同一个局域网
- 主机A希望发送数据报给主机B,B的MAC地址不在A的ARP映射表中
- 主机A 广播 ARP查询分组, 其中包含B的IP地址 ,目的MAC地址 = FF-FF-FF-FF-FF-FF
- 局域网中所有节点收到ARP查询分组
- 主机B收到ARP查询分组,返回B的MAC地址给主机A,包含有B的MAC地址的帧发送给主机A(单播)
发送数据报到子网以外
主机A经路由器R发送数据报给主机B
集中在寻址上——IP层(数据报)和MAC层(数据帧)
- 假设主机A知道主机B的IP地址
- 假设主机A知道第一跳路由器R的IP地址(通过DHCP协议)
- 假设主机A知道路由器R的MAC地址(通过ARP协议)
-
主机A构建IP数据报,源地址是A的IP地址,目的地址是B的IP地址
主机A构建链路层数据帧,目的MAC地址是路由器左边端口的MAC地址
-
数据帧从主机A发送到路由器R
路由器R收到数据帧,抽取出数据报递交到IP层
-
路由器R转发数据报,源地址为A的IP地址,目的地址为B的IP地址
路由器R将该数据报封装成链路层帧,目的MAC地址为主机B的MAC地址
以太网(Ethernet)
不可靠的无连接服务
**无连接服务:**通信时,发送方适配器不需要先和接收方适配器“握手”。
不可靠的服务:
- 接收到的帧可能包含比特差错。
- 收到正确帧,不发确认帧;收到出错帧,丢弃该帧,不发否定帧。
- 发送适配器不会重发出错帧。
- 丢弃数据的恢复是通过终端传输层的可靠数据传输机制来实现的
- 以太网并不知道是传输新数据,还是重传数据。
以太网的帧结构
发送方:发送适配器将IP数据报封装成以太网帧,并传递到物理层。
接收方:接收适配器从物理层收到该帧,取出IP数据报,并传递给网络层。
前同步码(8 字节)
使接收方和发送方的时钟同步,接收方一旦收到连续的8字节前同步码,可确定有帧传过来。
前同步码是“无效信号”,接收方收到后删除,不向上层传送。
源、目的MAC地址(各6字节)
主机A向主机B发送一个IP数据报
那么适配器B只接收目的地址与其MAC地址匹配或广播地址的帧,并将数据字段的内容传递给网络层。否则,丢弃该帧。
类型字段(2 字节)
以太网可以“多路复用”(支持)多种网络层协议,接收适配器根据“类型”字段,将数据字段传递给相应的网络层协议
数据字段(46~1500 字节)
以太网的最大传输单元MTU是1500字节:若IP数据报超过1500字节,必须将该数据报分段。
最小长度是46字节:如果IP数据报小于46字节,必须填充为46字节。接收方网络层去除填充内容。
循环冗余检测CRC(4字节)
检测数据帧中是否出现比特差错(翻转)
链路层交换机
支持多节点同时传输
每个主机由单独的链路直接连到交换机端口
交换机可以缓存数据帧
以太网协议在每个输入链路使用,无碰撞,全双工,每条链路自身是一个碰撞域(A-to-A‘和B-to-B’可以同时传输,而不会发生碰撞)
通过自学习构建转发表
当收到数据帧时,交换机“学习”发送主机的位置:进入的局域网网段(到达端口)
在转发表中记录发送主机/位置对
数据帧的过滤/转发
当交换机收到数据帧:
-
记录到达链路和发送主机的MAC地址
-
使用数据帧的目的MAC地址,在转发表中检索
-
IF在转发表条目中找到对应的MAC地址
Do{
**IF** 目的MAC地址对应的端口与数据帧的达到端口相同
Then 丢弃该数据帧
Else 转发该数据帧到条目指定的端口
}
-
Else,向除到达端口之外的所有端口转发**(flood)**——泛洪
三层交换
- 发送站点A在开始发送时,把自己的IP地址与B站的IP地址比较,判断B站是否与自己在同一子网内。
- 若目的站B与发送站A在同一子网内,则进行二层的转发。
- 若两个站点不在同一子网内,则发送站A要向“缺省网关”发出ARP请求,请求获得B的MAC地址。
- 如果三层交换机知道B的MAC地址,则向A回复B的MAC地址。否则三层交换机根据路由信息向B站广播一个ARP请求,B站得到此ARP请求后向三层交换机回复其MAC地址,三层交换机将B站的MAC地址保存到二层交换引擎的MAC地址表中,并回复给发送站A。
- A直接用B的MAC地址封装数据帧,三层交换机接收到数据后直接进行二层交换(数据链路交换)。
VLAN
Virtual Local Area Network:利用支持VLAN的交换机,可以在一个实际的物理局域网内,定义多个虚拟的局域网
基于端口的VLAN: 利用交换机内置的管理软件,将端口分组,使得一个单独的交换机像多个交换机一样工作。
Trunk Port(干线端口): 每台交换机上的一个特殊端口被配置为干线端口,干线端口属于所有VLAN,发送到任何VLAN的帧经过干线链路转发到其他交换机
第六章-物理层
第七章-网络编程
基本概念
服务器和客户机
服务器:
- 总是打开的主机
- 具有固定的、众所周知的IP地址
- 主机群集常被用于创建强大的虚拟服务器
客户机:
- 同服务器端通信
- 可以间断的同服务器连接
- 可以拥有动态IP地址
- 客户机相互之间不直接通信
并发与并行
并行(Parallelism):真正同时发生
并发(Concurrency):看起来同时发生一般采用分时机制
字节序
字节(Byte):
- 传输和存储信息的最小单位。
- 各种数据类型,都是由字节构成。
主机字节序(Big-Endian | Little-Endian):
- 不同类型的机器处理数据时,会按特定的字节排列顺序读取存储器。
网络字节顺序(Network-Endian)
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。
网络字节顺序采用Big-Endian排序方式,总是从低位地址开始传输。
发送数据包时,程序将主机字节序转换为网络字节序;接收数据包时,则将网络字节序转换为主机字节序。
数据结构对齐
对齐系数
- 每个特定平台的编译器都有自己的默认“对齐系数” 。
- 通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是指定的“对齐系数”。
结构体对齐规则:
- 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
- 结构体每个成员相对结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
- 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
数据结构对齐
平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的。
性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
Socket套接字与循环服务器
主动套接字和被动套接字
创建方式相同,使用方式不同
- 被动:等待传入连接的套接字,如服务器套接字
- 主动:发起连接的套接字,如客户端套接字
指明端到端地址:创建时不指定,使用时指明
- TCP/IP需要指明协议端口号和IP地址
- TCP/IP协议族:PF_INET
- TCP/IP地址族:AF_INET
- 注意:具有相同的数字值,防止误用
地址结构
Socket 通用地址结构sockaddr
Socket是传输层/网络层编程接口,由于传输层/网络层的各种实现不同,可能会有不同的编址方案。通用地址为了适应这种需求而定义。
循环服务器Socket编程基本步骤
TCP
UDP
地址转换函数小结
ipv4映射地址:即ipv4映射的ipv6地址。如ipv6地址::ffff:10.0.0.1可以表示ipv4地址 10.0.0.1。
ipv4兼容地址:即ipv4兼容的ipv6地址。如::0102:f001相当于地址::1.2.240.1。