计算机网络学习笔记
1. 计算机网络基本概念
定义:一些互相连接的、自治的计算机的集合
性能指标:速率、带宽、吞吐量、时延、时延带宽积、往返时间、利用率、丢包率
2. 常见计算机网络体系结构
OSI 体系结构
法律上的国际标准
TCP/IP 体系结构
事实上的国际标准
原理体系结构
3. 物理层概述
作用: 在各种传输媒体上传输比特 0 和 1
传输媒体:
-
导引型传输媒体
同轴电缆、双绞线、光纤、电力线
-
非导引型传输媒体
无线电波、微波、红外线、可见光
4. 数据链路层概述
-
数据链路层三个重要问题
- 封装成帧
- 差错检测
- 可靠传输
-
可靠传输的实现机制
- 停止-等待协议 SW
- 回退 N 帧协议 GBN
- 选择重传协议 SR
-
点对点协议 PPP:Point to Point Protocol
4.1. 媒体接入控制
共享信道要着重考虑的一个问题就是如何协调多个发送和接收站点对一个共享传输媒体的占用,即媒体接入控制 MAC(Medium Access Control)
-
静态划分信道
-
动态接入控制
- 多址接入
- 载波监听
- 碰撞检测
4.2. MAC 地址、IP 地址以及 ARP 协议
-
使用点对点信道的数据链路不需要使用地址
-
MAC 地址是以太网的 MAC 子层所使用的地址, 属于数据链路层
严格来说,MAC 地址是对网络上各接口的唯一标识,而不是对各设备的唯一标识
-
IP 地址是 TCP/IP 体系结构网际层所使用的地址
-
ARP 协议是属于 TCP/IP 体系结构的网际层,其作用是已知设备所分配到的 IP 地址,使用 ARP 协议可以通过该 IP 地址获取到设备的 MAC 地址
ARP 协议只能在一段链路或同一网络中使用
数据包转发过程中:
- 源 IP 地址和目的 IP 地址保持不变
- 源 MAC 地址和目的 MAC 地址逐个链路(或逐个网络)改变
4.3. 集线器与交换机的区别
- 使用集线器的以太网逻辑上仍是一个总线网,各站共享总线资源,使用的还是 CSMA/CD 协议,属于同一个碰撞域和广播域
- 集线器只工作在物理层,它的每个接口仅简单地转发比特,不进行碰撞检测
- 集线器一般都有少量的容错能力和网络管理功能
- 交换机通常有多个接口,一般都工作在全双工方式
- 交换机具有并行性,能同时联通多对接口,使多对主机同时通信,无碰撞(不使用 CSMA/CD 协议)
- 交换机工作在数据链路层,它收到帧后,在帧交换表中查找帧的目的 MAC 地址所对应的接口号
- 交换机的每个接口是一个独立的碰撞域
- 交换机隔离碰撞域但不隔离广播域
4.4. 以太网交换机生成树协议 STP
-
如何提高以太网可靠性?
-
添加冗余链路
但是冗余链路会带来负面效应——形成网络回路,带来以下问题:
- 广播风暴
- 主机收到重复的广播帧
- 交换机的帧交换表震荡(飘移)
-
使用生成树协议 STP
-
避免网络环路带来的各种问题
-
不论交换机间采用怎样的物理连接,交换机都能自动计算并构建一个逻辑上没有环路的网络,其逻辑拓扑结构必须是树型的(无逻辑环路)
-
-
4.5. 虚拟局域网 VLAN
使用一个或多个交换机互连起来的交换式以太网,其所有站点都属于同一个广播域
巨大的广播域会带来很多弊端:
- 广播风暴
- 难以管理和维护
- 潜在的安全问题
-
网络中会频繁出现广播信息
- TCP/IP 协议栈中很多协议都会使用广播
- 地址解析协议 ARP
- 路由信息协议 RIP
- 动态主机配置协议 DHCP
- TCP/IP 协议栈中很多协议都会使用广播
-
分割广播域的方法
- 使用路由器可以隔离广播域
-
虚拟局域网 VLAN是一种将局域网内的设备划分成与物理位置无关的逻辑组的技术,这些逻辑组具有某些共同的需求
5. 网络层概述
网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。
网络层提供的两种服务:
-
面向连接的虚电路服务
-
可靠通信由网络来保证
-
必须建立网络层的连接——虚电路 VC
-
通信双方沿着已建立的虚电路发送分组
-
目的主机地址仅在连接建立阶段使用,之后每个分组首部只需携带一条虚电路编号
-
数据总是按序到达
-
通信结束后,需要释放之前所建立的虚电路
-
-
无连接的数据包服务
-
可靠通信由用户主机来保证
-
不需要建立网络层连接
-
每个分组可走不同路径
-
每个分组必须携带目的主机的完整地址
-
这种通信方式所传送的分组可能误码,丢失,重复和失序
-
5.1. 分类编址的 IPv4 地址
-
A 类地址
8 位网络号,最高位为 0
-
B 类地址
16 位网络号,最高位为 10
-
C 类地址
24 位网络号,最高位为 110
-
D 类地址
全 32 位,最高位为 1110,多播地址
-
E 类地址
全 32 位,最高位为 1111,保留
-
地址 0.0.0.0 是一个特殊的 IPv4 地址,只能作为源地址使用,表示在本网络上的本主机
-
以 127 开头,且后面三个字节非全 0 或者全 1 的 IPv4 地址,既可以作为源地址,也可以作为目的地址,一般用于本地软件回环测试,例如常用的 127.0.0.1
-
地址 255.255.255.255,只能作为目的地之使用,表示“只在本网络上进行广播(各路由器均不转发)”
-
只有 A 类,B 类,C 类地址可分配给网络中的主机或路由器的各接口
-
主机号为全“0”的地址是网络地址,不能分配给主机或者路由器的各接口
-
主机号为全“1”的地址是广播地址,不能分配给主机或者路由器的各接口
5.2. 划分子网的 IPv4 地址和子网掩码
32 位子网掩码用于表明分类 IP 地址的主机号部分借用了几个比特作为子网号
- 子网掩码用连续的比特 1 来对应网络号和子网号
- 子网掩码用连续的比特 0 来对应主机号
- 将划分子网的 IPv4 地址与其对应的子网掩码进行逻辑与运算就可以得到 IPv4 地址所在子网网络地址
5.3. 无分类编址的 IPv4 地址
为了解决 IP 地址紧张的问题
无分类域间路由选择 CIDR,CIDR 使用“斜线记法”,即在 IPv4 地址后面加上斜杠,写上网络前缀所占的比特数量,剩余比特作为主机号。
5.4. IP 数据报的发送和转发过程
- 主机发送 IP 数据报
- 若在同一网络则直接交付
- 若不在同一网络,则间接交付,传输给主机所在网络的默认网关(路由器),由默认网关帮忙转发
- 路由器转发 IP 数据报
- 检查 IP 数据报首部是否出错,若出错则直接丢弃该 IP 数据报并通告源主机;若没有出错,则进行转发
- 根据 IP 数据报目的地址在路由表中查找匹配条目,找到则转发给下一跳,若找不到则丢弃该 IP 数据报并通告源主机
5.5. 路由选择协议——路由信息协议 RIP
RIP 要求自治系统 AS 内的每一个路由器都要维护从它自己到 AS 内其他每一个网络的距离记录,称为“距离向量”。
RIP 使用跳数作为度量来衡量到达目的网络的距离
- 路由器到直连网络的距离定义为 1
- 路由器到非直连网络的距离定义为所经过的路由器数加 1
- 允许一条路径最多只能包含 15 个路由器
- RIP 只适用于小型互联网
5.6. 路由选择协议——开放最短路径优先 OSPF 算法
开放最短路径优先 OSPF 算法使用了 DijKstra 提出的最短路径算法 SPF,克服了 RIP 算法的缺点
- OSPF 是基于链路状态(指本路由器和哪些路由器相邻,以及相应链路代价:费用、时延。带宽等)
- OSPF 采用 SPF 算法计算路由,从算法上保证了不会产生路由环路
- OSPF 不限制网络规模,更新效率高,收敛速度快
5.7. 边界网关协议 BGP 基本工作原理
- 外部网关协议 EGP(例如边界网关协议 BGP)
- 在不同自治系统内,度量路由的代价可能不同,因此,对于自治系统之间的路由选择,使用“代价”作为度量来寻找最佳路由是不行的
- 自治系统之间的路由选择必须考虑相关策略(政治,经济,安全等)
- 边界网关协议力求寻找一条能够到达目的网络且比较好的路由,并非一定要寻找最佳路由
5.8. IP 协议——IPv4 数据报首部格式
-
版本
占 4 个比特,通信双方版本必须一致
-
首部长度
占 4 个比特,表示 IP 数据报首部长度,取值以 4 字节为单位,最小十进制取值为 5,表示首部只有 20 字节固定部分;最大取值为 15,表示 IP 数据报首部包含 20 字节固定部分和最大 40 字节可变部分
-
可选字段
用来支持拍错,测量以及安全等措施,实际上可选字段很少被使用
-
填充字段,确保首部长度为 4 字节的整数倍,使用全 0 进行填充
-
区分服务
占 8 比特,用来获得更好地服务,利用该字段不同数值可以提供不同等级的服务质量,一般情况下不使用
-
总长度字段
占 16 比特,表示 IP 数据报总长度,首部+数据载荷,最大取值为十进制 65535,单位为字节
-
标识
占 16 比特,属于同一个数据报的各分片数据报应该具有相同的标识,IP 软件维持一个计数器,每产生一个数据报,计数器值加 1,并将此值赋给标识字段
-
标志
占 3 个比特
-
片偏移
表示该数据报分片在总的数据载荷中的偏移位置,以 8 字节为单位
-
生存时间
占 8 比特,最初以秒为单位,最大生存周期 255 秒,每转发一次减去该次转发在路由器上耗费的时间;现在以跳数为单位,每转发一次值减 1
-
协议
占 8 比特,指明 IPv4 数据报的数据部分是何种协议数据单元
如:取值为 6 表明为 TCP 协议;取值为 17 表明为 UDP 协议
5.9. 网际控制报文协议 ICMP
为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP,ICMP 是 IP 协议的附属协议,是介于 IP 层和 TCP 层的协议,一般被认为属于 IP 层协议。
- ICMP 报文被封装在 IP 数据报中进行发送
- 主机或路由器使用 ICMP 来向源 发送差错报告报文和询问报文
ICMP 差错报告报文共有以下 5 种:
- 终点不可达
- 源点抑制
- 时间超过
- 参数问题
- 改变路由(重定向)
ICMP 询问报文有以下两种:
-
回送请求和回答
用来测试目的站是否可达及了解其有关状态
-
时间戳请求和回答
请某个主机或路由器回答当前的日期和时间
ICMP 应用举例:
-
分组间探测 Ping
用来测试主机或路由器间的连通性,使用 ICMP 的回送请求和回答报文
-
跟踪路由
用来测试 IP 数据报从源主机到达目的主机要经过哪些路由器
5.10. 虚拟专用网 VPN 和网络地址转换 NAT
-
虚拟专用网 VPN
利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网
-
网络地址转换 NAT
缓解 IPv4 地址空间即将耗尽的问题,NAT 能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。
6. 运输层概述
物理层、数据链路层以及网络层它们共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信。
但实际上在计算机网络中进行通信的真正实体是位于通信两端主机中的进程。
- TCP/IP 体系运输层使用端口号来区分应用层的不同应用进程
- 端口号使用16 比特表示,取值范围 0~65535
6.1. TCP 和 UDP 对比
TCP:传输控制协议(Transmission Control Protocol)
UDP:用户数据报协议(User Datagram Protocol)
- UDP 是无连接的;TCP 是面向连接的
- UDP 支持单播、多播以及广播;TCP 仅支持单播,一对一通信
- UDP 是面向应用报文的,对应用层交付的报文既不合并也不拆分,保留边界,报文不可分割,是 UDP 数据报处理的最小单位;TCP 是面向字节流的,会对数据块进行编号拆分发送
- UDP 向上层提供无连接不可靠的传输服务(适用于 IP 电话、视频会议等实时应用);TCP 向上层提供面向连接的可靠传输服务(适用于要求可靠传输的应用)
- UDP 用户数据报由首部和数据部分组成,首部仅包含 8 字节(源端口+目的端口+长度+校验和);TCP 报文段也由首部和数据部分组成,但是首部格式复杂得多,最小为 20 字节(固定部分),最大为 60 字节(可变部分 40 字节)
6.2. TCP 的流量控制
所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接受
- 利用滑动窗口机制可以很方便地实现 TCP 连接上的流量控制
- TCP 接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小
- TCP 发送方收到接收方的零窗口通知后,应启动持续计时器,计时器超时后,向接收方发送零窗口探测报文
6.3. TCP 的拥塞控制
在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫拥塞,若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
TCP 四种拥塞控制算法
-
慢开始
- TCP 维护一个拥塞窗口 cwnd 和一个慢开始门限 ssthresh
- 拥塞窗口小于慢开始门限时,执行慢开始算法,每收到一次确认,拥塞窗口指数增长
-
拥塞避免
- 拥塞窗口大于慢开始门限时,执行拥塞避免算法,每收到一次确认,拥塞窗口线性加 1
- 当发生丢包时,认为网络拥塞,此时将慢开始门限变为开始时的一半,拥塞窗口变为 1,重新执行慢开始算法
-
快重传
-
要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认
-
即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
-
发送发一旦收到 3 个连续的重复确认,就将相应的报文段立即重传,而不是等待该报文段的超时重传计时器超时再重传
-
-
快恢复
- 发送方一但收到 3 个重复确认,就知道现在只是丢失了个别的报文段,于是不启动慢开始算法,而执行快恢复算法
6.4. TCP 可靠传输的实现
-
TCP 基于以字节为单位的滑动窗口来实现可靠传输
-
虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻,发送方的发送窗口并不总是和接收方的接收窗口一样大
-
TCP 要求接收方必须有累积确认和捎带确认机制,这样可以减小传输开销。
- 接收方不应过分推迟发送确认,否则会导致不必要的超时重传
-
TCP 是全双工通信,通信中的每一方都在发送和接收报文段,因此,每一方都有自己的发送窗口和接受窗口。
6.5. TCP 运输连接管理
-
TCP 是面向连接的协议,它基于运输连接来传送 TCP 报文段
-
TCP 运输连接的建立和释放是每一次面向连接的通信中必不可少的过程
-
TCP 运输连接的三个阶段:
- 建立 TCP 连接(三报文握手)
- 数据传送
- 释放 TCP 连接(四报文挥手)
-
TCP“三报文”握手建立连接
- 客户端发送同步位 SYN=1、初始序号字段 seq=x 的连接请求到服务器,同时进入同步已发送状态
- 服务器发送针对 TCP 连接请求的确认报文:同步位 SYN=1、确认位 ACK=1、序号字段 seq 为 y,确认号字段 ack=x+1,之后进入同步已接收状态
- 客户端收到来自服务器的确认报文后也发送一个确认报文至服务器,ACK=1,序号字段 seq=x+1,确认号字段 ack=y+1,至此两方连接建立
-
TCP“四报文挥手”释放连接
- 客户端发送 TCP 连接释放报文段,终止位 FIN=1,确认位 ACK=1,序号字段 seq=u,确认号字段 ack=v,进入终止等待状态 1
- 服务器发送一个 TCP 确认报文段,确认位 ACK=1,seq=v,ack=u+1,进入关闭等待状态,这个时候服务器仍然可以向客户端发送数据,客户端进入终止等待状态 2
- 数据传输完毕后,服务器发送 TCP 链接释放报文段并进入最后确认状态,终止位 FIN=1,确认位 ACK=1,序号字段 seq=w (因为半关闭状态下,服务器可能又发送了一些数据),确认号字段 ack=u+1
- 客户端发送 TCP 确认报文段,ACK=1,seq=u+1,ack=w+1,进入时间等待状态
- 服务器收到客户端的确认报文后进入关闭状态,客户端经过 2MSL(最长报文寿命)后进入关闭状态
注意:ack 均是对于对方报文 seq 序号 x 的确认,值为 ack=x+1
6.6. TCP 报文段首部格式
-
源端口
占 16 比特,用来标识发送该 TCP 报文段的应用进程
-
目的端口
占 16 比特,用来标识接受该 TCP 报文段的应用进程
-
序号
占 32 比特,序号增加到最后一个后,下一个序号又回到 0
指出本 TCP 报文段数据载荷的第一个字节的序号
-
确认号
占 32 比特,确认号增加到最后一个后,下一个确认号又回到 0
指出期望收到对方下一个 TCP 报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认
-
确认标志位 ACK
取值为 1 时确认号字段才有效,取值为 0 时确认号字段无效
TCP 规定,在连接建立后所有传送的 TCP 报文段都必须把 ACK 置 1
-
数据偏移
占 4 比特,并以 4 字节为单位
用来指出 TCP 报文段的数据载荷部分的起始处距离 TCP 报文段的起始处有多远(实际上指出的是首部长度)
-
窗口
占 16 比特,以字节为单位,指出发送本报文段的一方的接收窗口
-
检验和
占 16 比特,检查范围包括 TCP 报文段的首部和数据载荷两部分
-
同步标志位 SYN
在 TCP 连接建立时用来同步序号
-
终止标志位 FIN
用来释放 TCP 连接
-
复位标志位 RST
用来复位 TCP 连接
当 RST=1 时,表明 TCP 连接出现了异常,必须释放连接,然后再重新建立连接
RST 置 1 还可以用来拒绝一个报文段或者拒绝一个 TCP 连接
-
推送标志位 PSH
接收方的 TCP 收到该标志位为 1 的报文段会尽快上交应用进程,而不必等到接受缓存都填满后再向上交付
-
紧急标志为 URG
取值为 1 时紧急指针字段有效;取值为 0 时紧急指针字段无效
-
紧急指针
占 16 比特,以字节为单位,用来指明紧急数据的长度
当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个 TCP 报文段中进行发送、紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据
-
选项
- 最大报文段长度 MSS 选项:TCP 报文段数据载荷部分的最大长度
- 窗口扩大选项:为了扩大窗口,提高吞吐率
- 时间戳选项:用来计算往返时间 RTT
- 选择确认选项
-
填充
由于数据偏移字段(首部长度)以 4 字节为单位,因此必须填充保证首部长度为 4 字节的倍数
7. 应用层概述
7.1. 动态主机配置协议 DHCP
- DHCP 允许以太计算机加入新网络时刻自动获取 IP 地址等网络配置信息而不用手工参与
- DHCP 报文在运输层使用 UDP 协议封装
- DHCP 客户在未获取到 IP 地址时使用地址为 0.0.0.0
7.2. 万维网 WWW
-
HTTP/1.0 采用非持续连接方式。在该方式下,每次浏览器请求一个文件都要与服务器建立 TCP 连接
-
HTTP/1.1 采用持续连接方式。在该方式下,服务器在发送响应后仍然保持这条连接。
- 为了进一步提高效率,HTTP/1.1 的持续连接还可以使用流水线方式工作,即浏览器在收到 HTTP 的响应报文之前就能够连续发送多个请求报文。
-
HTTP 报文格式
HTTP 是面向文本的,其报文每一个字段都是 ASCII 码串,并且每个字段长度都是不确定的。
- 请求报文
- 响应报文
TODO…