概论


计算机网络机构与组成

  • 通信子网:计算机网络中实现网络通信功能的设备及其软件的集合称为网络的通信子网(物理层、数据链路层、网络层)。
  • 资源子网:网络中实现资源共享功能的设备及其软件的集合称为资源子网(应用层)。

三种交换技术

  • 电路交换:电路交换要求必须首先在通信双方之间建立连接通道,并在通信过程中独占该通道。
  • 报文交换:又称存储转发交换报文整个地发送,储存接收到的报文以目标地址为依据判断将数据转发给下一条路由。
  • 分组交换:将报文分组后以组为单位进行存储转发交换。

网络拓扑

指构成网络的成员间特定的排列方式,一般分为物理的、真实的、配在线的结构,或逻辑的、虚拟的、程序设计上的。(总线拓扑因为不知道怎么用Graphviz画出来所以懒得画了⁄(⁄ ⁄ ⁄ω⁄ ⁄ ⁄)⁄)

网络拓扑结构

TCP/IP参考模型

OSI采用7层参考模型,TCP/IP采用5层参考模型。

模型

应用层


按照工作模式分类有C/S和P2P工作模式

WEB服务

关键技术:

  • 超文本传输协议HTTP
  • 超文本标记语言HTML
  • 统一资源定位符URL

请求方法

GET/POST/HEAD请求方法(方法挺多的,不止这三种)

HTTP协议两种状态:

  • 非持续连接(HTTP 1.0):每次请求/响应都要建立一次TCP连接。
  • 持续连接(HTTP 1.1):HTTP1.1默认使用持久连接,如果客户端或者服务端任何一方不想使用持久连接,需要通过字段connection:close来通知对方。

文档类型:

  • 静态文档
  • 动态文档
  • 活动文档

电子邮件

  • SMTP协议:服务器之间传输邮件使用的协议
  • POP3/IMAP4协议:用于客户端远程管理服务器上的邮件
  • MIME协议:将非ascii码字符以及二进制以及非文本格式附件转为ascii码

FTP

控制连接使用21端口,数据连接使用20端口

  • 主动模式:客户端开启n和n+1两个端口。n作命令端口,连接服务器21端口,告知服务器,本地开启了n+1端口。n+1端口作数据端口,服务器使用20端口主动连接客户端的n+1端口建立数据连接。
  • 被动模式:客户端开启n和n+1两个端口。客户端使用n端口连接服务器21端口,通过PASV命令告知服务器使用被动模式。服务器开启一个数据端口p,通过PORT命令将p端口告知客户端,客户端使用n+1端口连接服务器p端口建立连接。

DNS

将域名转换为IP地址,使用UDP或TCP协议,53端口。一个域名可以对应对个IP地址。

  • 迭代解析:本地域名服务器向根域名服务器发送域名解析请求,根域名服务器查询不到则告诉本地域名服务器下一级域名服务器的IP,再由本地域名服务器向下一级域名服务器发送域名解析请求。本地域名服务器需要发送多次请求。
  • 递归解析:本地域名服务器只向根域名服务器发送一次请求,根域名服务器向下一级域名服务器查询到请求后返回给本地域名服务器。

传输层


UDP

无连接的协议

UDP报文格式如下:

源端口号(16bit)目的端口号(16bit)
UDP总长度(16bit)校验和(16bit)
数据
(数据不是16位的整数倍时,需要增加填充位)
  • 长度:UDP长度字段是16位的,最小长度是8个字节,因为UDP报头已经占用了8个字节。UDP报文总长度不可能超过65535字节(8字节的报头+65527字节的数据)。
  • 校验和:是可选字段
  • 校验和计算:
    1. 首先添加伪报头
    2. 每16位进行求和,如果最高位产生进位则将得到的结果加一
    3. 将所得的16位的和取反码插入到校验和字段

TCP

面向连接的传输层协议

TCP报头格式如下:

源端口号(16bit)目的端口号(16bit)
发送序号(32bit)
确认序号(32bit)
报头长度(4bit)保留(6bit)URGACKPSHRSTSYNFIN窗口(16bit)
校验和(16bit) 紧急指针(16bit)
选项及填充(≤40B)

