Computer Network Notes
本文最后更新于:2022年12月28日 下午
计算机网络概览
定义:通过单一技术互联的自治计算机集合
关键推动因素
- 信号的数字化——取样、量化、编码——二进制流
- 规模效应
分类
按传输技术分类:
- 广播
- 点到点
按范围分:
- Internet:全球互联网
- WAN(国家、大洲)
- MAN
- LAN(Ethernet,WiFi)
- PAN(bluetooth)
Internet
Internet是全球互联网,internet是网络的网络
internet是一般性概念,单指网络;Internet是一种具体的实现,即全球IP因特网
常用设备区别:
AP是无线接入点,主要的作用的是发出无线信号,连接无线终端,整合的网络管理还会通过AC(无线控制器)来完成。AC是整个无线网络的大脑,集中管理和控制整个无线网络。
家用路由器,即使在mesh组网的技术下,最多不会超过20个设备组网,太多的设备组网对路由器的压力很大。家用路由器的性能,也无法进行大规模网络下的复杂计算。大部分的AP,性能都要比家用路由器高。
Modem:信号转换(数字信号与模拟信号)
router:连接子网,交换报文
网络核心:交换
交换核心——相互连接的路由器
数据如何在网络之间不断交换?
- 电路交换 :建立专用路径,资源保留
- 优点:数据速率稳定,数据按序到达,网络层透明
- 缺点:建立连接时延,利用率较低
- 分组交换 :整体信息分为数据包,每个数据包单独转发,转发由交换机/路由器自己决定。资源共享
- 优点:利用率高,资源共享,资源按需使用,可以容纳更多用户。因为前三个特点,加上路由器的缓存,分组交换可以处理突发数据。
- 缺点:资源竞争冲突,拥塞,路由复杂,数据到达顺序不保证
时延
- 处理时延 —— 处理位错误,通常小于ms
- 排队时延 —— 等待时间,取决于拥塞程度
- 传输时延 —— 传到介质上的时间
- 传播时延 —— 在介质上传播的时间
协议
protocol:do what at when
为什么分层:
- 明确结构
- 模块化
设计目标
- 定位:如何标识一个host
- 路由:从src到dest选择路线
- 错误控制:检错与纠错
- 流量控制:接收双方速度相平衡
- 多路复用:资源共享
OSI参考模型
应用层——表示层——会话层——传输层——网络层——数据链路层——物理层
协议&服务&接口区别
上四层是端到端通信,下三层是点到点通信
TCP/IP模型
应用层——传输层——网络层——链路层
路由器:连接两个或多个网络,三层设备
交换机:连接一个网络内的主机
物理层
功能:提供一个bit流
信道容量定理
奈奎斯特取样准则:为了重建信号,每秒需要2H个样本(H为带宽),否则会有重叠
奈奎斯特准则: 对于一个带宽为W(Hz)的无噪声低通信道,最高的码元传输速率Bmax:
Bmax = 2W(band)
如果编码方式的码元状态数为M,得出极限信息传输速率(信道容量)Cmax:
Cmax = 2Wlog2M (b/s)
因为信道总是有噪声的,因此奈奎斯特准则给出的是理论上的上限。
香农定理:带宽为W的通道,一秒内允许传输的最大bit数量
Cmax = Wlog2(1+S/N) (b/s) 。S为信道内所传信号的平均功率,N为信道内部的高斯噪声功率
SNR = S / R,信噪比,单位是分贝,SNR(dB)= 10log10 (S/N)
因此相同信道,如果是不同的模拟方法,会得到不同的数据速率,不同的信噪比
调制
数字信号(二进制) —— > 相应的模拟信号(波形图)
- 调幅(ASK)
- 调频(FSK)
- 调相(PSK)
通过调整载波的幅度,频率,相位来匹配相应的二进制信息
BPSK:将二进制0或1映射到给定相位的正弦波(通常高频波)
BPSK使用了基准的正弦波和相位反转的波浪,使一方为0,另一方为1,从而可以同时传送接受2值(1比特)的信息。以二进制调相为例,取码元为“1”时,调制后载波与未调载波同相;取码元为“0”时,调制后载波与未调载波反相;“1”和“0”时调制后载波相位差180°。
QPSK:四相相移调制是利用载波的四种不同相位差来表征输入的数字信息,是四进制移相键控。QPSK是在M=4时的调相技术,它规定了四种载波相位,分别为45°,135°,225°,315°,调制器输入的数据是二进制数字序列,为了能和四进制的载波相位配合起来,则需要把二进制数据变换为四进制数据,这就是说需要把二进制数字序列中每两个比特分成一组,共有四种组合,即00,01,10,11,其中每一组称为双比特码元。
8PSK:三个bit标志一个码元,但解码也难了
QAM:实际在用的调制(AM + PM)
改变相位和幅度,QAM-16:一个码元4bit,QAM-64:一个码元6bit
传输介质
引导式介质:信号单方向传播,通常固体介质:光纤,双绞线,同轴电缆
非引导式介质:空气、真空
带宽
带宽(英语:Bandwidth)指信号所占据的频带宽度;在被用来描述信道时,带宽是指能够有效通过该信道的信号的最大频带宽度。
对于模拟信号而言,带宽又称为频宽,以赫兹(Hz)为单位。(比如1.3微米波段,1.3微米说的是波段的中心,波段的范围还需要在中心加减一个德尔塔,得到能够通过信道的最大波长和最小波长,也就对应了最小频率和最大频率,这个范围就是带宽)
对于数字信号而言,带宽是指单位时间内链路能够通过的数据量。数字信号的传输是通过模拟信号的调制完成的,为了与模拟带宽进行区分,数字信道的带宽一般直接用波特率或符号率来描述。
窄带 & 宽带
无线电传输
中频以下,无线电波遵循地球曲率
高频波段,无线电波被反射
多路访问
接入网络:接入边缘路由器(有线 或 无线)
多用户:多路访问:单一媒体上合并多个信号流,使得多个用户可以使用共享媒体
- 空分复用——SDM
- 频分复用——FDM
- 波分复用——WDM(与频分基本一样,毕竟反比)
- 时分复用——TDM,缺点:同步较困难
- 时频复用——结合FDM与TDM,更困难
- 码分复用——CDM
- 每一bit时间分为m个间隔,每个间隔叫做chip
- 每个站点分到一个唯一的m-bits的code,叫做chip sequence,是m维向量
- 上面的向量,每个分量为1,且相互正交
- 传输之前,每个station把自己要传输的内容与自己的chip seq相乘,然后相加,即得到在介质中传输的内容。传输完收到后,每个接收者再把接收内容和发送者的chip seq相乘,即得到原来发送内容。
- 为了区分传输0和不传输,可以让不传输为0,传输0为传输-1
数据链路层
两台相邻机器实现可靠通信(相邻是通过信道连接起来)
作用
- 向网络层提供服务接口
- 处理传输错误
- 调节数据流
提供的服务:
- 无确认的无连接服务(差错很少或者实时场景,比如LAN下差错相对较少)
- 有确认的无连接(帧要确认是否收到,比如无线系统)
- 有确认的有连接
成帧
由于接收到的可能出错,因此需要校验,方便校验, 使用帧的概念。每一个帧都有令牌检验
成帧方式
- 字节计数(但如果计数位出错的话就会全军覆没)
- 字节填充的标志字节(缺点:必须以该字节的大小(比如8比特)作为传输基本单元)
- 比特填充的标志比特(任意大小单元组成二进制流)——usb协议中使用
后两者副作用:帧大小取决于帧的数据内容
差错控制
确保可靠,我们要有反馈信息。接收方返回控制帧,进行肯定或否定的确认。但可能会有帧丢失的情况,这样如何反应?需要引入计时器,但是计时器会造成这种问题:接收方接收到两个一样的帧,多次传给了网络层,所以又需要为帧分配序号,从而使接收方区分原始帧和重传帧。
纠错码
- 码字,码率,海明距离
- n = m + r(m位信息,r位冗余,构成n位码字)
一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离。
为了检测d位错误,需要一个距离为d+1的编码方案,因为在这样的编码方案中,d位错误不可能将一个有效码字变成另一个有效码字。
为了纠正d位错误,需要距离为2d+1的编码方案,这样,合法码字足够远,即使发生了d位变化,也还是离原来的码字更近。在不太可能有更多错误的假设下,可以唯一确认原来的码字,从而纠错。
检错码
纠错码被用于无线系统,而光纤铜线等更加可靠,因此使用差错检测和重传更高效。
奇偶校验
- 奇校验和偶校验(事先约定好的1的个数)
校验和
CRC
- 使用生成多项式
- 首先对原本数据表示成多项式格式M(x)(长度为k,最高位是x的k-1次方)
- 有一个选定的生成多项式G(x),计算r(x) = reminder(M(x) * x^r / G(x)),r是Gx的最高指数
- 计算的T(x) = M(x) * x^r - r(x) = M(x) * x^r + r(x)
- 接收方收到数据后,只需要查看是否能被Gx整除即可
- 特性:所有单个错误都能被检测出来,两个错误可以被检测出来。如果Gx有x的r次方和r-1次方,那么所有奇数错误都能检测出来
海明码
- 我们已经知道原始数据,也知道海明码的位置(1,2,4,8),需要填充这些海明码
- 每一位数据都会对海明码作出贡献
- 对哪一位作出贡献,取决于该数据的位数是2的幂次如何组合的
- 检错的时候,和编码时候的表差不多,还是对应的位去检测偶校验,如果出错,那么最后得到的位运算结果,从下到上,转为10进制,就是出错位置。
- 无法纠正二位错误,但还是能告诉有错误
如果出错后去纠正,冗余负载太高,不如重传(Ack)
ARQ
自动重传请求
错误一般分为两类:出错 + 丢失
常用ARQ协议见下面
流量控制
基于反馈的流量控制
物理层进程和某些数据链路层进程运行在一个称为NIC(网络接口卡)的硬件上,也就是网卡
网络层永远得不到任何帧头的信息,这是因为要保持网络层和数据链路层的完全分离。只要网络层对数据链路层和帧格式一无所知,那么当数据链路层协议改变时,网络层软件不用作出任何改变。(比如换了个网卡)
一个帧由4个字段组成:kind, seq, ack, info,前三个是控制信息,合称帧头
基本协议
- 乌托邦式的协议
- 无错,单工停等式协议——只是接受,接受到就可以发下一个
- 有错,单工停等式协议——计时器+序号(区分新帧老帧)
- 如果在一个协议中,发送方在前移到下一个数据之前必须等待一个肯定确认,这样的协议叫自动重复请求(ARQ),常用的ARQ有SAW(停等)、GBN(回退N)、SRP(选择重传)
- 滑动窗口协议(最大区别-双向的)同一个链路传输两个方向,并且使用捎带确认,增大利用率
SAW(停等)
- 发送一个帧后,等ACk(当前帧的ACK)
- 设置计时器,超时后自动重传
- 设置序号区分帧
- 如果ACK不标号,那么sender就不知道是在请求重传帧还是请求新帧,因此ACK返回下一帧正在期待的序号
- 为了减少不必要的浪费,标识ACK时使用捎带确认
- 因为要一直等ACK,所以是半双工
效率低,因为大量时间在等待ACK(基本上等RTT)
滑动窗口思想
一次发多个待ACK的帧,每个帧有number,也可以用作流量控制
当出错的时候,就使用GBN或者SRP去处理
操作
对于发送端:滑动窗口前的,是已经发送的包;滑动窗口内的,是准备好发送的,但是还没有Acked的
- 发送端发出去后,窗口左边缩小
- 发送端收到Ack后,窗口右边扩张
对于接受端:滑动窗口前的,是已经收到的包;滑动窗口内的,是准备好接收的,但是还没有收到或者没有ack的
- 接收端收到包后,窗口左边缩小,表明已经收到了
- 接收端发出Acked后,窗口右边扩张,表明确认了,可以收后面的了
回退N协议(GBN)
Ack for multiple frames
是滑动窗口思想的一种实现
简要操作
- 发送窗口:
- 收缩:包发出去了
- 扩展:收到了包对应的ACK
- 接收窗口:
- 收缩:包收到了
- 扩展:发出了ACK
考虑到传输时延,使用管道化。
为了处理管道化的错误,两种协议,回退N和选择重传
回退N对应于窗口大小为1的情形,选择重传的窗口大小大于1
计时器过期时间 T > W * L / R(先把窗口的传出去)
发现错误后也有基于ACK的和NAK的两种方法
可能丢帧,也可能丢ACK(计时器触发)
在GBN下,不是每个帧都要独立ACK
详细操作
A - to - B,A有一个计时器
帧损坏
- 帧内部出错:B检测到frame i出错,B必须立刻传NAK i,当A收到NAK,必须重传帧i和后面的(已经传了但是没有被Ack的那些)
- 帧i丢失:但是B收到帧i+1,此时B也认为出错,必须发送NAK i
- 帧i丢失,但是B没收到其他帧,B可能会发ACK i-1,可能发NAK i。但A的定时器最终失效肯定会保证。
ACK 丢失
- B收到帧i,发ACK i+1,但是丢失了,但是B可能发了个ACK i+2或者以后的,不出错
- B没发后面的ACK,A的定时器失效,重发
NAK 丢失
- A 将在关联的(稍后的)帧上超时,并重新传输帧 i 和所有后续帧。
Note:
不是每个帧都会被独立ACKed
窗口大小讨论
窗口大小是k个bit的序列,帧的数字可以支持2的k次方减1个GBN
否则容易引起混淆
比如有一种用重复ACK表示出错的,当k=3,W=8时,发送端先发送P0,然后收到ACK1,之后发了P1-P8,加上P0,8个全发了,此时又收到一个ACK1,那么既可能是都没错,正常请求下一波,也可能是之前那个出错了,重新开始请求ACK1,需要第一个ACK1去重发。
选择重传协议(SRP)
通常和否定策略结合,即发送否定确认。
每个帧都需要单独确认(因为没有顺序了,Ack也是没有顺序,只能每个都ack一次)
需要接受端的缓存配合
效率:min(1,W*t/S),t是传输时延,S是一个的总时间
GBN和SRP效率都是这个
数据链路总结
提供无错的比特流
- 成帧(三种方法确定开始和结尾)
- 差错控制
- 编码(检错纠错)
- 海明码(纠错)
- 奇偶(检测)
- CRC(检测)
- ARQ差错恢复:重发
- 发送者处理丢失的帧(计时器),接收者处理出错的帧(重复ACK或者NAK)
- SAW思想
- 滑动窗口(管道化提高SAW的效率)
- SAW
- GBN(SAW + P#,ACK/NAK的差错控制)
- SPR(修改GBN,通过缓存,只重发出错的帧,需要对每个帧都ACK一下)
MAC
作用
分配channel:单一(固定)& 随机(动态)
core: Who can transmit at when
多人访问链接
包含两部分:
点对点连接:终端和交换机(台式)
广播连接:以太网 ,无线连接
多人访问并非只有动态,也可能有p to p
协议
- ALOHA
- CSMA
- Taking turns
- collision free
- limited-contention
- Ethernet
- Wireless LAN
要解决的核心:冲突检测、恢复
冲突系统:多个用户使用相同的通道,导致冲突
term
- frame time:transmission delay
- N : new frames
- G : generated frames / frame time(considering retransmission)
pure ALOHA
检测:听
恢复:等随机时间再重发
Vulnerable time:2t(t 是 transmission delay)
max throughput : 0.184
Slotted ALOHA
- Time is cut into slots.
- need sync
- Vulnerable time : t
- max throughput : 0.368
ALOHO 的主要问题:吞吐量太低了
本着提高信道利用率,下面是CSMA
CSMA
check before transmit(提高信道利用率)
- scenario : LAN (propagation delay is small)
- p-Persistence CSMA & Non-Persistence CSMA
- if persist, the node listen to the channel continuously, and transmit frame with probability of p.
- if not persist, node doesn’t listen continuously, check channel after random time
- Collision may still happen because of propagation delay
- p越小,其实吞吐量越大,倾向于conservative
- 主要是为了提高利用率,但冲突还是会发生,一旦发生,帧就要浪费
为了减少不必要的浪费,添加冲突检测,检测到就直接停止
CSMA/CD(Ethernet)
如何检测?
- 有线:听到的和发出的一样不
- 无线:难以检测
- 硬件限制(只能取一)
检测
- contention
- idle
- transmission
检测时间
最小:t(prop)
最大:2t(RTT)
CSMA/CD = slotted ALOHA with slot of length 2t
静态的适合高负载,动态的适合低负载
Collision-Free Protocol
- polling(轮询):如果master出问题的话系统崩溃
- token ring:单个节点出问题的话系统崩溃
- bit-map(适合人多)reserve
- binary countdown(有优先级)reserve
Limited Contention Protocols
结合起来
低负载竞争(延迟小),高负载无冲突(contention-free)(利用率高)
做法:分组:组内竞争一个时间slot
关键在于动态分配时间槽
应用
Ethernet
LAN
Encapsulation: IP datagram -> Ethernet frame
- frame structure:Preamble,Mac Address(Dest & Source),Type(higher-layer)Data,CRC
- many different Ethernet standards(a family)
- 不可靠、无连接
经典以太网
传统以太网采用广播的方式发送信息,同一时间只允许一台主机发送信息,否则各主机之间发生冲突,因此属于半双工方式。
帧结构
- 目标地址第一位:0是普通地址,1是组地址,该组中的所有站都要接受(组播),全1是广播
- type:网络层可能有多个协议,因此需要知道谁来处理
- Data:不能太大,太大了收发器没有足够的内存来存储完整帧;不能太小,太小了
- 冲突后会截断,截断的更短,要能区分有效帧和截断的无效数据
- (更重要原因)—— 传完了,但是冲突了。冲突时接收方发出突发噪声,让发送方知道冲突了。但如果帧太短,发送方已经传完了,那么它就知道自己已经传成功了,结论错误。
- 所以传输时间为Lmin / R,传播时间为d / c,Lmin / R > 2d / c,要求
过程
- NIC收到网络层的数据,构建帧
- 监听信道96 bit time,如果空闲就传,否则等待
- 无冲突,传输成功
- 有冲突,放弃并且传48bit的jam signal(突发信号),等待随机时间
随机时间如何确定?
二进制指数后退
两个站冲突后等待,如果等待时间一样,那么会一直冲突
如果冲突了m次,那么下次就从0到2的m次方-1,这些数中随机选择。期望增加
最大1023,还冲突发失败报告
性能
帧越长,效率越高,但是那样变成只为一个人服务了
集线器 hub / 中继器
无脑传输,一个来,其余所有路线传出去
放大信号,延长传输距离
共同组成一个大的冲突域
hub没有CSMA/CD,所以主机需要使用CSMA/CD
交换机
- 有缓存 :store and forward
- 传输有目标,只传到目标地址的主机
- 在各自的冲突域内运行CSMA/CD
- 全双工,无冲突
- 自学习,交换表
无线网络LAN
基站 : 无线和有线之间的桥梁
802.11n – Wi-Fi4,最高到600Mbps,2.4-5GHz
802.11ac – Wi-Fi5,5GHz,3.4Gbps
802.11ax – Wi-Fi6,2.4-5GHz,7Gbps
都是理论最高速度
特征
- 衰减
- 干扰
- 多径效应(反射的存在)
SNR很重要
问题
- 隐藏终端问题 – 由于竞争者离得太远而导致站无法检测到潜在的竞争者
- 暴露终端问题 – 发送方由于离得近, 导致不敢发送(其实方向不一样可以发送)
CSMA还是可以工作,但是无法检测冲突,只能避免冲突
CSMA/CA
发送前要等一段时间(发送方和接收方都是)
RTS - CTS
类似于预定的思想
如果有基站: 发送者发RTS,听到的人知道附近有人在发东西, 先别发, 接收方返回CTS, 其他人听到CTS, 也等着(CTS里面有帧长度信息所以知道等多长时间)
没有基站协调,每个host都是独一无二的, 有隐藏终端和暴露终端的问题. 与上面不同的一点, 如果一个站点听到了RTS, 但是没有听到CTS, 说明这个站点和接收方实际上很远, 可以发送
真正希望知道的是接收方附近是否有无线电活动
网络层
数据链路就是将帧从一端传到另一端,而网络层是处理端到端数据传输的最底层。因此需要知道整个网络的拓扑结构,选择路径、选择路由
提供服务
- 向传输层提供服务需要独立于路由器(数量种类与拓扑)
- 传输层需要的网络地址需要一个统一的编址方案
- 无连接和连接的争论
不面向连接,数据报——数据报网络(比如IP)
面向连接,虚电路——虚电路网络(比如MPLS,在ISP中使用的)
路由算法
是网络层软件的一部分,负责确定一个入境数据包应该发送到哪个输出线路上。
路由:对使用哪一条路径作出决策,找到从src到dest的一条路径
转发:数据包到达后路由器根据路由表采取的行为(查表)
路由算法:生成和更新路由表
- 需要全局信息的——link- state算法(链路状态算法),如Dijkstra
- 只需要分散信息的——迭代过程就是与邻居不断交换信息,distance-vector(距离矢量)算法,如Bellman-Ford算法
- 静态算法——路由改变很慢
- 动态算法——路由改变很快
最优准则
如果节点j落在从i到k的最短路上,那么从j到k的最短路遵循同样的路径
最短路径路由(dijkstra算法)
要求:
- 非负
- cost可加
这是static算法
dijkstra需要全局信息
迭代path的长度,k次迭代后,集合N里面包含了k个到原点最近的节点
每次从不在N里面的节点中选择一个cost最小的,然后加入到N中,用这个节点去更新其他所有节点(不在N里)
距离矢量算法
- 局部信息
- 动态更新
- Bellman-Ford
- 要有一个更新顺序,每次都按照这个顺序,根据自己的所有邻居最新情况去更新,直到不再变化
- 有count-to- infinite问题
链路状态路由过程
- 找到邻居,直到邻居地址
- 测量到邻居的cost(可以用RTT近似)
- 建立一个packet,里面有刚才的信息
- 发出packet到其他路由器
- 计算最短路
- 该路由用于OSPF中
分层路由
路由器被分为多个自治系统(AS)
一个AS内运行同一种路由算法(intra- AS),比如RIP和OSPF
网关路由器:负责将数据包转发到AS以外的地方,运行的是自治系统间(inter-AS)路由协议,比如BGP
泛洪:强制泛洪(发到所有出口,重复很多),选择泛洪(只发给目的地)
广播路由
- 使用泛洪
- 或使用多目的地路由
- 或使用生成树路由
- 发送最少packet
- 只能用于link-state,需要全局的信息
- 反向路径转发:生成树的近似
- 如果数据包到达的链路 在其返回发送方的最短路径上,那么泛洪
- 其他情况,路由器直接丢数据包,因为很有可能是重复的
多播路由
移动主机
使用隧道,家庭代理
拥塞控制
处理网络中的流量吞吐大小
- 开环方式:不反馈,直接避免
- 闭环方式:使用反馈
增加资源:通常带宽
减少流量
QoS
不同应用对不同的性能要求不一样
为了平滑抖动,需要使用buffer
一个buffer里面多个包,需要管理队列,也就是调度
调度
多个网络来的包混在一起,谁先转发出去?
- FIFO
- PQ
- 罗宾环 / WFQ(权重平衡队列)
Traffic Shaping
入口点控制,调节流量
主要是ISP管理,安装在接入网中,主要为了保护网络,即使计算机发很多包,但是对后面的网络影响不大
leaky bucket
像是漏水桶一样,有一个最大吞吐速率来平滑大的burst
Token Bucket
每一个包都必须有一个token才能出去。如果空闲,那么token会有一个最大值;当来包后,可以消耗这些token,如果消耗完token,必须要等待有token才能出去。同时如果队列已经满,那么新的packet将会被丢弃
定位(IP)
以太网协议(Ethernet)规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。
以太网协议不能解决多个局域网如何互通,这由 IP 协议解决。
设计原则:
- 没有硬编码地址
- 单一命名结构,不能有歧义
- 容易处理
IP作用:标识一个interface,不是一个host
路由表:mapping
entry:目的IP地址 -> 出站链路(转发到哪个路由器)
索引:根据目标IP地址的网络部分去索引
IP地址编址方式
每一个ip地址包括两部分:网络地址和主机地址(最新的还有子网id),五类地址对所支持的网络数和主机数有不同的组合。
共四个八位组,如192.168.123.253
因此只有每个八位组内部才存在一个增加进位的关系,不同的八位组之间其实是相互并列的,互不影响,完全不需要进位的
1、a 类地址 :一个a 类ip地址仅使用第一个8位位组表示网络地址。剩下的3个8位位组表示主机地址。a类地址的第一个位总为0,因此a类地址的范围小于127,再去掉0.0.0.0的主机地址,a类地址只有126个。a类地址最大是0111 1111,也就是127
当查看一个ip的第一位(从左到右),如果是0,就是a类地址
2、b 类地址 : b类网络地址范围 128.0.0.1~191.255.255.254。一个b类ip地址使用两个8位位组表示网络号,另外两个8位位组表示主机号。128.0对应1000 0000,191.255对应1011 1111,我们发现第一位都是1,第二位都是0,因此网络个数为2的14次方。
当查看一个ip第一位是1,第二位是0,(10开头)就是b类地址
3、 c 类地址 :范围:192.0.0.1~223.255.255.254。这类地址可以认为与a类地址正好相反。a类地址使用第一个8位位组表示网络号,剩下的3个表示主机号,而c类地址使用三个8位位组表示网络地址,仅用一个8位位组表示主机号。192.0.0是1100 0000 0000,223.255.255是1101 1111 1111
当查看一个ip第一位是1,第二位是1,第三位是0,(110开头)就是c类地址
4、d 类地址 d 类地址用于在ip网络中的组播( multicasting ,又称为多目广播)。d类地址的前4位恒为1110 ,预置前3位为1意味着d类地址开始于128+64+32等于224。第4位为0意味着d类地址的最大值为128+64+32+8+4+2+1为239。(不可分配给主机使用)
有的会加上子网ID(一个大组织用的多),能隐藏内网结构信息,也有助于减少地址空间耗尽问题
子网掩码
Masking:从IP地址中提取出物理网络地址的过程
IP地址与掩码与运算之后,结果为1的是网络号,结果为0的是主机号
所以掩码某一位为1,代表是网络地址或者子网地址,如果为0,代表是主机地址
在三层结构下(有子网地址)
那么网络id要和网络掩码与运算,子网id要和子网掩码与运算(再减去网络id)
默认路由
网络中太多网络和目的地,毕竟从技术上讲,每个网络都需要下一跳的信息
使用默认路由来处理未知目的地,能够减少空间,但可能不是最优路径
CIDR
聚合路由以节省空间
将一个连续地址块折叠成一个逻辑网络
网络地址就是这个连续块的最小值
传输层
为什么有传输层
为了定位一个路由,只需要下面三层,但是我们用户接触的是应用层,还需要一层,连接网络层与应用层。提供的是一种逻辑的连接,在不同主机的不同进程之间,对应用层掩盖网络层的一些细节。
当你位置变动,实际上网络层的细节都变了,路由方式也变了,甚至路由协议也变了。所以我们需要传输层,提供逻辑上的可靠连接抽象
- 进程与进程之间的
类型
- 面向连接(TCP)
- 建立连接
- 流量控制
- 拥塞控制
- 不面向 – UDP
- 注意:网络层给了两种,面向连接(建立虚电路)与不面向(IP),但主流还是IP
实现
往往有4种方式,后两种常见
- 网卡
- 应用层
- 操作系统内核
- 网络应用的库
TCP
- 需要提供可靠、顺序的数据包
- 数据链路层的有序,为什么网络层有无序?
- 原因:数据链路有序(GBN),但数据链路仅针对相邻主机的一个hop,是在以太网里运行的,但是出去了还是要靠IP,但是IP是不管的(每个packet独立转发),因此传输层需要再把顺序搞回来
- 流量控制
- 拥塞控制
- 网络层运行在所有设备上,主要路由器上,由ISP拥有,但传输层主要是本机,由个人拥有
结构
- 端口(src与dest)——端口就是传输层的address
- Seq #(以bytes的多少计数,不是按照segments计数,每一个byte都被编号了)
- Ack #(同上)
- 接受窗口(流控)
- Flag
- ACK(上面的ACK是否有效)
- RST(reset)
- SYN(是否为syn包)
- FIN(是否为fin包)
连接
IP + port
- UDP的端口号对应一个队列,但是TCP的端口号就是共享的
建立
两次握手行不行?
一个请求,一个回应,同时事先约定我们都从0开始(因为总还是有同步需求)
不行,根源在于建立在IP上,每个包都是单独转发,路由可能需要复制包去泛洪,这样接收者会收到重复的0,会认为是一个新的连接。
建立连接,为了防止混淆,需要每次一个ISN(初始seq num),同时三次握手来保障。
必须要有个已读回执,也就是三次握手,不会收到重复的影响
- 序列号要重复使用,其使用间隔必须大于2T,以便于上一轮的包与ACK都expire了
- MSL —— 最长lifetime
- 每次连接都是新的初始序列号
- 建立后忽略重复建立请求
三次握手
- sender发送SYN置1的包,此时seq为x
- receiver返回SYN与ACK均置1的包,seq为y,同时ack为x+1
- sender发送ACK的包,seq为x+1,ack为y+1
- 对应关系:
- 收到的seq是什么,发出的ack就是什么+1(表示expect下一个)
- 收到的ack是什么,就发出什么seq(是他所需要的)
重复建立连接请求
如果重复请求建立同一个连接(网络原因),接收者照常回复,由发送者在第三次时候来判断,直接发RST(reset)
重复ACK
还是由发送者判断,发送RST
同时请求建立连接
各自发SYN与(SYN+ACK),结束,不再有第三次ACK
四次挥手
- sender发送FIN
- receiver发送ACK,此时关闭单方向的(half-close)
- receiver发送FIN,表示我也结束了
- sender发送ACK,表示我知道了
- 即每个方向用两次握手
- 关闭时不需要三次,因为如果丢了,还有个过期的机制,无影响
同时关闭
各自发送FIN,收到后再发送ACK,即关闭
第四步的发送
为什么在第二步已经关闭了单向的连接(比如关闭一个浏览器网页),但是第四步还是可以发送ACK?
原因:第二步关闭的是应用层,第四步是传输层处理
状态机
双端都需要一个状态机,才能知道目前的状态,在等的状态,等到后发什么,变成什么
TCP性质
- 流量与拥塞控制
- TCP Reno,newReno:GBN
- TCP SACK:SRP
ACK的确认仍然是累加的
不使用NAK,但是使用重复的ACK
流量/拥塞控制
两个变量:
- rwnd : 接收方目前想要接受的速度,可以小于物理buffer
- cwnd:拥塞控制的变量,发送方控制
- cwnd : 一个RTT内可以发出多少segment,是累加的,总数需要加起来
- 有效的窗口 = min(rwnd, cwnd)
拥塞控制的核心就在于调整cwnd
慢启动
- 指数增长
拥塞避免
- AIMD
- 线性增加
- 指数减少
检测
这里进行了一次不对等条件的转换
很多包时,路由器丢掉最后的包,我们直接认为:丢包 = 出现拥塞
然后变成了检测丢包的问题:
- 重传时间超时(RTO)
- 重复ACK
超时
RTO需要设置好,大于RTT(至少),也不能太长
动态调整RTO
先估计RTT:
发一个SampleRTT,然后收到ACK
然后对于SampleRTT进行平滑处理,这里方法是在时间上加窗口
current estimated = old estimated * (1 - x) + x * sampleRTT
类似等比数列,越前面的影响越小
RTO = estimated RTT + 安全边距
边距就是SampleRTT的方差,同时也被应用了一个以时间为权重的窗口
重复ACK
快重传(cont)
慢启动细节
收到一个ACK,就增大一个cwnd
- 如果每个包都有ACK,那么整体增速就是2的n次方
- 每隔一个包确认一次,底数就是1.5
- 达到阈值后就进入拥塞控制阶段
拥塞避免
- 每收到一个ACK,就增大
1/cwnd
,因此是线性增长
TCP Tahoe
收到三个连续ACK或者超时
ssthresh = cwnd / 2
cwnd = 1
TCP Reno
超时后与Tahoe一样,但是当收到三个连续ACK后
cwnd = cwnd / 2
- 继续在拥塞避免阶段
快重传&快恢复
如果有三个ACK,不至于超时那么严重,不会激进地把cwnd设置为1
ssthresh = min(rwnd, cwnd / 2)
快重传:先把请求的发了,然后cwnd = ssthresh + number of duplicated ACKs
(临时阶段)
快恢复:然后从临时恢复过来
即收到新的ACK后,说明那个丢失的解决了,再设置cwnd = ssthresh
,重新进入拥塞避免阶段
握手阶段建立的ssthresh
快重传:要不要加3,快恢复:要不要把cwnd变为一半
性能分析
主要看公平性与吞吐量
公平性
理想是平分带宽
如果大家都遵守TCP的AIMD,那么会不断震荡到平衡最佳位置
但有的应用程序如果不遵守AIMD,那么会一直抢带宽(也比较难)
但是一般情况下许多应用程序可以通过并行化的方式,开启多个TCP连接,比如浏览器,这样协议是允许的
为了防止这种流氓行为,有的应用使用UDP协议(一些多媒体协议)
吞吐量
throughout = W * MSS / RTT,W基本决定于cwnd
W = min(rwnd, cwnd)
能发的个数 * 一个大小 / 时间
Long , Fat Pipes
long : RTT is big
Fat: pipe is wide
Large bandwidth-delay product, TCP is not friendly.
AQM
router如何和host联动,使得sender快速知道有一个拥塞。(除了time out)
router has buffer,which contains a queue(waiting queue)
管理队列:
- Drop tail(不公平)
- Early Congestion Notification(Random Early Drop (RED)
- 对于黄色的部份,由于提前丢包,发生重复ACK或者time out,sender就知道即将出现拥塞了。
- 丢尾的方式,大家基本同时拥塞,丢了之后,再经过一轮时间,又变成了同时拥塞
RTT增大(不稳定)主要是由于queuing delay
TCP改的版本很多?IP基本没人该,因为TCP是在end device里面的,IP out of control
UDP
无连接,不可靠
由应用层去处理丢包,重复,失序等问题
端口抽象:允许同一主机上面多个通信端口
格式
- 源端口
- 目的端口
- 总长度
- 校验和
- 数据
Socket
接触TCP的话,需要接触其内核,各种编程地配置连接,所以传输层的软件是分成了两部分,一层对上, 一层对下,socket就是使用下层接口时候的东西
总结
传输层:
可靠性:ACK + 重传
流量控制:rwnd
拥塞控制:cwnd
TCP:
三次握手,四次挥手
两个阶段(慢启动和拥塞避免),两个变量(cwnd和ssthresh),两个性能指标(公平和吞吐),两种方案:Tahoe和Reno
应用层
DNS
UDP协议,端口53,应用层处理重发
使用缓存
域名解析
DHCP是给主机分配host,注意区分
SMTP
TCP协议,端口25
MTA :mail transfer agent
UA:user agent
SMTP主要是MAT给MTA传输时候用到的,UA其实是订阅了MTA
而M TA传给UA时,用的是其他协议,比如IMAP,POP3
WWW
- URL:统一资源定位符
- cookie:保留状态
HTTP
TCP协议,80端口
支持管道化请求与缓存
使用持久连接来提高性能
Streaming
声音视频:ADC,模拟to数字转换
电话波特率是8000,每个样本8bit,总共64kbps
取样,量化,编码
H.264也是视频压缩格式
交织:将一个样本分布在不同的传输上,从而减少丢失的影响
H.323
conferencing
SNMP
network management
路由算法
OSPF
- IGP, intra-AS routing
- Link-state
- dijkstra
- no transport protocol
RIP
- distance vector
- Bellman-ford
- UDP port 520
BGP
- Inter-AS
- TCP port179
- dynamic
Network Security
密码架构
对称加密
发送方和接收方使用一个key
使用相同的key加密和解密
公钥密码
每个人都有一对key:公钥和私钥,公钥所有人都知道,私钥只有自己知道
text经过一次公钥再经过一次私钥会还原成text
数字签名
- 接收方可以验证发送方所声称的身份
- 发件人不能否认发送了信息
- 消息不能由其他人撰写
如何实现?公钥算法
Alice发给Bob
先经过自己的私钥加密,然后经过Bob的公钥加密
这样Bob收到后,先经过自己的私钥解密,只有自己能解开,然后用Alice的公钥解密,如果能解开,那么就能确定是Alice发的,就像是Alice在上面签名了一样
认证
authentication
回放攻击
中间人攻击
使用KDC或者CA去解决,
防火墙
- 网络隔离
- 允许一些通过,阻止另一些
- 防止DOS攻击,比如SYN泛洪
- 防止非法修改数据
- 只允许授权访问内部网络
三种防火墙
- 无状态数据包过滤
- 状态包过滤
- 应用网关
复习
因特网组成:
- 接入网络 - 边缘
- ADSL非对称数字用户线
- FTTH光纤入户
- 无线Wi-Fi(全名是IEEE 802.11 family)与蜂窝网络
- 核心网
- IP
调制:
波特率 = symbol rate
比特率 = 数据率 = 波特率 * X bit/symbol
传输介质
- 双绞线
- 数据速率:5类100Mb,超5类传输速率1000M—使用8根(全部使用)
- 抗干扰:屏蔽双绞线能提高自己的抗干扰能力
- 同轴电缆
- 数据速率:10Mb/s
- 抗干扰:良好
- 光纤
- 数据速率:2.5Gb/s,10Gb/s
- 抗干扰:优
传输介质的date rate,类型,限制范围
ICMP
IP辅助协议,传达网络级错误的相关信息,只报告错误不做处理,封装在IP里面
NAT
IPv4的地址耗尽
IPv6的安全性
IPv4到6的相互转换
ARP
IP 到 MAc的转换
RARP:MAC到IP的转换
TCP是可靠+有序,UDP是不可靠+无序
UDP支持单播/多播传送,但TCP只有单播传送
MAC地址中01:00:5E开头的是组播地址
网段
通常使用同一物理层的设备之间必然通过相同的传输介质直接相互连接,(如交叉双绞线直接连接的两台主机);但是两组其传输介质并非直接相连的网络设备,如果它们的传输介质通过工作在物理层的扩展设备如中继器和集线器等转接连接,则仍然被视为同一物理层中的设备,是一个而非两个网段。另外,工作在数据链路层或更高层的设备如网桥、交换机、路由器等等,由它们连接起来的两组设备仍然分别处于各自独立的物理层,因此是两个网段。
在以太网环境中,一个网段其实也就是一个冲突域(碰撞域)。同一网段中的设备共享(包括通过集线器等设备中转连接)同一物理总线,在这一总线上执行CSMA/CD(载波监听多路访问/冲突检测)机制。不同网段间不共享同一物理层,因此不会跨网段发生冲突(碰撞)。
现代高速以太网通常使用交换机代替集线器,交换机是工作在数据链路层的设备,由它转接的两组设备不在同一网段中。事实上,交换机为连在其上的每一个独立设备各自划分出一个独立的网段,每个网段只包含两个设备——交换机本身,和这个独立设备。这样,交换机就能隔离冲突,提高网络的利用率和总体性能。
应用层总结
SNMP:网络管理协议
POP,IMAP:收邮件
RTP,RTSP:串流
注意DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议
调制解调器是物理层的设备
NIC的四种模式
- 广播模式:接收全1的帧
- 多播模式:接收所有组播的帧
- 直连:接收目标地址为自己地址的帧
- 混杂模式:接收所有帧,wireshark这么做的,交换机和网桥的NIC也工作在这个模式
- 一般NIC的默认模式:广播模式 + 直连(direct)