物理层:在物理媒体上为数据端设备透明地传递原始比特流。传输单位是比特。
数据链路层:功能可以概括为成帧、差错控制、流量控制和传输管理等。传输单位是帧。
网络层:将网络层的协议数据单元(分组)从源端传到目的端,为分组交换网上的不同主机提供通信服务。对分组进行路由选择,并实现流量控制、阻塞控制、差错控制和国际互联等功能。传输单位是数据报。 常用协议:
传输层:为端到端提供可靠的传输服务,为端到端连接提供流量控制、差错控制、服务质量、数据传输管理等服务。传输单位是报文段(TCP)或者用户数据报(UDP)。
会话层:负责管理主机间的通话进程,包括建立、管理以及终止进程间的通话。
表示层:主要处理在两个通信系统中交换信息的表示方法。
应用层:为特定类型的网络应用提供访问OSI参考模型环境的手段。传输单位是报文。
从具体构成角度
节点
边:通信链路
协议
数以亿计的、互联网计算设备:
通信链路
分组交换设备:转发分组(packets)
从服务角度
使用通信设施进行通信的分布式应用
通信基础设施为apps提供编程接口(通信服务)
将发送和接收数据的apps与互联网连接起来。
为app应用提供服务选择、类似于邮政服务
网络结构
网络边缘(edge)
网络核心
接入网、物理媒体(access)
端系统(主机):
客户/服务器模式(C/S)
对等(peer-peer)模式(P2P)
采用网络设施的面向连接服务(TCP)
目标:在端系统之间传输数据。
握手:在数据传输之前准备
TCP—传输控制协议(Transmission Control Protocol)
TCP服务
可靠地,按顺序地传送数据
流量控制
拥塞控制
采用基础设施的无连接服务(DUP)
目标:在端系统之间传输数据
UDP—用户数据报协议(User Datagram Protocol)
使用TCP的应用
使用UDP的应用:
网络核心:路由器的网状网络
基本问题:数据怎样通过网络进行传输的?
电路交换:为每个呼叫预留一条专有电路:如电话网。
分组交换
电路交换
端到端的资源被分配给从源端到目标端的呼叫“call”:
电路交换例子
为呼叫预留端-端资源
网络资源(如带宽)被分成片
为呼叫分配片
如果某个呼叫没有数据,则其资源片处于空闲状态(不共享)
将带宽分成片
缺点:
分组交换
以分组为单位存储-转发方式
资源共享,按需使用
存储-转发:分组每次移动一跳(hop)
排队和延迟
如果到达率>链路的输出速率
转发表和路由选择协议
网络结构
网络结构是网中网,具有层次结构
协议定义了在俩个或多个通信实体之间交换的报文格式和次序,以及报文发送和/或接受一条报文或其他时间所采取的动作。
协议的三大要素
因特网协议栈由5个层次组成:物理层、链路层、网络层、传输层和应用层。因特网协议栈是一个理想模型。
下层为上层提供服务。越下面的层次,越靠近硬件;越上面的层次,越靠近用户。
层次 | 功能 |
---|---|
应用层(Application Layer) | 支持网络应用,应用协议仅仅是网络应用的一个组成部分,运行在不同主机上的进程则使用应用层协议进行通信。 |
传输层(Transport Layer) | 负责为信号源和信号宿主提供应用程序进程间的数据传输服务,这一层上主要定义了俩个传输协议,传输控制协议即TCP和用户数据报协议UDP。 |
网络层(Network Layer) | 负责将数据报独立地从信号源发送到信号宿主,主要解决路由选择,拥塞控制和网络互联等问题。 |
链路层(Link Layer) | 负责将IP数据报封装成合适在物理网路上传输的帧格式并传输,或将从物理网络接受到的帧解封,取出IP数据交给网络层。 |
物理层(Physical Layer) | 负责将比特流在节点间传输,即负责物理传输。该层的协议既与链路有关也与传输介质有关。 |
在发送端:
在接收端以反方向重构报文段。
基本概念
模拟传输VS数字传输
传输方式 | 优点 | 缺点 |
---|---|---|
模拟 | 对信号有高利用率 | 不抗噪 |
数字 | 信号不易失真 | 需要更宽的带宽 |
信道特性
码元(Symbol):承载信息量的基本信号单位。
波特率(Baud rate):传输码元的速率。
比特率(bit rate):传输比特的速率。
信道容量(Channel capacity):在一个信道中能够可靠地传送信息时可达速率的最小上界,单位bps。
频带宽度(Frequency bandwidth):信道允许的信号频率范围,单位Hz。
传输延迟(Transmission delay):包括发送到接受的处理事件、电信号的响应时间、中间介质的传输时间。
奈奎斯特定理(Nyquist’s Law)
香农定理(Shannon’s Formula)
信道的信息传输速率C(单位:bps)
W - 带宽,单位 Hz
S - 信道的平均信号功率
N - 信道的高斯噪声功率
S/N - 信号功率与噪声功率之比(也可以叫信噪比)
一般情况下,信噪比不用 S/N表示,而是 10log10S/N10log10S/N ,单位为dB。
模拟/数字信号传输
调制解调器
编码解码器
调制(Modulation):数字信号到模拟信号
脉码调制(Pulse Code Modulation, PCM)
模拟信号到数字信号:
脉码调制步骤:
数字信号编码:
数字信号到数字信号:
不归零编码:
主要介绍俩种不归零编码
Non-Return-To-Zero Level (NRZ-L) Coding:高电平表示“1”,低电平表示“0”。
NRZ-L的优点:简单好实现
NRZ-L的缺点:
反向不归零编码(NRZ-I): 遇“1”反向。只能解决NRZ-L的部分问题(全“1”问题,不再是直流)
外同步(External synchronization)
给系统一个同步时钟信号,设置一个周期的宽度。
外同步有诸多不便,于是有了自同步的曼切斯特编码。
曼切斯特编码(Manchester encoding): 每个编码由两段组成,“1”:先高后低;“0”:先低后高(可以反过来定义):
曼切斯特编码的优点(解决了不归零编码的问题):
曼切斯特编码的缺点:
差分曼切斯特编码(Differential Manchester encoding):
解决曼切斯特编码的二义性。
“1”:自己的前半波与前一个编码的后半波相同;
“0”:自己的前半波与前一个编码的后半波相反。
有两种画法,初始为高、初始为低,两种画法结果对称。
差分曼切斯特编码的优点:
差分曼切斯特编码的缺点(同曼切斯特编码):
块编码(Block encoding)
延时(delay)
现实中的计算机系统不是理想系统,事件是随机突发的,所以不可避免的存在延时。
数据包的延时由四个部分组成:
处理时延(Nodal Processing Delay,dprocdproc)
路由器接收到分组对其进行处理的时间(比如差错检测),耗时很短,毫秒级。
排队时延(Queuing Delay,dqueuedqueue)
分组在链路上等待传输的时间,取决于先期到达的正在排队等待向链路传输的分组数量。
传输时延(Transmission Delay,dtransdtrans)
将分组的比特流传输到链路的时间(比如进行编码转换成查分曼切斯特编码的时间)。
如分组长度 L ,传输速率 R bps,则其传输时延为:
所以传输时间取决于分组长度和传输速率。
传播时延(Propagation Delay,$$)
信号在媒体上传播的时间。
如物理链路的长度 d,传播速度 s m/sec,则其传播时延为:
丢包
流量强度(traffic intensity)代表了路由器上排队的拥堵率。
其中,L —— 分组长度(bits);
R —— 链路带宽(bps);
a —— 平均分组到达速率
路由器的排队容量是有限的,当分组到达一个已满的队列时,路由器将丢弃该分组,产生丢包。
吞吐量
从主机A到主机B传文件,B接收文件的速率为瞬时吞吐量(instantaneous throughput),单位bps;所有时间的平均速率为平均吞吐量(average throughput)。
串联链路吞吐量取决于瓶颈链路(bottleneck link)。
网络应用结构
客户机-服务器体系结构(Client-server architecture)C/S
例如:HTTP、IMAP、FTP
服务器:
客户机:
点对点体系结构(Peer-peer architecture)p2P
优点:自扩展性(self-scalability):新的点都会提供服务容量和负荷。
缺点:每个点都是间断性连接,而且IP地址会改变。
例子:P2P的文件分享。
客户机和服务器进程
进程:一台主机上运行的程序。
在同一台主机上,两个进程通过进程间通信(inter-process communication)来进行通信。进程间通信由操作系统定义;
不同主机之间,进程通信同过报文交换,
比如并行计算中的MP和MPI,MP(Multi Processing)只能用于同一台主机间的通信,MPI(Message Processing Interface)主要用于不同主机之间的通信,也适用于同一台主机。
客户机进程(client process):发起通信的进程。
服务器进程(server process):等待连接的进程。
套接字(Sockets)
进程之间通过socket来接受/发送信息。
socket在进程通信中的作用相当于一个信封:
进程寻址(Addressing Processes)
如果两个主机之间的进程进行通信,发送端不仅要知道接收端的IP地址还需要知道进程相应的端口号。
IP地址:IPv4中32位IP,负责找到接收端主机。
端口号(port number):每台主机都可能运行着多个进程,每个进程对应一个端口号。
比如,HTTP服务端口号80、邮件服务端口号25。
应用层协议(Application-Layer Protocols)
网络应用的开发必须遵守网络协议。
应用层协议的分类
公开网络协议
专用网络协议
应用层协议内容
应用层协议定义了
app对传输服务的需求
数据完整性(data integrity)
一些app需要100%可靠的文件传输,比如文件传输;有一些运行一部分的丢失,比如语音。
时效性(timing)
一些app要求较少的延时,比如对话直播。
吞吐率(throughput)
吞吐率,即最小带宽,一些app存在一个吞吐率下限才能正常使用,比如视频音频等多媒体;有些app运行弹性的吞吐率,比如邮件传输,吞吐率小可以慢慢传过去。
TCP(传输控制协议)
UDP(是一种不提供不必要服务的轻量传输协议。优点是速度快,灵活性好。)
不同app选择的网络传输协议
World Wide Web 中的网页由超链接(hyperlink)连接。
www.someshcool.edu/someDept/pic.gif
,其中www.someshcool.edu
为主机名,/someDept/pic.gif
为路径名。HTTP协议概述
网页的应用层协议。
基于客户-服务器体系结构。
HTTP的传输层使用TCP
HTTP是无状态的。
HTTP消息类型:请求(request)与响应(response)
HTTP连接类型
非持久性连接(Non-persistent HTTP)
非持久性HTTP步骤
如果加载多个对象时,需要多次非持久性HTTP连接。
非持久HTTP响应时间
RTT:往返时间(Round Trip Time),一个很小的数据包(处理文件的时间可忽略)从客户机传到服务器再传回来的时间。
HTTP响应时间(一个对象):
1个RTT:建立TCP连接的时间
1个RTT:HTTP请求以及收到HTTP响应的前几个字符的时间
对象/文件传输的时间
对一个对象来说,非持久性HTTP响应时间为
非持久性HTTP的问题
持久性连接(Persistent HTTP)
持久性HTTP步骤
DNS服务
DNS:分布式,层级的数据库
为什么要选用分布的DNS,而不是采用集中式的DNS。
DNS采用三层结构:
一个客户机得到www.baidu.com的IP地址的步骤:
根域名服务器(Root Name Server)
顶层域名服务器(Top-Level Domain Server, TLD)
.com
、.org
、net
、.edu
等等,国家的TLD,比如.cn
、.uk
等等。.com
、net
TLD的组织.edu
的组织权威域名服务器(Authoritative Domain Server)
本地域名服务器(Local DNS Name Server)
严格来说不属于层级结构
每个ISP都会有一个本地域名服务器,也叫做默认域名服务器(default name server)
当主机要进行DNS查询时,查询会被直接送到本地的DNS服务器。
作用:
DNS查询方法
迭代查询(iterated query)
递归查询(recursive query)
DNS缓存和更新
DNS记录和消息
DNS记录
DNS的分布式数据库里存储了资源记录(resource record, RR)
RR的格式:(name, value, type, ttl)
type = A
type = NS
foo.com
)type = CNAME
www.ibm.com
是 servereast.backup2.ibm.com
的别名,这与负荷的分配有关,可能有多个服务器。type = MX
DNS消息
DNS有两种消息类型:查询(query)和回答(reply),两种消息格式相同。
向DNS数据库插入记录
比如要创建一个networkutopia.com
的网站
先在.com
的TLD提供商 Network Solution 注册networkutopia.com
.com
TLD服务器插入 NS、A 的RR
(networkutopia.com
, dns1.networkutopia.com
, NS)
(dns1.networkutopia.com
, 212.212.212.1
, A)在自己的权威域名服务器上进行配置
www.networkutopia.com
的type A记录networkutopia.com
的type MX记录DNS查询工具
在命令行用nslookup
进行DNS查询。
nslookup直接查询
xxxxxxxxxx
11nslookup domain [dns-server]
xxxxxxxxxx
11nslookup -qt=type domain [dns-server]
type | 类型 |
---|---|
A | 地址记录 |
AAAA | 地址记录 |
AFSDB | Andrew文件系统数据库服务器记录 |
ATMA | ATM地址记录 |
CNAME | 别名记录 |
HINFO | 硬件配置记录,包括CPU、操作系统信息 |
ISDN | 域名对应的ISDN号码 |
MB | 存放指定邮箱的服务器 |
MG | 邮件组记录 |
MINFO | 邮件组和邮箱的信息记录 |
MR | 改名的邮箱记录 |
MX | 邮件服务器记录 |
NS | 名字服务器记录 |
PTR | 反向记录 |
RP | 负责人记录 |
RT | 路由穿透记录 |
SRV | TCP服务器信息记录 |
TXT | 域名对应的文本信息 |
X25 | 域名对应的X.25地址记录 |
点对点体系结构(Peer-peer architecture)
P2P概述
文件分发:客户机-服务器结构 vs P2P
从一个服务器分发大小为F的文件到N个节点需要多少时间?(每个节点上传和下载的速率都是有限的,网络中有足够的带宽)
如果选用客户机-服务器结构
服务器上传:需要上传这份文件 NN 次,上传速度为 usus,则需要的上传时间为 NF/usNF/us
客户机下载:每个客户机都需要下载文件,
客户机-服务器结构的分发时间:
此处的N导致耗费的时间随要下载的节点的数量线性增长,当要下载的节点数目大时,要耗费相当多的时间。
不需要先上传完再下载,参考第一章/网络核心/分组交换,以分组为单位发送,可以忽略上传到下载的时间。
如果选用P2P结构
服务器上传:服务器至少要上传1次文件,上传时间为
客户机下载:每个客户机都要下载文件,客户机最大下载时间为
客户机上传:每个下载了文件的客户机都可以上传文件,此时总上传速率可以达到
P2P结构的分发时间:
客户机-服务器结构和P2P分发时间对比
BitTorrent
文件分为大小为 256Kb的块(chunk)
每个节点负责上传和下载的文件块
追踪器(tracker):追踪参加洪流的节点
洪流(torrent):有一组节点相互交换文件块
新的节点想下载文件,先询问追踪器参加的节点,再从相近的节点处下载文件块
节点加入洪流:
下载时,节点会上传文件块到其他节点
节点可以更改交换文件块的节点
节点随时会上线和下线
一旦节点有了完整的文件,它可以离开或者留在洪流中
请求文件块
发送文件块
发送文件块遵守一报还一报原则(tit-for-tat)
UDP:客户机与服务器之间没有连接
UDP中的socket编程示例
这里jupyter notebook中进行编程,安装好jupyter notebook后,在命令行执行
xxxxxxxxxx
11jupyter notebook
即可启动jupyter notebook
UDP服务器代码:UDPServer.ipynb
xxxxxxxxxx
121from socket import * #引入socket库
2
3serverPort = 12000 #服务器端口号
4serverSocket = socket(AF_INET, SOCK_DGRAM) #创建服务器套接字
5serverSocket.bind(('', serverPort)) #给套接字绑定端口号
6print('The server is ready to receive.')
7
8while True: #服务器要一直在线等待,所以给一个死循环
9 message, clientAddress = serverSocket.recvfrom(2048) #从服务器套接字中读取信息(发送的消息和客户机IP地址+端口号)
10 modifiedMessage = message.decode().upper() #对消息进行处理(此处是改大写)
11
12 serverSocket.sendto(modifiedMessage.encode(), clientAddress) #将处理后的消息发回给客户机
UDP客户机代码:UDPClient.ipynb
xxxxxxxxxx
131from socket import * #引入socket库
2
3serverName = gethostname() #由于没得服务器,服务器主机用本机来当
4serverPort = 12000 #服务器端口号
5clientSocket = socket(AF_INET, SOCK_DGRAM) #创建客户机套接字
6
7message = input('Input lowercase sentence:') #得到输入字符串
8clientSocket.sendto(message.encode(),(serverName, serverPort)) #发送数据到相应主机名+端口号的服务器进程
9
10modifiedMessage, serverAddress = clientSocket.recvfrom(2048) #接收服务器发回的消息
11print(modifiedMessage.decode()) #显示接收的字符串
12
13clientSocket.close() #关闭客户机socket
先运行UDPServer.ipynb,启动服务器运行。
先运行UDPClient.ipynb,进行客户机访问。
服务器的先行准备
客户机连接服务器
服务器接收客户机消息
服务器需创建一个新的socket,为了服务器进程能够和客户机进行通信
TCP中的socket编程示例
TCP服务器代码 :TCPServer.ipynb
xxxxxxxxxx
171from socket import * #引入socket库
2
3serverPort = 12000 #服务器端口号
4serverSocket = socket(AF_INET, SOCK_STREAM) #创建服务器套接字(前台)
5serverSocket.bind(('', serverPort)) #给套接字绑定端口号
6serverSocket.listen(1)
7print('The server is ready to receive.')
8
9while True: #服务器要一直在线等待,所以给一个死循环
10 connectionSocket, addr = serverSocket.accept() #前台套接字接收到请求后,创建一个新的套接字(窗口)
11
12 sentence = connectionSocket.recv(1024).decode() #窗口套接字读取信息
13 capitalizedSentence = sentence.upper() #对消息进行处理(此处是改大写)
14
15 connectionSocket.send(capitalizedSentence.encode()) #将处理后的信息发回给客户机
16
17 connectionSocket.close() #关闭窗口套接字,前台套接字保持开放
TCP客户机代码:TCPClient.ipynb
xxxxxxxxxx
141from socket import * #引入socket库
2
3serverName = gethostname() #由于没得服务器,服务器主机用本机来当
4serverPort = 12000 #服务器端口号
5clientSocket = socket(AF_INET, SOCK_STREAM) #创建客户机套接字(类型为字节流SOCK_STREAM)
6clientSocket.connect((serverName, serverPort)) #TCP连接
7
8sentence = input('Input lowercase sentence:') #得到输入字符串
9clientSocket.send(sentence.encode()) #发送数据到服务器
10
11modifiedSentence = clientSocket.recv(1024) #接收服务器发回的消息
12print('From server:', modifiedSentence.decode()) #显示接收的字符串
13
14clientSocket.close() #关闭客户机socket
传输层概述
为不同主机之间的应用进程提供通信的桥梁
端对端:传输层协议在端系统间运行,不需要涉及网络核心
传输层的协议:TCP和UDP
传输层和网络层对比
网络层:主机之间的通信
传输层:进程之间的通信
传输层依赖于并能强化网络层服务。
传输层协议
TCP:可靠的,有序的传送
拥塞控制
流量控制
需要建立连接
UDP:不可靠的,无序的传送
提供尽力而为交付服务
二者均不提供的服务:延时保障、带宽保障
多路分用
多路分用工作流程
主机收到IP数据报(IP datagram)
主机利用IP地址和端口号来把报文段传入正确的套接字
无连接的多路分用(Connectionless demultiplexing)
面向连接的多路分用(Connection-oriented demux)
UDP(User Datagram Protocol,用户数据报协议),标准为RFC 768。
UDP的优点
UDP的应用
通过UDP进行可靠的传输(UDP本身是不可靠的)
位于UDP头部,负责检测传输的段有没有发生“错误”(比如位的翻转)
发送方:
接收方:
校验和相同只能说是“检验不出错误”,不能保障没有错误。比如传输中多个16bit字发生错误,但是可能恰巧相加校验和不变。
可靠数据传输原理(Principles of reliable data transfer, rdt)
对应用层、传输层、链路层都很重要
不可靠信道的特点决定了不可靠传输协议的复杂度
调用接口函数:
接口函数 | 参数 | 作用 |
---|---|---|
rdt_send() | data | 调用数据传输协议的发送方,将要发送的数据交付给位于接收方的较高层 |
udt_send() | packet | rdt调用,通过不可靠信道,将packet传输到接收方 |
rdt_rcv() | packet | 在packet到达接收方信道时调用 |
deliver_data() | data | rdt调用,传输数据到高层 |
与不可靠信道之间的函数调用都是双向的,由于其不可靠性,需要进行确认的控制信号(ACK,NAK)。
rdt1.0概述
下层信道完全可靠:rdt1.0中假设下层的信道是一个完全可靠的信道(理想情况)
发送方和接收方的
有限状态机(FSM)
(存在状态和操作)
rdt1.0有限状态机
发送方
rdt_send(data)
上级调用rdt,从上级接收到data,make_pkt(data)
将data装到packet里,再用udt_send(packet)
将packet发送出去,完成后发送方再回到“等待上级调用”的状态。(发送方只有一个状态)接收方
rdt_rcv(packet)
下级调用rdt,从下级接收到packet,用extract(packet, data)
将packet重新恢复成data,提取出来的data再通过deliver_data(data)
传送给上级。完成后接收方再回到“等待下级调用”的状态。引入差错检测、控制信号和重传机制,解决下层信道不可靠问题。
rdt2.0概述
packet在下层信道传输中会出现比特翻转:可以引入校验和(checksum)来检测比特错误。
错误恢复——如果检验到错误如何恢复?
rdt2.0引入的新机制
rdt2.0无限状态机
发送方
rdt_send(data)
上级调用rdt,从上级接收到data,sndpkt = make_pkt(data, checksum)
将data装到packet里,再用udt_send(sndpkt)
将packet发送出去。此时,发送方变为“等待ACK或NAK”的状态。rdt_rcv(rcvpkt)
接收反馈,如果isNAK(rcvpkt)
即接收到NAK,则重传udt_send(sndpkt)
,并保持“等待ACK或NAK”的状态;如果isACK(rcvpkt)
即接收到ACK,则回到“等待上级调用”的状态。接收方
rdt_rcv(rcvpkt)
接收方接收packet,如果corrupt(rcvpkt)
,即检测到错误,则udt_send(NAK)
反馈NAK;如果notcorrupt(rcvpkt)
,即未检测到错误,则extract(packet, data)
将packet重新恢复成data,deliver_data(data)
将data传送给上级,最后udt_send(ACK)
反馈ACK。完成后接收方再回到“等待下级调用”的状态。rdt2.1有限状态机
发送方
接收方
rdt2.2概述
rdt2.2有限状态机
发送方
isNAK(rcvpkt)
判断本次反馈是NAK,替代成判断上次序号的反馈是ACK,比如rdt2.2在“等待ACK 0”时,如果isACK(rcvpkt, 1)
,则相当于收到来rdt2.1中的isNAK(rcvpkt)
。其余不变。接收方
rdt3.0概述
发送端在一个合理的时间内,等待接收ACK。
rdt3.0有限状态机
start_timer
启动计时器。如果timeout
传输超时,则重新启动计时器;如果在规定时间内接收到反馈,则stop_timer
结束计时。rdt3.0流程
rdt3.0性能
采用流水线的机制,不要等一个RTT发送回来再发下一个(即不再采用停等机制),来提高物理资源的使用率。
GBN发送方
GBN接收方
发送的ACK是顺序接收到的packet里面最大的序列号#
乱序到达的packet
GBN流程
接收方分别确认所有正确收到的pkt
发送方重发没ACK的pkt
发送方的window
SR发送方
收到上层数据
timeout(n)
pkt n
,重启timer如果ACK(n)
在可接收范围内[sendbase,sendbase+N−1]
pkt n
标记为接收完成SR接收方
如果pkt n
在接收范围内[rcvbase,rcvbase+N−1][rcvbase,rcvbase+N−1]
ACK(n)
如果pkt n
在[rcvbase−N,rcvbase−1][rcvbase−N,rcvbase−1]
内
ACK(n)
其他情况忽略
SR流程
SR困境
pkt0
,被当作后一轮的pkt0
填入。
点对点(point-to-point):一个发送方、一个接收方
可靠的、有序的字节流
流水线机制
全双工
面向连接
流量控制
端口号:用来标识同一台计算机的不同的应用进程。
序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
保留:为将来定义新的用途保留,现在一般置0。
控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。
窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
TCP序号
TCP ACK
TCP报文的ACK填写:期望从另一方收到的下一个字节序号
累计ACK(cumulative ACK):与GBN相似
TCP 序号和ACK传输
TCP计时
如何设置TCP timeout值?
如何EstimateRTT(估计RTT)?
则EstimateRTT为
DevRTT(偏差RTT)为(一般β=0.25β=0.25)
重传超时间隙(TimeoutInterval)
TCP的rdt服务是建立在IP的不可靠传输上的。
重传触发情况
TCP简化
TCP sender
TCP sender的3种事件
从上一层收到数据
分段,创建seq#(报文中字节流第一个字节的序号)
开始timer
超时
收到ACK
如果收到未ACK的segment的ACK
图TCPsender简化版
TCP重传情况
TCP receiver
事件 | TCP接收方反应 |
---|---|
具有所期望序号的按序报文段到达。所有在期望序号及以前的数据都已经被确认 | 延迟的ACK,对另一个按序报文段的到达最多等待500ms。如果下一个按序报文段在这个时间间隔内没有到达,则发送一个ACK |
具有所期望序号的按序报文段到达。另一个按序报文段等待ACK传输 | 立即发送单个累计ACK,以确认两个按序报文段 |
比期望序号大的失序报文段到达。检测出间隔 | 立即发送冗余ACK,指示下一个期待字节的序号(其为间隔的低端的序号) |
能部分或完全填充接收数据间隔的报文段到达 | 倘若该报文段起始于间隔的低端,则立即发送ACK |
TCP快速重传
timeout时间长,造成长时延
通过重复的ACK检测丢包
TCP快速重传机制:
接收方要控制发送方,使发送方不会发送得太快导致接收方的缓存(buffer)溢出。
接收方告诉发送方free buffer大小,包含在TCP报文的rwnd(receive window中)
图接受方缓存
sender通过rwnd来限制unacked segment的数量
保障receive的buffer不会溢出
建立连接之前,先握手
client、server俩边都可关闭连接
用ACK回应FIN(ACK可以和FIN一起发)
同时收到FIN也可以处理(双工)
图 TCP 关闭连接
图 TCP 双方状态循环
拥塞:
场景一:2个Sender, 和1个无限buffer的Router
场景二:2个Sender, 和1个有限buffer的Router
一个router、有限buffer
重传timeout的packet
情况一(理想):sender只在router的buffer有空时才发送
情况二:知道丢包,当router的buffer满了,packet丢失。sender只有在知道丢包时才重传。
情况三:重复packet
拥塞代价
sender逐渐增加发送速率(window size),从而探查可用bandwidth,直到丢包
sender传输限制
cwnd是动态的随着网络拥塞程度变化的函数
结合之前的rwnd,实际的窗口大小为
TCP发送速率(TCP sending rate)
发送cwnd bytes,等待1个RTT接收ACK,然后再发送后续的bytes。
连接开始时,先指数级增长发送速率,直到出现
丢包
当出现丢包时,
timeout情况
3个重复的ACK情况(TCP RENO版本)
TCP Tahoe版本中,timeout和3个重复的ACK都将cwnd设为 1MSS
当cwnd达到上次timeout时的1/2(即sstresh)时,从指数级增长变成线形增长。
sstresh —— 出现丢包时,将sstresh设置为此时cwnd的1/2
图 TCP Tahoe/Reno下cwnd的变化图【注:中间有一次3次ACK的丢包】
avg TCP throughput(TCP平均吞吐量)由window size 和 RTT 决定(忽略slow start,假设一直由data在发送)
W:丢包时的 window size,avg window size 为
假设一条具有 1500byte 报文段和 100ms RTT 的TCP连接,用此连接以 10Gps 发送数据。此时平均拥塞窗口长度为 83.333 个报文段。TCP连接的吞吐量公式(单位 bytes/sec):
10Gps的吞吐量,报文段丢失概率为
目标:K条TCP连接,经过R bps的瓶颈,每条TCP连接分 R/Kbps,则公平。
以两条TCP连接为例,从A出发,经过加性增、乘性减,会逐渐趋向公平线。所以TCP可以实现公平性。
网络辅助的拥塞控制
网络层提供尽力而为的服务(best-effort service)。
VC组成:
路由维持连接状态的信息。
信令协议(signaling protocol)
VC采用信令协议(signaling protocol)
转发表存储地址范围对应的链路接口,比如
Destination Address Range | Link Interface |
---|---|
11001000 00010111 00010000 00000000 ~ 11001000 00010111 00010111 11111111 | 0 |
11001000 00010111 00011000 00000000 ~ 11001000 00010111 00011000 11111111 | 1 |
11001000 00010111 00011001 00000000 ~ 11001000 00010111 00011111 11111111 | 2 |
Otherwise | 3 |
最长前缀匹配
选择 Link Interface 遵循最长前缀匹配原则。
例题:下面转发表
目的地址11001000 00010111 00010110 10100001
和 11001000 00010111 00011000 10101010
分别对应的Link Interface为?
11001000 00010111 00010110 10100001
-> 0
11001000 00010111 00011000 10101010
-> 1(与1和2都匹配,但是与1匹配更长)
Internet:网络核心简单,复杂度在网络边缘
ATM:复杂度在网络核心
线路端接(line termination):物理层功能,用来比特的接收
数据链路处理(协议,拆封)(data link processing (protocol, decapsulation)):数据链路层功能,比如以太网
查找、转发、排队(lookup, forwarding, queueing)
三种交换结构:共享内存、共享总线、交叉开关矩阵
排队(缓存管理)(Queueing(datagram buffer))
数据链路处理(协议,封装)(Data link processing(protocol, encapsulation))
线路端接(Line termination)
路由协议
目标:从源到目的找到一条最好的路径
路由图表示:
路由算法:找到cost最小路径
路由算法分类
全局/分散信息
静态/动态
算法步骤如下: G={V,E}
算法复杂度
假如有n个节点,
Dijkstra算法存在振荡问题。
通过广播路由得到路由的实时情况。完成广播通信的最直接方式是由发送节点向每个目的地分别发送分组的拷贝。
洪泛(Flooding):从源发送pkt到所有其他的节点
无限制洪泛会引起广播风暴(Broadcast storm),导致广播路由耗光了所有的流量。
受控洪泛(Controlled flooding):解决广播风暴问题
序号控制洪泛(Sequence-number-controlled flooding)
源节点将其地址(或其他的唯一标识符)以及广播序号放人广播分组,再向它的所有邻居发送该分组。每个节点维护它已经收到的、复制的和转发的源地址和每个广播分组的序号列表。当一个节点接收到一个广播分组时,它首先检查该分组是否在该列表中。如果在,丢弃该分组;如果不在,复制该分组并向该节点的所有邻居转发。
反向路径广播(Reverse Path Broadcasting,RPB)
RPB 的基本思想是当一台路由器接收到具有给定源地址的广播分组时, 仅当该分组到达的链路正好是位于它自己到其源的最短单播路径上,它才向其所有出链路 (除了它接收分组的那个)传输分组。否则,该路由器丢弃入分组。
生成树广播(Spanning-tree broadcast):消除了冗余广播pkt,而且能够被任何节点用于开始广播分组
LS算法 = 广播路由 + Dijkstra算法
DV算法为基于分散信息、动态的路由算法。
定义
Bellman-Ford方程:
例题:通过
对于节点x
迭代、异步: 每个本地迭代产生于:
分布:
如何解决无限问题?
如果要节点最小cost路由要绕路(即不是邻居),则标为∞∞
LS | DV | |
---|---|---|
信息复杂度(Message complexity) | O(nE)O(nE)(n个节点,E条链路) | 只在邻居之间交换 |
收敛速度(Speed of convergence) | O(n2)O(n2),可优化到O(nlogn)O(nlogn) | 速度会变化 |
强健性(Robustness) | 有一定强健性,每个节点都有自己的表 | 强健性低,节点依赖于邻居 |
之前讨论的路由都是理想化的:所有路由器都相同,网络是“扁平”的。而实际,并不存在这样的理想路由。
大规模
管理自治
聚集路由成自治系统(autonomous system,AS)
AS内的路由
(intra_AS routing)
AS间的路由
(inter_AS routing)
AS分类
内部网关协议(Interior Gateway Protocols,IGP)是AS内的路由。
常用的IGP有:
DV算法
cost:跳数
最大15跳,16跳视为∞∞。设置最大跳数以防止无穷计数问题,但这也限制了只能用于小网络,大网络很容易超最大跳数。
每30s通过发送通告的方式更新DV,通告最多路由到25个目的
如果超过180s每收到通告,则这个邻居/链路宣告死亡
通过该邻居的路由失效
发送新通告给邻居
如果邻居的转发表变化,它也会发送新的通告
链接失败的信息会快速迭代完成
RIP运行在应用层(路由器实际可能存在应用层,只是不对用户开放)
通告用 UDP pkt 周期性发送
对公众开放
使用
LS算法
OSPF通告每个邻居路由器携带一个条目
通告通过洪泛散布到整个AS
两层结构:
局部区域(local area)和主干(backbone)
区域边界路由器(area border router):负责为流向该区域以外的分组提供路由选择。汇拢该区域的节点距离信息,通告给其他的区域边界路由器
主干路由器(backbone router):在主干内运行OSPF路由
网关路由器(boundary router):与其他AS连接
采用 Path Vector protocol
BGP会话:两BGP路由器通过半永久的TCP连接来交换消息
如果一个AS向另一个AS通告了某个路由器,则承诺了可以路由到该路由器
通告前缀(advertised prefix)包括BGP属性
两个重要attributes
基于policy的路由
使用TCP交换BGP消息
BGP消息:
路由器可能知道到达同一个前缀的多条路由。BGP以下优先级选择路由:
假设:网关X 将其路径发送到 网关W
W 可以选择/不选 X所提供的路径
如果W选择X通告的路径
X可以通过advertisement来控制传入流量:
A,B,C是ISP(网络服务提供商)
W,X,Y是客户
X是 Multihomed AS,连接了两个ISP,也可以称为 dual-homed,一般是大型公司。X可以不允许 B -> X -> C 这条路由,则X不通告B有路由到C
A 通告 B 路径 AW
B 通告 X 路径 BAW
是否 B 通告 C 路径 BAW ?
规模:分层可以节省表格大小,减小更新的流量。
Intra-AS | Inter-AS | |
---|---|---|
Policy | 一个管理员,不需要policy决策 | 管理员想要控制路由,需要有policy |
性能 | 关注性能 | 比起性能更关注policy |
版本(Version, 4bit) 对于IPv4,字段的值是4。
首部长度(Header Length, IHL, 4bit) 首部长度说明首部有多少32位字(4字节)。一般为5,相当于5*4=20字节。
服务类别(Type Of Service,8bit)
报文长度(Length, 16bit) IP首部+数据部分的总长度
标识(Identification, 16bit) 用于在IP层对数据报进行分片的时候,标识数据包。
标志(Flags,3bit)
这个3位字段用于控制和识别分片,它们是:
分片偏移 (Fragment Offset, 13bit) 这个13位字段指明了每个分片相对于原始报文开头的偏移量,以8字节作单位。
存活时间(Time To Live,TTL, 8bit) 本数据报的TTL.
协议 (Protocol, 8bit) 1—-icmp, 2—-igmp, 6—-tcp, 17—-udp, 89—-ospf
首部检验和 (Header Checksum, 16bit) IP首部的校验和
源IP地址(Source IP, 32bit)
目的IP地址(Destination IP, 32bit)
网络链路有MTU(最大传送单元)— 最大可传输的链路的帧
如果IP数据报 > MTU ,则分片,到目的地后再重组
IP头部字段用来标记
IP数据报分片示例
本来要发送 4000 byte 的数据报(head部分 + data部分)
链路的 MTU = 1500 bytes
需要将数据分为3片来发送
length
:片长度,包括了 20 bytes IP首部部分,最大为MTU
fragflag
:3 bits
offset
:data部分偏移量,以 8 bytes 为单位,只计算data部分
IP地址:32位、主机和路由器接口的ID
接口
(interface):主机/路由器 和 物理链接 之间的连接
每个接口都有一个对应的IP地址
接口连接方式
IP地址
子网
把路由器去掉,剩下的每个区域都是一个子网。
上图中有6个子网。
A类
0
1.0.0.0
~ 127.255.255.255
B类
10
128.0.0.0
~ 191.255.255.255
C类
110
192.0.0.0
~ 223.255.255.255
D类
1110
E类
1111
192.32.216.9
200.23.16.64/27
中的27
为 网络部分+子网部分 的位数
子网掩码
子网的网络ID
a.b.c.d / x
,其中x是子网部分位数主机获取IP地址:
当一台主机加入网络时,从子网中的DHCP服务器获取IP地址。
从ISP处获取分配的IP地址。
ISP从ICANN组织获取IP地址
ICANN:Internet Corporation for Assigned Names and Numbers
从这个本地网络出去的报文都有着:相同的源IP+不同的端口号
对于外界网络来说,这个本地网络都是一个IP
实现方式
发送出去的报文:(源IP(内部的IP),端口号)—> (NAT IP(NAT统一的IP),新端口号)
NAT转换表:记住(源IP(内部的IP),端口号)<—> (NAT IP(NAT统一的IP),新端口号)的转换对
收到的报文:根据NAT转换表,(NAT IP(NAT统一的IP),新端口号)—> (源IP(内部的IP),端口号)
外部不知道内部的情况,所以外部不能发起通信
预留给内部的IP地址:
10.0.0.0
~10.255.255.255
(A类)176.16.0.0
~172.31.255.255
(B类)192.168.0.0
~192.168.255.255
(C类)可以有16bit的主机地址位(10.0.0.0
~10.255.255.255
),一个NAT支持内部60000+的连接
NAT存在争议
主机、路由器、网关来交流网络层信息
IP的一部分,但体系结构在IP之上:ICMP消息搭载在IP数据报上
ICMP消息:type,code,引发错误的IP数据报首部和前8个字节
Type | Code | description | 描述 |
---|---|---|---|
0 | 0 | echo reply (ping) | echo响应 (被程序ping使用) |
3 | 0 | dest. network unreachable | 目标网络不可达 |
3 | 1 | dest host unreachable | 目标主机不可达 |
3 | 2 | dest protocol unreachable | 目标协议不可达 |
3 | 3 | dest port unreachable | 目标端口不可达 |
3 | 6 | dest network unknown | 未知的目标网络 |
3 | 7 | dest host unknown | 未知的目标主机 |
4 | 0 | source quench (congestion control - not used) | 源端关闭(拥塞控制) |
8 | 0 | echo request (ping) | Echo请求 |
9 | 0 | route advertisement | 路由通告 |
10 | 0 | router discovery | 路由器的发现/选择/请求 |
11 | 0 | TTL expired | TTL 超时 |
12 | 0 | bad IP header | IP 报首部参数错误 |
ICMP是管控制的IP的“兄弟”
ICMP被IP使用,同时作为网络层协议使用IP
ping、traceroute、path MTU discovery 都使用到了ICMP
ping:使用 ICMP Echo request/repley msgs
path MTU discovery
Traceroute程序:跟踪从一台主机到其他主机之间的路由,用ICMP报文实现。
源发送一系列 UDP报文段 到目的
当第n个数据报到达第n台主机时
当该ICMP报文返回到源主机,源主机计算RTT(往返时延),得到第n台路由器名字及其IP
标准的Traceroute程序用相同的TTL发送3个一组的分组,输出对每个TTL提供3个结果
停止条件步骤
在Mac上可在app“系统信息”中的窗口
->网络实用工具
中使用Ping、Traceroute等工具。
动机
IPv6数据报格式
版本(Version, 4 bit) 对于IPv6,字段的值是6(0110)。
流量类型(Traffic class,8 bit)
用来标识对应IPv6的通信流类别,类似于IPv4中的ToS。
流标签(Flow label,20 bit)
用来标记报文的数据流类型,以便在网络层区分不同的报文。
有效载荷长度(Payload length,16 bit)
给出了IPv6数据报中跟在定长的40 byte数据报头部后面的字节数量。
下一个头部(Next Header,8 bit)
该字段标识数据报中的内容(数据字段)需要交付给哪个协议(如TCP或UDP)。无扩展的头部,Next Header指向TCP/UDP;有扩展的头部,Next Header指向的下一个头部比如路由选择。与IPv4头部 协议(Protocol)字段相同。
跳段数限制(Hop limit,8 bit)
生存时间,相当于IPv4中的TTL。转发数据报的每台路由器讲对该字段内容 -1,如果跳转限制计数到0时,则丢弃该数据报
源IP地址(Source Address,128 bit)
目的IP地址(Destination Address,128 bit)
数据(Data)
去除Checksum:加快了转发速度
Options:依旧允许可选项,但是不放在头部,而是放在 Next Header 指出的位置上
ICMPv6
:ICMP的IPv6版本
三种类型:单播(unicast)、多播(multicast)、任意播(anycast)
冒号划分的十六进制(128 bit)
eg. 68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF
0的压缩
用双冒号::
表示一组0或多组连续的0,但只能出现一次。
FF05:0:0:0:0:0:0:B3
= FF05::B3
0:0:0:0:0:0:128.10.2.1
= ::128.10.2.1
(IPv4和IPv6兼容的IP)12AB:0:0:CD30:0:0:0:0
= 12AB::CD30:0:0:0:0
= 12AB:0:0:CD30::
(如果出现两个多个0,随意压一个都行)单播的地址格式(一共 128 bit):
全球路由前缀(Global routing prefix,48 bit)
前3位为001
,分配给公司和组织。
子网ID(Subnet ID,16 bit)
如果是小公司,只需要1个子网的话,全设为0
接口ID(Interface ID,64 bit)
基于 EUI-64
现在的网络既有IPv4,也有IPv6。世界上的所有网从IPv4到IPv6需要很长的转换时间。
两种IPv4到IPv6的迁移
当IPv6穿过IPv4的路由器上时,将IPv6作为载荷承载在IPv4上。就是像一个连接两个IPv6路由器的IPv4隧道
保证帧流的透明传输
链路层服务:
成帧(Framing)、接入链路(link access)
可靠交付(Reliable delivery)
流量控制(Flow Control)
差错检测(Error Detection)
差错纠正(Error Correction)
主要考虑帧的界定,即如何将前一帧和后一帧分开。
在每帧的前面添加 Counting header(本帧长度)
设定两个ASCII——SOH、EOT,SOH为标注开始的字符,EOT为标注结尾的字符。
如果中间的数据部分也有SOH或EOT,则加入转义字符 EOT 标识。类似于C语言中的\
的作用。
与基于字符的首尾界定法的思路相似,但开始和结束的标志为01111110
为防止中间的数据部分也有01111110
导致提前结束
1
后插入一个0
1
后删除一个0
比如在曼切斯特编码中,如果
1
0
违逆码只能应用在物理层,因为违逆码无法储存。
通过增加冗余位(EDC)来检测差错。
差错检测不是100%可靠的。
可能会漏掉一些错误,但是概率很小
更大的EDC检错能力更强
单个奇偶校验位(Single Bit Parity)
分为奇校验和偶校验,EDC长度为1 bit。
如发送一个长为dd bit 的信息时,加EDC一共
1
(即如果发送的信息有偶数个1
,则EDC为0
;奇数个1
,则EDC为1
)1
(即如果发送的信息有偶数个1
,则EDC为1
;奇数个1
,则EDC为0
) 下图采用偶校验,信息D中共有9个1
,所以偶校验位为1
。
奇偶校验只能检测出奇数个错误的情况。但由于现在传输的准确率很高,就算出错,大概率也就出 1 bit 的错误,所以使用简单的奇偶校验也能检测出大部分错误。
二维奇偶校验(two-dimensional parity)
将DD中的dd bit 划分成ii行、jj列,计算每行和每列的奇偶校验值,产生
二维奇偶校验不仅可以检测错误,还可以利用奇偶校验差错的行和列的索引找出错误的比特位,进行纠错。
CRC(Cyclic Redundancy Check),循环冗余检测。
思路:发送信息DD,设置一个生成多项式,利用冗余位RR,将D+RD+R凑成生成多项式的整数倍,在接收方如果无法整除,则出差错。
生成多项式GG和CRC比特位数
设置一个
比如下面,三次项和常数项系数为11,则二进制数GG的第四位和第一位为11
生成多项式GG为r+1r+1 bit,则CRC冗余位为rr bit。如此才能保证能把D+RD+R凑成GG的整数。
计算CRC冗余位RR
增加RR的目的是实现:
先将信息DD乘以2r2r,即左移rr bit,后面补0
。再将移位后的D×2rD×2r除GG,但是中间步骤不用减,而用异或。比如
信息DD为101110
,生成多项式0
,得101110000
,再除以G=1001
得到的余数011
则为CRC冗余位RR。
发送方发送信息DD和冗余位RR的拼接,即101110011
。
接收方检错
接收方收到发送方发来的101110011
后,将其除以生成多项式GG 1001
。如果整除则未检测到差错,否则检测到差错。
链路的两种类型:
点对点链路(point-to-point link)
由链路一端的单个发送方和链路另一端的单个接收方组成。
广播链路(broadcast link)
多个发送方和接收方,单一的、共享的信道。
多路访问协议(Multiple access protocol),规范结点在共享的广播信道上的传输行为。
多路访问协议分类:
信道划分协议
(channel partitioning protocol)
随机接入协议
(random access protocol)
轮流协议
(taking-turns protocol)
多路访问协议的目标:高效、公平、简单、分布式
TDM将时间划分为时间帧(frame),并进一步划分每个时间帧为NN个时隙(slot),链路中的每条连接专用一个时隙。
详见 时分多路复用(TDM)。
链路中的每条连接专用一个频段。
详见 时分多路复用(FDM) 。
详见 码分多路复用(Code division multiplexing,CDM) 。
结点传输pkt时,占有信道全部带宽,结点间无优先级
存在多个传输结点 => 碰撞
随机接入协议明确了:
常用的随机接入协议
非时隙、简单、完全分散
最早的ALOHA,目前已经不再使用
帧长一定 => 帧传输时间一定
当一帧首次到达(从网络层传下来),结点立即将该帧完整传输进广播信道
如果发送碰撞,则该结点
假设一帧在t0t0处开始传输,则在[t0−1,t0+1][t0−1,t0+1],其他结点如有传输,发生碰撞,则易损时间区长度为2τ2τ(tautau为一帧的传输时间)。
一个结点发送成功,则需要本结点发送、其他结点在[t0−1,t0][t0−1,t0]和[t0,t0+1][t0,t0+1]不发送。一个给定结点成功传送的概率为
则有NN个结点,任意一个结点成功传送的概率为
如此,求得纯ALOHA的最大效率为1/(2e)≈0.18(改变p,使S最大化)。
假设一帧在t0处开始传输,则在本时隙中,其他结点如有传输,发生碰撞,则易损时间区长度为τ(ττ为一帧的传输时间)。
一个给定结点成功传送的概率为
如果有NN个活跃结点,任意一个结点成功传送的概率为
如此,求得时隙ALOHA的最大效率为1/e≈0.37(改变pp,使SS最大化)。即在有大量结点有帧要传输时,最多3737的时隙做有用的工作,信道传输速率不是R bps,而是0.37R bps。
时隙ALOHA的最大效率是纯ALOHA的两倍。
载波侦听多路访问(CSMA,Carrier Sense Multiple Access),一个结点在传输前先侦听信道。
如果侦听到信道空闲,则传输帧
如果侦听到信道正忙,则推迟传输。再传输方式分为坚持型和非坚持型:
CSMA依旧会发生碰撞
只要共享信道,那么碰撞就是不可避免的,即使CSMA有侦听。
比如下图中,B结点在t0时传输帧,但是帧的传输是需要一定时间的,这就导致在t1时,D结点侦听判断信道空闲,传输帧。两信号发生碰撞。
如此,整个帧传输时间被浪费了。可以看出,广播信道的端到端信道传播时延(distance and propagation delay)(信号从一个结点到另一个结点的传播时间)在决定性能上起关键作用。
碰撞要在短时间内检测出来(最好在一个争用期内)
一旦检测到碰撞立即停止传输,以减少信道的浪费
采样坚持型或非坚持型重传
碰撞检测
如下图,当B结点和D结点检测到碰撞时,立即停止继续发送。
争用期:以太网的端到端往返时间2τ
A结点给B结点发送帧流,最坏情况就是在即将发送到B结点时,发生碰撞,返回碰撞信息,最大用时即为2τ。
最短帧:最短帧长度为2τR(R为信道速率)
和上述同样的最坏情况中,从A结点发送帧,到碰撞信号返回到A结点花费2τ2τ的时间,在此期间A结点不能停止帧的发送,所以最短帧的长度为2τR。
如此可以最大利用网络效率,而且不会产生二义型。如果发送完了这个帧,没有发生碰撞,则发生成功。
CSMA/CD 效率
CSMA/CD 效率:当有大量的活跃结点,且每个结点有大量的帧要发送时,帧在信道中无碰撞地传输的那部分时间在长期运行时间中所占的份额。
其中,tprop为两结点之间的最大传播时间;
ttrans为传输一个最大长度的帧的时间。
效率趋近1,则需
CSMA/CD 比 ALOHA 简单、便宜、分布式。
有一个主结点
主结点以循环的方式轮询每个结点
主结点先向一个结点发送报文,告诉能够传输的帧的最多的数量,这个结点传输完帧后,主机点再发给下一个结点报文,循环轮询。
缺点:
令牌(token)在结点之间以某种固定次序进行交换
结点只有在拿到令牌时,才能发送帧
受控的,不会发生碰撞
缺点:
局域网模型中,数据链路层分为LLC子层和MAC子层。
可以叫MAC 地址、LAN地址、物理地址
用于从一个接口到另一个物理连接的接口(同一网络)获取数据报
MAC地址长度:4848 bit / 66 byte
与硬件有关,一个网卡(适配器)对应一个MAC地址
例如:1A-2F-BB-76-09-AD
与局域网相连的每个接口都有唯一的MAC地址
MAC地址由IEEE分配
IEEE给公司固定MAC地址的前2424 bit,后2424 bit由公司保证每个适配器MAC地址的唯一性
IP地址和MAC地址的关系:IP地址就像是一个邮件地址,解决在哪上网的问题;MAC地址像身份证,解决谁在上网的问题
ARP(Address Resolution Protocol),地址解析协议
局域网中的每个IP结点(主机、路由器)都有ARP表
ARP表:局域网结点的IP地址和MAC地址的对应关系
<IP address; MAC address; TTL>
TTL
:存活时间,过TTL的时间要丢弃这一行数据A想要发送数据报给B,但是B的MAC地址没有记录在A的ARP表中。
A发送一个
广播帧
——查询ARP分组,包含B的IP地址
FF-FF-FF-FF-FF-FF
B接收到ARP分组,给A回复B的MAC地址
A在ARP表中缓存IP到MAC地址对,直至超时TTL
ARP即插即用:ARP表自动建立,不需要系统管理员来配置
不同子网的A和B通过路由器R发送数据报,A只知道B的IP地址,不知道B的MAC地址
A创建IP报文(IP地址在整个传输过程中不改变)
A创建数据帧,在IP报文的基础上,加上MAC地址
帧从A传到路由器R
路由器R接收帧,并从路由器R的数据链路层传到网络层,从数据帧拆成IP数据报
路由器R在IP报文的基础上,加上新的MAC地址段,传到数据链路层
帧从路由器R传到B,B接收到数据
总线型
早期流行,所有的结点共用一条总线。
星型
以太网现在使用的拓扑结构,中间是交换机,所有结点和交换机的连接是唯一的,不会发生冲突。
前导码(Preamble,7 byte)
7 bytes 的方波10101010
,用于“唤醒”接收适配器,并将它们的时钟与发送方的时钟同步。
帧开始符(Start of Frame Delimiter(SFD),1 byte)
10101011
,用来警告接收适配器,要开始了。
目的MAC地址(Destination address,6 byte)
目的适配器的MAC地址。
源MAC地址(Source address,6 byte)
源适配器的MAC地址。
类型(Type,2 byte)
上层的协议。比如,IP协议对应0X0800
。
数据(Data,46~1500 byte)
IP数据报。
最小长度——46 byte
由2τR2τR决定。IEEE 802.3中,2τ为51.2μs,R=10Mbpss,由此得到最小帧长度64 bytes。再减去18 bytes的其他部分,得到最小数据的长度46 bytes。
详见CSMA-C中的最短帧。
小于最小长度得补充到46 byte。
最大长度——1500 byte
超过最大长度得分片。
帧校验序列(FCS,4 byte)
错误检测机制,比如CRC。
xxxxxxxxxx
141A: //A事件
2sense channel, if idle //如果侦听信道空闲
3then {
4transmit and monitor the channel; //传输并监听信道(监听是否有其他站点在传输)
5if detect another transmission //如果监听到其他站点在传输
6then {
7abort and send jam signal; //停止并发送jam信号(将冲突信号发送给其他站点)
8update # collisions; //更新冲突次数(冲突次数+1)
9delay as required by exponential backoff algorithm; //调用二进制指数退避算法来延时
10goto A //重新执行A事件
11}
12else {done with the frame; set collisions to zero} //如果在传输的过程中没监听到其他站点在传输,则完成帧的传输,并将冲突次数清零
13}
14else {wait until ongoing transmission is over and goto A} //如果侦听信道在忙,则继续侦听,直至信道空闲,再发送(1-坚持);如果是非坚持,则等待一个随机的时间之后再进行监听
Jam Signal:长48 bits48 bits,保证每个其他的发送方意识到冲突
一旦检测到冲突,为降低再冲突的概率,需要等待一个随机时间,二进制指数退避算法即解决时延时间的问题。
时延的时间为端到端的往返时间2τ2τ的整数倍,即
不同的以太网标准有:
下图为100 Mbps以太网标准,其中100代表$100\ Mbps,TX、T2、T4代表媒体为不同的铜线,FX、SX、BX代表媒体为不同的光纤。
物理层设备:相当于工作在bit 层的传话筒,将接收到的bit从一个接口传到其他的所有接口
层级结构
每个连接的LAN称为LAN网段
集线器不会隔离冲突域
集线器的优点
集线器的缺点
由于上述缺陷,如今大部分集线器已被交换机取代
交换机,也可以叫网桥
链路层设备
存储、转发以太网帧
检查传入的帧的MAC地址,有选择地将帧转发到一个或多个传出链路,使用CSMA / CD访问段
透明:主机不知道交换机的存在
即插即用,自学习(不需要配置交换机)
<MAC address, interface, TTL>
,即MAC地址、通向该MAC地址的接口、存活时间。xxxxxxxxxx
91when frame received at switch: //交换机接收到帧
21. record incoming link, MAC address of sending host //在交换表中记录发送方的传入接口、MAC地址
32. index switch table using MAC destination address //在交换表中查找目的MAC地址
43. if entry found for destination //如果在交换表找到了该目的MAC地址
5then {
6if destination on segment from which frame arrived then drop frame //如果目的与发送方在同一网段,则丢弃该帧
7else forward frame on interface indicated by entry //如果不在同一网段,则转发帧到相应接口
8}
9else flood //如果在交换表找到不到该目的MAC地址,则泛洪(转发到除发送方所在接口以外的所有接口)
路由器 | 交换机 | |
---|---|---|
存储转发 | 有 | 有 |
所在层 | 网络层设备(检查网络层头部) | 链路层设备(检查链路层头部) |
转发表 | 使用路由算法,IP地址 | 使用泛洪,自学习,MAC地址 |
交换机以太网存在缺点:缺乏广播隔离,导致易产生广播风暴。
为解决上述问题,采用虚拟局域网VLAN。
VLAN:在单个LAN内,将支持VLAN功能的交换机配置为多个虚拟LAN。
将单个LAN基于端口划分为多个VLAN。
最早采用实体线相连,后采用中继端口。
中继端口(trunk port):也可以叫共享端口,在多个物理交换机上定义的VLAN之间传送帧。
下图中,a为实体线相连,b为中继端口连。
802.1q:原802.1帧未带有VLAN标识,所以802.1q协议为中继端口之间转发的帧添加/删除了其他报头字段