各个字段含义

  • 发送序号:在建立连接时双方都需要用随机数发生器生成一个初始序号
  • 确认序号:接收方希望下一次接收到的字节序号。
  • 报头长度:以4字节为一个单位计算。报头长度为4位,实际报头长度为$20\sim60$字节,则该字段的值为$5(5\times4=20)\sim15(15\times4=60)$。
  • 保留:保留作今后使用。
  • 控制
    • URG:URG=1时,紧急指针字段有效。
    • ACK:确认号字段的值有效,ACK=1表示确认号字段有效。
    • PSH:PUSH标志,PSH=1时接收方应该尽快将报文交给应用层而不需要等待缓冲区满。
    • RST:连接出现查错,必须释放连接,重新建立连接。
    • SYN:连接请求或者同意连接请求,用于创建连接和使序号同步。SYN=1,ACK=0表示连接请求SYN=1,ACK=1表示同意连接请求。
    • FIN:终止连接,FIN=1表示发送方没有数据要传输了,请求释放。
  • 校验和:计算方式同UDP,是一个强制字段。
  • 窗口:报文发送方可以接收的字节数,即窗口大小。

建立连接

  1. 客户端向服务器发送SYN包,请求建立连接,该报携带客户端为该请求设定的随机数A作为消息序号
  2. 服务器收到合法的SYN包后,回送一个SYN/ACK包。该包确认号为A+1,携带一个随机产生的序号B
  3. 客户端收到SYN/ACK包后,发送一个ACK包。该包序号被设置为A+1,确认号被设置为B+1。

连接释放

  • 一端请求停止本侧的连接,需要向对侧发送FIN包,对侧回复ACK进行确认。
  • 一端发送FIN包并收到ACK回包后,连接进入半关闭状态,另一端如果有需要仍可以继续发送数据。
  • 四次握手后需要等待$2\times MSL$时间后才能拆除连接,为了防止由于FIN报文丢包,对端重发导致与后续的TCP连接请求产生顺序混乱,在这段超时等待时间内,本地的端口不能被新连接使用。RFC793定义了MSL为2分钟,Linux设置成了30s。

流量控制

TCP使用滑动窗口进行流量控制,接收方在”接收窗口”指出还可接收的字节数量。发送方在没有新的确认包的情况下最多发送”接收窗口”允许的字节数量。

当接收方发送”零窗口”停止之后,发送方停止发送数据,直到接收方发出下一个”非零窗口”通知为止。为了防止下一个”非零窗口”丢失,双方无休止地等待对方通知而造成死锁,接收方设置了一个”坚持定时器”(persistence timer)。接收方收到”零窗口”通知后启动”坚持定时器”。当”坚持定时器”时间到时,发送方尝试发送一个小的ZWP包(Zero Window Probe),期待接收方回复一个带着新的接收窗口大小的确认包。一般ZWP包会设置成3次,如果3次过后还是0,有的TCP实现就会发RST断开连接。

当接收方以很小的增量处理数据时,它会发送一系列小的接收窗口。这被称为”糊涂窗口综合征”,因为TCP报头至少需要20字节,每次只发送很少的数据导致效率不高。为了避免”糊涂窗口综合征”,有下面两种算法:

  • 接收方使用Clark算法,当收到的窗口小于某个值,发送ACK宣布窗口大小为0,直到缓冲区空间大于MSS,或者缓存区的一半已经空了,再将窗口打开。
  • 发送方使用Nagle算法,只有当($Windows Size>=MSS$且$Data Size>=MSS$)或等待时间超过200ms,才会发送数据,否则将数据放入缓冲区。Nagle算法默认打开,对于Telnet或SSH这样的交互式程序需要关闭这个算法,可以通过设置TCP_NODELAY关闭该算法。

拥塞控制

防止过多报文进入网络造成路由器与链路过载。

TCP的现代实现包含四种相互影响的拥塞控制算法:慢开始、拥塞避免、快重传、快恢复。设置拥塞窗口(CWND)与慢开始阈值(SST),初始时CWND设置为1。

  • 慢开始: $CWND<SST$时使用慢开始,慢开始阶段CWND初始化为1,CWND呈指数增长
  • 拥塞避免: $CWND>SST$时使用拥塞避免,CWND呈线性增长。
  • 超时重发机制 检测1到超时则SST设置为当前CWND的一半,CWND设置为1,执行慢启动算法。
  • 快重传 快重传算法规定,发送方收到连续三个重复ACK就立即重传对方尚未收到的报文段,而不必继续等待为其设置的重传计时器到期。
  • 快恢复 发送方收到连续三个重复ACK后,将SST设置为当前CWND的一半。由于发送方现在认为网络很可能没有发生拥塞,因此不执行慢开始,直接将CWND设置为SST,使拥塞窗口线性增长。

