一、计算机网络和因特网
1、Internet
计算机网络:两台以上具有独立操作系统的计算机通过某些介质连接成的相互共享软硬件资源的集合体
因特网服务提供商ISP(Internet Service Provider)
两大功能:连通性、共享
具体构成:数以亿计的计算机互连设备、通信链路、分组交换机
服务描述:提供网络应用基础架构,为分布式应用程序提供的通信服务接口
组成部分:网络边缘、接入网、网络核心
分组交换(packet switching)技术
发送端将要发送的数据(报文)分成若干数据块,封装成分组,发送到目的端。目的端解封后恢复原数据。
路径(route或path):一个分组从发送端系统传输到接收端系统,所经过的一系列通信链路和分组交换机。
协议
定义了两个或多个通信实体间所交换报文的格式和顺序,以及在报文发送和/或接收或者其他事件方面所采取的行动(响应)
基本要素:
- 语法:报文格式
- 语义:每个字段的含义
- 同步:报文传输的先后次序
Internet文档RFC
RFC(Request For Comments)请求评论
四个阶段:
- 因特网草案(Internet Draft)-不是RFC文档
- 建议标准(Proposed Standard) -开始成为RFC文档
- 草案标准(Draft Standard)
- 因特网标准(Internet Standard)
2、网络边缘
- 端系统 (/主机):
- 运行网络应用程序
- 处在网络的边缘
- 传统主机/网络计算机和客户
- 客户/服务器 C/S模型
- 客户请求,并接收服务器提供的服务
- 端对端模型peer-peer model:
- 极少或不采用专门服务器
- 接入网 (network access):
- 将端系统连接到其边缘路由器的物理链路。
- 是用户连接到网络的基础设施。
- 边缘路由器(edge router) :
- 端系统到任何其他远程端系统的路径上的第一台路由器。
家庭接入网络
点对点接入
数字用户线DSL:使用传统的电话线路连接本地中心局,数据通信和电话采用频分多路复用技术。
线缆调制解调器:cable modems
HFC:(hybrid fiber coaxial cable)混合光纤同轴电缆
电缆调制解调器
非对称
共享广播媒体:
- 光节点发送的分组经下行信道传输到每个家庭:若几个用户同时下载,实际接收速率下降。
- 每个家庭发送的分组经上行信道向光节点传输:几个用户同时发送分组将会冲突,需要相应多路访问协议协调
FTTH(Fiber To the Home) - 光纤到户
从本地局端直接到每个家庭提供一条光纤路径
从中心局出来的每根光纤由多个家庭共享,在临近家庭的位置,通过光纤分配器,才为每个家庭提供一根光纤
- ONT光纤网络端接器(家庭端)
- OLT光纤线路端接器(电信公司端)
企业接入网络
LAN:local area networks
WIFI无线接入网路
广域无线接入网络
广域无线接入网:wide-area wireless access
典型技术:
- 利用移动电话设施接入:欧洲的无线接入协议WAP 、日本的i模式(i.mode)。
- 分组交换接入:第三代无线3G技术、4G技术。
物理媒体
定义:将网络中不同节点(主机和路由器)互相连接起来的物理线路。
是进行数据传输的物理通路,通过传播电磁波或光脉冲来发送比特流。也称为传输媒体、传输介质或传输媒介。
分类:
- 导引型媒体:电磁波沿着固体媒体传播。如双绞线、同轴电缆或光缆等。
- 非导引型媒体:电波在空气或外层空间中传播。如无线电等
双绞线
两根彼此绝缘、相互缠绕成螺旋状的铜线。缠绕的目的是减少电磁干扰,提高传输质量。
- 屏蔽双绞线(STP, Shielded Twisted Pair)
- 非屏蔽双绞线 (UTP, Unshielded Twisted Pair )
同轴电缆
两根彼此绝缘的同心导体,双向传输
光纤电缆
- 光纤传导光脉冲, 每个光脉冲代表1位
- 高速传输:高速点对点传输
- 低误码率: 中继到更远传输距离 ; 防止电磁干扰,难以被分光窃听。
- 多模光纤MMF,单模光纤SMF
无线电信道
- 利用无线电波在自由空间传播实现通信
- 传播环境的影响
- 无线链路类型
- 卫星无线电信道
端系统上的因特网服务
面向连接服务TCP
无连接服务UDP
3、网络核心
电路交换 (circuit switching)
面向连接的
预留带宽,独占资源
- 预留端到端资源:端系统之间通信路径上所需要的资源 (缓存,链路带宽)。建立连接。
- 发送方以恒定速率向接收方传送数据。
- 如:电话网络。
每条链路可有n条电路,能够支持n条同步连接
通信过程:
- 在两台主机A、B之间创建一条专用的端到端连接,分别占用每条链路中的一条电路;
- 该连接获得链路带宽的1/n,进行通信。
多路复用:在一条传输链路上同时建立多条连接,分别传输数据。
频分多路复用FDM(frequency-division multiplexing)
- 链路的频谱由跨越链路创建的连接所共享。
- 按频率划分若干频段,每个频段专用于一个连接。
- 带宽bandwidth:频段的宽度,如8kHz。
时分多路复用TDM (time-division multiplexing)
- 时间划分为固定区间的帧,每帧再划分为固定数量的时隙,每一个时隙专用于一个连接,用于传输数据。
缺点:
- 效率低:静默期(无数据传输)专用电路空闲,网络资源被浪费;
- 创建端到端电路及预留端到端带宽的过程复杂。
分组交换(packet switching)
共享带宽,竞争资源
- 不需要资源预留
- 按需使用资源,可能要排队等待:
- 如:因特网。
报文(message):应用程序要传输的信息
工作过程:
- 源主机将报文划分为一些列较小的数据块,封装成分组(packet);并将每个分组通过若干链路和分组交换机,传送到目的主机;
- 目的主机拆分分组,提出数据块,并按顺序重新组装成报文。
每个分组使用全部链路带宽:分组以链路的最大传输速率传输。
传输过程中采用存储转发传输机制:分组交换机先将输入端的整个分组接收下来(存储),再从输出链路转发传输出去(转发)。
- 每经过1个节点转发一次
- 在1个链路上传输
- 转发分组前,要求收到完整分组
输出缓存 (输出队列): 用于保存准备发往某个链路的分组。每条相连的链路都对应有一个。
排队时延:分组在输出缓存中等待转发的时间。它变化的,与网络中的拥塞有关。
分组丢失: 当缓存空间已满时,有分组要被丢弃
路由器:接收分组,然后根据分组目的主机地址信息,将分组按自己的转发表查找到相应的输出链路并转发,最终能使分组到达目的主机。
路由选择协议:自动的对自己维护的转发表进行设置
优点:允许更多用户使用网络
缺点:过度竞争导致分组延迟与丢失,需要可靠数据传输,拥塞控制协议
分类:
- 数据报网络:TCP/IP:可以提供面向连接的服务也可以提供无连接服务
- 虚电路网络:X.25,FR,ATM:一定面向连接
几种交换技术:
- 电路交换:整个报文的比特流连续地从源点直达终点,好像在一个管道中传送。
- 报文交换:整个报文先传送到相邻结点,全部存储下来后,再转发到下一个结点。
- 分组交换:单个分组(只是整个报文的一部分)传送到相邻结点,存储下来后,再转发到下一个结点。
4、ISP
第一层:国家/国际级ISP
第二层:区域级ISP
第三层:本地ISP或接入ISP
5、分组交换网络的延迟,丢失和吞吐量
- 节点(主机或路由器)处理时延:nodal processing delay 检查比特级的差错,检查分组头部,选择输出链路
- 排队时延:queueing delay 等待被发送到输出链路上的时间 取决于拥塞程度
- 传输时延:Transimission delay 发送分组比特流的时间 = L/R R=链路带宽 (bps) L=分组长度 (bits)
- 传播时延:propagation delay 传播延迟 = d/s d = 物理链路长度 s = 介质的信号传播速度 (~2x108 m/sec)
$$
d_{nodal}=d_{proc}+d_{queue}+d_{trans}+d_{prop}
$$
流量强度(traffic intensity) = La/R
a=平均分组到达速率 average packet arrival rate
- La/R ~ 0: 分组稀疏到达,无队列,平均排队延迟极小,接近于0
- La/R -> 1: 分组猝发到达,形成队列,队列长度迅速增加,排队延迟大幅增大
- La/R > 1: 输出队列平均位到达速率超过送走这些位的极限速率,输出队列持续增长,排队延迟趋于无穷大。
分组丢失
- (1)路由器输入链路和输出链路的缓冲区容量有限
- (2)当分组到达路由器输入链路发现缓冲区已满,则路由器只好丢弃分组
- (3)当分组在路由器内部要转发到输出链路时,发现输出缓冲区队列已满,路由器只好丢弃分组
丢失的分组可能被前路由节点、源节点重传,或不重传
丢包率/分组丢失率(packet loss rate/ratio)= 丢包数÷已发分组总数
Traceroute可检测和度量端到端时延
吞吐量(Throughout):接收端接收到数据的比特速率 (bps ) min(Rc,Rs)
- 瞬时吞吐量: 某一瞬间的吞吐量
- 平均吞吐量: 一段时间内的吞吐量均值
- 带宽是一条链路理论上的最大吞吐量
瓶颈链路(Bottleneck Link):端到端路径中制约吞吐量的链路
6、协议及其服务模型
- (1)计算机网络体系结构分为很多层,每层完成一个特定功能,层和层之间相互协作,底层为上一层提供服务,上层使用底层提供的服务(服务模型),实现本层的功能,再为上一层提供服务。
- (2)网络设计者以分层的方式组织协议,以及实现这些协议的网络软硬件。
- (3)一个协议层能够用软件、硬件或者两者结合实现
- (4)各层的所有协议称为协议栈,如因特网TCP/IP协议栈
优点:
- 使复杂系统简化
- 模块化的分层易于系统更新、维护
缺点:
- 有些功能可能在不同层重复出现:如,基于链路和基于端到端传输的差错恢复
- 某层的功能可能需要仅存在其他某层的信息(时间戳值)
协议栈(protocol stack):各层所有协议的集合
协议vs服务
- (1)协议的实现保证了能够向上一层提供服务。本层的服务用户只能看见服务,而无法看见下面的协议。下 面的协议对上面的服务用户是透明的。
- (2)协议是“水平的”,即协议是控制两个对等实体进行通信的规则。但服务是“垂直的”,即服务是由下层 通过层间接口向上层提供的。
ISO/OSI七层模型
表示层:通信用户之间数据格式的转换、数据压缩及加解密等。
会话层:对数据传输进行管理,包括数据交换的定界、同步,建立检查点等。
TCP/IP参考模型
实体: 定义自身功能的硬/软件的集合
对等实体: 两台计算机上同一层所属的程序、进程或实体称为该层的对等程序、对等进程或对等实体。
各层:
分布式
在各节点的网络实体(entities) 实现了各层的功能
主机实现5层功能,路由器和交换机实现2-3层功能。
网络实体完成功能动作, 对等实体交换消息
传送不同的协议数据单元PDU(Packet Data Unit)
- 每层传递的数据分为首部字段和有效载荷字段两部分。
- 有效载荷是相邻上层传下来的数据。
PDU:头部+负载,头部主要包括编址信息和控制信息
PDU中的控制信息主要包括
- 地址(Address): 标识发送端/接收端
- 差错检测编码(Error-detecting code): 用于差错检测或纠正
- 协议控制(Protocol control): 实现协议功能的附加信息,如: 优先级(priority)、服务质量(QoS)、 和安全控制等
7、攻击威胁下的网络
1、植入恶意软件
- 病毒,病毒则在用户运行受感染文件后立即复制
- 蠕虫,蠕虫不需要任何人为操作即可复制
- 僵尸网络,植入恶意程序,使控制者通过相对集中若干计算机直接向大量计算机发送指令的攻击网络
2、攻击服务器和网络基础设施
- 拒绝服务攻击(Dos)
- 三种类型
- 弱点攻击:向目标主机上易受攻击的应用程序和操作系统发送精细的报文
- 带宽洪泛:向目标主机发送大量分组
- 连接洪泛:利用目标主机创建半开或全开的TCP连接
3、嗅探分组
4、伪装
5、修改或删除报文
8、发展史
Cerf and Kahn’s 开放网络体系结构的系统设计原则:
- 最简单化,自治原则 – 网络独立运作,与其他网络互连时无须进行内部改动
- 尽力服务原则– 提供尽最大努力的端到端服务
- 无状态路由器 – 路由器无须维护连接状态信息
- 分布式控制
Bob Kahn和Vint Cerf设计了TCP/IP协议和互联网基础架构而被共同称为“互联网之父”
二、应用层
1、应用层协议原理
客户/服务器体系结构
服务器
- 总是打开的主机
- 具有固定的、众所周知的IP地址
- 主机群集常被用于创建强大的虚拟服务器
客户机
- 同服务器端通信
- 可以间断的同服务器连接
- 可以拥有动态IP地址
- 客户机相互之间不直接通信
纯P2P体系结构
- 没有总是打开的服务器
- 任意一对主机直接相互通信
- 对等方间歇连接并且可以改变IP地址
优点:自扩展性
缺点:难以管理
进程通信
- 同一主机上的两个进程通过内部进程通信机制进行通信
- 不同主机上的进程通过交换报文相互通信
- 客户进程:发起通信的进程
- 服务器进程:等待联系的进程
套接字:应用程序编程接口API
进程寻址:IP+端口号
应用层协议
2、Web应用和HTTP协议
- 网页(Web页,或称文档)由许多对象组成。
- 对象就是文件,可以是HTML文件, JPEG图像, Java applet, 音频文件…
- 多数网页由单个基本HTML文件和若干个所引用的对象构成
- 每个对象被一个URL(Uniform Resource Locator统一资源定位符)寻址
HTTP
超文本传输协议 hypertext transfer protocol
HTTPS:443端口
client/server模式
- client: 浏览器browser请求, 接收, “解释显示” Web对象
- server: Web服务器响应请求,发送 Web对象
使用TCP:
- 客户初始化一个与HTTP服务器80端口的TCP连接 (创建套接字)
- HTTP服务器接受来自客户的TCP连接请求, 建立连接
- Browser (HTTP client)和Web服务器 (HTTP server) 交换HTTP消息(应用层协议消息)包括HTTP请求和响应消息
- 最后结束(或叫关闭)TCP连接
HTTP是无状态协议
非持久HTTP连接:每个TCP连接上只传送一个对象,下载多个对象需要建立多个TCP连接 HTTP/1.0
持久HTTP连接:一个TCP连接上可以传送多个对象 HTTP/1.1默认
非持久HTTP连接的问题:
- 每个对象需要2个RTT
- OS必须为每个TCP连接分配主机资源
- 大量客户的并发TCP连接形成服务器的严重负担
持久HTTP连接:
- 服务器发送响应消息后保持连接
- 同一客户/服务器的后续HTTP 消息继续在该连接上传送
不带流水线的持久HTTP连接:
- 客户先前响应消息收到,才发出新的请求消息
- 每个引用对象经历1个RTT
带流水线的持久HTTP连接 :
- HTTP/1.1默认使用
- 客户遇到1个引用对象就发送请求消息
- 所有引用对象只经历1个RTT
响应时间模型
往返时间RTT(Round-Trip Time):1个小分组从客户主机到服务器再到客户主机所花费的时间
响应时间:
- 1个RTT用于建立TCP连接
- 1个RTT用于HTTP请求/响应消息的交互
- Html文件传输时间
- total = 2RTT+transmit time
HTTP报文
请求报文:
HTTP/1.0
- GET
- POST
- HEAD:服务器收到请求时,用HTTP报文进行响应,但不返回请求对象
HTTP/1.1
- GET, POST, HEAD
- PUT:文件在实体主体中被上载到URL字段指定的路径
- DELETE:删除URL字段指定的文件
响应报文:
状态码:
- 200 OK 请求成功, 所请求信息在响应消息中返回
- 301 Moved Permanently 所请求的对象已永久迁移, 新的URL在本响应消息的(location:)头部指出
- 400 Bad Request 该请求不能被服务器解读
- 404 Not Found 服务器上不存在所请求文档
- 505 HTTP Version Not Supported
Cookie
目的:提高用户和服务器的交互性
- cookie头部行在HTTP请求消息中
- cookie头部行在HTTP响应消息中
- cookie文件保存在用户主机中并被用户浏览器管理
- cookie也保存在Web站点的后端数据库
客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等校验。
Web缓存(代理服务器)
目标:在不访问服务器的前提下满足客户端的HTTP请求
响应过程:
浏览器向缓存/代理服务器发送所有的HTTP请求,如果所请求对象在缓存中,缓存器返回对象,否则缓存器向起始服务器发出请求,接收对象后转发给客户机。
缓存既充当客户端,也充当服务器,一般由ISP(Internet服务提供商)架设
优点:
- 减少对客户机请求的响应时间
- 减少内部网络与接入链路上的通信量
- 能从整体上大大降低因特网上的Web流量
条件GET方法
目的:证实缓存器中的对象是否为最新
缓存器:在请求报文中包含对象最后修改时间 If-modified-since: <date>
服务器: 如果对象是最新的则响应报文中不包含对象: HTTP/1.0 304 Not Modified
3、文件传输协议FTP
FTP
File Transfer Protocol
传输文件到远程主机/从远程主机下载文件
client/server模式
- client: 发起传输的一方
- server: 远程主机
端口号:21
- FTP客户首先发起建立1个与FTP服务器端口号21之间的TCP控制连接
- 客户在建立的控制连接上获得身份认证
- 客户在建立的控制连接上发送命令来浏览远程主机的目录.
- 当服务器接收到1个文件传输命令时, 在服务器端口号20创建1个与客户的TCP数据连接1个文件传输后,服务器结束这个TCP数据连接.
控制连接:
- USER-PI(protocol interpreter):用户协议解释器
- SERVER-PI:服务器协议解释器
数据连接:
- user-DTP(Data Transfer Process):用户数据传输进程
- server-DTP:服务器数据传输进程
建立方式
主动模式:
- 客户端发送PORT命令
- PORT h1,h2,h3,h4,p1,p2 (h1-h4是IP地址,p1-p2是端口号)
- 服务器根据PORT命令指定的客户端地址和端口号发起数据连接
被动模式:
- 客户端发送PASV命令
- 服务器返回监听的地址和端口号
- 客户端发起数据连接
为什么有两种模式:很多网络禁止来自于外部的连接请求
4、电子邮件SMTP、POP3、IMAP
SMTP
组成部分:
- 用户代理user agents
- 邮件服务器mail servers
- 简单邮件传送协议和邮件接收协议
用户代理:
- 允许用户阅读,回复,转发,保存,编辑邮件消息
- 发送, 接收邮件消息到/从服务器
邮件服务器:
邮箱mailbox 存放用户接收的邮件消息
SMTP协议:
- 运行邮件服务器之间传递消息所使用的协议
- 客户端:发送消息的服务器
- 服务器:接收消息的服务器
- 端口号:25
- 使用持久连接TCP
- 要求邮件消息(header & body)必须是7-bit ASCII
- 使用CRLF.CRLF 来判断邮件消息的结束
HTTP vs SMTP
- HTTP:拉协议
- SMTP:推协议
- 都有ASCII 命令/应答交互, 状态码
- HTTP: 每个对象封装在它各自的HTTP响应消息中发送
- SMTP: 一个邮件内各个对象置于同一个邮件消息的多目部分发送
MIME:Multipurpose Internet mail Extensions,多用途因特网邮件扩展,支持非ASCII码的邮件数据传输
邮件访问协议POP、IMAP
从服务器获取邮件信息
POP
支持使用客户端远程管理在服务器上的电子邮件
使用TCP
端口号 110
身份认证阶段和传输阶段
会话是无状态的
IMAP
邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等
端口号 143
所有邮件消息保存在一个位置: 服务器
允许用户利用文件夹组织管理邮件消息
支持跨会话(Session)的用户状态
它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。
5、DNS:因特网的目录服务
DNS
域名系统Domain Name System
功能:
- 主机名到IP地址的转换
- 主机别名
- 邮件服务器别名
- 负载分配
特点:
- 分布式数据库
- 应用层协议:DNS服务器实现域名转换
- 请求和回答报文使用53端口
- 基于UDP
分层:
- 根名字服务器Root name servers 负责记录顶级域名服务器的信息
- 顶级域名服务器top-level domain servers:负责顶级域名 com, org, net, edu, etc, 和所有国家的顶级域名 uk, fr, ca, jp
- 权威DNS服务器authoritative DNS servers: 在因特网上具有公共可访问主机(如Web服务器和邮件服务器)的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。组织机构的权威DNS服务器负责保存这些DNS记录
- 本地DNS服务器Local DNS name server每个ISP(如居民区ISP、公司、大学)都有一个本地DNS,也加默认服务器
DNS查询方法:
- 递归查询(recursive query)
- 迭代查询(iterated query)
- 被查询的名字服务器 回复可以被查询的名字服务器的IP地址
DNS缓存和权威DNS记录更新
- 一旦名字服务器获得DNS映射, 它将缓存该映射到局部内存
- 服务器在一定时间后将丢弃缓存的信息
- 本地DNS服务器可以缓存TLD服务器的IP地址
- 因此根DNS服务器不会被经常访问
权威DNS服务器记录更新:IETF动态更新/通报机制
DNS: 存储资源记录(RR,Resource Records)的分布式数据库
假设用一个全新的浏览器(第一次启动的那种),访问百度(http://www.baidu.com/),在敲入网址并按下回车之后:
1、获得IP地址
(1)首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表
(2)若没有命中,则继续搜索操作系统的 DNS 缓存(Linux,/etc/hosts; Windows, C:\WINDOWS\system32\drivers\etc\hosts)
(3)若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器采用递归查询自己的 DNS 缓存,查找成功则返回结果
(4)若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行迭代查询
本地域名服务器向根域名服务器发起请求,根域名服务器返回顶级域名服务器地址给本地服务器
本地域名服务器拿到顶级域名服务器地址后,向其发起请求,获取权威域名服务器地址
本地域名服务器根据权威域名服务器地址,向其发起请求,得到该域名对应的 IP 地址
本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
(5)操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存。浏览器得到域名对应的 IP 地址,并将 IP 地址缓存(缓存时间)。
2、和起始服务器(或者Web缓存/代理服务器),建立TCP连接
得到百度的IP,下一步是使用TCP协议,建立TCP连接。
3、向起始服务器(或者Web缓存/代理服务器)发送请求报文,用HTTP协议请求网页内容,
4、浏览器收到响应报文,并解析。
Type=A(Address)
- name = 主机名
- value = IP地址
Type=CNAME(canonical)
- name = 主机别名
www.ibm.com的真名为servereast.backup2.ibm.com - value = 真实的规范主机名
- name = 主机别名
Type=NS( name server )
- name = 域名(如foo.com)
- value = 该域权威名字服务器的主机名
Type=MX(mail exchange)
- name =邮件服务器的主机别名
- value =邮件服务器的真实规范主机名
DNS报文
查询报文和应答报文有相同的报文格式
报文头部:
标识符: 16位,查询和应答报文使用相同的标识符
标志:有若干个标志构成,分别标识不同的功能
查询/应答-0/ 1
查询希望是/非递归查询-1/0
应答可/否获得(支持)递归查询-1/0
应答是/否来自权威名字服务器-1/ 0
问题:查询的Name, type
回答:对于查询,应答的资源记录。可以有多个资源记录,因为可以有多个IP地址
权威:域对应的权威名字服务器的信息
附加信息:权威名字服务器的IP地址等其他有帮助的记录
DNS攻击
- DDoS攻击:对根域名服务器或顶级域名服务器发起拒绝服务攻击
- 重定向攻击:中间人攻击、DNS中毒攻击(发送欺骗的域名解析结果给DNS服务器
- 利用DNS实现DDoS攻击: DNS反弹式拒绝服务攻击(DNS reflector attacks,又称DNS amplification attacks)。伪造客户地址向大量的dns服务器发出请求,导致客户无法访问dns服务器进行域名解析。
6、内容分发网络CDN
Content distribution networks
- 将内容的拷贝存储在CDN节点中
- 用户向CDN请求内容
- 被定向到附近的拷贝,取得内容
- 如果网络路径拥塞,则可能选择其他的拷贝
cdn访问流程
三、传输层
1、传输层服务
在两个不同的主机上运行的应用程序(进程)之间提供逻辑通信机制
传输层协议运行在端系统
- 发送方: 将应用程序报文分成报文段传递给网络层,
- 接受方: 将报文段重新组装成报文传递到应用层
- 在网络层之上并依赖于网络层
协议
- 可靠按序提交(TCP) —— 拥塞控制、流量控制、连接建立
- 不可靠的无序传递(UDP)——“尽力传递”IP的直接扩展
- 两种服务均不保证——延迟、带宽
2、多路复用和多路分解
- 接收主机多路分解:将接收到的数据段传递到正确的套接字(多路分解)
- 发送主机多路复用:从多个套接字收集数据, 用首部封装数据,然后将报文段传递到网络层(多路复用)
多路分解
- 主机收到IP数据报
- 每个数据报有源IP地址,目的IP地址
- 每个数据报搬运一个报文段
- 每个报文段有源和目的端口号
- 主机用IP地址和端口号指明报文段属于哪个合适的套接字
无连接多路分解
- 用端口号创建套接字
- UDP 套接字由两个因素指定:(目的IP地址, 目的端口号)
- 当主机收到UDP报文段:检查报文段中的目的端口号、用端口号指示UDP报文段属于哪个套接字
- 来自不同的源IP地址且/或源端口号的IP报文报,导向同一个的套接字
面向连接的多路分解
- TCP套接字由4部分指定:源IP地址、源端口号、目的IP地址、目的端口号
- 接收主机使用所有四个值将报文定位到合适的套接字
- Web服务器对每个连接的客户都有不同的套接字
3、无连接传输:UDP
数据包协议:
- 基于Internet IP协议
- 复用/分用
- 简单的错误校验
- “尽最大努力”服务,报文段可能:
- 丢失
- 会传递失序的报文到应用程序
- 无连接:
- 在UDP接收者发送者之间没有握手
- 每个UDP 报文段的处理独立于其他报文段
特点:
- 不需要建立连接 (减少延迟)
- 简单: 在发送者接受者之间不需要连接状态
- 很小的报文段首部
- 没有拥塞控制: UDP 能够用尽可能快的速度传递
- 常用于流式多媒体应用:丢包容忍、速率敏感
- 其他UDP应用:DNS、SNMP、RTP
- 经UDP的可靠传输:在应用层增加可靠性、应用程序的差错恢复
- UDP 是面向报文的。发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。一次发送一个报文。应用程序必须选择合适大小的报文
在计算校验和时,临时把“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
UDP校验和算法
目标: 对传输的数据进行差错检测
发送方:
- 将数据段看成16bit的整数序列
- 校验和: 数据段内容相加 (1的补码和)
- 发送者将校验和值放入UDP的校验和域
接收方:
- 计算接收到数据段的校验和
- 检查计算的校验和是否等于校验和域中的值:
- NO – 检测到错误
- YES – 没有检测到错误
4、可靠数据传输
使用有限状态机(FSM)来定义发送方和接收方
Rdt1.0:完全可靠信道上的可靠数据传输
在完美可靠的信道上
- 没有bit错误
- 没有分组丢失
发送方,接收方分离的 FSMs :
- 发送方发送数据到下层信道
- 接收方从下层信道接收数据
Rdt2.0: 具有bit错误的信道
下层信道可能让传输分组中的bit受损
- 利用校验和检测位错误
- 确认(ACKs): 接收方明确告诉发送方 分组接收正确
- 否认 (NAKs):接收方明确告诉发送方 分组接收出错
- 发送方收到NAK后重发这个分组
基于重传机制的rdt协议称为ARQ(Automatic Repeat reQuest)协议
发送方只有接受到ACK时才会继续发送分组 —— 停等协议
rdt2.1: 发送方处理破坏的 ACK/NAKs
发送方:
- 发送方给每个分组增加序列号(Sequence number)
- 必须检查是否收到混淆的ACK/NAK
- 状态加倍:状态必须记住当前的分组是1号还是0号
接收方:
- 必须检查分组是否重复:当前所处的状态提供了期望收到的分组。
- 注意:接收方并不知道它的上一个ACK/NAK 是否被发送方正确收到
rdt2.2: 无NAK的消息协议
- 接收方通过ACK告知最后一个被正确接收的分组
- 在ACK消息中显式地加入被确认分组的序列号
- 发送方收到重复ACK之后,采取与收到NAK消息相同的动作,即重传当前分组
rdt3.0: 具有出错和丢失的信道
下层信道还要丢失报文 (数据或者 ACKs)
发送者等待“合理的”确认时间
- 如果在这个时间内没有收到确认就重发
- 如果报文(或者确认)只是延迟 (没有丢失):
- 重发将导致重复,但是使用序号已经处理了这个问题
- 接受方必须指定被确认的报文序号
- 要求倒计时定时器:只有在定时器超时时才触发重发
缺点:性能差
流水线技术
流水线: 发送方允许发送多个 “在路上的”, 还没有确认的报文
- 序号数目的范围必须增加
- 在发送方/接收方必须有缓冲区
滑动窗口协议
- 滑动窗口协议( Sliding-window protocol )
- 窗口
- 允许使用的序列号范围
- 窗口尺寸为N:最多有N个等待确认的消息
- 滑动窗口
- 随着协议的运行,窗口在序列号空间内向前滑动
- 滑动窗口协议:GBN, SR
Go-Back-N(GBN)协议
发送方
分组头部包含k-bit序列号
窗口尺寸为N,最多允许N个分组未确认
ACK(n): 确认到序列号n(包含n)的分组均已被正确接收
- 可能收到重复ACK
对第一个发送未被确认的报文定时(timer)
- timeout(n):若超时,重传窗口中的分组n及所有更高序号的分组
接收方
只有ACK: 对接收的分组总是发送具有最高按序序号的ACK
- 可能产生冗余的ACKs
- 仅仅需要记住期望的序号值(expectedseqnum)
对失序的分组:
- 丢弃 (不缓存) -> 没有接收缓冲区!
- 重新确认具有按序的分组
选择性重传(Selective Repeat,SR)
- 接收方分别确认已经收到的分组
- 必要时,缓冲报文, 最后按序提交给上层
- 发送者只重发没有收到确认的分组
- 对每个没有确认的报文发送者都要启动一个定时器(每个未被确认的报文都有一个定时器)
- 发送窗口
- N 个连续序号
- 限制被发送的未确认的分组数量
发送方:
- 从上层收到数据 :
- 如果下一个可用的序号在发送方窗口内,则将数据打包并发送,启动定时器
- 超时(n):
- 重发分组n, 重启定时器
- 收到ACK(n)在[sendbase,sendbase+N-1]内:
- 标记分组n被接收
- 如果n是最小的未确认分组,则增加窗口基序号到下一个未被确认的序号
接收方:
- 分组n的序号在[rcvbase, rcvbase+N-1]内
- 发送ACK(n)
- 失序分组: 缓冲
- 有序分组: 交付上层 (包括已经缓冲的有序分组), 提高窗口到下一个没有接收的分组
- 分组n在[rcvbase-N,rcvbase-1]内
- 发送ACK(n)
- 其他:
- 忽略
问题:
解决方案:窗口小于或或等于序号空间大小的一半
5、TCP
概述
- 点到点:
- 一个发送者,一个接收者
- 可靠按序的字节流:
- 没有“信息边界”
- 流水线:
- TCP 拥塞和流量控制设置窗口大小
- 收发缓冲区
- 全双工数据:
- 同一个连接上的双向数据流
- MSS: 最大报文段长 (maximum segment size)
- 面向连接:
- 在数据交换前握手(交换控制信息)
- 连接状态只在连接的两端中维护,在沿途节点中并不维护状态。
- TCP连接包括:两台主机上的缓存、连接状态变量、socket等
- 流量控制:
- 发送方不会淹没接收方
报文
- 端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
- 序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
- 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
- 数据偏移(即首部长度)——占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)
- 保留字段——占 6 位,保留为今后使用,但目前应置为 0
- 紧急 URG (URGent)—— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
- 确认 ACK(ACKnowledgment) —— 只有当 ACK =1 时确认号字段才有效。当 ACK = 0 时,确认号无效。
- 复位 RST (ReSeT) —— 当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
- 同步 SYN(SYNchronize) —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文
- 终止 FIN (FINis) —— 用来释放一个连接。FIN= 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接
- 窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节
- 检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
- 紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
- 填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。
TCP序号与确认
序号:
- 数据段中第一个字节在数据流中的位置编号
- 建立TCP连接时,双方随机选择序列号
确认ACKs:
- 希望接收到的下一个字节的序列号
- 累计确认:该序列号之前的所有字节均已被正确接收到
TCP往返时延的估计值
太短:不必要额重传
太长:对数据段丢失响应慢
估计RTT:
样本RTT(SampleRTT): 测量从报文段发送到收到确认的时间
样本RTT会变化,因此需要一个样本RTT均值(Estimated RTT)
- 对收到的样本RTT要根据以下公式进行均值处理(指数加权移动平均,典型的:α=0.125)
$$
EstimatedRTT = (1-α)EstimatedRTT + αSampleRTT
$$
- 设置超时
- EstimtedRTT 加上 “安全余量”
- EstimatedRTT变化大 -> 更大的安全余量
- SampleRTT 偏离 EstimatedRTT多少的估计
$$
DevRTT = (1-β)DevRTT + β|SampleRTT - EstimatedRTT|
$$
典型地,β = 0.25
- 然后设置超时时间间隔:
$$
TimeoutInterval = EstimatedRTT + 4*DevRTT
$$
- 设置超时
- 初始时TimeoutInterval设置为1秒
- 第一个样本RTT获得后, EstimatedRTT=SampleRTT,DevRTT=SampleRTT/2
- TimeoutInterval = EsitimatedRTT +max(G,K*DevRTT)
- (K=4,G是用户设置的时间粒度)
可靠数据传输
发送方事件
- 从应用程序接收数据:
- 用序号创造一个报文
- 序号是报文中第一个数据字节在字节流中的位置编号
- 如果没有启动定时器,则启动定时器 (定时器是最早没有被确认的报文发送时启动的)
- 设置超时间隔: TimeOutInterval
- 超时:
- 重发导致超时的报文
- 重新开始定时器
- 收到确认:
- 如果ACK落在窗口之内,则确认对应的报文,并且滑动窗口
- 若还有未确认的报文,重新开始定时器
产生TCP ACK的建议[rfc 5681]
超时间隔加倍
- TCP每次重传,都会把下一次的超时间隔设置为先前值的两倍。
- 但是当收到上层应用的数据和收到ACK两个事件中的任何一个发生时,定时器的TimeoutInterval值恢复为由近期的EstimatedRTT和DevRTT计算得到。
- 这种修改,提供了一种形式受限的拥塞控制。
- 缺陷:重传丢失报文之前要等待很长时间,增加了网络时延
快速重传
- 发送方可以在超时之前通过重复的ACK检测丢失报文段
- 发送方常常一个接一个地发送很多报文段
- 如果报文段丢失,则发送方将可能接收到很多重复的 ACKs
- 如果发送方收到3次重复确认(4个对同样报文段的确认),则发送方认为该报文段之后的数据已经丢失。
- 启动快速重传: 在定时器超时之前重发丢失的报文段
- 接受方B会缓存正确接受但失序的报文段
流量控制
(假设 TCP 接收方丢弃失序的报文段)
缓冲区的剩余空间
= RcvWindow
= RcvBuffer-[LastByteRcvd - LastByteRead]
- 接收方在报文段接收窗口字段中通告其接收缓冲区的剩余空间
- Sender限制自己已经发送的但还未收到ACK的数据不超过接收方的空闲RcvWindow尺寸
连接管理
三次握手
- Step 1: 客户发送TCP SYN报文段到服务器
- 指定初始的序号
- 没有数据
- Step 2: 服务器接收SYN, 回复 SYN/ACK 报文段
- 服务器分配缓冲区
- 指定服务器的初始序号
- Step 3: 客户接收 SYN/ACK, 回复 ACK 报文段, 可能包含数据
关闭连接
- Step 1: 客户发送 TCP FIN 控制报文段到服务器
- Step 2: 服务器接收 FIN, 回复 ACK. 进入半关闭连接状态;
- Step 3: 服务器发送FIN到客户,客户接收 FIN, 回复 ACK,
- 进入 “time wait”状态
- 等待结束时释放连接资源
- Step 4: 服务器接收 ACK. 连接关闭
6、拥塞控制
拥塞:从信息角度看: “太多源主机发送太多的数据,速度太快以至于网络来不及处理”
表现:
- 丢失分组 (路由器的缓冲区溢出)
- 长延迟 (在路由器的缓冲区排队)
端到端拥塞控制:
- 没有从网络中得到明确的反馈
- 从端系统观察到的丢失和延迟推断出拥塞
- TCP采用的方法
网络辅助的拥塞控制:
- 路由器给端系统提供反馈
- 单bit指示拥塞 (SNA, DECnet, TCP/IP ECN, ATM)
- 指明发送者应该发送的速率
7、TCP拥塞控制
AIMD(Additive-increase,multiplicative-decrease)
- 发送方增加传输速率(窗口大小),探测可用带宽,直到发生丢包事件
- 加性递增: 每个RTT内如果没有丢失事件发生,拥塞窗口增加一个MSS
- 乘性递减: 发生丢包事件后将拥塞窗口减半
慢启动(slow start)
连接开始的时候, CongWin = 1 MSS
- Example: MSS = 500 bytes & RTT = 200 msec
- 初始速率 = 20 kbps
有效带宽将 >> MSS/RTT
希望尽快达到期待的速率,故将以2的指数方式增加速率。
故以指数方式增加速率,直到产生丢失事件,或者达到某个阈值ssthresh
当连接开始的时候以指数方式增加速率:
- 每收到一个ACK,CongWin =CongWin + 1MSS
- 在每个 RTT内倍增 CongWin
- 总结: 初始速率慢但是呈指数快速增长
ssthread(阈值)变量
- 发送丢失事件后,ssthresh设置为丢失事件事件前的 CongWin 的1/2
- 当CongWin达到ssthresh时,从指数增加变为线性增加
当超时事件发生以后:
- ssthresh= CongWin/2
- CongWin 立即设置为 1个 MSS;
- 窗口开始指数增长(进入慢启动)
收到三个重复的确认时:
- ssthresh= CongWin/2
- CongWin 减半+3 (Reno版)
- 然后,进入线性增长(快速恢复)
注:上述为TCP Reno版本的内容,在TCP Tahoe版本里,无论超时还是三个重复,都直接将CongWin 置为 1个 MSS
快速恢复阶段:
- 对于引起TCP进入快速恢复状态的缺失报文段,每收到一个冗余的ACK,CongWin的值增加一个MSS。
- 最终,当对丢失的报文段的一个ACK到达时,TCP在降低 CongWin(cwnd = ssthresh)后,进入拥塞避免状态。
四、网络层
1、引言
功能:
- 从发送方主机传输报文段到接收方主机
- 发送方主机封装报文段(segments)为数据报(datagrams)
- 接收方主机递交报文段给传输层
- 在每个主机、路由器上都需要运行网络层协议
- 路由器会检查通过它的所有IP数据报的头部字段,然后根据目的IP地址对数据报进行转发
转发(forwarding): 将分组从路由器的输入端口转移到正确的路由器输出端口
路由(routing): 确定分组从发送方传输到接收方(目的主机)所经过的路径(或路由)
- 数据平面
- 本地的,每个路由器自身的功能
- 决定抵达路由器输入端口的数据包如何转发到输出端口
- 控制平面
- 整个网络范围
- 决定数据报在端到端路径上的路由器之间如何路由
- 两种数据平面的实现方式:
- 传统的路由算法: 在路由器内实现
- 软件定义网络(software-defined networking, SDN): 在远程服务器上实现
网络层可能提供的服务
- 确保交付:确保分组到达目的地。
- 具有时延上界的确保交付:主机到主机的时延。
- 有序分组交付:按发送顺序到达。
- 确保最小带宽:当发送主机以低于特定比特率的速率发送比特,分组不会丢失,在一定时延到达。
- 确保最大时延抖动:发送方发送两个连续分组的时间间隔与接收到的间隔相同
因特网的网络层提供的服务
- 单一服务,即尽力而为服务(best-effort service) 。
- 分组间的定时不能被保证;
- 分组的接收顺序与发送顺序不一定相同;
- 传送的分组不能保证最终交付,即网络可能未向目的地交付分组。
2、虚电路和数据报网络
- 数据报 网络提供网络层的无连接 服务
- 虚电路 网络提供网络层的 连接 服务
传输层:面向连接服务在网络边缘的端系统中实现。
网络层:面向连接服务在端系统及网络核心的路由器中实现
数据报网络
- 在网络层无呼叫的过程
- 路由器: 不需要维护端到端连接的状态
- 没有网络等级的“连接”的概念
- 使用目的主机的地址进行分组转发
对于给定目的地址,使用最长地址前缀匹配来完成输出端口的查找
即:用目的地址前缀与转发表的前缀匹配
- 存在匹配:向对应链路转发
- 不存在匹配:选择“其他”项对应的链路转发。
- 存在多个匹配:使用最长前缀匹配规则,即向与最长前缀匹配的链路接口转发分组。
说明:
- 路由器转发表只维持转发状态信息;
- 转发表由选路算法修改(1~5分钟更新);
- 一个端系统发送给另一个端系统的一批分组可能在网络中选择不同的路径,到达的顺序可能不一致。
特点:
- 网络层模型简单
- 端系统功能复杂:高层实现许多功能,如按序传送、可靠数据传输、拥塞控制与DNS名字解析等
- 因特网服务模型提供的服务保证最少(可能没有!),对网络层的需求最小,使得互连使用各种不同链路层技术的网络变得更加容易。
3、路由器工作原理
体系结构:
核心功能:
- 运行路由算法/协议(OSPF, RIP, BGP)
- 将分组从路由器的输入链路传送到正确的输出链路。
输入端口
功能:
- 第一个线路端接模块:将一条物理链路端接到路由器的物理层;
- 第二个数据链路处理模块:实现路由器的数据链路层功能;
- 第三个查找与转发模块:实现查找与转发功能,通过查找转发表分组通过路由器交换结构转发到适当的输出端口;
分布式交换:
- 选路处理器计算转发表,给每个输入端口存放一份转发表拷贝。
- 在每个输入端口本地做出交换决策,无须激活中央选路处理器。
- 可避免在路由器中某个单点产生转发处理瓶颈。
- 目的:以线速完成输入端口的处理
- 排队:如果数据报到达输入端口的速度快于输入端口将数据报转发到交换结构的速度,就会发生排队
排队
- 当交换结构的速度慢于输入端口的速度,就会在输入端口的缓冲区发生排队
- 导致排队延时和由于输入缓冲区溢出导致的丢包!
- 线头阻塞(Head-of-the-Line (HOL) blocking): 在队列前面的被阻塞的数据报会阻止队列中的其他数据报被转发。
交换结构:
- 将分组从输入端口缓存交换(转发)到恰当的输出端口缓存中
- 三种交换结构
- 内存
- 总线
- 纵横式
经内存的交换结构
- 早期用计算机作为路由器时采用的结构(第一代)
- 输入端口与输出端口之间的交换由**CPU(选路处理器)**控制完成;
- 输入端口与输出端口类似I/O设备:
- 当分组到达输入端口时,通过中断向选路处理器发出信号,将分组拷贝到处理器内存中;
- 选路处理器根据分组中的目的地址查表找出适当的输出端口,将该分组拷贝到输出端口的缓存中。
- 交换速度受总线带宽的速度限制 (每个分组穿过两次总线)
经总线的交换结构
- 输入端口通过一条共享总线将分组直接传送到输出端口,不需要选路处理器的干预。
- 每次只能有一个分组通过总线传送。
- 分组到达一个输入端口时,若总线正忙,会被暂时阻塞,在输入端口排队
- 路由器交换带宽受总线速率限制。
经交换矩阵交换结构
- 纵横式交换机:由2n 条总线组成,n 个输入端口与n 个输出端口连接。
- 到达输入端口的分组沿水平总线穿行,直至与所希望的输出端口的垂直总线交叉点:
- 若该条垂直总线空闲,则分组被传送到输出端口;
- 否则,该到达的分组被阻塞,必须在输入端口排队。
高级设计: 数据报分割成固定长度信元, 通过交换矩阵来交换信元
输出端口
- 取出存放在输出端口内存中的分组,并将其传输到输出链路上。
- 当交换结构将分组交付给输出端口的速率超过输出链路速率,就需要排队与缓存管理功能。当输出端口的缓冲区溢出时,就会出现延时和丢包。
4、网际协议:因特网中的转发和编址
IP数据报(IPv4)
- 版本号:4位,IP协议版本号(4,6)
- 首部长度:4位,IP分组首部长度,以4字节为单位
- 服务类型(TOS,terms of service)字段占8位:指示期望获得哪种类型的服务
- 1998 年这个字段改名为区分服务
- 只有在网络提供区分服务(DiffServ)时使用
- 一般情况下不使用,通常IP分组的该字段(第2字节)的值为00H
- 数据报长度:16位:IP分组的总字节数(首部+数据)
- 最大IP分组的总长度:65535B ,最小的IP分组首部:20B
- IP分组可以封装的最大数据:65535-20 =65515B
- 16-bit标识符:16位,标识一个IP分组
- IP协议利用一个计数器,每产生IP分组计数器加1,作为该IP分组的标识
- 标志位字段:3位,第一位保留,第二位DF(Don’t Fragment),第三位MF(More Fragment)
- DF =1:禁止分片; DF =0:允许分片,MF =1:非最后一片; MF =0:最后一片(或未分片)
- 片位移:13位,一个IP分组分片封装原IP分组数据的相对偏移量
- 片偏移字段以8字节为单位
- 寿命(TTL,Time To Live):8位,IP分组在网络中可以通过的路由器数(或跳步数)
- 路由器转发一次分组,TTL减1
- 如果TTL=0,路由器则丢弃该IP分组
- 上层协议:8位,指示IP分组封装的是哪个协议的数据包
- 实现复用/分解
- 6 —— TCP,17——UDP
- 首部校验和:16位,实现对IP分组首部的差错检测
- 计算校验和时,该字段置全0
- 采用反码算数运算求和,和的反码作为首部校验和字段
- 逐跳计算并校验
- 源IP,目的IP:32位,分组的源主机/路由器(网络接口)和接收分组的目的主机/路由器(网络接口)的IP地址
- 选项字段占长度可变,范围在1~40B之间:携带安全、源选路径、时间戳和路由记录等内容 ,一般不用
- 填充字段占长度可变,范围在0~3B之间:目的是补齐整个首部,符合32位对齐,即保证首部长度是4字节的倍数
IP数据报分片和重组
- 网络链路存在MTU (最大传输单元,Maximum Transmission Unit) —链路层数据帧可封装数据的上限
- 不同链路的MTU不同
- 在因特网中,一个大的分组可能在路由器中被分割为几个分片(fragmented),在最终的目的主机上,将这些分片重新组装(reassembled)成一个大的分组
- IP首部的相关字段用 于标识分片以及确定 分片的相对顺序
- 总长度、标识、标志 位和片偏移,见前文数据报文
假设原IP分组总长度为L,待转发链路的MTU为M,若L>M,且DF=0,则可以/需要分片 。 一个最大分片可封装的数据应该是8的倍数,因此一个最大分片可封装的数据(向下取整):
$$
d=\left [ \frac{M-20}{8} \right ]×8
$$
需要的总片数(向上取整)为:
$$
n=\left [ \frac{L-20}{d} \right ]
$$
每片的片偏移字段取值为:
$$
F_{i}= \frac{d}{8} ×(i-1),1≤i≤n
$$
IP地址
路由器和主机可以有多个接口,每个接口有一个IP地址
- IPV4:32个二进制位长(4字节),常用点分十进制表示;
- IPV6:128个二进制位长(16字节)常用冒号分隔表示
早期分成的五类IP地址:
- A类地址的第一位为“0”
- 范围: 1. 0. 0. 1-127.255.255.254
- B类地址的前两位为“10”
- 范围:128.0.0.1-191.255.255.254
- C类地址的前三位为“110”
- 范围:192.0.0.1-223.255.255.254
- D类地址的前四位为“1110”
- 范围:192.0.0.1-223.255.255.254
- 用于其他特殊用途,如多播地址Multicasting
- E类地址的前五位为“11110”
- 范围:240.0.0.0~255.255.255.255
- 用于某些实验和将来使用
前三类为基本的IP地址
特殊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地址:
- 网络号:指明主机所在网络的编号。
- 主机号:主机在网络中的编号。
IP子网(subnet):
- IP地址具有相同网络号的设备接口
- 不跨越路由器(第三及以上层网络设备)可以彼此物理联通的接口
路由器总是具有两个或两个以上IP地址。
当两个路由器直接相连时,在连线两端的接口处,可以指明IP地址也可以不指明IP地址。
划分子网
从主机号借用若干个比特作为子网号,剩下的主机位为主机号
子网掩码:用来确定网络地址(网络号+子网号)和主机地址的长度
子网掩码长为32位比特,其中的1对应于IP地址中的网络号和子网号,而子网掩码中的0对应于主机号。
使用子网掩码的分组转发
不划分子网时,路由表只有两项:目的网络地址和下一跳地址,例如
使用子网划分后,路由表中包括三项:目的网络地址、子网掩码和下一跳地址
主机H1首先要进行的操作时把本子网的子网掩码 255.255.255.128与目的IP 128.30.33.138进行与操作。得到128.30.33.128,它不等于H1的网络地址,所以不在一个子网上。因此H1把分组交互给子网上的默认路由器R1。
CIDR无分类域间路由
传统IP地址A类会造成地址浪费,C类又不够用
Classless Inter-Domain Routing
CIDR消除了传统的A类、B类和C类地址的概念。网络前缀可以任意长度
CIDR将网络前缀都相同的连续的IP地址组成“CIDR地址块“
地址格式 a.b.c.d/x,x为前缀长度
路由聚合(route aggregation): 一个CIDR地址块可以表示分类IP的多个分类地址,这种地址的聚合称为路由聚合,又称为构造超网(supernetting)
动态主机配置协议DHCP
Dynamic Host Configuration Protocol
即插即用 plug-and-play
端口号 67/68
- 主机广播 “DHCP DISCOVER” (发现报文)
- DHCP 服务器用 “DHCP OFFER” (提供报文)进行响应
- 主机请求IP地址: “DHCP REQUEST” (请求报文)
- DHCP 服务器分配IP地址 “DHCP ACK/NACK” (确认报文)
- DHCP 终止租用期”DHCP RELEASE”(终止报文)
工作过程
- DHCP 服务器被动打开 UDP 端口 67,等待客户端发来的报文。
- DHCP 客户从 UDP 端口 68发送 DHCP 发现报文
- 凡收到 DHCP 发现报文的 DHCP 服务器都发出 DHCP 提供报文,因此 DHCP 客户可能收到多个 DHCP 提供报文。
- DHCP 客户从几个 DHCP 服务器中选择其中的一个,并向所选择的 DHCP 服务器发送 DHCP 请求报文。
- 被选择的 DHCP 服务器发送确认报文DHCPACK,客户进入已绑定状态,并可开始使用得到的临时 IP 地址了。DHCP 客户根据服务器提供的租用期 T 设置两个计时器 T1 和 T2,它们的超时时间分别是 0.5T 和 0.875T。当超时时间到就要请求更新租用期
- 租用期过了一半(T1 时间到),DHCP 发送请求报文 DHCPREQUEST 要求更新租用期。
- DHCP 服务器若不同意,则发回否认报文DHCPNACK。这时 DHCP 客户必须立即停止使用原来的 IP 地址,而必须重新申请 IP 地址(回到步骤2)
- DHCP 服务器若同意,则发回确认报文DHCPACK。DHCP 客户得到了新的租用期,重新设置计时器。若DHCP服务器不响应步骤6的请求报文DHCPREQUEST,则在租用期过了 87.5% 时,DHCP 客户必须重新发送请求报文 DHCPREQUEST(重复步骤6),然后又继续后面的步骤。
- DHCP 客户可随时提前终止服务器所提供的租用期,这时只需向 DHCP 服务器发送释放报文 DHCPRELEASE 即可。
DHCP分配的不仅仅是IP地址,还可分配:
- 客户的第一跳路由器的地址(网关)
- DNS服务器的IP地址或域名
- 子网掩码
DHCP是应用层协议
- 请求报文封装到UDP数据报中
- IP广播
- 链路层广播
NAT网络地址转换
Network Address Translation
IP地址中的网络号部分是从ISP的地址空间中划分一块给申请者,而ISP是从ICANN获取到的地址块
ICANN(Internet Corporation for Assigned Names and Numbers)
- 分配IP地址
- 管理DNS
- 分配域名,解决纠纷
动机:
- 只需/能从ISP申请一个IP地址
- IPv4地址耗尽
- 本地网络设备IP地址的变更,无需通告外界网络
- 变更ISP时,无需修改内部网络设备IP地址
- 内部网络设备对外界网络不可见,即不可直接寻址(安全)
实现:
- 替换:利用(NAT IP地址,新端口号)替换每个外出IP数据报的(源IP地址,源端口号)
- 记录 :将每对(NAT IP地址, 新端口号) 与(源IP地址, 源端口号)的替换信息存储到NAT转换表
- 替换 :根据NAT转换表,利用(源IP地址, 源端口号)替换每个进入内网IP数据报的(目的IP地址,目的端口号),即(NAT IP地址, 新端口号)
- 16-bit 端口号:
- 一个局域网地址可以同时支持60,000个并发连接!
- NAT 存在争议
- 路由器只应该处理到第三层(传输层)
- 违反了端到端主张
- 应用程序设计者在设计时不得不将NAT加以考虑,如P2P应用程序
- 应使用IPv6来解决地址短缺问题
因特网控制报文协议ICMP
Internet Control Message Protocol
用于主机路由器之间彼此交流网络层信息
差错报告(5种)
- 目的(主机、网络、协议、端口)不可达
- 源抑制(Source Quench)
- 超时/超期
- 参数问题
- 重定向
网络探询(2种)
- 回声(Echo)请求与应答报文(Reply):ping
- 时间戳请求与应答报文:tracerouter
ICMP报文:
Traceroute
源端发送一系列的UDP分组给目的端
- 第一个分组 TTL =1
- 第二个 TTL=2, 等等
当第n个分组到达第n个路由器时
- 路由器丢弃该分组
- 并给源端发送一个ICMP报文 (type 11, code 0)
- 这个报文包含了路由器的名称和IP地址
当源端收到ICMP报文时,计算传输往返时间RTT
- 对每个TTL作三次
停止发送的依据:
- UDP报文最终到达目的端
- 目的端返回回应应答的 ICMP 报文(type3, code3)
- 源端停止发送
IPv6
动机:
- 32-bit IPv4地址空间即将用尽
- 快速处理/转发数据报
- 支持QoS(服务质量)
IPv6 数据报格式:
- 固定长度的 40 字节基本首部
- 不允许分片
地址表示
IPv6地址为128位长,但通常写作8组,每组为四个十六进制数的形式。例如
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
是一个合法的IPv6地址。
如果四个数字都是零,可以被省略。例如:
2001:0db8:85a3:0000:1319:8a2e:0370:7344
等价于
2001:0db8:85a3::1319:8a2e:0370:7344
遵从这些规则,如果因为省略而出现了两个以上的冒号的话,可以压缩为一个,但这种零压缩在地址中只能出现一次。因此:
2001:0DB8:0000:0000:0000:0000:1428:57ab
2001:0DB8:0000:0000:0000::1428:57ab
2001:0DB8:0:0:0:0:1428:57ab
2001:0DB8:0::0:1428:57ab
2001:0DB8::1428:57ab
都使合法的地址,并且他们是等价的。但
2001::25de::cade
是非法的。(因为这样会使得搞不清楚每个压缩中有几个全零的分组)
同时前导的零可以省略,因此:
2001:0DB8:02de::0e13等价于
2001:DB8:2de::e13
如果这个地址实际上是IPv4的地址,后32位可以用10进制数表示;因此:
ffff:192.168.89.9 等价于 ::ffff:c0a8:5909, 但不等价于 ::192.168.89.9 和 ::c0a8:5909。
ffff:1.2.3.4格式叫做 IPv4映像地址,是不建议使用的。而::1.2.3.4格式叫做 IPv4一致地址
IPv4 地址可以很容易的转化为IPv6格式。举例来说,如果IPv4的一个地址为135.75.43.52(十六进制为0x874B2B34),它可以被转化为0000:0000:0000:0000:0000:0000:874B:2B34或者::874B:2B34。同时,还可以使用混合符号(IPv4-compatible address),则地址可以为::135.75.43.52。
5、路由和选路
选路算法
- 路由算法确定了通过网络的端到端路径
- 转发表确定了在路由器上的本地转发
默认路由器:与主机直接相连的路由器,又叫第一跳路由器。每当主机发送一个分组时,都先传送给它的默认路由器。
- 源路由器:源主机的默认路由器。
- 目的路由器:目的主机的默认路由器。
- 从源主机到目的主机的选路归结为从源路由器到目的路由器的选路。
路由算法:是确定一个分组从源路由器到目的路由器所经路径的算法
路由算法的关键:在给定的一组路由器以及连接路由器的链路中,找到一条从源路由器到目的路由器的“好”路径,即具有“最低费用”的路径
分类
全局路由算法:所有路由器拥有完整的网络拓扑信息和链路费用信息。
- 链路状态路由算法LS(link state routing algorithm):必须知道网络中每条链路的费用。
分布式路由算法:以迭代的、分布式的方式计算最低费用路径。
- 节点只有与其直接相连链路的费用信息:不需拥有所有网络链路费用的完整信息。
- 通过迭代计算,并与相邻节点(邻居节点)交换信息
- 逐步计算出到达某目的节点或一组目的节点的最低费用路径。
- 距离向量路由算法DV(distance Vector):每个节点维护到网络中所有其他节点的费用(距离)的估计向量。
静态路由算法:
- 路由确定后基本不再变化。只有人工干预调整时,可能有一些变化。
动态路由算法:
- 当网络的流量负载或拓扑发生变化时,路径可能发生改变。
- 可以周期性地或直接地响应拓扑或链路费用的变化。
- 易受选路循环、路由振荡之类问题的影响。
链路状态路由算法
Dijkstra最低费用路径算法
基本思想:以源节点为起点,每次找出一个到源节点的费用最低的节点,直到把所有的目的节点都找到为止。
定义:
c(x,y):表示从节点x到y的链路费用;
= ∞ 如果不是直接邻居
D(v):表示从源节点到目的节点v的当前路径的费用;
p(v):表示从源节点到目的节点v的路径上的前驱节点(例如w是v的前驱节点);
N’:表示已经找到最低费用路径的节点集合。
过程:
- 初始化 N‘ = {源节点u};
- 对所有不在N‘ 中的节点v,标出其D(v)值:
- 节点v与源节点u直接相连,D(v) = c(u,v)
- 节点v与源节点u不直接相连 ,D(v) = ∞
- 找出一个到源节点的费用最低的节点w,并以此更新其它点D(v) 值
- 从不在N’ 中的节点中找出一个D(w)值最小的节点w,并将w加入到N’ 中。
- 对不在N‘ 中,但与节点w是邻居的节点v,用新的值更新
- D(v)=min[D(v),D(w)+c(w,v)]
- 将节点v原值与节点v经节点w到源节点的值比较,取小值。
- 重复步骤(2)
- 直到所有的网络节点都在N’ 中为止。
- 对于每个节点,都得到从源节点沿着它的最低费用路径的前驱节点;
- 每个前驱节点,又可得到它的前驱节点;以此继续,可以得到到所有目的节点的完整路径。
- 如节点z的前驱节点依次为: z->y->x->u
- 得出从源节点u到节点z的最低费用路径为:uxyz,费用为4。
根据目的节点找出顺序和其费用以及前驱节点,可以画出源节点u到所有目的节点的最低费用路径树。
转发表:存放从源节点到每个目的节点的最低费用路径上的下一跳节点。即指出对于发往某个目的节点的分组,从该节点发出后的下一个节点。
默认路由 * :表示所有具有相同“下一跳”的表项。即将“下一跳”相同的项合并为一项,目的节点用“*”表示。优先级最低,转发分组时,当找不到对应表项时,才使用默认路由。
复杂度:
- 所有迭代中需要搜寻的节点总数为n(n+1)/2
- 算法复杂性为O(n^2)
- 更有效的执行可能: O(nlogn)
距离向量路由算法
收敛较慢。可能会遇到选路回环,或计数到无穷的问题。
6、层次选路
- 一个区域内的路由器组成集合 “自治系统” (AS,autonomous system )
- 同一个自治系统的路由器运行相同的路由协议——区域内路由协议
- 不同自治系统内的路由器可以运行不同的区域内路由协议
网关路由器
- 和其他自治系统内的路由器直接相连的路由器
- 运行域间路由协议,与其他网关路由器交互
- 同自治系统内的所有其他路由器一样也运行域内路由协议
AS互连
- 转发表根据AS内和AS间选路算法而配置
- AS域内的选路项用于目的端在域内的选路。
- AS域内和AS域间的选路项用于目的端在域外的选路
AS域间任务
假设AS1中的路由器接收到了目的端是AS1外的分组。路由器将把这个分组转发到哪个网关路由器呢?
AS1 需要知道:
- 通过AS2和AS3可以到达哪些目的端
- 将这些可达信息传播给AS1内的所有路由器
这就是域间选路的任务
示例:在router 1d 上设置转发表
- 假设AS1运行域间路由协议知道网络X通过网关1c从AS3(而不是AS2) 是可达的
- 通过域内路由协议将可达信息传播给所有域内路由器
- Router 1d 由域内路由信息判断自己的接口I 在到达1c的最小开销路径上
- 在转发表里添加一项 (x,I)
示例:在多个自治系统中选择
- 现在假设AS1通过域间选路协议知道子网x从AS3和AS2都可以到达
- 为了配置转发表,路由器1d必须决定通过哪个网关将分组转发到目的子网x
- 这同时也是域内路由协议的工作
- 热土豆选路: 把分组送到两个路由器中最近的一个
域(自治系统)内路由选择(RIP、OSPF、IGRP)
使用域内路由协议,也被称作内部网关协议 (IGP,interior Gateway Protocols)
标准的域内路由协议:
- RIP: 路由信息协议(Routing Information Protocol)
- OSPF: 开放式最短路径优先(Open Shortest Path First)
- IGRP: 内部网关路由协议 (Interior Gateway Routing Protocol,Cisco 私有)
RIP略
OSPF(Open Shortest Path First)
- 用链路状态算法
- 分发LS 分组(通告)
- 每个路由器构造完整的网络(AS)拓扑图
- 路由器本地运行 Dijkstra算法
- 每个router都广播OSPF通告,OSPF通告里为每个邻居路由器设一个表项(记录每个邻居的链路特征和费用)。
- 通告会散布到整个自治系统 (通过洪泛法)
- OSPF报文直接封装到IP数据报中 (不是 TCP 或 UDP)
优点(RIP所没有的)
- 安全: 所有OSPF 消息需要认证 (防止恶意入侵)
- 允许多个相同开销的路径 (在 RIP中只有一条路径)
- 对于每个链路, 有多个消费尺度用于不同的服务类型TOS (例如在尽力转发时卫星链路代价设置为 “低” ,而对实时应用设置为高)
- 单播和多播综合支持:
- 多播 OSPF (MOSPF) 使用和 OSPF同样的链路数据库
- OSPF支持对大规模AS分层
层次OSPF
- 两级层次: 本地区域, 主干区域(这些区域都是在一个自治系统内)
- 只在区域内发送链路状态通告
- 每个节点有详细的区域拓扑; 仅知道到达其他区域内网络的方向(即最短路径)
- 区域边界路由器(同时属于本地区域和主干区域):“汇总”了到本区域内部网络的路径, 并通告给其他区域边界路由器.
- 主干路由器:限于在主干区域内运行OSPF路由协议(本身不是区域边界路由器)
- 边界路由器: 连接到其他自治系统
Interne域间路由BGP
BGP (Border Gateway Protocol):事实上的标准域间路由协议
BGP 为每个 AS 提供了一种手段:
- eBGP:从相邻AS获取子网可达信息
- iBGP:向该AS内部的所有路由器传播这些子网的可达信息
- 基于该可达信息和AS策略,决定到达子网的“好”路由
允许一个子网向Internet的其他部分通告它的存在 “I am here”
BGP会话(session)
- 两个BGP路由器 (“Peers”)交换BGP报文
- 通告去往不同目的前缀(prefix,代表1个子网)的路径 (“路径向量(path vector)”协议)
- 报文交换基于半永久的TCP连接(长时间不拆除)
- BGP会话和物理链路无关(并不总是和某条物理链路对应)
BGP 报文
- OPEN:建立到对方的TCP连接,并对发送者进行认证
- UPDATE:通告新路径 (或者撤销旧路径)
- KEEPALIVE:在没有UPDATES时保持连结活跃; 也对OPEN请求作出应答
- NOTIFICATION:报告前面报文的错误; 也用于关闭连结
BGP通告
- 当AS3通告一个前缀给AS1:
- AS3承诺能够将数据报转发该子网
- AS3能够在它的通告中汇聚网络前缀
分发路径信息
在3a和1c的eBGP会话中,AS3向AS1通告一个前缀可达信息。
- 1c通过iBGP会话向AS1中的所有路由器发布这个新的前缀可达信息。
- 1b可以 (也可能不)将这个可达信息通过1b和2a之间的eBGP会话通告给AS2。
当路由器得知一个新的前缀时,就在它的转发表中为该前缀创建一个项。
路径属性 和 BGP 路由
- 当通告前缀时,通告包含了BGP属性.
- 前缀+属性=“路由”
- 两个重要的属性:
- AS-PATH: 包含了前缀的通告已经通告过的那些AS,如 AS67,AS17
- NEXT-HOP: 指出到达下一个AS的具体AS间边界路由器(可能存在多条从当前AS到达下一个AS的链路)
- 当网关路由器接收到路由通告时,使用输入策略来决定接收/舍弃该通告。
BGP路由选择
- 网关路由器收到路由通告后,利用其输入策略(import policy)决策接受/拒绝该路由
- e.g., 从不将流量路由到AS x
- 基于策略(policy-based) 路由
- 路由器可能知道到相同前缀的多条路由,路由器必须从中选择,排除规则(应用排除规则直到有一条留下)
- 本地偏好值属性: 具有最高偏好值的路由被选择
- 最短AS-PATH的路由
- 最靠近 NEXT-HOP路由器的路由 : 热土豆路由
- 其他标准
BGP选路策略
- W,Y是桩网络(stub network/AS): 只与一个其他AS相连
- X是双宿网络(dual-homed network/AS): 连接两个其他AS
- X不期望经过他路由B到C的流量 ,因此,X不会向B通告任何一条到达C的路由
- A 向B通告路径 AW
- B 向X通告路由BAW
- 但B不会向C通告路由BAW,因为B并不想让C经BAW将流量引导到W,B只想服务它自己的客户,B不想承担在A和C之间传送流量的负担和开销
为什么AS内选路和AS间选路采用不同的协议 ?
策略:
- AS间: 管理员想控制本AS内产生的通信流怎样选路,以及什么通信流穿过自己的网络
- AS内:单个管理者, 因此不需要策略
规模:
- 层次路由节省了转发表的大小空间,减少了路由更新的流量
性能:
- AS内: 集中在性能上
- AS间: 策略可能比性能更加重要
7、SDN
软件定义网络(SDN,SoftwareDefinedNetwork)是一种新型网络创新架构,可通过软件编程的形式定义和控制网络,具有控制平面和转发平面分离及开放性可编程的特点。
SDN的核心理念是,希望应用软件可以参与对网络的控制管理,满足上层业务需求,通过自动化业务部署,简化网络运维。
SDN并不是一个具体的技术,它是一种网络设计理念,规划了网络的各个组成部分(软件、硬件、转发面和控制面)及相互之间的互动关系。
相关组织:
- ONF(open network foundation ):openflow
- IETF I2RS interface to route system
- 国际主流运营商发起成立的ETSI(欧洲电信标准协会): 网络功能虚拟化工作组(Network Function Virtualizetion,NFV)
- Opendaylight
SDN的核心思想是建立一个通用转发体系
- 每个交换设备包含一个流表(flow table). 流表由一个逻辑上中心化的控制器(远程控制器)来计算和分发
- 首部字段值:入分组与之匹配,匹配不上分组被丢弃或发往远程控制器。首部字段包括链路层、网络层、传输层首部字段。
- 计数器:分组与流表项匹配时更新。包含已经匹配分组数量,以及上次更新以来的时间
- 动作:分组匹配表项时的动作(转发、丢弃、复制、分发到多个端口)
特征:
- 基于流的转发:基于首部字段值进行转发
- 数据平面与控制平面分离:数据平面由网络交换机组成,控制平面由服务器和管理流表软件构成。
- 网络控制功能:位于数据平面交换机外部,包括SDN控制器和若干网络控制程序。
- 可编程的网络:调用API定义和控制网络设备的数据平面。
SDN控制器组件
OpenFlow
SDN中控制器与转发层之间的通信接口标准
- 允许直接访问和操作网络设备的转发平面
- 分离控制平面和数据平面,二者间使用标准的协议通信
- 数据平面采用基于流的方式进行转发
OpenFlow网络由 网络设备(OpenFlow Switch)和控制器(OpenFlow Controller)通过OpenFlow通道(OpenFlow Channel)组成
五、链路层:链路、接入网和局域网
1、链路层概述
- 主机和路由器: 节点(nodes)
- 连接相邻节点的通信信道:链路(links)
- 有线链路(wired links)
- 无线链路(wireless links)
- 局域网(LANs)
- 第二层的分组: 数据帧(frame), 它是封装了的数据报
数据链路层的职责是将数据报从一个节点传送到与该节点直接有物理链路相连的另一个节点。
提供的服务
组帧 (framing):
- 封装数据报为数据帧,增加头部(e.g.,地址信息),尾部信息(e.g.,差错编码信息)
- 帧同步(e.g.,帧定界符)
链路接入( link access)
- 如果是共享链路,需要解决信道接入(channel access)
- 在数据帧头部中,用MAC地址来标识源和目的(不同于IP地址)
在相邻节点之间可靠传输数据帧(某些链路可能未实现)
- 在比特错误率很低的链路(光纤、双绞线)很少使用
- 无线链路:高比特错误率,需要可靠交付
流量控制(flow control):
- 用于控制发送节点向直接相连的接收节点发送数据帧的频率
差错检查(error detection):
- 差错可能由信号衰减、噪声引入
- 接收方检测是否出现错误
- 通知发送方重传或丢弃数据帧
错误纠正(error correction):
- 接收方直接纠正比特错误,而不需要请求重传
半双工和全双工(half-duplex and full-duplex):
- 在半双工:链路的两个节点交替双向传输,但是不能同时发送
- 全双工:链路两个节点同时双向传输
链路层实现的位置
- 在主机和网络设备(路由器)上实现
- 链路层的主体部分是在**网络适配器(**称为网卡)或者一个芯片组上实现
- 以太网卡、802.11卡、以太网芯片组
- 实现链路层和物理层的功能
- 链路主机的系统总线
- 硬件、软件与固件的组成
发送方:
- 封装数据报为数据帧
- 增加差错检测比特,实现可靠数据传输,流量控制等机制
接收方:
- 执行检查错误、实现可靠数据传输、流量控制等机制
- 抽取数据报,将其递交给上层
2、差错检验和纠错
发送节点
- 将数据D附加若干差错检测和纠错位EDC,一起发送到链路。
- 数据D包括网络层传来的数据报,以及链路级寻址信息、序列号和其他字段。
- 保护范围包括数据D的所有字段。
接收节点
- 接收比特序列D’和EDC’。
- 如果发生传输比特错误(0->1,1->0),D’和EDC’可能与发送的D和EDC不同。
- 接收方根据D’和EDC’,判断D’是否和初始的D相同(D的传输是否正确)。
正确:解封取出数据报,交给网络层;
出错:差错处理。
差错检测和纠正技术不能保证接收方检测到所有的比特差错,即可能出现未检测到的比特差错,而接收方并未发现。
选择一个合适的差错检测方案使未检测到的情况发生的概率很小即可。
差错检测和纠错技术越好,越复杂,开销更大。
奇偶校验
最基本的方法
比特奇偶校验
发送方:
- 在要发送的信息D(d位)后面附加一个奇偶校验位
- 使“1”的个数是奇数(奇校验)或偶数(偶校验)
- 一起传输发送(d+1位)。
接收方:
- 检测收到的信息(d+1位)中“1”的个数。
- 偶校验:发现奇数个“1”,至少有一个比特发生差错(奇数个比特差错)。
- 奇校验:发现偶数个“1”,至少有一个比特发生差错。
可以查出任意奇数个错误,但不能发现偶数个错误。
若比特差错概率很小,差错独立发生,一比特奇偶校验可满足要求。
若差错集中一起“突发”(突发差错),一帧中未检测到的差错的概率达到50%。
二维奇偶校验
基本思想:
- 将要传信息D(d比特)划分为i行j 列(i 个组,每组j位);
- 对每行和每列分别计算奇偶值;
- 结果的i+j+1个奇偶比特构成了帧的差错检测比特。
特点:
- 可以检测并纠正单个比特差错(数据或校验位中)。
- 能够**检测(但不能纠正)**分组中任意两个比特的差错。
Internet校验和
传输层
循环冗余检测CRC
CRC (cyclic redundancy check)编码:
即多项式编码,把要发送的比特串看作为系数是0或1的一个多项式,对比特串的操作看作为多项式运算
基本思想:
- 设发送节点要把数据D(d 比特)发送给接收节点。
- 发送方和接收方先共同选定一个生成多项式 G(r+1比特),最高有效位 (最左边)是1。
发送方:
- 计算出一个r位附加比特R,添加到D的后面产生DR(d+r 比特)
- DR能被生成多项式G模2运算整除,一起发送
接收方:
- 用生成多项式G去除接收到的DR(d+r比特)
- 余数非0:传输发生差错;
- 余数为0:传输正确,去掉尾部r位,得所需数据D。
R的计算:将数据D后面添加r个0,除以给定的生成多项式G,所得余数即为R(r位)。
例子:
生成多项式G的选择:常见的有8、12、16和32 比特生成多项式G。
国际标准已经定义了8-、16-、32-位生成多项式G;8-位CRC用于ATM信元首部的保护;32-CRC用于大量链路层IEEE协议。其他检错方法不常用,故不作专门介绍
- CRC8生成多项式为G(x)=x8+x5+x4+1
- CRC16生成多项式为G(x)=x16+x12+x5+1
- CRC-32生成多项式为G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x2+x+1
CRC特点:
能检测小于 r+1 位的突发差错、任何奇数个差错,在适当的假设下,长度大于r+1比特的突发差错以概率1-0.5^r被检测到
差错检测方法比较
- 奇偶校验能力最弱,CRC校验能力最强。
- 奇偶校验通常用于简单的串口通信
- Internet校验和通常用于网络层及其之上的层次,要求简单快速的软件实现方式
- CRC通常应用于链路层,一般由适配器硬件实现
3、多路访问链路和协议
- 点对点链路:链路两端各一个节点。一个发送和一个接收。
- 拨号接入PPP。
- 以太网交换机与主机间的点对点链路
- 广播链路(共享介质): 多个节点连接到一个共享的广播信道。
- 广播:任何一个节点传输一帧时,信号在信道上广播,其他节点都可以收到一个拷贝。常用于局域网LAN中,如早期的以太网和无线局域网。
广播链路的信道共享技术 —— 多路访问协议(多址访问协议)
多路访问协议
目的:协调多个节点在共享广播信道上的传输
避免多个节点同时使用信道,发生冲突(碰撞),产生互相干扰。
冲突(collide):两个以上的节点同时传输帧,使接收方收不到正确的帧(所有冲突的帧都受损丢失)。
- 造成广播信道时间的浪费。
- 多路访问协议可用于许多不同的网络环境,如有线和无线局域网、卫星网等
期望:
- 当一个节点有数据发送时,它能以R bps的速率发送.
- 当有M个节点要发送数据,每个节点的平均发送速率为 R/M
- 完全分散:
- 不需要主节点协调传输
- 不需要时钟、时隙同步
- 简单
分类:
- 信道划分协议
- 把信道划分为小“片” (时隙)
- 给节点分配专用的小“片”
- 随机访问协议
- 不划分信道,允许冲突
- 能从冲突中“恢复”
- 轮流协议
- 通过轮流访问信道避免冲突,要发送的节点越多轮流时间越长
信道划分协议
- 主要有TDMA、FDMA、CDMA三种。
- 设信道支持 N 个节点,传输速率是 R b/s。
时分多路访问TDMA (time division multiple access):
将时间划分为时间帧,每个时间帧再划分为N个时隙(长度保证发送一个分组),分别分配给N个节点。每个节点
只在固定分配的时隙中传输。
特点:
- 避免冲突、公平:每个节点专用速率R/N b/s。
- 节点速率有限:R/N b/s;
- 效率不高:节点必须等待它的传输时隙。
频分多路访问FDMA (frequency division multiple access):
将总信道带宽 R b/s划分为 N 个较小信道(频段,带宽为R/N),分别分配给 N 个节点。例: 6个站点的LAN, 频带1、3、4 有分组, 频带2、5、6 空闲
特点:
- 避免冲突、公平:N个节点公平划分带宽;
- 节点带宽有限、效率不高:节点带宽为R/N
码分多路访问CDMA (frequency division multiple access):
- 每个节点分配一个唯一的编码
- 每个节点用它唯一的编码来对它发送的数据进行编码
- 允许多个节点“共存” ,信号可叠加,即可以同时传输数据而无冲突 (如果编码是“正交化”的)
随机访问协议
- 基本思想:
- 发送节点以信道全部速率(R b/s)发送;
- 节点间没有协调者
- 发生冲突时,冲突的每个节点分别等待一个随机时间,再重发,直到帧(分组)发送成功
- 典型随机访问协议:
- ALOHA协议(纯ALOHA,时隙ALOHA)
- 载波监听多路访问CSMA协议
- 带冲突检测的载波监听多路访问CSMA/CD
- 带冲突避免的载波监听多路访问CSMA/CA
ALOHA
夏威夷大学研制的一个无线电广播通信网(20世纪70年代初),采用星型拓扑结构,使地理上分散的用户通过无线电来使用中心主机。
- 纯ALOHA
- 时隙ALOHA
纯ALOHA
- 非时隙Aloha: 简单,不需同步
- 帧一到达,立即传输
- 如果与其他帧产生冲突,在该冲突帧传完之后:
- 以概率p立即重传该帧;
- 或等待一个帧的传输时间,再以概率p 传输该帧,或者以概率1-p 等待另一个帧的时间。
- 冲突概率:
- 在t0发送的帧,和在 [t0-1,t0+1]的发送的其它帧冲突
效率:
P(给定节点成功传送) = P(节点传送) * P(没有其他节点在[t0-1,t0]内传送) * P(没有其他节点在[t0,t0 +1]内传送)
= p * (1-p)^N-1 * (1-p)^N-1
= p * (1-p)^2(N-1) 最大值为1/2e = 0.18
时隙ALOHA
假设:
- 所有帧大小相同
- 时间被划分为相同大小的时隙,每个时隙等于传送1帧的时间
- 节点只能在一个时隙的开始才能传送
- 节点需要时钟同步
- 如果2个或2个以上节点在同一时刻传送,所有节点都能检测到冲突
实现:
- 当节点要发送新帧,它等到下一时隙开始时传送
- 没有冲突,节点可以在下一时隙发送新帧
- 如果有冲突,节点在随后的时隙以概率p重传该帧,直到成功为止。
优点:
- 单个活跃节点可以持续以全部速率传送帧
- 高分散性: 只需节点的时隙同步
- 简单
缺点:
- 冲突,浪费时隙
- 空闲时隙
- 节点只有在传输数据包时才能检测到冲突
- 时钟同步
效率:当有很多节点,每个节点有很多帧要发送时,成功时隙所占的百分比
- 假设有N个节点,每个节点在时隙以概率p发送
- 一个节点在一个时隙成功传送的概率 = p(1-p)^(N-1)
- 任一节点传送成功的概率 = Np(1-p)^(N-1)
- 为了得到N个活跃节点的最大效率,必须找出使表达式Np(1-p)N-1 取最大值的p*
- 为了得到大量活跃节点的最大效率, 我们求N趋近无穷时Np*(1-p*)N-1 极限值,计算可知最大效率为1/e =0 .37
CSMA(载波侦听多路访问)
Carrier Sense Multiple Access with Collision Avoid
- 载波侦听:某个节点在发送之前,先监听信道。
- 信道忙:有其他节点正往信道发送帧,该节点随机等待(回退)一段时间,然后再侦听信道。
- 1-坚持CSMA(以概率p=1,一直侦听信道)
- 非坚持CSMA(随机等待一段时间侦听信道)
- P-坚持CSMA(以概率p侦听信道)
- 信道忙:有其他节点正往信道发送帧,该节点随机等待(回退)一段时间,然后再侦听信道。
- 信道空:该节点开始传输整个数据帧。
- CSMA 的特点:
- 发前监听,可减少冲突。
- 由于传播时延的存在,仍有可能出现冲突,并造成信道浪费。
带冲突检测的CSMA(CSMA/CD)
=== 以太网所采用的 ===
增加“载波侦听”和“冲突检测”两个规则。
- 基本原理: 传送前侦听
- 信道忙:延迟传送
- 信道闲:传送整个帧
- 发送同时进行冲突检测:一旦检测到冲突就立即停止传输, 尽快重发。
- 目的:缩短无效传送时间,提高信道的利用率。
- 冲突检测:
- 有线局域网易于实现:测量信号强度,比较发射信号与接收信号
- 无线局域网很难实现:接收信号强度淹没在本地发射信号强度下
以太网CSMA/CD的运行机制
- 适配器从网络层得到分组, 创建帧
- 如果适配器侦听到信道空闲,开始传送帧。如果信道忙, 它会等到信道空闲才传送帧
- 如果适配器传送整个帧时,都没有检测到其它传输, 则完成该帧的传送
- 如果适配器在发送中检测到其它传送,就放弃传送,并发送一个拥塞信号
- 放弃传送后,适配器进入指数回退阶段,即该帧经过n次冲突后,适配器在{0,1,2,…,(2^n)-1}中随机选取一个K值 ,其中n=min(n,10),然后等待K*512比特时间后,回到第2步(二进制指数回退算法)
二进制指数回退算法
- 目标:适配器依据当前负载情况重传,重负载时等待时间变长
- 第一次冲突: 在{0,1}中选k值;延迟Kx512比特时间传送
- 第二次冲突:在{0,1,2,3}中选k值…
- 10次以后,在 {0,1,2,3,4,…,1023}中选k值。
- K是等概率选择
轮流协议
多路访问协议理想特性:
- 只有一个节点活动时,吞吐量R b/ s;
- 有M个节点活动时,吞吐量R/M b/ s。
- ALOHA和CSMA协议有第一个特性,但没有第二个特性
典型协议:
- 轮询协议
- 令牌传递协议
轮询协议
主节点“邀请”从节点依次传送
问题:
- 轮询的开销
- 延时
- 单点故障(主节点)
令牌传递(token passing)
- 控制令牌顺序从一个节点传递到下一个节点。
- 令牌:特殊帧
- 问题:
- 令牌开销
- 延时
- 单点失效(token)
4、交换局域网
概述
按照网络覆盖地理范围的大小,计算机网络可分为广域网、局域网和城域网。
- 局域网(Local Area Network , LAN ):为一个组织所拥有,且地理范围和站点数目均有限,如一个办公室、一幢大楼或几幢大楼之间的地域范围。
- 城域网(Metropolitan Area Network,MAN):连接着多个LAN,范围扩大到大约1~13英里(1英里=1.6093 km),构成MAN的每一个LAN可以属于同一组织,也可以属于多个不同的组织。
- 广域网(Wide Area Network,WAN) :由两个以上的LAN构成,连接可以穿越30英里以上的距离。最广为人知的WAN就是Internet,它由全球成千上万的LAN和WAN组成。
局域网技术特征:
拓扑结构:星形网、环形网、总线网、树形网和网状网
物理媒体(传输介质):双绞线、同轴电缆、光纤等
介质访问控制方法:
- 多址访问协议
- 随机访问的CSMA/CD
- 令牌传递技术的令牌环和FDDI在局域网技术中变得次要或被淘汰
决定了网络的传输数据类型、响应时间、吞吐量、以及网络应用等网络特征。
星型结构
- 辐射状连接
- 中央结点集中式通信控制
- 优点:结构简单,访问协议简单,单个节点的故障不会影响到整个网络。
- 缺点:对中央结点的可靠性要求很高,一有故障,全网瘫痪。
总线结构
- 所有的站点都连接在同一根传输线,即“总线”上
- 优点:结构简单,易于扩充
- 缺点:故障检测比较困难
环形结构
- 站与站点之间首尾相接,形成一个环,数据只能沿单方向传输
- 优点:这种结构适合于光纤介质。实时性较强
- 缺点:如果处理不当,站点的故障会引起全网故障
树型结构
它是从星型拓扑演变而来的,形状像一棵倒挂的树
特点:与星型拓扑大致相似。它与星型结构相比降低了通信线路成本,增加了网络复杂性
网状结构
网状网络的每一个站点都与其它站点一一直接互连
优点:连接方法主要是利用冗余的连接,实现站与站之间的高速传输和高容错性能,以提高网络的速度和可靠性
优点:关系复杂,建网难,维护难
计算机与局域网通过网络接口板进行连接,网络接口板又称通信适配器(Adapter)或网络接口卡NIC(Network Interface Card),通常我们称为“网卡”。
链路层寻址
链路层地址:MAC(Media Access Control Address)地址。
用于把数据帧从一个节点传送到另一个节点(同一网络中)。
MAC地址(LAN地址、物理地址):
- 节点“网卡”本身所带的地址(唯一)。
- MAC地址长度通常为6字节(48比特),共248个。
- 6字节地址用16进制表示,每个字节表示为一对16进制数
- 网卡的MAC地址是永久的(生产时固化在其ROM里)
MAC地址分配
- 由专门机构IEEE管理物理地址空间
- 负责分配六个字节中的前三个字节(高24位,地址块)
- MAC 地址是平面结构
- 带有同一网卡的节点,在任何网络中都有同样的MAC地址。
- IP地址具有层次结构
- 当节点移动到不同网络时,节点的IP地址发生改变。
MAC地址识别
- 广播信道的局域网中,一个节点发送的帧,在信道上广播传输,其他节点都可能收到该帧。
- 大多数情况,一个节点只向某个特定的节点发送。
- 由“网卡”负责MAC地址的封装和识别。
- 发送适配器:将目的MAC地址封装到帧中,并发送。所有其他适配器都会收到这个帧。
- 接收适配器:检查帧的目的MAC地址是否与自己MAC地址相匹配:
- 匹配:接收该帧,取出数据报,并传递给上层。
- 不匹配:丢弃该帧。
- 广播帧:发送给所有节点的帧,全1地址:FF-FF-FF-FF-FF-FF
回顾:
- 节点的3种不同地址表示
- 应用层的主机名、网络层的IP地址和链路层的MAC地址
- 实际在链路上传输时,根据MAC地址,确定相应的节点
- 地址之间的转换
- 通信时,需要进行地址转换:主机名 -> IP地址 -> MAC地址
- DNS域名系统:将主机名解析到IP地址。DNS为在因特网中任何地方的主机解析主机名。
- ARP地址解析协议:将IP地址解析到MAC地址。ARP只为在同一个LAN上的节点解析IP地址。
地址解析协议ARP
Address Resolution Protocol
ARP表: 局域网上的每个节点(主机、路由器)都有这个表
- 为某些局域网节点进行IP/MAC地址映射: < IP address; MAC address; TTL>
- 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
- 利用单播帧向A发送应答
主机A在它的ARP表中缓存 IP-to-MAC 地址对,直到信息超时
- 软状态:信息超时会被删除,除非有新的更新消息
ARP是即插即用的:
- 节点创建ARP表不需要网络管理员的干预
发送数据报到子网以外
- 集中在寻址上——IP层(数据报)和MAC层(数据帧)
- 假设主机A知道主机B的IP地址
- 假设主机A知道第一跳路由器R的IP地址(通过DHCP协议)
- 假设主机A知道路由器R的MAC地址(通过ARP协议)
流程:
主机A构建IP数据报,源地址是A的IP地址,目的地址是B的IP地址
主机A构建链路层数据帧,其中源MAC地址是A的MAC地址,目的MAC地址是R(左)接口的MAC地址,封装A到B的IP数据报。
数据帧从主机A发送到路由器R
路由器R收到数据帧,抽取出数据报递交到IP层
路由器R转发数据报(源和目的IP地址不变!)
路由器R将该数据报封装成链路层帧,其中源MAC地址是R(右)接口的MAC地址,目的MAC地址是B的MAC地址,封装A到B的IP数据报。
以太网(Ethernrt)
以太网是最为著名的有线局域网技术
- 是第一个广泛使用的局域网技术;
- 简单、便宜;
- 版本不断更新,数据速率更高、成本更低。
物理拓扑结构
- 总线(bus): 一直流行到90年代中期
- 所有结点在同一冲突域(collision domain) (可能彼此冲突)
- 星形(star):目前流行
- 中心是交换机
- 每个端口运行一个独立的以太网协议(节点相互之间不发生碰撞)
以太网链路层访问技术
发送方:发送适配器将IP数据报封装成以太网帧,并传递到物理层。
接收方:接收适配器从物理层收到该帧,取出IP数据报,并传递给网络层
前同步码:8字节
前7字节是“10101010”,最后一个字节是“10101011”。
使接收方和发送方的时钟同步,接收方一旦收到连续的8字节前同步码,可确定有帧传过来。
前同步码是“无效信号”,接收方收到后删除,不向上层传。
CRC的校验范围不包括前同步码。
源、目的MAC地址(各6字节)
- 适配器只接收目的地址与其MAC地址匹配或广播地址的帧,并将数据字段的内容传递给网络层。否则,丢弃该帧。
类型字段(2字节)
- 以太网可以“多路复用”(支持)多种网络层协议(如IP协议、Novell IPX) 。通过“类型”字段区分。
- 发送方填入网络层协议“类型” 编号;
- 接收适配器根据“类型”字段,将数据字段传递给相应的网络层协议。
数据字段(46~1500字节)
- 携带网络层传来的IP数据报
- 以太网的最大传输单元MTU是1500字节:
- 若IP数据报超过1500字节,必须将该数据报分段。
- 最小长度是46字节:
- 如果IP数据报小于46字节,必须填充为46字节。接收方网络层去除填充内容。
循环冗余检测CRC(4字节,帧校验序列FCS)
- 检测数据帧中是否出现比特差错(翻转)
- 发送主机计算CRC:范围包括目的地址、源地址、类型、数据字段的比特,结果放入帧CRC字段。
- 接收主机进行CRC校验:接收主机对收到的帧进行同样计算,并校验结果是否和CRC字段的内容相等。若计算结果不等于CRC字段的值(CRC校验失败),该帧有差错。
以太网向网络层提供的服务
- 无连接服务:通信时,发送方适配器不需要先和接收方适配器“握手”。
- 不可靠的服务:接收到的帧可能包含比特差错。
- 收到正确帧,不发确认帧;
- 收到出错帧,丢弃该帧,不发否定帧。
- 发送适配器不会重发出错帧。
- 丢弃数据的恢复是通过终端传输层的可靠数据传输机制来实现的
- 以太网的MAC协议:使用无时隙的CSMA/CD协议(二进制指数回退)
5、链路层交换机
链路层设备
- 存储转发数据帧
- 检查达到的数据帧的MAC地址,有选择的转发数据帧到一个或多个输出链路转发帧
- 当数据帧被转发到一个共享网段时,使用CSMA/CD来访问共享链路
- 透明:主机不关心是否存在交换机
- 即插即用和自学习:交换机不需要手工配置
交换机:
- 每个主机由单独的链路直接连到交换机端口
- 交换机可以缓存数据帧
- 以太网协议在每个输入链路使用,无碰撞,且可以全双工,每条链路自身是一个碰撞域
- 每个交换机有一个交换机转发表,其中每个条目:(主机的MAC地址,到达主机的端口,时戳)
- 通过自学习
自学习:
- 当收到数据帧时,交换机“学习”发送主机的位置:进入的局域网网段(到达端口)
- 在转发表中记录发送主机/位置对
转发:
当交换机收到数据帧:
记录到达链路和发送主机的MAC地址
使用数据帧的目的MAC地址,在转发表中检索
如果在转发表条目中找到对应的MAC地址
执行{
如果 目的MAC地址对应的端口与数据帧的达到端口相同
则 丢弃该数据帧
否则 转发该数据帧到条目指定的端口
}
否则,向除到达端口之外的所有端口转发(flood)
交换机互连
A发送数据帧给G——S1通过泛洪和自学习知道数据帧先转发到S4和S3
交换机的交换
特点:
- 识别目的MAC地址,根据交换表进行端口选择
- 识别源MAC地址更新交换表
交换方式:
- 存储转发(缓存整个帧后再转发)
- 快速分组又称直通交换(识别出目的地址直接转发)
存储转发:
具有差错检测功能,转发时延较大,适用于出错率高的链路
快速转发:
快速分组又称直通交换:不具有差错检测功能,转发时延较小,适用于时延要求高,出错率低的链路。
SFD:帧首定界符,FCS:帧检验序列,DA:目的地址,SA:源地址
三层交换机
三层交换技术能够在网络模型中的第三层实现数据包的高速转发。
简单地说,三层交换技术就是二层交换技术+三层转发技术,三层交换机就是“二层交换机+基于硬件的路由器”
交换机制:一次路由,多次交换
工作原理
- 发送站点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地址封装数据帧,三层交换机接收到数据后直接进行二层交换。
交换机vs路由器
- 两者都是存储转发设备:
- 路由器:网络层设备(检查网络层头部)
- 交换机:链路层设备(检查链路层头部)
- 两者都有转发表
- 路由器:使用由算法计算转发表,基于IP地址转发
- 交换机:通过泛洪、自学习来学习转发表,基于MAC地址转发
VLAN
Virtual Local Area Network
利用支持VLAN的交换机,可以在一个实际的物理局域网内,定义多个虚拟的局域网
基于端口的VLAN: 利用交换机内置的管理软件,将端口分组,使得一个单独的交换机
- 流量隔离:从1-8号端口进/出的帧,只能访问1-8号端口
- 动态成员:端口可以在VLAN之间动态调整
- VLAN间转发:通过路由完成(就像独立的交换机之间)
- 在实际中,厂商会将路由功能和交换功能都整合在一台设备中
- 干线端口( trunk port )承载定义在多个物理交换机之上的VLAN间的流量
- 某一个VLAN内的流量帧,如果要跨域物理的交换机,需使用802.1q格式(带有VLAN ID 信息)
- 802.1q协议的作用:对干线端口之间传输的帧,添加/移除额外的头部字段
六、Socket编程
#include <sys/socket.h>
int socket(int family,int type,int protocol);
- 功能:创建一个新的套接字,返回套接字描述符
- 参数:
- family:指明使用的协议栈,如TCP/IP使用的是 PF_INET(PF,Protocol Family)或者AF_INET
- type: 指明需要的服务类型, 如:
- SOCK_DGRAM,数据报服务,UDP协议
- SOCK_STREAM,流服务,TCP协议
- protocol:IP报头中的协议字段,一般取0
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *myaddr,socklen_t addrlen);
- 功能:为套接字指明一个本地端点地址
- TCP/IP协议使用sockaddr_in结构,包含IP地址和端口号
- 服务器使用它来指明Well Known端口号,然后等待连接
- 参数:
- sockfd,套接字描述符,指明创建连接的套接字
- myaddr,本地地址,IP地址和端口号
- addrlen ,地址长度
#include <sys/socket.h>
int listen(int sockfd,int backlog);
- 功能:
- 为套接字指明一个本地端点地址
- 用于服务器,指明某个套接字连接是被动的,并准备接收传入连接。
- 参数:
- Sockfd:套接字描述符,指明创建连接的套接字
- backlog:该套接字使用的队列长度,指定在请求队列中允许的最大请求数
#include <sys/socket.h>
int accept (int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen);
- 功能:
- 系统从完成队列上摘下socket,为每个新的连接请求创建一个新的套接字,服务器只对新的连接使用该套接字,原来的监听套接字接受其他的连接请求。
- 新的连接上传输数据使用新的套接字,使用完毕,服务器将关闭这个套接字。
- 参数:
- Sockfd:套接字描述符,指明正在监听的套接字
- cliaddr:提出连接请求的主机地址
- addrlen:地址长度
accept默认会阻塞进程,直到有一个客户连接建立后返回,它返回的是一个新可用的套接字,这个套接字是连接套接字。此时我们需要区分两种套接字,一种套接字正如accept的参数sockfd,它是监听套接字,在调用listen函数之后,一个套接字会从主动连接的套接字变身为一个监听套接字;而accept返回是一个连接套接字,它代表着一个网络已经存在的点点连接。
#include <sys/socket.h>
int connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen);
- 功能:
- 同远程服务器建立主动连接,成功返回0,失败返回-1
- 属于客户端的调用
- 参数:
- sockfd,套接字描述符,指明创建连接的套接字
- servaddr,指明远端IP地址和端口号
- addrlen,地址长度
int send(int sockfd, const void * data, int data_len, unsigned int flags);
- 功能:
- 在TCP连接上发送数据, 成功返回数据长度,出错返回-1。
- 参数:
- sockfd,套接字描述符
- data,指向要发送数据的指针
- data_len,数据长度
- flags,一般为0
int sendto(int sockfd, const void * data, int data_len, unsigned int flags, struct sockaddr *remaddr, int remaddr_len);
- 功能:
- 基于UDP发送数据报,返回实发数据长度,出错返回-1。
- 参数:
- sockfd,套接字描述符
- data,指向要发送数据的指针
- data_len,数据长度
- flags,一般为0
- remaddr,远端地址:IP地址和端口号
- remaddr_len ,地址长度
int recv(int sockfd, void *buf, int buf_len,unsigned int flags);
- 功能:
- 从TCP接收数据,返回实际接收数据长度,出错返回-1。
- 如果没有数据将阻塞,如果收到的数据大于缓存大小,多余数据将丢弃。
- 参数:
- Sockfd:套接字描述符
- Buf:指向内存块的指针
- Buf_len:内存块大小,以字节为单位
- flags:一般为0
int recvfrom(int sockfd, void *buf, int buf_len, unsigned int flags, struct sockaddr *from, int fromlen)
- 功能:
- 从UDP接收数据,返回实际接收的字节数,失败返回-1
- 参数:
- Sockfd:套接字描述符
- buf:指向内存块的指针
- buf_len:内存块大小,以字节为单位
- flags:一般为0
- from:远端的地址,IP地址和端口号
- fromlen:远端地址长度
#include <unistd.h>
int close (int sockfd);
- 功能:
- 关闭socket,实际上是关闭文件描述符
- 如果只有一个进程使用,立即终止连接并撤销该套接字,如果多个进程共享该套接字,将引用数减一,如果引用数降到零,则撤销它。
- 参数:
- Sockfd:套接字描述符