第一章 计算机网络与因特网
1. 因特网介绍
1.1 协议
协议定义了网络实体之间发送和接收消息的格式、意义、顺序以及对消息传输、接收采取的行动。
三要素:语法、语义、时序。
-
语法
- 数据与控制信息的结构或格式
- 信号电平
-
语义
- 需要先发出何种控制信息
- 完成何种动作以及做出何种回应
- 差错控制
-
时序
- 事件顺序
- 速度匹配
1.2 因特网的构成:边缘部分与核心部分
1.2.1 网络边缘
1.2.1.1 终端系统
主机即端系统,由客户端与服务器构成。
主机可发送数据包,接收应用程序信息,分成小块。
1.2.1.2 接入网络
-
数字用户线
-
有线网络(频分复用)
- 混合光纤同轴(上下游传输速率不对称)
- 电缆网络(光纤链接家庭到ISP路由器)
-
家庭网
-
企业接入网(以太网)
-
无线接入网络
1.2.1.3 物理媒体
-
导向媒体(固体介质)
双绞线、同轴电缆、光缆
-
非导向媒体(如无线电)
地面微波、卫星
1.2.2 网络核心
连接端系统的分组交换机和链路形成的网状网络。关键功能为路由和转发。
1.3 电路交换
1.3.1 概念
通信双方必须先建立一个专用的连接(电路),一直维持到通信结束。通常用于传统电话网络。
采用FDM(频分复用)与TDM(时分复用)技术。
1.3.2 特点
- 电路为专用资源,不共享
- 电路段空闲不使用也不共享
- 通常用于传统电话网络
1.4 分组交换
1.4.1 存储和转发
整个数据包必须到达路由器,然后才能在下一个链路上传输。
需要秒才能将位数据包推送到链路中。假设传播延迟为零,则端到端延迟为。
1.4.2 排队和损失
若链路的到达速率在一段时间内超过链路的传输速率,数据包将排队等待,若缓冲区满,则会丢失数据包。
1.4.2 特点(相对电路交换)
- 允许更多的用户使用网络
- 很适合突发数据(资源共享,无需呼叫建立)
- 有可能发生拥塞
1.5 性能指标
1.5.1 延迟
分组到达链路的速率暂时超过输出链路的容量,数据包进入队列等待转发。
传输时延大于传播时延时,一个分组中前几个比特已到达下移路由器,而余下的仍在前一个路由器中等待传输。
流量强度:
其中,为链路带宽(),为分组长度(),为平均分组到达率。
1.5.2 丢包
队列的缓存容量是有限的,分组到达已满队列将被丢弃,丢弃的分组可能由前序结点或源重发,也可能不重发。丢包率为丢包数与已发送分组数的商。
1.5.3 吞吐量
吞吐量表示在发送端与接收端之间的传送数据速率()。
- 即时吞吐量:给定时刻的速率。
- 平均吞吐量:一段时间的平均速率。
2. 网络的体系结构
2.1 网络体系结构的概念
网络体系结构从功能上描述了计算机网络结构,是分层结构,每层遵循某个或某些网络协议完成本层的功能。网络体系结构是计算机网络的各层及其协议的集合,是抽象的,一个计算机网络的功能层次及其关系的定义。
- 实体表示任何可发送或接收信息的硬件或软件进程。
- 协议是控制两个对等实体进行通信的规则的集合,是水平的。
- 任一层实体需要使用下层的服务,遵循本层的协议,实现本层的功能,向上层提供服务,服务是垂直的。
- 下层协议的实现对上层的服务用户是透明的。
- 同系统的相邻层实体间通过接口进行交互,通过服务访问点(SAP)交换原语,指定请求的特定服务。
2.2 对等层、服务与服务访问点
2.2.1 对等层
对等层是指在计算机网络协议层次中,将数据直接传递给对方的任何两个同样的层次。
2.2.2 服务
上层使用下层提供的服务必须通过与下层交换一些命令,这些命令叫服务原语。
2.2.3 服务访问点
在同一系统中相邻两层的实体进行交互的地方叫服务访问点。
2.3 TCP/IP模型
2.4 OSI/RM模型
OSI模型的目的是支持易购网络系统的互联互通,每一层完成特定的网络功能。
2.5 五层原理模型
综合OSI/RM模型与TCP/IP模型的优点。
层 | 作用 | 协议 |
---|---|---|
应用层 | 支持各种网络应用 | FTP, SMTP, HTTP |
传输层 | 进程-进程的数据传输 | TCP, UDP |
网络层 | 源主机到目的主机的数据分组路由与转发 | IP协议,路由协议等 |
链路层 | 相邻的网络元素(主机、交换机、路由器等)的数据传输 | 以太网、802.11、PPP |
物理层 | 比特传输 | – |
第二章 应用层
1. 应用层协议原理
1.1 应用层的概念与作用
应用层直接和应用程序接口并提供常见的网络应用服务,支持各种网络应用。
1.2 网络应用程序体系结构
1.2.1 客户机-服务器结构
-
服务器
- 7*24小时提供服务
- 有永久性访问的域名/地址
- 能利用大量服务器实现可拓展性
-
客户机
- 与服务器通信,使用服务器提供的服务
- 间歇性接入网络
- 可能使用动态的IP 地址
- 不会与其他客户机直接通信
1.2.2 纯P2P结构
- 没有永远在线的服务器
- 任意端系统/节点之间可以直接通讯
- 节点间间歇性接入网络
- 节点可能改变IP地址
- 优点:高度可伸缩
- 缺点:难于管理
1.2.3 混合结构
举例:Napster
文件传输使用P2P结构,文件搜索采用C/S结构。
1.3 进程间通信
1.3.1 标识符
IP地址+端口号,如11.45.14.191:9810,其中11.45.14.191为IP地址,9810为端口号。
1.3.2 Socket
进程间通信利用socket发送/接收消息实现。其过程类似于寄信。传输基础设施想进程提供API,可以选择传输协议并设置参数。
2. 因特网上的引用层协议
2.1 万维网构成
万维网是无数个网络站点和网页的集合,他们相互连接。
2.2 HTTP协议
HTTP: Hypertext Transfer Protocol,使用TCP传输服务。
服务器在80端口等待客户请求,浏览器发起到服务器的TCP连接(创建套接字Socket),服务器接收来自浏览器的TCP连接,浏览器(HTTP客户端)与服务器(HTTP服务器)交换HTTP消息,关闭TCP连接。
HTTP是无状态的,服务器不维护任何油管客户端国区所发的请求消息。
2.3 E-mail
2.3.1 用户代理
即邮件阅读器,允许用户阅读、回复、发送、保存和撰写报文。
当用户完成邮件撰写时,邮件代理向其邮件服务器中发送邮件,并存放在发送队列中。
当用户想读取一条报文时,邮件代理从其邮件服务器的邮箱中获取该报文。
2.3.2 邮件服务器
- 邮箱:发送给用户的报文。
- 报文队列:用户要发出的邮件报文。
邮件发送的主要过程:
- 邮件保存到发送方报文队列。
- 通过SMTP协议转发到接收方邮件服务器,保存到相应邮箱中。
- 若投递失败,发送方将其保存在一个报文队列中,以后每30分钟发送一次,若几天后仍未成功,将该报文删除,并通知发送方。
- 用户访问自己邮箱时,邮件服务器对其身份进行验证((用户名和口令)。
2.3.3 SMTP(简单邮件传送协议)
SMTP是应用层协议,使用TCP可靠数据传输服务,包括在发送方邮件服务器上运行的客户机端与在接收方邮件服务器上运行的服务器端。每个邮件服务器上都有SMTP的客户机端和服务器端。
2.4 DNS
2.4.1 DNS的作用
进行域名向IP地址的翻译,记录主机、邮件服务器别名,可实现Web服务器负载均衡。
2.4.2 分布式层次式数据库
例如客户端想要查询www.tigerxly.com的IP:
- 客户端查询根服务器,找到com域名解析服务器。
- 客户端查询com域名解析服务器,找到tigerxly.com域名解析服务器。
- 客户端查询tigerxly.com域名解析服务器,获得www.tigerxly.com的IP地址。
2.4.3 DNS根域名服务器
当本地域名解析服务器无法解析域名时,访问根域名服务器。根域名服务器如果不知道映射,访问权威域名服务器,获得映射后想本地渔民服务器返回映射。
-
顶级域名服务器
负责com, org, net, edu等顶级域名和国家顶级域名,例如cn, uk, fr等。
-
权威域名服务器
组织的域名解析服务器,提供组织内部服务器的解析服务。
本地域名解析服务器不严格属于层次体系,每个ISP有一个本地域名服务器。当主机进行DNS查询时,查询被发送到本地域名服务器。
2.4.4 查询示例
- 迭代查询
- 递归查询
2.4.5 DNS记录缓存和更新
-
只要域名解析服务器获得域名-IP映射,即缓存这一映射,一段时间过后,缓存条目失效(删除)。
-
本地域名服务器一般会缓存顶级域名服务器的映射,因此根域名服务器不经常被访问。
-
记录的更新/通知机制
- RFC 2136
- Dynamic Updates in the Domain Name System (DNS UPDATE)
2.5 P2P
3. Socket编程
3.1 UDP套接字
3.1.1 客户机
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPClient{
/* The server port to which
the client socket is going to connect */
public final static int SERVICE_PORT = 50001;
public static void main(String[] args) throws IOException{
try{
/* Instantiate client socket.
No need to bind to a specific port */
DatagramSocket clientSocket = new DatagramSocket();
// Get the IP address of the server
InetAddress IPAddress = InetAddress.getByName("localhost");
// Creating corresponding buffers
byte[] sendingDataBuffer = new byte[1024];
byte[] receivingDataBuffer = new byte[1024];
/* Converting data to bytes and
storing them in the sending buffer */
String sentence = "Hello from UDP client";
sendingDataBuffer = sentence.getBytes();
// Creating a UDP packet
DatagramPacket sendingPacket = new DatagramPacket(sendingDataBuffer,sendingDataBuffer.length,IPAddress, SERVICE_PORT);
// sending UDP packet to the server
clientSocket.send(sendingPacket);
// Get the server response .i.e. capitalized sentence
DatagramPacket receivingPacket = new DatagramPacket(receivingDataBuffer,receivingDataBuffer.length);
clientSocket.receive(receivingPacket);
// Printing the received data
String receivedData = new String(receivingPacket.getData());
System.out.println("Sent from the server: "+receivedData);
// Closing the socket connection with the server
clientSocket.close();
}
catch(SocketException e) {
e.printStackTrace();
}
}
}
3.1.2 服务器
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPServer{
// Server UDP socket runs at this port
public final static int SERVICE_PORT=50001;
public static void main(String[] args) throws IOException{
try{
// Instantiate a new DatagramSocket to receive responses from the client
DatagramSocket serverSocket = new DatagramSocket(SERVICE_PORT);
/* Create buffers to hold sending and receiving data.
It temporarily stores data in case of communication delays */
byte[] receivingDataBuffer = new byte[1024];
byte[] sendingDataBuffer = new byte[1024];
/* Instantiate a UDP packet to store the
client data using the buffer for receiving data*/
DatagramPacket inputPacket = new DatagramPacket(receivingDataBuffer, receivingDataBuffer.length);
System.out.println("Waiting for a client to connect...");
// Receive data from the client and store in inputPacket
serverSocket.receive(inputPacket);
// Printing out the client sent data
String receivedData = new String(inputPacket.getData());
System.out.println("Sent from the client: "+receivedData);
/*
* Convert client sent data string to upper case,
* Convert it to bytes
* and store it in the corresponding buffer. */
sendingDataBuffer = receivedData.toUpperCase().getBytes();
// Obtain client's IP address and the port
InetAddress senderAddress = inputPacket.getAddress();
int senderPort = inputPacket.getPort();
// Create new UDP packet with data to send to the client
DatagramPacket outputPacket = new DatagramPacket(
sendingDataBuffer, sendingDataBuffer.length,
senderAddress,senderPort
);
// Send the created packet to client
serverSocket.send(outputPacket);
// Close the socket connection
serverSocket.close();
}
catch (SocketException e){
e.printStackTrace();
}
}
}
3.2 TCP套接字
3.2.1 客户机
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class SocketClient {
public static void main(String[] args){
try {
Socket clientSocket = new Socket ("localhost",50001);
InputStream is = clientSocket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String receivedData = br.readLine();
System.out.println("Received Data: "+receivedData);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
3.2.2 服务器
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static final int SERVER_PORT = 50001;
public static void main (String[] args){
try {
ServerSocket server = new ServerSocket(SERVER_PORT);
Socket clientConn = server.accept();
DataOutputStream serverOutput = new DataOutputStream(clientConn.getOutputStream());
serverOutput.writeBytes("Java revisited\n");
clientConn.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
第三章 传输层
1. 传输层概述
1.1 传输层和网络层的关系
网络层是主机之间的逻辑通信机制,传输层是应用进程之间的逻辑通信机制。传输层位于网络层之上,依赖于网络层服务,对网络层服务进行(可能的)增强。
1.2 进程到进程的数据交付
传输层可为应用提供多种协议,如TCP、UDP。发送方将应用递交的消息分成一个或多个段,并向下传给网络层;接收方将接收到的段组装成消息,并向上交给应用层。
1.3 复用和分用
发送端从多个socket接收数据,为每块数据封装上头部信息,生成段,交给网络层(多路复用);接收端依据头部信息将接受到的段交给正确的socket,即不同的进程(多路分用)。
1.3.1 分用的工作原理
主机收到IP数据报,每个数据报写到源IP地址、目的IP地址和一个传输层的段,每个段携带源端口号和目的端口号。主机获取段后,传输层协议提供IP地址和端口号信息,使主机将段导向相应的socket。(TCP会做更多的处理)
1.3.2 无连接分用和面向连接分用
-
无连接分用将来自不同源IP地址和源端口号的数据被导向一个socket。
-
面向链接分用,服务器为每个客户端开不同的socket。
2. UDP协议
2.1 UDP的特点
UDP基于IP协议,提供"best effort"服务,数据可能丢失或非按序到达。UDP是无连接协议,发送方和接收方不需要握手,每个UDP段的处理独立于其他段。
由于流媒体服务容忍丢失且对速率敏感,故UDP常用于流媒体服务。UDP还用于DNS和SNMP。
可在应用层添加可靠性机制和特定的错误回复机制以通过UDP进行可靠数据传输。
2.2 UDP报文段结构
后面跟数据(如果有)。报文长度包含首部。
2.3 UDP校验和
2.3.1 校验和的目的
检测UDP段在传输中是否发生位翻转等错误。
2.3.2 校验和的计算
发送方将段的内容视为16-bit整数,计算所有整数的和,将进位加在和的后面,将得到的值按位取反,得到校验和,并将其放入校验和字段。
3. 可靠数据传输原理
3.1 流水线可靠数据传输原理
流水线协议允许发送方在收到ACK之前连续发送多个分组,有更大的序列号范围,提高了资源利用率,但发送方和接收方需要更大的存储空间以缓存分组。
3.2 回退N步
数据分组头部包含k-bit序列号,窗口尺寸为,表示到序列号(含)的分组均已正常接收。为传输中的分组设置计时器,超过一定时间,重传未收到ACK的所有分组。
3.3 选择重传
接收方对每个分组单独进行确认,并设置缓存机制,缓存乱序到达的分组。发送方为每个分组设置定时器,只重传没有收到ACK的分组。
4. TCP协议和TCP的拥塞控制
4.1 TCP可靠传输原理
TCP通过流水线机制、累计确认机制和单一重传计时器的使用实现可靠传输。
NextSeqNum = InitialSeqNum
SendBase = InitialSeqNum
loop(forever){
switch(event)
event: data received from application above
create TCP segment with sequence number NextSeqNum if (timer currently not running)
start timer
pass segment to IP
NextSeqNum = NextSeqNum + length(data)
event: timer timeout
retransmit not-yet-acknowledged segment with smallest sequence number
start timer
event: ACK received, with ACK field value of y
if (y > SendBase) {
SendBase = y
if (there are currently not-yet-acknowledged segments)
start timer
}
}
如果sender收到对同一数据的3个ACK,则假定该数据之后的段已经丢失,在计时器超时前进行重传(快速重传)。
4.2 流量控制
TCP基于滑动窗口进行流量控制。在TCP连接建立时,接收方会在确认报文段中给出自己接收窗口的大小。在每次发送确认报文时能够根据情况动态调整接收窗口的大小,并将告知发送方。
4.3 TCP报文段结构
字段 | 解释 |
---|---|
源端口和目的端口 | 各占2字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。 |
序列号 | 占4字节。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。 |
确认号 | 占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。 |
数据偏移 | 占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。 |
保留 | 占6位,保留为今后使用,但目前应置为0。 |
紧急URG | 当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。 |
确认ACK | 只有当ACK=1时确认号字段才有效。当ACK=0 时,确认号无效。 |
推送PSH | 接收TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。 |
复位RST | 当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。 |
同步SYN | 同步SYN=1表示这是一个连接请求或连接接受报文。 |
终止FIN | 用来释放一个连接。FIN=1表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。 |
窗口 | 用于流量控制。 |
校验和 | 占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。 |
紧急指针 | 占16位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。 |
选项 | 长度可变。TCP最初只规定了一种选项,即最大报文段长度MSS。 |
填充 | 使整个首部长度是4字节的整数倍。 |
4.4 建立连接和释放连接
4.4.1 连接的建立
4.4.2 连接的释放
4.4.3 为什么要三次握手四次挥手
参考这篇文章
4.5 拥塞控制
在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,产生拥塞。
4.5.1 慢开始算法
发送方维持一个叫做拥塞窗口的状态变量(cwnd),只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去,但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
最开始设定cwnd=1,在每收到一个对新的报文段的确认后,使cwnd加一,即增加一个MSS的数值,逐步扩大cwnd,cwnd呈指数增加,直到超出门限状态变量的值(ssthresh)后,停止使用慢开始算法转而使用拥塞避免算法。(cwnd=ssthresh时,两种算法均可用)
4.5.2 拥塞避免算法
让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增长。
4.5.3 AIMD
- Additive Increase: 每个RTT将cwnd增大一个MSS——拥塞避免
- Multiplicative Decrease: 发生loss后将cwnd减半
4.6 TCP面向字节流与UDP面向报文
面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会使IP数据报太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。
虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。
在TCP建立连接前两次握手的SYN报文中选项字段的MSS值,通信双方商定通信的最大报文长度。如果应用层交付下来的数据过大,就会对数据分段,然后发送;否则通过滑动窗口协议来控制通信双发的数据。(来源)
第四章 网络层
1. 网络层概述
1.1 网络层的作用
实现两个端系统之间的数据透明传送。
1.2 网络层的主要功能
路由和分组转发。
-
转发
将分组从路由器的输入端口转移到合适的输出端口。
-
路由
通过路由算法确定分组从源到目的经过的路径。
1.3 数据平面和控制平面
-
数据平面
每个路由器都具备数据平面,用来决定输入端口的数据报怎样发到输出端口,实现转发功能。
-
控制平面
控制平面与全网逻辑相关,用来确定数据报如何在路由器之间沿着从源主机到目标主机之间的路由转发。控制平面方法有两种。分别是传统路由算法(路由器中实现)与software-defined networking(SDN,远程服务实现)。
1.4 网络层服务类型
1.4.1 无连接服务
不事先为系列分组的传输确定传输路径,为每个分组独立确定传输路径,因此不同分组传输路径可能不同。数据报网络
1.4.2 连接服务
首先为系列分组的传输确定从源到目的经过的路径(建立连接),然后研该路径传输系列分组,因此系列分组的传输路径相同,传输结束后连接拆除。虚电路网络
2. IPv4协议
2.1 IP协议的作用
把各种数据包传送给对方。(无连接)
2.2 IP首部格式
字段 | 解释 |
---|---|
版本 | 占4位,IP协议的版本号。 |
首部长度 | 占4位,IP分组首部长度。 |
服务类型 | 占9位,指示期望获得哪种类型的服务,只有在网络提供区分服务(DiffServ)时使用,一般情况下不使用,通常IP分组的该字段(第2字节)的值为00H。 |
总长度 | 占16位,IP分组的总字节数(首部+数据)。 |
标识 | 占16位,标识一个IP分组。IP协议利用一个计数器,每产生IP分组计数器加1,作为该IP分组 的标识。 |
标志位 | 占3位,第一位保留,第二位为DF,DF=1表示禁止分片,反之为允许分片;第二位为MF,MF=1表示非最后一片,反之表示最后一片或未分片。 |
片偏移 | 占13位,一个IP分组分片封装原IP分组数据的相对偏移量,以8字节为单位。 |
生存时间(TTL) | 占8位,IP分组在网络中可以通过的 路由器数(或跳步数),每经过一个路由器就减一,如果TTL为0,则丢弃该IP分组。 |
协议 | 占8位,表示封装的是哪个协议的数据包。 |
首部校验和 | 占16位,实现对IP分组首部的差错检测。计算校验和时,该字段置全0,采用反码算数运算求和,和的反码作为首部校验和字段。逐跳计算,逐跳检验。 |
源/目的IP地址 | 各占32位,分别表示发送分组的网络接口和接收分组的网络接口的IP地址。 |
选项 | 字段长度可变,范围在1-40B之间,携带安全、源选路径、时间戳和路由记录等内容,实际上很少被使用。 |
填充 | 即保证首部长度是4字节的倍数。 |
2.3 IP分片与重组
网络链路存在MTU(最大传输单元),即链路层数据帧可封装数据的上限。不同链路的MTU不同。
大IP分组向较小的MTU链路转发时,可以被分片,使一个IP分组分为多片IP分组。IP分片叨叨目的主机后进行重组。IP首部的相关字段用 于标识分片以及确定 分片的相对顺序。
2.4 IP地址的概念
32比特(IPv4)编号标识主机、路由器的接口,与每个接口相关联。
2.4.1 分类
2.4.2 特殊地址
NetID | HostID | 作为IP分组源地址 | 作为IP分组目的地址 | 用途 |
---|---|---|---|---|
全0 | 全0 | 可以 | 不可以 | 在本网范围内表示本机,在路由表中表示默认路由。 |
全0 | 特定值 | 不可以 | 可以 | 表示本网内某个特定主机。 |
全1 | 全1 | 不可以 | 可以 | 本网广播地址(路由器不转发)。 |
特定值 | 全0 | 不可以 | 不可以 | 网络地址,表示一个网络。 |
特定值 | 全1 | 不可以 | 可以 | 直接广播地址,对特定网络上所有主机进行广播。 |
127 | 非全0或非全1的任何数 | 可以 | 可以 | 用于本地软件还回测试,称作还回地址。 |
2.4.3 私有IP地址
类 | NetID |
---|---|
A | 10 |
B | 172.16-172.31 |
C | 192.168.0-192.168.255 |
2.5 子网划分
将IP地址分为3块:
- 网络号:高位比特
- 子网号:原网络主机号部分
- 主机号:低位比特
子网地址+子网掩码确定子网大小。
2.5.1 子网掩码
32位,点分十进制表示。NetID与SubID全为1,其他全为0。将IP分组的目的IP地址与子网掩码按位与运算,可提取子网地址。
2.6 CIDR与超网
超网(supernetting),也称无类别域间路由选择(CIDR),它是集合多个同类互联网地址的一种方法。
2.7 路由转发分组原则
当一条数据包进入路由器的时候,首先匹配路由表中掩码最长的;当到达目的地有不同的路由协议条目时,首先匹配路由协议的优先级;当到达目的地有多条同种路由协议的时候,首先匹配COST值小的。
3. 路由算法
3.1 控制平面两种实现方式
3.1.1 传统路由算法
在路由器中实现,每个路由器中独立的路由算法组件在控制平面中相互作用。
3.1.2 software-defined networking (SDN)
逻辑集中,远程服务实现。A distinct (typically remote) controller interacts with local control agents (CAs). 远程控制起与CA进行交互。
3.2 路由选择算法及其分类
路由算法确定去往目的网络的最佳路径。
3.2.1 路由算法分类
-
静态路由
需要手工配置,更新慢,但是优先级高。
-
动态路由
路由定期更新,更新快,几十相应链路费用或拓扑变化。
-
全局信息
所有路由器掌握完整的网络拓扑和链路费用信息。如链路状态(LS)算法。
-
分散信息
路由器只掌握无力相连的邻居以及链路费用。邻居间进行信息交换并运算。如距离向量(DV)算法。
3.2.2 DV算法
每个结点不定时地将其自身的DV估计发送给其邻居,当x接收到邻居的新的DV估计时,即依据B-F更新其自身的距离向量估计:(DP算法)
每个节点仅当DV变化时才通告给邻居。
3.2.3 层次路由
上述图论算法直接应用在庞大的互联网中是不可行的,路由表几乎无法存储,计算过程信息交换量巨大,会淹没链路。
现实做法是,聚合路由器为一个自治系统(AS),同一AS内的路由器运行相同的算法。网关路由器可通过链路连接其他AS的网关路由器。
3.3 ICMP
3.3.1 概念与作用
互联网控制消息协议(英语:Internet Control Message Protocol,缩写:ICMP)是互联网协议族的核心协议之一。它用于网络层中发送控制消息,提供可能发生在通信环境中的各种问题反馈。通过这些信息,使管理者可以对所发生的问题作出诊断,然后采取适当的措施解决。(差错报告、网络探询)
ICMP依靠IP来完成它的任务,它是IP的主要部分。它与传输协议显著不同:它一般不用于在两点间传输数据。它通常不由网络程序直接使用,除了ping和traceroute这两个特别的例子。(来源)
3.3.2 报文结构
3.3.3 分类
-
差错报告报文
目的不可达、源抑制、超时/超期、参数问题、重定向
-
网络探询报文
回声请求与应答报文、时间戳请求与应答报文
3.3.4 差错报文封装
3.4 OSPF
开放最短路径优先。采用链路状态路由算法,每个路由器构造完整的AS网络拓扑,利用Dijkstra算法计算路由。
相对于RIP,OSPF更安全,允许使用多条费用相同的路径,并可根据需求设置费用。OSPF支持对大规模AS分层。
第五章 数据链路层与局域网
1. 数据链路层
1.1 数据链路层的作用
实现相邻网络元素(主机、交换机、路由器等)的数据传输,负责通过一条链路从一个节点另一个物理链路直接相邻的节点传送数据报。
1.2 链路概念及分类
链路是连接相邻结点的通信信道,包括有线链路、无线链路和局域网。
-
点对点链路
- 拨号接入的PPP
- 以太网交换机与主机间的点对点链路
-
广播链路(共享介质)
- 早期的总线以太网
- HFC的上行链路
- 802.11无线局域网
1.3 Mac协议
采用分布式算法决定结点如何共享信道,即决策结点何时可以传输数据。
-
信道划分Mac协议
再用多路复用技术,包括TDMA、FDMA、CDMA、WDMA等。
-
随机访问Mac协议
信道不划分,允许冲突,并采用冲突恢复机制。
-
轮转Mac协议
节点轮流使用信道。
1.3.1 TDMA
每个站点在每个周期占用固定长度的时隙。
1.3.2 FDMA
每个站点分配一个固定的频带。
1.3.3 CSMA/CD
短时间内可以检测到冲突,冲突后传输终止,减少信道浪费。
令为LAN中两个节点的最大传播延迟,为最长帧传输延迟,则传输效率为:
1.3.4 争用期
最先发送数据帧的站,在发送数据帧后至多经过时间(两倍的端到端往返时延)就可知道发送的数据帧是否遭受了碰撞。以太网的端到端往返时延称为争用期,或碰撞窗口。
经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。
1.4 Mac地址
用于局域网内标识一个帧从哪个接口发出,到达哪个物理相连的其他接口,48位,固化在网卡的 ROM中,有时也可以软件设置。每块网卡都有唯一的Mac地址,由IEEE统一管理、分配。
1.5 ARP
地址解析协议。局域网中每个IP节点维护一个表。
1.6 局域网与以太网
-
局域网
是地理范围小的计算机网络,使用多路访问协议,传输速率高。
-
以太网
目前应用最普遍的局域网技术。
1.7 交换机工作原理
参考这里