网络层


IPv4

地址分类

IP地址按照ABCDE类进行划分

0-78-1516-2324-31
A类地址0网络号7位主机号24位
B类地址10网络号14位主机号16位
C类地址110网络号21位主机号8位
D类地址1110主机号28位
E类地址11110保留用于实验和将来使用

特殊IP地址

网络标识主机标识意义
全0全0表示本网络上的本主机
全0主机号表示本网络上的某个主机
网络号全0表示指定的一个网络
全1全1受限广播地址
网络号全1直接广播地址
1270.0.1环回地址

保留专用地址

网络号
A类10.0.0.0/8
B类172.16.0.0/12
C类192.168.0.0/16

子网划分

三级地址结构:网络号-子网号-主机号

  • 路由器处理到来的分组:把子网掩码和IP地址进行按位与运算(AND),得出网络地址,即网络号+子网号。
  • 子网内部主机寻址:将子网掩码的反码与IP地址进行按位与(AND)运算,得到的结果即为主机部分。

CIDR

使用二级地址结构:网络前缀-主机号。基于可变长子网掩码(VLSM)进行任意长度的前缀的分配。

NAT

解决IPv4地址短缺的方案,通过”IP:端口”的方式进行映射。会使得主动模式的FTP服务受到影响。

IPv4分组格式

版本(4bit)首部长度(4bit)区分服务(6bit)显式拥塞通告(2bit)总长度(16bit)
标识(16bit)标志(3bit)段偏移(13bit)
生存时间(8bit)协议(8bit)头校验和(16bit)
源IP地址(32bit)
目的IP地址(32bit)
选项
数据部分

各个字段的含义:

  • 版本:IPv4版本为4,填入0100。
  • 分组长度:分组长度为4位,以4字节为单位。由于IPv4首部可能包含数目不定的选项,该字段也用于确认数据的偏移量。IPv4分组首部长度为$20\sim60$字节,所以该字段的数值为$5\sim15$。
  • 协议:指使用IP协议的高层协议类型,例如TCP为6,UDP为17。IANA维护着一份IP协议号列表
  • 头校验和:只保证首部数据完整性,不包括数据部分。分组头之外的数据属于高层部分,高层数据都会有相应的校验字段,因此高层数据不对高层数据进行校验。IP分组头每经过一跳路由器都要改变一次,但数据不改变,因此只对IP分组头设置校验和。
  • 生存时间:使用TTL值限制一个分组在互联网中的寿命,通常是计算转发路由器跳数实现。每经过一跳路由器TTL值减一,TTL值为0时丢弃该分组。
  • 标识:用于唯一标识一个报文的所有分段,因为分段不一定按序到达,在重组的时候需要知道分段所属的分组。
  • 标志
    1. 第一位始终为0
    2. 第二位为DF,DF=1时不能对报文进行分段。如果分组长度超过MTU,又不能对其进行分段,则丢弃该分组,并发送ICMP查错报文向源主机报告。
    3. 第三位为MF,MF=1表示接收的不是最后一个分段。
  • 段偏移:指明每个分组相对原始分组开头的偏移量。以8字节为单位计数,因此分段长度为8字节的整数倍。
  • 选项:用于控制与测试,不经常使用,最大为40字节。

路由选择

路由表建立

使用路由表三元组(M,N,R),即子网掩码-目的网络-下一跳路由器

IP路由汇聚

使用CIDR+最长前缀匹配原则进行IP路由汇聚

路由信息协议RIP

  1. 启动时对(V,D)路由表进行初始化
  2. 每隔30s向相邻路由器广播自己的路由表(V,D)信息
  3. 收到相邻路由器发送的(V,D)报文,对自己的(V,D)路由表进行更新

最短路径优先协议OSPF

一个OSPF网络分为多个区域。

