基本概念
协议
定义了在两个或多个对等通信实体之间交换的报文格式和顺序,以及发收报文或其他事件所采取的动作。
- 语法:传输数据的格式、信号电压
- 语义:要完成的控制信息、响应、差错控制等功能
- 时序:执行顺序、条件
协议是水平的,服务是垂直的。
边缘网接入技术
家庭接入:DSL(利用数字电话线)、电缆(利用电视线)、FTTH(光纤到户)、拨号(传统电话线,速度慢)和卫星、以太网、WIFI
- HFC(混合光纤同轴):是在电缆接入的主干线上用光纤传输,用户共享传输速率。电缆调制调解器会将HFC网络分为上行和下行两个信道,所以不会产生碰撞。
公司接入:以太网(用户接入速率100Mbps~1Gbps, 服务器1Gbps~10Gbps)和WIFI
广域无线接入:3G、4G(第四代广域无线网络)、LTE(长期演进,源于3G)
核心网交换技术
分组交换:需要存储转发机制和路由选择协议的支持。按需分配
- 时延:处理时延 + 排队时延(变动的) + 传输时延 + 传播时延
- 流量强度:La/R
- 吞吐量:多段链路的吞吐量取决于瓶颈链路
- 总共有M个用户时,同时有N个用户在发送数据的概率
电路交换:需要TDM和FDM复用技术。连接稳定
因特网结构
接入ISP + 区域ISP + IXP + 第一层ISP + 内容提供商
对等层ISP不相互结算,通过IXP接入高层ISP费用更低,这两种方式可以减少费用。
内容提供商的数据中心更靠近低层ISP,绕开高层ISP,可以在减少延迟的同时也降低费用
报文&报文段&数据报&帧
- 应用层报文指的是在端系统的应用程序之间按照某种协议进行信息交换的分组.
- 运输层报文段指的是通过TCP/UDP等运输层协议对应用层报文进行封装后所形成的分组, 报文段对报文的传输参数进行了一定的设置, 使其具有了某种特性, 比如面向连接, 确保传递等.
- 网络层数据报是对运输层报文段和目的地址进行封装后产生的分组. 数据报确定了分组的目的地, 使得分组可以通过网络层从发送方传送到接收方.
- 链路层帧是对网络层数据报的封装, 它添加了下一个节点的具体地址, 使得分组能够传递到下一个节点
传输层
UDP
基于IP协议增加:
- 复用/分用
- 简单的错误校验
source port + dest port + length + checksum
checksum发送方
校验和计算:计算所有16位整数的和,进位加在和后面,结果按位取反;接收方检验时将所有字节与检验和相加结果应该为全1
提供”Best effort”服务,UDP段可能丢失或非按序到达
优点:无建立连接的延迟,无需维护连接状态,头部开销少,没有拥塞控制应用程序可更好的控制自己的发送时间和速率
应用:流媒体(现在的语音和图像其实更多是用TCP,因为大多数防火墙会拦截UDP),DNS,SNMP(简单网络管理协议)——适用于实时服务,且能容忍一定的分组丢失
TCP
可靠数据传输协议(rdt)
在不可靠的底层信道上实现可靠信道
- 数据单向传输,控制信息双向流动
- 可能产生位错误:接收方利用校验和检测位错误,利用确认机制在错误发生(NAK)时要求重传分组,ARQ协议——0-1停等协议
- 可能ACK/NAK本身有错误,导致重复传递分组,接收方无法对新发来的分组进行判断:增加序列号,接收方丢弃重复分组,而且可以省去NAK(收到重复ACK时代表出错)
- 可能丢包(数据报或ACK):需要定时器,发送方等待合理时间之后重传,即使由于延迟最后又到了也能用序号机制处理重复分组。即使知道RTT,对于每一个分组也仍然需要定时器来记录对应的时间。
停等协议中发送方利用率(L/R)/(RTT+ L/R)
极低,网络协议限制了物理资源的利用
流水线机制与滑动窗口协议
利用等待时间,在收到ACK之前连续发送多个分组
- 窗口:更大的序列号范围,更大的存储空间缓存分组
- 滑动窗口:随着协议的运行,窗口在序列号空间内向前滑动(窗口数 < 序列号数)
- 滑动窗口协议:GBN ,SR
Go-Back-N 协议
- ACK(n): 到n(包含n)之前的分组均已被正确接收——累积确认机制
- 多个分组共用一个timer,发送base分组时启动
- 超时Timeout(n):重传序列号 >= n 的还未收到ACK的所有分组——可能造成资源浪费
- 接收方没有缓存,乱序到达的分组直接丢弃,重新确认序列号最大的按序到达分组
缺陷:重传分组太多
Selective Repeat 协议
基于GBN修改确认机制和对乱序分组的处理
- 接收方对每个分组单独确认
- 接收方缓存乱序到达分组
- 每个分组有一个timer
- 避免序列号重叠问题:$N_S+ N_R <= 2^K$ 窗口长度必须<=序号空间大小的一半
TCP原理
TCP在IP层提供的不可靠服务基础上实现可靠数据传输。用到了上述的:*流水线机制,累积确认,单一重传定时器,超时或收到重复ACK时触发重传结合了GBN和SR的优点
- 段结构
- 序列号:segment第一个字节的编号
- ACKs: 希望接收到的下一个字节的序列号,采用累计确认
- 定时器超时时间的设置:$EstimatedRTT$ + 安全边界
- $EstimatedRTT = (1 - \alpha)EstimatedRTT + \alphaSampleRTT$
- 用多个SampleRTT的指数加权移动平均求估计RTT $\alpha$ 一般取0.125
- $DevRTT = (1 - \beta)DevRTT + \beta|SampleRTT-EstimatedRTT|$
- 用方差求RTT的变化值即安全边界,$\beta$ 一般取0.25
- $TimeoutInterval = EstimatedRTT + 4*DevRTT$
- 快速重传机制:即在定时器超时之前重传,因为真正发生超时的时候,根据上述的计算公式timeoutinterval也会变得很大,所以在收到重复的三个ACK之后,马上重传,每次重传后将超时时间加倍
- 流量控制:接收方通过在segment头部字段将rcvwindow告诉发送方,发送方据此控制发送数据量
- $rwnd = RcvBuffer - [LastByteRcvd - LastByteRead]$
三次握手四次挥手
看图示流程更好理解,注意各个步骤中SYN
ACK
FIN
等信号的区别
拥塞控制原理
相比于可靠数据传输对端到端的传输控制,拥塞控制更多的考虑整个网络的全局性问题。相比于流量控制考虑的是接收方的处理能力,拥塞控制考虑的是整个网络的处理能力
主要表现为分组丢失和排队延迟过大。由于分组丢失和定时器超时都会重发,导致有效分组更少,整体吞吐量进一步下降。同时,在多跳传输中,当分组被dropd掉时,任何用于该分组的上游处理全都白费了,这是对整个网络资源的另一种浪费,在这种情况下,当每个路由器都在做无用功时,吞吐量趋近0。
控制方法:
- 端到端:端系统通过观察loss , delay 等网络行为判断是否发生拥塞——TCP采用
- 网络辅助:路由器向发送方反馈网络拥塞信息 ——ATM(异步传输模式)
TCP拥塞控制
- 拥塞窗口:$CongWin >= LastByteSend - LastByteAcked$ 则发送速率为 $rate ≈ CongWin / RTT$ 可以看到拥塞窗口是可以动态调整的
- 感知拥塞:发送loss事件(timeout或3个重复的ACK)之后,发送方降低速率。速率调整的方法:
- 加性增-乘性减(AIMD)
- 每个RTT将CongWin增大一个MSS(TCP一次能传输的数据的最大值,不包括协议头开销)——谨慎增加,拥塞避免
- 发生loss后将CongWin减半
- 慢启动(SS)
- 收到每个ACK将CongWin翻倍,指数型增长
- 综合运用
- 设置一个慢启动阈值变量 ssthresh,用来控制是采用SS还是AIMD
- 开始用SS, 达到ssthresh后改为AIMD
- 当收到3个重复ACK时,CongWin/2并且将ssthresh更新为前CongWin/2,即又开始线性增长
- 当发生timeout事件时,直接将CongWin设为1并且将ssthresh更新为前CongWin/2 ,然后开始SS——因为超时表明拥塞更加严重
- 平均吞吐量计算:期间发送的总MSS数量 / 耗费的RTT数 MSS数量跟发送窗口数W有关
- 加性增-乘性减(AIMD)
网络层
核心功能:转发和路由
路由算法确定通过网络的端到端路径,转发表确定本路由器如何转发分组。
两类分组交换网络服务模型:无连接的数据报网络和连接的虚电路网络
相比于传输层,网络层服务是在网络核心实现的主机到主机服务
虚电路
一条从源主机到目的主机类似于电路的逻辑连接,与电路交换的区别是,采用分组交换且每个分组在传输时会利用链路的全部带宽。但同时也具备了电路交换预分配资源的优点,从而使得服务性能有一定的保证
- 每个分组携带虚电路标识
VCID
而不是目的主机地址。同一条虚电路在不同链路段上的VCID
可能是不同的 - 经过的每个网络设备会维护每条经过它的虚电路连接状态,利用VC转发表记录、改写输入输出
VCID
- 信令协议在建立时一次性确定路径
- 应用:ATM 、帧中继网络等
数据报
无连接,分组携带目的地址。由于路径是不确定的,所以需要路由算法构建转发表。
- 转发时并不是针对某一具体地址,而是一个地址范围,相当于对转发表进行聚合。最长前缀匹配优先
- 端系统更为智能,可以自适应、性能控制和差错恢复。(VC的端系统为电话机、传真机) 可以理解为技术进步带来的功能转移,更复杂的处理放到上层去做——简化网络,复杂边缘
- 应用:Internet
IP协议
首部结构
理解各字段的含义
- 版本号:一般为IPv4, 即 4H
- 首部长度:占4位,以4字节为单位。一般不含可选字段时首部长度为20字节,即首部字段为5H
- 服务类型:一般不使用,00H
- 总长度:占16位,指的是首部+数据的长度。因此最长数据为 65535B - 20B = 65515B,但是链路层有MTU限制,而且不同链路的MTU也会不同,所以还需要分片和重组机制,路由器只分不装,目的主机负责重组
- 标识:和源IP目的IP共同标识一个IP分组,取原IP分组的标识
- 标志位:占3位,保留位 + DF(Don’t Fragment) +MF(More Fragment)
- 片偏移:相对原IP分组的偏移量,以8字节为单位,每个片长是8的整数倍,计算时要注意取整
- 生存时间TLL:剩余跳数,转发一次减1,为0 时路由器将其丢弃同时向源主机发送一个ICMP报文
- 协议:TCP为6 UDP为17
- 首部校验和:同UDP, 只对首部校验,由于TLL等字段会发生变化,所以要逐跳校验
IP地址
IP子网:具有相同网络号的设备接口,彼此间不跨越路由器(第三层及上层网络设备)就可以进行物理联通
有类编址
- A类(50%): 子网占8位,最高位固定为0 ,
0.0.0.0~127.255.255.255
- B类(25%): 子网占16位,最高两位固定为10,
128.0.0.0~191.255.255.255
- C类(12.5%): 子网占24位,最高三位固定为110,
192.0.0.0~223.255.255.255
- D类(6.25%): 子网占32位,最高四位固定为1110,
224.0.0.0~239.255.255.255
- E类(6.25%): 子网占32位,最高四位固定为1111,
240.0.0.0~255.255.255.255
A、B、C类可以分配做主机IP地址,注意一些全0(本机)或全1(广播)或127(环回)的特殊地址
还有一部分保留的私有地址(可复用): A类 10 B类 172.16~172.31 C类 192.168.0~192.168.255
子网划分借用主机号的一部分,用子网掩码按位与来提取子网地址
无类域间路由(CIDR)
地址格式:a.b.c.d/x
可以将多个子网聚合成一个较大的子网,构成超网,这种路由聚合可以大幅减少路由表内容
IPv6(128bit)
更多地址,同时改进首部格式以快速处理转发数据报和支持QoS
- 首部长度固定40字节——不含可选区,但基本首部之外可含无需路由器处理的拓展首部
- 版本、优先级、流标签
- 载荷长度、下一个首部、跳步限制
- 源地址、目的地址
- 不允许分片——要分只能在源主机分
- 不含校验和域,加快处理速度
- 新版ICMP,:新增 如 包过大的ICMP报文,多播组管理功能
- 不使用掩码,采用CIDR的
...../x
形式表示地址前缀 - 格式:16bit 4个16进制数一组,共8组。可多个0可省略
过渡技术:
- 隧道:IPv6封装到IPv4数据部分,完成封装的路由器支持双协议栈
DHCP获取IP地址
硬编码:静态配置
DHCP协议:动态主机配置协议,租赁IP地址。服务器为客户配置IP、掩码、默认网关和DNS,即插即用,允许地址重用
- 要接入的主机广播
DHCP discover
源端口0.0.0.0 68
目的端口255.255.255.255 67
- DHCP服务器利用
DHCP offer
响应 - 主机请求IP
DHCP request
- DHCP服务器分配IP
DHCP ack
DHCP采用C/S模式,用UDP封装,服务器默认端口67
网络地址转换(NAT)
节省IPv4地址,内外IP变动相互隔离,只需通过NAT转换表重定向,增加内部设备的安全性。
争议:要对端口进行处理,违背了层次关系
NAT穿透:如何访问位于内网的服务器或主机
- 静态配置NAT, 来自特定端口被转发给服务器
- 利用即插即用互联网网关设备协议IGD 自动配置
- 中继服务器桥接
ICMP协议
差错报告报文:目的不可达,源抑制,超时,参数问题,重定向
网络探询报文:回声请求与应答报文——ping,时间戳请求与应答报文
不发送的情况:
- 对ICMP报文本身不发
- 只对第一个IP数据报分片发送,后续分片不发
- 多播IP数据报不发
- 特殊地址 如0.0.0.0 或 127.0.0.0 不发
封装到IP数据部分
Traceout 是ICMP的一个应用,通过逐渐增加TTL,依次获得该路径上的路由器名称和IP,选择一个不被使用的端口这样到达目的主机后会返回一个目的端口不可达ICMP报文,终止跟踪。
路由算法
静态路由: 手工配置, 更新慢,优先级高
动态路由:及时更新
- 基于全局信息:链路状态路由算法——OSPF(TCP)
- 基于Dijkstra算法(单源最短路径)
- 可能存在震荡现在:由于动态更新,路径一直变来变去
- 基于局部信息:距离 - 向量路由算法——RIP(最多15跳的内部路由,UDP)
- 基于Bellman-Ford方程(动态规划)
- 根据邻居信息和局部链路费用变化异步更新,有变化时才告知邻居
- 无穷计数问题:好消息传的快,坏消息传的慢,因为要参考未变化的邻居发来的信息
- 解决方法:毒性逆转
重点
时延计算
socket 通信步骤
可靠数据传输,FSM描述不想看了..
往返时间估计
TCP/IP五层协议:应用-运输-网络-链路-物理 OSI七层参考模型:应用-表示-会话….
CRC校验码: 原m 位信息左移 生成多项式最高阶 位低位补0,与生成多项式对应的除数进行异或,得到的余数为冗余码
海明码
子网划分:在主机号上进行划分,注意点分十进制与二进制的转换,变长子网划分类似于变长指令拓展,或同一子网由两个不同区间拼接
IP数据报分片: 注意每个分片都要加上首部,片偏移要用起始位 / 8
TCP和UDP的特点和区别
TCP滑动窗口
发送窗口: 已发送并收到确认 || 已发送未收到确认 | 可用窗口 || 不允许发送
接收窗口:已确认并交付主机 || 允许接收的序号 || 不允许接收
拥塞控制及快速重传:区分超时和3个重复ACK时拥塞窗口的变化,注意阈值可能 < 慢启动的$2^n$
TCP的三次握手及四次挥手
握手:SYN = 1, seq = x –> SYN =1, ACK =1 ,seq = y , ack = x +1 –> ACK =1 ,seq = x + 1, ack = y + 1
为什么要四次挥手客户端要等待2MSL:保证最后一个确认报文段无法到达时可以重传;使本次连接所产生的所有报文从网络消失,防止出现已失效的连接请求占用资源。由此可见客户端更早请求关闭,实际上更晚真正关闭
路由选择(距离-向量法)
- 添加没有的路由,注意跳数 + 1
- 替换已有的较长路由
- 更新过时路由