前言
关于 计算机网络 知识体系的总结。
概述
计算机网络
- 计算机网络 —— 自主计算机的互连集合
网络分类
- 直连网
- 点到点网络
- 单工(simplex):如有线电视
- 半双工(half duplex):如对讲机
- 全双工(full duplex):如电话
- 多路访问网络(共享介质、可能存在碰撞)
- 单播、多播、广播
- 点到点网络
- 间接连网:用路由器(或网关)连接起来构成的网络,也称网络互连
- 系统域网、局域网、城域网、广域网
因特网
- 多层 ISP(因特网服务提供商)结构,由终端、路由器、通信链路组成
网络服务
- 可靠/不可靠:如 TCP/UDP
- 面向连接/无连接:如电话/邮件
- 有确认/无确认:如挂号信/数据报
网络分层
- 上层服务可以使用下层服务提供的协议
- 因特网模型(4层)
- 物理网络层
- 物理层 bitstream 字节流
- 数据链路层 PPP Ethernet (节点 node / 跳 hop)数据帧
- 网络层 IP 路由协议 (主机 host) 数据报
- 传输层 TCP UDP (端 end) 数据段
- 应用层 FTP SMTP HTTP 消息
- 物理网络层
- ISO/OSI 参考模型(7层)
- 物理层:传输原始比特流
- 数据链路层:在物理网路中传送数据包
- 网络层:通过路由选择连接各种网络
- 传输层:用于进程之间的数据传送
- 会话层:提供会话式的数据传送服务
- 表示层:提供数据转换服务
- 应用层:为专门应用提供服务
网络性能分析
- 包交换技术
- 延迟
- 处理延迟:检查比特错,确定输出链路
- 排队延迟:在输出链路队列等待发送
- 传输延迟:包长(bits)/ 链路带宽(bps)
- 传播延迟:物理链路长度 / 信号传播速度
- 丢失
- 延迟
- 带宽:一条链路或通道可达到的最大数据传输速率
- 吞吐量:一条链路或通道的实际数据传输速率
物理层
- 载波信号一般采用正弦波信号
编码方式
- FSK 频移键控、ASK 幅移键控、PSK 相移键控、QAM 正交调幅
- 单极编码
- 双极编码
- 不归零编码 NRZ(有时钟漂移、基线漂移)
- 不归零反转编码 NRZI(有时钟漂移、基线漂移)
- 曼切斯特编码(克服时钟漂移、基线漂移)(以太网)
- 0 变为 01、1 变为 10
- 差分曼切斯特编码(克服时钟漂移、基线漂移)
- 0 起始跳变、1 起始不跳变、中间一定跳变
- 4B / 5B 编码:使用 5 比特表示 4 比特,不会多于 1 个前导零和多于 2 个末端零。可以结合 NRZI,不会有过多跳变同时克服时钟漂移、基线漂移。
物理介质
- 有线介质
- 双绞线
- 同轴电缆
- 光纤(利用了光的全反射)
- 单模光纤:速率高、距离长
- 多模光纤
- 阶跃光纤:速率低、距离短
- 渐变光纤:速率中、距离中
- 无线介质 —— 大气:如地面微波、wifi、3/4/5G、卫星
多路复用技术
- 电路交换技术:时分多路复用、频分多路复用、波分多路复用、码分多路复用
- 包交换技术:统计多路复用
数据链路层
概述
- 只涉及一个直连网
- 主要功能:形成帧、差错检测、差错控制、介质访问控制
- 差错:丢失、重复、错序、溢出、比特错,碰撞(多路访问)
- 纠错码:海明码、二维奇偶检验码
- 校验码:
- 奇偶校验码
- 二维奇偶校验码(可以纠正 1 位比特错)
- 校验和
- 循环冗余校验码 CRC(容易用硬件实现、速度快、检错率高)
- 可靠数据传输:确认帧、超时定时器(自动重发请求 ARQ)
- 停等协议
- 滑动窗口协议
- PPP 协议
停等协议
- 确认帧(ACK)表示序号为 ACK 以及之前的数据帧以及全部收到并已交给上层协议。
- 只有收到前一个数据帧的确认才可以发送下一个数据帧。
滑动窗口协议
- 发送窗口:连续发送数据帧的可用序号范围,主要用于流控制。
- 发送窗口大小:表示发送窗口的大小,也是发送缓冲区的大小。
回退 N 协议
- 出现超时的时候将重传所有已发送且未收到确认的帧。
选择性重传
- 否定性确认帧(NAK)表示在这一帧之前的数据帧全部收到并已交给上层协议,要求发送方重传这一帧。每个帧只发送一次 NAK。
- 接收窗口:用于确定应该保存那些帧,用序号范围表示。
- 接收窗口大小:表示接收窗口的大小,也是接收缓冲区的大小。
提高滑动窗口协议效率
- 选择性确认:接收方把已收到的帧序号告诉发送方。当发送方要重传的时候不会发送这些帧。
- 延迟确认:接收方收到一帧后并不立即发送确认帧,而是等待一段时间再发送。
- 捎带确认:通信双方采用全双工的方式工作,接收方在发数据时顺便把确认号也告诉对方。
PPP 协议
- PPP 协议是点到点网络的数据链路层协议。
- PPP 协议是根据 HDLC(高级数据链路控制)协议进行设计的,主要用于串行电缆、电话线等各种串行链路。
- PPP 协议可以提供连接认证、传输加密和压缩功能。
- PPP 协议可以为各种网络层协议提供服务。
- PPP 协议的多链路捆绑技术可以通过将通信两端之间的多条通信链路捆绑成一条虚拟的链路而达到扩充链路可用带宽的目的。
- PPP 协议没有纠错、流控制、确保有序功能。
介质访问控制子层
概述
- 多路访问网络采用共享介质连接所有站点,发送站点通过广播方式发送数据并占用整个共享介质的带宽。由于每个站点只需要一条线接入网络就可以访问所有站点,所以安装简单并且价格便宜,局域网一般都采用这种链路。
- 数据链路层
- 介质访问控制子层(MAC 子层):控制和协调所有站点对共享介质的访问,避免或减少冲突。
- 逻辑链路控制子层(LLC 子层):为上层协议提供服务
- LLC 1:提供无确认无连接服务
- LLC 2:提供有确认面向连接的服务
- LLC 3:提供有确认无连接的服务
- CSMA(载波监听多路访问)
- 1-persistent CSMA:信道空立即发送,信道忙持续监听。(以太网)
- non-persistent CSMA:信道空立即发送,信道忙延迟一段随机长度的时间。(最省电)
- p-persistent CSMA:信道空立即以概率p发送,以概率1-p延迟一个时间槽,信道忙延迟一个时间槽。
以太网
- MAC 层协议
- CSMA/CD(带冲突检测的载波监听多路访问)
- 发送数据帧之前先监听信道。如果空闲立即发送,如果忙持续监听直到空闲。
- 边发送边检测冲突。如果发送完毕都没有检测到冲突则发送成功。
- 如果发送时检测到冲突,则停止发送,在发送 32 位干扰位以加强冲突信号后采用二进制退避算法随机延迟一段时间,再重新监听。
- 接收帧的方式
- 以太网站点会缓存所有帧
- 如果缓存的帧有错则丢弃
- 对比目的地址,如果是需要接收的帧则接收(包括单播多播广播)
- 如果网卡设置是混杂模式则会接收所有无错的帧
- 最短帧问题
- 发送 96 bits 时间信道均空闲则认为信道空闲
- 最短帧 64 Bytes,也是争用窗口长度。为了使发送站点能检测到所有冲突。
- CSMA/CD(带冲突检测的载波监听多路访问)
- 物理层协议
- 传输方法:异步传输
- 编码方法:采用曼切斯特编码
- 冲突域:两个接口同时发送数据会产生冲突(集线器,半双工)
- 广播域:一个广播帧可以到达的所有接口(交换机,全双工,不同接口不同冲突域)
透明网桥
- 扩展局域网:用网桥连接若干局域网,形成一个更大的局域网。
- 原来的局域网成为该扩展局域网的一部分,称为一个网段。
- MAC 地址表:目的 MAC 地址、转发端口、TTL。
- 过滤(filter)、转发(forward)、扩散(flood)。
- 自学习:将接收到的帧的原地址和接收端口记录到表中。
生成树协议
- 配置信息 BPDU(当前根BID,到根距离、发送BID、发送端口)
- 网桥ID BID(优先权、网桥的 MAC 地址)
- 端口ID PID(优先权、序号)
- 根端口:网桥上离根最近的端口
- 指定网桥:网段上离根最近的网桥(最近路径有多条选最小 BID)
- 指定端口:指定网桥上与网桥连接的端口
- 阻塞端口:网桥上既非根端口又非指定端口
虚拟局域网
- 网桥只在具有相同 VLAN ID 的端口之间转发帧,把原来的局域网分割成多个相互隔离的局域网,称为虚拟局域网。
- 默认 VLAN 为 VLAN 1
- 一个 VLAN 的帧只能转发到属于同一个 VLAN 端口或者干道端口,只有发往干道端口的帧才需要加上 VLAN ID。
交换机
- 交换机:一个把多个网段连接起来的设备,也称为多端口网桥。
- 交换机结构:
- 共享总线式交换机
- 纵横式交换机:可以实现多路并行传输
- 转发方法:
- 存储转发:交换机接收整个帧之后转发它。
- 直通:交换机不用收到整个帧而是收到帧的硬件地址后立即转发它。
- 无碎片:交换机不用收到整个帧而是收到帧的前64个字节后立即转发它。
- 适应性交换:自动在上面三种方式进行选择。
- 全双工模式:交换机可以在全双工模式下工作,没有冲突,不需要 CSMA/CD 算法。
令牌环网
- 令牌环网:一个通过在站点之间传递令牌防止冲突并且具有优先权的星形 LAN。
- 数据传送过程:
- 令牌绕环而行
- 只有截获令牌的站点才可以发送数据帧
- 发送的数据帧通过所有的活动站点
- 目的站点拷贝数据帧
- 只有发送方移除数据帧
- 当没有数据帧要发送或者持有时间到时需要释放令牌,继续绕环而行。
- 具有 ACK 标志(是否见到)
- 具有 Copy 标志(是否收到)
- 具有监控站(超时产生新的令牌帧)
- 具有选举帧(监控站失效时重新进行选举)
- 无主帧(数据传递出错,找不到源站点,第 2 次收到则进行丢弃)
网络层
概述
- 网络层协议负责确定把收到的包从哪条路径转发出去,即路由选择功能。
- 交换技术
- 电路交换:通过在网络中连接多条物理电路形成一条通路后传送数据。
- 包交换:采用统计多路复用的方法通过网络传送数据包。
- 虚电路:先建立连接再传送数据包。
- 交换式虚电路:每次传送数据前建立连接,传送完释放连接。
- 永久虚电路:由管理员建好后一直保持,随时可以传送数据。
- 数据报:根据数据包的目的地址直接转发数据包。(因特网)
- 虚电路:先建立连接再传送数据包。
- IP 协议(因特网的网络层协议)
- 可路由的(routable):全局地址,按层分配。
- 尽力服务:无连接无确认的数据报服务。
- 可以运行在任何网络上。
IP 数据报
IP 数据报的格式
- 版本号:4(IPv4)或 6(IPv6)。
- 头部长度:以字(32-bits)为单位。
- 服务类型:优先权(3)、低延迟(1)、高吞吐量(1)、高可靠性(1)、花钱最少(1)、保留位(1)。
- 总长度:数据报的长度,以字节为单位。
- 标识、标志、偏移量:用于划分片段。
- 生存期:记载经过的路由器数(跳数)。
- 一般初值设置为网络直径的两倍,Win 8 和 Linux 默认 64,UNIX 默认 255。
- TTL 减到 0 仍未到达目的地则进行丢弃,并发出一个 ICMP 包告知源主机。
- 协议:6(TCP)、17(UDP)、1(ICMP)、2(IGMP)。
- 头部校验和:路由器会丢弃出错的数据报。
IP 数据报的分段和重组
- 最大传输单元(MTU)是该网络可以运载的最大有效载荷,即数据帧的数据部分的最大长度。
- 以太网的 MTU 为 1500,FDDI 为 4353,令牌环网 为 4482
- 如果一个数据报的长度大于 MTU,则需要进行分段。
- 源主机每次发 IP 数据报都会把标识字段加 1。
- 分段时标识保持不变,并且用偏移量字段指出该片段的数据部分相对原来的偏移量。
- 标志位中有 DF 字段和 MF 字段。
- DF = 1 表示不可分段。
- MF = 1 表示后面还有片段。
- 当目的主机收到该数据报的所有片段时会进行重组。
- 当第一个片段到达时就会启动重组定时器(默认15秒)。
- 若重组定时器到期仍没有完成重组则会放弃重组并丢弃该数据报的所有片段。
IP 数据报的选项
- 一般格式:代码(1)、总长度(1)、数据(n)
- 代码 0:选项列表结束。
- 代码 1:无操作。
- 代码 7:记录每个转发路由器的 IP 地址。
- 代码 20:IP 警报器,告知路由器需要特殊处理的选项。
- 代码 50:记录时间戳,每个转发的路由器都要记录 IP 地址和转发时间。
- 代码 131:松散源路由,指明一系列必须经过的路由器。
- 代码 137:严格源路由,指明一系列必须且只能经过的路由器。
IP 地址
IP 地址空间
- MAC 地址(48位)和 IP 地址(32 位)均是全局分配,但是 IP 地址是分层的,可路由的。
- IP 地址由 ICANN 统一负责并逐级分配。亚洲由 APNIC 负责,中国由 CNNIC 负责。
- IP 地址属于接口(网卡)。主机或路由器的每个接口可以配置一个或多个 IP 地址。
IP 地址结构
- 一个 IP 地址划分为两个部分:网络号和主机号。
- 网络号也称网络前缀、网络标识,确定拥有该 IP 地址的主机位于哪个网络。
- 主机号用于确定 IP 地址属于该网络下的哪台主机。
有类网
- A 类:0.0.0.0 ~ 127.255.255.255,主机号 24 位
- B 类:128.0.0.0 ~ 191.255.255.255,主机号 16 位
- C 类:192.0.0.0 ~ 223.255.255.255,主机号 8 位
- D 类:224.0.0.0 ~ 239.255.255.255,多播地址
- E 类:240.0.0.0 ~ 255.255.255.255,保留网
子网划分
- 一个有类网可以通过子网掩码划分为多个相同大小的子网。
- 主机号为全 1 和全 0 的地址被保留,不能使用。
- 子网号为全 0 或全 1 的子网可以使用(以前不能)。
- 变长子网掩码(VLSM)允许把一个有类网划分为多个不同大小的子网。
- 无类域间路由选择协议(CIDR)允许把多个有类网合并为一个更大的网络,称为超网。
特殊的 IP 地址
- 全 0:未知或私密 IP 地址,只用作源地址。
- 全 0 + host:同一子网的主机,只用作源地址。
- 全 1:有限广播,对于一个直连物理网的广播。
- network + 全 1:对于一个远程网络的广播。
- network + 全 0:用 32 比特表示的网络号(含子网号)。
- 01111111 + 任意值:环回地址,如 127.0.0.1 表示本机地址。
私有 IP 地址
- 无需 IANA 分配,任何人都可以使用的 IP 地址。
- 只能用于内部网络。主干网上的路由器会过滤掉目的地址为私有地址的 IP 数据报。
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0 ~ 192.168.255.255
网络地址转换
- 网络地址转换(NAT)是一种把内部地址映射为外部地址的技术。
- 动态 NAT:出口路由器在内网数据报发往外网时自动映射。关联 TTL,超时会删除。
- 静态 NAT:直接由管理员加入的映射方法。不会被自动删除。
- NAPT 把端口号也加入到映射中,也称为 PAT 或过载 NAT。
ARP 协议
- 地址解析协议(ARP)可以把 IP 地址映射为 MAC 地址。
- 没有超时重传机制。超时没有收到响应则丢弃引发 ARP 查询的 IP 分组。
- 源主机获得的映射结果缓存在 ARP 表中,并设有 TTL。
- 当收到 ARP 请求,目的主机会缓存源主机的映射,其他监听到的主机如果已缓存则会更新 TTL。
- 也可以直接将映射加入到 ARP 缓存中,称为静态 ARP 映射,没有 TLL。
DHCP 协议
- 动态主机配置协议(DHCP)用于主机在加入网络时动态租用 IP 地址。
ICMP 协议
- 因特网控制消息协议(ICMP)用于主机或路由器发布网络级别的控制消息。
- ICMP 常见的消息类型:
- 不可达消息:网络不可达、主机不可达、协议不可达、端口不可达、分段错误、源路由错误。
- 回响请求和响应:从回响(echo)请求收到的标识符、序号和数据拷贝到回响答复中。
- 时间超时消息:代码 0 表示 TTL 减为 0,代码 1 表示重组 IP 片段超时。
- 重定位消息:当路由器发现转发消息的接收接口和转发接口相同时会发送 ICMP 消息给主机,要求主机将发往目的主机的数据报直接发送。
路由协议
概述
- 路由表(也称为转发表)
- 目的网络号、下一跳、接口。
- 如果目的网络为直连网络则下一跳为空。
- 有类网的 IP 路由选择
- 利用数据包中的目的地址得到目的网络号,然后查询路由表。
- 如果查询的结果为直连网,则直接把数据包从查出的接口转发到目的主机。
- 否则,如果查询得到下一跳,则把数据包转发给下一跳。
- 如果没有任何匹配项则把数据包转发给默认路由器。
- 如果没有设置默认路由器则丢弃该数据包。
- 无类网的 IP 路由选择
- 匹配方法:目的 IP 地址和子网掩码匹配子网号。
- 最长匹配原则:当有多条路由都匹配时选择子网掩码最长的路由。
- 路由协议
- 路由器在收到一个数据报之后用其目的地址查找路由表得到下一跳,再把该数据报转发给下一跳。
- 路由表可以由管理员手工建立,称为静态路由,默认路由和直连路由都是静态路由。
- 路由表也可以由路由协议自动建立,称为动态路由。
- 自治系统
- 自治系统(AS):在同一个机构管理下的网络,决定采用的协议和网络控制政策。
- 用于 AS 内的协议称为内部网关协议(IGP)。如 RIP 协议、OSPF 协议。
- 用于 AS 之间的协议称为外部网关协议(EGP)。如 BGP 协议。
- 运行同一个 IGP 协议的连通区域也称为路由选择域。
- 路由算法:找最短路径的算法
- 通过链路状态:OSPF 协议
- 通过距离向量:RIP 协议
RIP 协议
- 距离向量算法
- 每个结点周期性地发送自己距离向量估计给邻居。
- 当一个结点收到来自邻居的新的距离向量估计,它将据此更新自己的距离向量。
- 在自然条件下,距离向量会收敛到实际的最短路径开销。
- 路由信息协议(RIP):采用邻居的路由表构造自己的路由表。
- 路由表中到目的网络的距离以跳为单位。最大距离 15。距离 16 表示不可达。
- 初始时每个 RIP 路由只有到直连网的路由,距离为 1。
- 每 30 秒 RIP 路由把它的整个路由表发送给邻居。
- 当收到邻居发来的路由表,路由器将更新它的路由表。
- 收到的路由距离全部加 1(一跳的距离)。
- 把路由表中不存在的路由加入路由表。
- 如果比路由表中的路由距离更小,则更新该路由距离,并把下一跳修改为邻居。
- 如果路由已存在并且下一跳就是邻居,则必须进行更新。
- RIP 路由表的每一项都有 TTL,加入路由器时启动,更新时重置,超时则失效。
- RIP 协议的问题
- 慢收敛问题
- 计数到无穷问题
- RIP 协议的技术
- 水平分割技术:从一个接口学来的路由不会从该接口发回去。
- 毒性反转技术:从一个接口学来的路由会把距离改为无穷大后从该接口发回去。
- 抑制技术:距离被改为无穷大的路由在一段短时间(180 秒)内其距离不允许被修改。
- 触发更新:一旦出现路由变化将立刻把变化的路由发送给邻居。
- RIP 协议的定时器
- 更新定时器:控制一个路由器如何定期把路由表发送给邻居。默认 30 秒。
- 失效定时器:到期时被标记为无效路由。默认 180 秒。
- 清除定时器:到期时该路由将从路由表中删除。默认 240 秒。
- 抑制定制器:在路由距离变为无穷大时启动,到期前不许改动。默认 180 秒。
- RIPv1 数据包
- 只能在有类网使用。使用 UDP 数据报封装,端口号 520,采用广播方式发送给邻居。
- RIPv2 数据包
- 支持无类网。可以采用广播或多播的方式发送给邻居。
- 特点
- 协议简单、容易实现。
- 网络直接不能超过 16 跳。
- 不允许把一个大网络分成多个区。
- 开销缺乏灵活性。
- 每 30 秒发送完整路由表会消耗大量带宽。
- 直连网的管理距离为 0,在 RIP 协议中的距离为 1。
OSPF 协议
- 链路状态路由算法
- 利用最短路径算法求出一个节点到所有其他节点的最短路径。
- 利用这些最短路径上的下一个节点作为下一跳得到源节点的路由表。
- 开放式最短路径优先协议(OSPF)
- 周期性地收集链路状态,并扩散出去。
- 利用收到的链路状态建立整个 AS 的拓扑结构图。
- 利用 Dijkstra 算法计算到 AS 中所有网络的最短路径。
- 利用这些路径上的下一跳建立路由表。
- 路由器 ID
- 使用直接配置的 RID。
- 所有活动环回接口中最大的 IP 地址。
- 所有活动物理接口中最大的 IP 地址。
- 除非路由器重启、所选接口故障或关闭或 IP 地址改变、重新执行了 router-id 命令,RID 将保持不变。
- 指定路由器
- 当多路访问网络重启时,选举 DR 的过程就开始了。在等待时间(40 秒)结束时,带有最高和次高优先权的路由器分别称为 DR 和 BDR。如果优先权相同,RID 更大的成为 DR,次大的成为 BDR。
- 如果路由器不希望参与选举,应该把优先权设置为 0。
- 如果一个新的路由器在选举之后到达或者有路由器修改为更高的优先权,它也不可能抢占现存的 DR 和 BDR。
- 当 DR 失效时,BDR 成为 DR,并开始一个新的选举过程选出 BDR。
- 一个多路访问网络中的 OSPF 路由器只与 DR 和 BDR 建立相邻关系。
- 收到一个 LSA 后,一个多路访问网络中的 OSPF 路由器将把它首先多播给 DR 和 BDR,然后 DR 再把它多播给所有的 OSPF 路由器。
- 特点
- 所有的 OSPF 消息都要认证(防止恶意入侵)。
- 路由表中允许多个相同开销的路径存在,可以实现负载均衡。
- 对于每条链路,允许同时有多个开销。
- 在大型路由选择域中 OSPF 可以分区。
- OSPF 比 RIP 收敛快而且更安静。
- OSPF 实现起来更复杂,需要更多的计算开销。
OSPF协议的详细描述
- 对于每个中转网,要选举一个直连路由器作为其指定路由器(DR)。
- 发现邻居:每 10 秒向邻居发送 Hello 分组。如果 40 秒都收不到邻居发来的 Hello 分组,则把到邻居的链路标记为失效。多路访问网络采用多播发送 Hello 分组。一个 Hello 分组包含优先权、已知的邻居、DR 和 BDR。
- 完全相邻:在发现邻居之后,OSPF 路由器与邻居交换链路状态数据库中的 LSA(链路状态通告),请求得到更新的或者没有的 LSA。在与邻居的链路状态数据库变得完全一样时,它们就处于完全相邻状态。
- 生成 LSA:每 30 分钟或者链路变化时,每个 OSPF 路由器会生成 router LSA,中转网的 DR 会生成 network LSA。
- 扩散 LSA:产生的 LSA 立即封装为 Update 分组,被可靠地扩散出去(需要确认)。每次产生的 LSA 序号会加 1。通过序号可以防止扩散形成回路。
- 收集 LSA:路由器收集到 LSA 后,用新 LSA 替换链路状态数据库中的旧 LSA。如果一个 LSA 在 60 分钟内没有被更新,它将从链路状态数据库中移除。
- 计算最短路径:当链路状态数据库被改变时,OSPF 路由器将利用 Dijkstra 算法计算到所有网络的最短路径。
- 建立路由表:利用得到的最近路径产生路由表。
BGP 协议
- 边界网关协议(BGP)采用可靠扩散的方法把 AS 内的网络信息传遍整个因特网。
- 在 AS 中,每个运行 BGP 协议的路由器被称为 BGP 路由器。
- 在 BGP 路由器之间可以通过 TCP 连接(端口号 179)建立相邻关系。
- BGP 协议所扩散的网络号称为网络层可达信息(NLRI)。
- BGP 路由器可以把 NLRI 连同它们的属性一起通过相邻关系扩散给邻居,进而扩散到因特网中所有的 BGP 路由器。
- BGP 路由器在 NLRI 引入 BGP 协议时扩散一次,并不定时扩散。
- BGP 分组类型
- OPEN 报文:用于建立相邻关系。
- KEEPALIVE 报文:用于判断邻居是否有效。
- UPDATE 报文:用于扩散 NLRI。
- NOTIFICATION 报文:用于报告错误。
传输层
概述
- 传输层协议称为端到端或进程到进程的协议。
- 因特网的传输层可以为两个进程在不可靠的网络层上建立一条可靠的逻辑链路。
- 传输层可以提供字节流传输服务,并且可以进行流控制和拥塞控制。
- UDP 协议:提供不可靠的尽力服务。
- TCP 协议:提供可靠的字节流服务。
- 传输层的多路复用
- 发送方:收集来自上层进程的数据形成数据段并发送出去。
- 接收方:把收到的数据段交给正确的上层进程。
端口号
- 1 ~ 1023:知名端口号。如 HTTP-80、FTP Control-21、FTP Data-20,telnet-23、SMTP-25、POP3-110、DNS-53。
- 1024 ~ 49151:注册端口号。在 IANA 注册的专用端口号,为企业软件所用。
- 49152 ~ 65535:动态端口号。没有规定用途的端口号,一般用户可以随意使用,也称为私用或暂用端口号。
- 端口号只具有本地意义,即端口号只是标志本地计算机应用层的各进程。在因特网中,不同的计算机的相同端口号是没有联系的。
UDP 协议
概述
- 用户数据报协议(UDP)只提供无连接的不可靠的尽力服务。
- UDP 发送给接收进程的数据有可能丢失,也有可能错序。
- UDP 分组的首部开销小,只有 8 个字节。
- UDP 没有拥塞控制,网络中的拥塞控制也不会影响主机的发送速率。
- UDP 接收进程每次接收一个完整的数据报,如果进程设置的接收缓冲区不够大,收到的数据报将被截断。
- UDP 的校验和字段是可选的,全 0 时表示忽略校验和。
与 IP 数据报的区别
- IP 数据报在网络层要经过路由的存储转发。
- UDP 数据报是在传输层的端到端的逻辑信道中传输,而封装成 IP 数据报在网络传输中,UDP 数据报对于路由是不可见的。
TCP 协议
概述
- 传输控制协议(TCP)为进程之间提供面向连接的可靠的数据传送服务。
- TCP 是全双工协议。
- TCP 提供流控制机制,即控制发送方的发送速度,使发送的数据不会淹没接收方。
- TCP 提供拥塞控制功能。
- TCP 进程提供可靠的字节流服务,也即没有消息边界,多次发送的数据可以放在一个数据段中传送且不标识边界。
- 每个 TCP 连接可以由四元组唯一标识:源 IP 地址,源端口号,目的 IP 地址,目的端口号。
- 标志位(为 1 时有效)
- URG:本数据段包含紧急数据。
- ACK:表示确认号有效。
- PSH:发送方执行了推送操作,接收方需要尽快将所有缓存的数据交给接收进程。
- RST:重置连接。因为连接出现了错误,通知对方立即中止连接并释放相关资源。
- SYN:同步序号标志,用来发起一个 TCP 连接。
- FIN:结束标志,向对方表示自己不再发送数据。
- 通知窗口大小:接收方告知发送方接收窗口的大小,发送方会据此修改发送窗口的大小。
- 选项
- 建立连接时:MSS(最大段长度)、窗口比例、是否使用选择性确认(SACK)。
- 默认 MSS:Unix - 536、Windows - 1460。
- 默认 SACK:Unix - False、Windows - True。
- 数据传送时:选择性确认的序号范围、时间戳等等。
三次握手和四次挥手
- 三次握手(非对称活动,只能由客户端向服务端发起)建立连接
- 客户端发送连接请求(SYN 报文,含服务器端口号)。
- 服务端收到后查看是否有进程监听该端口,如果没有则发送 RST 拒绝。如果有,则发出 SYN + ACK 包,表示确认连接,并发送服务端的连接请求。
- 客户端收到后发送 ACK 包表示确认连接。
- 服务器发送 SYN + ACK 包之后会把链接请求放入到进程的半连接队列中(SYN 队列),而收到客户端的 ACK 后变成全连接队列(accept 队列)。
- 如果半连接队列和全连接队列满,则后面到的连接请求会直接被丢弃。而客户端发送 ACK 之后就认为连接已经建立,在第一个数据段重传几次后才会中止连接。
- SYN 泛洪攻击就是客户端恶意建立半连接队列,不发送 ACK 给服务端,这样服务端就会一直维护半连接队列,造成资源的浪费。
- 四次挥手(对称活动,可以由客户端或者服务端发起)关闭连接
- 主机 1 发送 FIN 报文表示不再发送数据,但可以接收数据,进入终止等待 1。
- 主机 2 发送 ACK 报文表示收到,主机 1 收到后进入终止等待 2。
- 主机 2 发送 FIN 报文表示不再发送数据,进入最后确认状态。
- 主机 1 发送 ACK 报文表示收到,在等待时间结束后关闭连接。
- 主机 2 收到 ACK 报文后关闭连接。
- 为什么有等待时间?因为最后一个 ACK 可能丢失,而主机 2 发送的 FIN 包含有超时重传机制,如果略大于 1 MSL 之后还没有收到的话会进行重传,而等待时间就是用于等待可能的重传包的,若没有等到则认为正常收到,就可以关闭连接。
- 当主机 2 收到 FIN 报文并且自己也没有数据需要发送的时候,中间的两次握手可以合并。
- 主机 1 和 主机 2 也可能同时发出 FIN 报文,并不会影响最后的结果。
- 在进程异常退出的时候会直接发送 RST 报文并直接暴力关闭连接,没有挥手过程。
TCP 滑动窗口
- TCP 协议使用选择性重传,但不使用 NAK。
- 只有一个超时定时器,只要有未确认的数据段就要启动。超时则重传当前未收到确认的最小序号的数据段。
- TCP 采用字节流的方式,每个数据段使用其第一个字节的编号作为序号,而确认号则是期待接收的下一个字节的序号。
- TCP 协议没有直接规定错序到达的数据段的处理方式,需要取决于具体实现。
TCP 的确认机制
- 快速重传
- 如果发送方收到一个数据段的 3 次重复 ACK 就会认为其后的数据段已经丢失,在超时之前就会重传该数据段。
- 延迟确认
- 采用延迟确认的时候,接收方不会在收到数据段的时候立即进行确认,而是延迟一段时间再确认,在这期间收到的多个数据段只需要对最后一个数据段进行确认。
- 如果发送确认号的同时有数据要发往对方,还可以使用捎带确认机制一起发送。
- 大部分系统的延迟确认时间为 200 ms,TCP 标准要求不大于 500 ms。
- 选择性确认
- 选择性确认允许接收方把收到的数据块通过数据段的选项告知发送方,使发送方不会重传这些数据块。
TCP 的拥塞控制
- 拥塞控制的两类方法
- 端到端:没有来自网络的明确反馈,通过丢包和延迟推导。(如快速重传)
- 网络辅助:由路由器反馈给终端,使用信号指出拥塞发生,或者是直接给出发送速率。
- TCP 拥塞控制
- 超时或者收到 3 个重复 ACK 则认为丢包,拥塞发生。
- 发送速率 rate = SWS(发送窗口大小) / RTT
- 引入拥塞窗口变量 CongWin 来限制 SWS。SWS = Min(CongWin, AdvWin)。
- 加性增乘性减:每个 RTT 增加 1 MSS,直到丢包,丢包后 CongWin 直接减半。
- 慢启动
- 初始时 CongWin 设置为 1 MSS,并设置一个阈值。
- 在当前窗口所有数据段确认都收到后 CongWin 加倍。
- 当拥塞发生时,把当前 CongWin 减半作为阈值。然后又从 1 开始。
- 当 CongWin 达到阈值后,每次增加 1 MSS。
TCP 的问题及解决方法
- 长肥管道
- 如果两个端点的管道容量很大,可能会出现管道不满载、序号回绕的问题。
- 可以使用 SYN 选项设置 Window Scaling,$WinSize=AdvWin*2^{WinScale}$。
- 序号回绕使用数据段的选项的时间戳解决,只用于区分,不确认先后次序。
- 当丢包发生时需要清空管道,并使用快速重传、快速恢复。
- 死锁现象
- 如果接收方发送了窗口为 0 的 ACK,然后取走接收缓冲区的数据,再次发送的 ACK 丢失,则发送方会认为接收方仍然没有空位,从而发生死锁。
- 解决办法是使用坚持定时器,定期从要发送的数据取一个字节发送出去,直到收到大小不为 0 的通知窗口。
- 傻瓜窗口症候
- 发送进程有很多小批量的数据要发送。
- Nagle 算法:发送方收到 ACK 或者发送进程的数据达到 MSS 才发送下一个数据段。这样的方法对于即时性要求高的不适用(如鼠标操作)。
- 接收进程频繁取走小批量数据。
- Clark 算法:当接收缓冲区的空闲块变得很小时,等到空闲块大小为接收缓存区的一半或者达到 MSS 才发送通知窗口。
- 发送进程有很多小批量的数据要发送。
TCP 的定时器
- 重传定时器:针对第一个未确认的数据段。超时重传或者发送窗口移动才重启。
- 坚持定时器:用于保持窗口大小消息流动即使连接的另一端关闭了接收窗口。
- 保活定时器:在长时间没有交换数据段之后检测连接的另一端是否出现问题。
应用层
概述
- 应用层直接和应用程序接口并提供常见的网络应用服务。
- 应用层是开放系统的最高层,是直接为应用进程提供服务的。
- 应用层的许多协议都是基于客户服务器方式。
- 常见的应用层协议:DNS、HTTP、FTP、SMTP。
DNS 协议
- 域名服务器(DNS)是专门用于解析域名的服务器。
- 在因特网中,主机之间的通讯是通过 IP 地址进行的。而 IP 地址难以记忆,我们一般采用的都是域名的方式进行访问,例如 ender-coder.github.io 这样的域名。
- DNS 存储了域名与 IP 地址之间的映射,提供了域名与 IP 地址之间的转换服务。
- DNS 是使用分布式数据库实现的,通过在不同 DNS 服务器之间进行转发直到找到信息。
- DNS 报文包括请求报文和响应报文,一般采用 UDP 协议,超过 512 字节可以采用 TCP 协议。
- DNS 采用的端口号是 53,在 UDP 和 TCP 都是如此。
- DNS 查询可以是递归查询也可以是迭代查询。
HTTP 协议
概述
- 超文本传输协议(HTTP)是应用层最基本的客户端与服务器的访问协议。
- 本地浏览器向服务器发送请求,而服务器回应本地浏览器相应的网页。
- HTTP 的标准制定由万维网协会(W3C)和互联网工程任务组(IETF)进行协调,最终发布了一系列的RFC,其中最著名的是 1999 年 6 月公布的 RFC 2616,定义了 HTTP 协议中现今广泛使用的一个版本 —— HTTP 1.1。
- HTTP 是无连接、无状态的,也即服务器不维护任何关于客户端过去发送的信息。
- HTTP 协议使用 TCP 连接进行可靠的传送。
- HTTP 采用的端口号是 80。
请求网页的工作过程
- 用户确定要访问的域名 URL,输入到浏览器中。
- 浏览器向 DNS 服务器发出请求,得到相应的 IP 地址。
- 浏览器向指定地址的 80 端口发出一条 TCP 连接请求。
- 通过三次握手建立 TCP 连接后,浏览器向服务器发送 HTTP 请求。
- 服务器收到请求后,向浏览器发送网页文件。
- 网页文件发送完成后,服务器通过四次挥手关闭 TCP 连接,通讯完成。
- 浏览器解析收到的网页文件并显示。
- 如果该网页中含有图片等信息,一般是通过异步传输的方式,浏览器还需要再次与服务器建立连接并请求该部分信息。
- 现有的 HTTP 1.1 协议中,连接不会马上进行关闭,而是会等待一定的时间,如果用户有后续操作就可以直接在这个连接进行通讯,这样可以提高效率,减少短时间内建立连接的次数。
Cookie 与 Session
- 现有的 HTTP 协议中引入了 cookie 技术,可以保存状态信息(比如用户的登陆态)。
- 浏览器发送 request 请求到服务器,服务器除了返回请求的 response 之外,还给请求分配一个唯一标识ID,协同 response 一并返回给浏览器。
- 服务器在本地创建一个 MAP 结构,专门以 key-value(请求ID-会话内容)形式将每个 request 进行存储。
- 浏览器的第二次 request 带有 ID,服务器先从 request 中查找该 ID,根据 ID 查找维护会话的 content 内容,该内容中记录了上一次 request 的信息状态。
- 根据查找出的 request 信息生成基于这些信息的 response 内容,再次返回给浏览器。如果有需要会再次更新会话内容,为下一次请求提供准备。
- session 即是这个过程中保存在服务器的信息,也就是服务器会通过 session 保存一个状态记录,浏览器会通过 cookie 保存状态记录,服务器通过两者的对比实现跟踪状态。这样也极大的避免了cookie 被篡改而带来的安全性问题。
- cookie 保存在客户端,比较不安全;session 保存在服务器端,比较安全。
- cookie 中保存的是字符串,而 session 中能够存储任何类型的数据。
- 一般情况下,cookie 的过期时间会设置得很大,这样 cookie 会在浏览器中保存很长时间,而 session 依赖于 sessionId,如果把 id 设置为 -1 的话,如果关闭浏览器,session 就会失效。
- cookie的缺陷
- cookie 会被附加在每个 HTTP 请求中,所以无形中增加了流量。
- 由于在 HTTP 请求中的 cookie 是明文传递的,所以安全性成问题。(除非用HTTPS)
- cookie 的大小限制在 4KB 左右。对于复杂的存储需求来说是不够用的。
HTTP 请求方法
- GET:请求指定的页面信息,并返回实体主体。
- HEAD:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。
- POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
- PUT:从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE:请求服务器删除指定的页面。
- CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS:允许客户端查看服务器的性能。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。
GET 和 POST 请求的区别
- GET 提交的数据会放在 URL 之后,也就是请求行里面,以 ? 分割 URL 和传输数据,参数之间以 & 相连。而 POST 方法是把提交的数据放在 HTTP 包的请求体中。
- GET 提交的数据大小有限制(因为浏览器对 URL 的长度有限制),而 POST 方法提交的数据没有限制。
- POST 的安全性要比 GET 的安全性高。比如通过 GET 提交数据,用户名和密码将明文出现在 URL 上,除此之外,使用 GET 提交数据还可能会造成跨站请求伪造(CSRF)攻击。
HTTP 状态码
状态代码的第一个数字代表当前响应的类型:
- 1xx 消息 —— 请求已被服务器接收,继续处理。
- 2xx 成功 —— 请求已成功被服务器接收、理解、并接受。
- 3xx 重定向 —— 需要后续操作才能完成这一请求。
- 4xx 请求错误 —— 请求含有词法错误或者无法被执行。
- 5xx 服务器错误 —— 服务器在处理某个正确请求时发生错误。
HTTP 和 HTTPS 的区别
- HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。
- 安全套接字层超文本传输协议 HTTPS,为了数据传输的安全,HTTPS 在 HTTP 的基础上加入了 SSL/TLS 协议,SSL/TLS 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
- HTTPS 协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
- HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
- HTTPS 协议握手阶段比较费时,连接缓存不如 HTTP 高效,并且 SSL 证书是需要收费的。
- HTTPS 协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用,并且 SSL 的信用链也不是绝对安全的。
FTP 协议
概述
- 文件传输协议(FTP)的目标是提高文件的共享性和可靠高效地传送数据。
- 在传输文件时,FTP 客户端程序先与服务器建立 TCP 连接,然后向服务器发送命令。
- FTP 协议与操作系统无关,任何操作系统上的程序只要符合 FTP 协议,就可以相互传输数据。
- 相比于其他协议,FTP 协议要复杂一些,命令传输与数据传输分别采用不同的端口。
FTP 的工作过程
- 启动 FTP 服务器。由于 FTP 采用了客户机 / 服务器工作模式,因此在创建 FTP 会话之前,首先必须启动 FTP 服务器,并使其处于等待客户机程序的 FTP 请求状态。
- 打开 FTP 并建立控制连接。启动 FTP 客户机程序,并向 FTP 服务器的 21 端口(控制连接端口)发出主动连接的请求,以期获得 FTP 服务器的相应权限。服务器响应请求后便在用户协议解释器和服务器协议解释器之间建立了一条 TCP 连接。
- 建立数据连接并进行文件传输。用户通过客户机程序输入 FTP 命令,服务器接收命令。如果命令正确且需要进行文件传输,服务器使用 TCP 20 端口在双方之间建立另一条 TCP 连接,即数据连接,并通过该连接进行文件传输。当本次命令的文件传输完毕,关闭该数据连接。
- 关闭 FTP。用户执行完其所需的 FTP 命令后,发出退出 FTP 命令,控制连接关闭,本次 FTP 服务结束。
主动模式(PORT)
- 客户端随机打开一个大于 1024 的端口向服务器的 21 命令端口发起连接,同时开放 N+1 端口监听,并向服务器发出 “port N+1” 命令,由服务器从它自己的 20 数据端口主动连接到客户端指定的数据端口(N+1)。
- FTP 的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。
被动模式(PASV)
- 当开启一个 FTP 连接时,客户端打开两个任意的本地端口(N > 1024 和 N+1)。
- 第一个端口连接服务器的 21 端口,提交 PASV 命令。然后,服务器会开启一个任意的端口(P > 1024),并返回带有该端口号的信息。
- 客户端收到命令取得端口号之后,会通过 N+1 号端口连接服务器的端口 P,然后在两个端口之间进行数据传输。