相对RIP协议,OSPF有如下特点:

  1. OSPF使用链路状态协议
  2. 每个路由器周期性地发送链路状态信息,使得区域内所有路由器最终都能形成一个追踪网络链路状态的链路状态数据库
  3. 路由器在链路状态变化时使用洪泛法向所有路由器发送消息
  4. OSPF协议使用链路状态作为”最短路径”的评判标准

外部网关协议BGP

每个自治系统选择一个路由器作为BGP发言人,每个BGP发言人与其他自治系统中的BGP发言人交换路由信息

ICMP

IP协议无连接、不可靠,ICMP协议用于解决IP协议不可靠的问题。

ICMP报文有查错报文和查询报文。

报文类型种类
查错报文目的站不可达
数据报超时
数据报参数错误
源站抑制
路由器重定向
查错报文时间戳请求与应答
回应请求与应答
地址掩码请求与应答
路由器查询与通告

ARP

ARP协议根据给定的IP地址寻找到对应的物理地址(MAC地址)。

主机的高速缓存中有一张ARP缓存表,主机A要寻找主机B时会先查看本地的ARP缓存表,如果没有记录会发送广播请求。B收到广播请求之后给A回复一个ARP数据包,A收到数据包之后将B的MAC地址写入高速缓存中,然后A通过该MAC地址与B进行通信。

(ARP地址欺骗能一键断舍友网,非常好玩)

IPv6

IPv6使用冒分十六进制ip地址,长度为128位。

IPv6格式

  • 使用冒分十六进制格式表示每个位段前导的0可以省略,例如$21DA:0000:0000:0000:02AA:000F:FE08:9C5A$与$21DA:0:0:0:2AA:F:FE08:9C5A$是等价的
  • 0位压缩法
    1. 连续的0可以进行压缩,上面的IP地址还可以化简为$21DA::2AA:F:FE08:9C5A$
    2. 不能将有效的0压缩掉,$FF02:30:0:0:0:0:0:5$不能表示为$FF03::5$
    3. 双冒号”::”在一个IP地址中只能出现一次,$2001::25de::cade$是非法的,因为不能判断每个冒号代表多少个0
  • 内嵌IPv4地址表示法:如果是IPv4地址,后32位可以用10进制数表示,因此$::FFFF:192.168.89.9$等价于$::FFFF:C0A8:5909$

IPv6分组格式

基本头部(40B)扩展头部1扩展头部n上层数据

数据链路层


数据链路层实现链路管理、帧传输、流量控制、差错控制等功能。

流量控制

单帧停止等待协议

如图所示

image-20210628012113105

发送方每次发送一帧后,需要等待确认帧返回之后再发送下一帧,否则重发出错的数据帧。

  • 传播延时$t_p$:电信号通过介质传播到接收方的时间,介质长度除以传输电磁波传播速度
  • 发送延时(传输延时),数据发送所需时间。等于帧长度除以发送速度。使用$t_f$和t$t_a$分别表示数据帧和ACK的发送延时。
  • 处理延时$t_{pr}$:接收方收到数据帧时要检查数据帧的帧头地址、校验字段,以确定帧传输是否正确。

帧传输总延时为:
$$
t_T=t_p+t_f+t_{pr}+t_a+t_p+t_{pr}
$$
计算时通常忽略ACK发送延时$t_a$与帧处理延时$t_{pr}$,则传输总延时为:
$$
t_T\approx 2t_p+t_f
$$
单帧停止等待协议效率为:
$$
U=t_f/(t_f+2t_p)
$$
假设$a=t_p/t_f$,则:
$$
U=1/(1+2a)
$$

连续发送ARQ协议

  • 拉回重发协议:连续发送$0\sim5$号帧后得知2号帧出错,会重发$2\sim5$号帧,然后再发6号帧。
  • 选择重发协议:连续发送$0\sim5$号帧后得知2号帧出错,会重发2号帧,然后再发6号帧。

滑动窗口协议

若接收窗口$W_r$=1,则发送窗口的大小$W_r≤2^n-1$时,ARQ协议才能正确运行。

差错控制

循环冗余检测CRC

模2除法

将普通除法中减法换成按位异或即为模2除法

校验码计算

  1. 发送方报文多项式为$f(x)$
  2. 生成多项式$G(x)$为一个$k+1$位的二进制数,最高次幂为$x^k$
  3. 报文多项式乘以$x^k$,即左移k位
  4. $f(x)\cdot x^k$按模2除以$G(x)$得到k位余数就是校验位
  5. 将校验位加在$f(x)\cdot x^k$上作为实际发送的数据

校验码计算例子

  1. 发送$f(x)=1010001$ (7bit)
  2. 生成$G(x)=10111$ (n=4,k=4)
  3. 发送数据位左移4位得到$f(x)\cdot x^k=10100010000$
  4. 用左移得到的结果按模2除法计算得到余数$R(x)=1101$
  5. 则CRC校验位为1101,将$R(x)$加在$f(x)\cdot x^k$上得到10100011101

Ethernet基本工作原理

以太帧结构

前导符(7B)帧前定界符(1B)目的地址(6B)源地址(6B)类型(2B)数据(46-1500B)帧校验(4B)
  • 源地址和目的地址均为MAC地址
  • 网络层协议类型:0x800表示IP协议;0x8137表示IPX协议
  • 数据长度为$46B\sim1500B$
  • 帧校验码为CRC32校验码,用于验证帧数据是否损坏

冲突检测

以太网采用载波监听多路访问/冲突检测(CSMA/CD)方式进行冲突检测

  • 载波监听多路访问/冲突检测(CSMA/CD)
    1. 该方案用于以太网IEEE 802.3标准
    2. 发送阻塞信息并立即停止发送数据,阻塞消息为连续几个比特全1的信号,对冲突进行强化使其他设备更快检测到冲突
    3. 在固定时间内等待随机时间,再次发送
    4. 以太网协议IEEE 802.3规定一个帧的最大重发次数为16次
  • 载波监听多路访问/冲突避免(CSMA/CA)
    1. 该方案用于无线局域网标准IEEE 802.11
    2. 设备检测到信道空闲,且维持一段帧间隔时间后,再等待一段随机的时间依然空闲才会提交数据
    3. 发送前先发送一个RTS(Request to Send)帧给最近接入的节点,等待最近的节点回复CTS(Clear to Send)帧后,才开始发送数据。确保发送数据时不会发送碰撞

物理层


模拟数据编码方案

移幅键控ASK

改变幅度表示信号0和1
$$
u(t)=
\begin{cases}
u_m\cdot sin(ω_1t+φ_0), 数字1 \\
0, 数字0 \\
\end{cases}
$$
实现简单,抗干扰能力差

移频键控FSK

改变角频率表示信号0和1
$$
u(t)=
\begin{cases}
u_m\cdot sin(ω_1t+φ_0), 数字1 \\
u_m\cdot sin(ω_2t+φ_0), 数字0 \\
\end{cases}
$$
实现容易,技术简单,抗干扰能力强,是目前最常用的调制方法之一

移相键控PSK

改变相位表示信号0和1
$$
u(t)=
\begin{cases}
u_m\cdot sin(ωt+0), 数字1 \\
u_m\cdot sin(ωt+π), 数字0 \\
\end{cases}
$$
可以达到高速传输的目的,抗干扰能力强,实现复杂

数字数据编码方式

非归零码

低电平表示0,高电平表示1。

缺点:

  1. 收发双方不能保持同步,为保证同步需要用另一个信道发送同步信号
  2. 如果信号中的0和1不等就会存在直流分量

曼彻斯特编码

每个周期有前$\frac{T}{2}$和后$\frac{T}{2}$两部分,前$\frac{T}{2}$传输该比特的反码,后$\frac{T}{2}$传输该比特的原码

优点:

  1. 利用电平跳变产生同步信号,无需另外发送同步信号
  2. 不含直流分量

差分曼彻斯特编码

每个比特中间的电平跳变仅做同步使用,某个比特开始处发生跳变表示传输0,不发生跳变表示传输1

信道带宽与香农定理

在有随机热噪声的信道中传输数字信号时,传输速率$R_{max}$与信道带宽$B$、信噪比$S/N$的关系为
$$
R_{max}=B\cdot log_2(1+S/N)
$$
$R_{max}$单位为bps,带宽$B$单位为Hz

参考

大部分内容参考了维基百科和深大某不知名的计网教科书

Wiki-TCP

Wiki-CSMA

详解FTP协议的主动模式和被动模式

TCP拥塞控制——快重传和快恢复

说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...