两种交换方式

  • 分组(packet)交换
    不长期占用链路,将报文分组,所有分组由路由器按照目的地址丢到网络中,也就是用户不需要发送/接收分组时就不占用网络资源。
  • 电路(circuit)交换
    通信双方建立一条专用链路,不进行分组交换时这条链路也不能给别人用。

路由器与交换机

路由器(圆)工作在网络层(网络核心)
交换机(方)工作在链路层(网络边缘)

时延(delay)、丢包(lost)、吞吐量(throughput)

  • 传播时延:两个路由器之间的时间
  • 传输时延:经过一个路由器的时间
  • 丢包:队列已满,分组丢失
  • 吞吐量:分组来得快 还是 路由器处理得快?

时延计算

image
图源见水印 感谢知乎大佬!!!

类似于卡车过桥问题,传输时延是所有分组被发出所需的时间,就是第一个分组被发出到最后一个分组被发出之间的时间。结束传送的时间就是最后一个分组到达目的地的时间。
因为第一个分组到达目的地之前,最后一个分组之前的所有分组都在链路中传播着,时间被最后一个分组覆盖掉了,所以传播时延只需要关注最后一个分组。
最后一个分组在k条链路上的时延是kd。传输时延考虑的是所有比特被推出源地址的时间加上最后一个分组被k-1个路由器推出的时间之和。(处理时延应该与这个类似,但题目大多不考虑处理时延和排队时延。)

感觉竖着画会更清楚(图源https://blog.csdn.net/vavid317/article/details/125992380 )
image
因为只考虑传输时延和传播时延,所以每一次转发时所有分组都是一个接一个(无缝衔接地)被发出去的。可以看出只有第一次(从源主机)被发出时,时间是分组数个传输时延+1个传播时延,后续每经一次转发,时间都是1个传输时延+1个传播时延。
所以当有n个分组,m段链路,且传输时延是d1,传播时延是d2时,总时延 = n * d1 + (m - 1) * d1 + m * d2

其他指标

流量强度 I = (L * a) / R
L是分组长度,a是每秒到达几个分组,R是链路带宽。

带宽时延积 = R·tprop
带宽时延积表示的是任一时刻链路上具有的最大比特数。

比特宽度 bitWidth = 链路长度 / 比特数 = 链路长度 / (带宽 * 传播时延)

协议分层(layer)

物理层是第一层,应用层是第五层。自顶向下就是从应用层开始讲

  1. 物理层
    数字信息->信号
    把一个个比特从一个节点传到另一个节点 依据链路
  2. 链路层
    单位:帧(frame)
    找到物理层发来的一堆比特中的开始和结束标识,分成一个个帧继续传输。
    需要依赖MAC地址
  3. 网络层
    网络层是不可靠的。可能发生丢包等。
    单位:数据报(datagram)
    依赖IP地址
    协议:IP协议
    从一台主机移动到另一台主机
  4. 运输层
    单位:报文段(segment)
    协议:TCP,UDP
    TCP:有拥塞控制机制,长报文划分为短报文(可以在网络层的不可靠服务基础上提供可靠服务给应用层)
    UDP:不必要的事情绝对不做(向应用层提供的服务仍然是不可靠的)
    运输层需要区分不同报文段要去向目的主机的哪一个应用(进程)。
  5. 应用层
    单位:报文(message)
    就是人直接接触到的层。
    协议:HTTP,SMTP,FTP

TCP协议

面向连接的、可靠的、基于字节流的传输层协议。
面向连接:TCP只能是一对一的两点连接,不能像UDP一样支持一对多和多对多通信。且UDP是无连接的,也就是不会在通信之前建立连接。
字节流:TCP传输的数据没有“边界”,但可以保证有序。UDP按包发送,可能有丢包或乱序。

TCP首部有选项,可变长。UDP首部长度固定。

UDP校验和

image
(图是盗的,但这张图讲的超级清楚)

UDP首部有4个部分,每部分2字节,分别是:源端口号、目的端口号、数据报长度和校验和
还有一个12字节长的伪首部,包括:源IP(4)、目的IP(4)、协议类型(本来只有1字节,但需要补上一个字节的0)、数据报长度(2字节,等于首部中的长度)
发送方用0填充待填充的部分,然后把伪首部、首部和数据部分二进制求和再取反,结果填入检验和字段,然后去掉伪首部,发送。
接收方先填上伪首部(伪首部的信息都是接收方可以知道的),然后计算校验和,若全为1则无差错,有0则有差错
注意:校验和能检测出所有的1位错误,但2位错误可能恰好被抵消而无法被检出

为什么用的是反码,而不是补码或者原码?

  • 不依赖系统的大端小端。发送方和接收方都不需要调用网络字节序转换的相关函数,因为利用反码求和时,交换16位数的字节顺序,得到的结果只有字节顺序相应发生变化;若是原码或补码,所得结果可能大不相同。
  • 计算和验证校验和比较简单快速。IP报文传输过程中经常只对RTT进行-1操作,转发报文时就可以直接增加校验和,不用重新进行计算。(不过计算机都是用补码进行数据存储,为什么不是用补码更方便代码实现呢?这个问题还是不懂)

回退N步GBN

  • GBN发送方响应以下三种事件
  1. 上层调用
    如果窗口未满,发送;对于发送方,能发的最大分组数为N - (nextseqnum - base);如果窗口已满,发送方可能:返回数据给上层,隐式表示窗口已满;或缓存上层数据;或用同步机制,仅允许上层在窗口不满时调用。
  2. 接受ACK
  3. 超时
    发送方只有一个计时器,计时对象是发送方的base,每当base+1,计时器重启。如果计时器超时,重传所有已发送但未确认的分组。
  • GBN接收方
  1. 累积确认
  2. 只需要维护下一个按序接收的分组号
  3. 只需要接收按序分组,对于失序到达的分组直接丢弃不必缓存。

选择重传SR

  • SR发送方
  1. 接收上层数据
    如果未满,直接发送;否则缓存数据或将其返回上层。
  2. 超时
    每个分组都有自己的计时器,超时后只发送一个分组。
  3. 收到ACK
  • SR接收方
  1. 收到[rcv_base - N, rcv_base - 1]的分组
    发送ACK,说明这是已接收的旧分组(意为如果发送方收到这个ACK就不要再重传这个分组)。
  2. 收到[rcv_base, rcv_base + N - 1]的分组(即当前在窗口中的)
    发送ACK。
  3. 其他情况
    直接忽略该分组。

TCP拥塞控制

慢启动

每收到一个确认,cwnd增加1个MSS。也就是每经1个RTT,cwnd翻倍。

  • 出现超时:cwnd设置为1,开始慢启动;cwnd阈值设为出现超时时的cwnd的一半
  • cwnd等于ssthresh:进入拥塞避免模式
  • 收到3个冗余ACK:快速重传,快速恢复

拥塞避免

每个RTT把cwnd增加1个MSS。

  • 超时:cwnd设为1MSS,ssthresh设为超时时的一半
  • 3个冗余ACK:进入快速重传

快速重传

  1. ssthresh = (收到3个冗余ACK时的cwnd / 2)
    cwnd = ssthresh + 3
  2. 重新进入拥塞避免

快速恢复(与快速重传结合使用)

  1. 重传丢失的报文段(就是“快速重传”)
  2. 等待,每收到1个冗余ACK,cwnd增加1个MSS
  3. 收到新的(不是快速重传中重传的)ACK时,cwnd设置为快速重传中的ssthresh,再次进入拥塞避免

Reno & new Reno

区别主要在快速恢复阶段。Reno只要收到一个重传包的ACK,就会退出快速恢复,重新进入拥塞避免;new Reno会等到收到所有重传包的ACK后才退出快速恢复。

状态转换

  1. 慢启动过程:每一轮把cwnd翻一倍
  • 若cwnd == ssthresh,转移到拥塞避免
  • 若超时,ssthresh设成当前轮(已经翻了一番之后的)的cwnd的一半,cwnd设为1,重新开始慢启动
  • 若出现3个冗余ACK,执行快速重传和快速恢复
  1. 拥塞避免过程:每一轮把cwnd+1
  • 若超时,ssthresh设成当前轮(已经翻了一番之后的)的cwnd的一半,cwnd设为1,重新开始慢启动
  • 若出现3个冗余ACK,ssthresh设成当前轮cwnd的一半,cwnd设成修改后的ssthresh+3,转入快速恢复
  • 对于Tahoe:超时或3个冗余ACK都会直接重启慢启动
  1. 快速恢复过程:每收到1个冗余的ACK,把cwnd+1【这个+1是因为这个过程中在等待重传的ACK,前面的包还没被确认导致窗口被锁死不能向后滑动,如果不增大cwnd以营造窗口右滑的效果,会导致最后陷入”几乎不再发送新包“的状态】注意这里是指数型增,不是加性增
  • 对于Reno:只要收到一个重传包的ACK,就把cwnd设为(转入快速恢复时的)ssthresh,并转入拥塞避免【降低cwnd是为了抵消上面为营造窗口滑动效果而每轮给cwnd加的1】
  • 对于new Reno:收到所有重传包ACK后转入拥塞避免
  • 若超时,ssthresh设成当前轮cwnd的一半,cwnd设为1,重新开始慢启动
  • 若出现3个冗余ACK(此情况只对Reno有效,因为new Reno的目的就是在这个过程中解决完所有的冗余ACk问题所以会直接忽略),ssthresh设成当前轮cwnd的一半,cwnd设成修改后的ssthresh+3,重新执行快速恢复【存疑????没找到确切答案】

迭代和递归(DNS查询)

迭代:你问我,我不知道,但我让你去问他;然后你再去问他,他也不知道,他让你问别人;你问别人,别人告诉了你。
递归:你问我,我不知道;所以我去问他,他也不知道;他再问别人,别人告诉他,他告诉我,我告诉你。
迭代中的查询者得到很多不同人的回答,越来越接近正确答案;递归中的查询者只得到一个最终答案的回答。

DNS的各种记录

  • A记录:(主机名,IP地址)
  • NS记录:(域名,能获得该域中主机ip的权威服务器名)
  • CNAME记录:(别名,规范名)
  • MX记录:(别名,邮件服务器规范名)

CIDR 无类别域间路由选择

一篇巨好的文章

IP地址分成网络号(左)和主机号(右)两部分。
子网掩码的作用是区分这两个部分。
例如a.b.c.d/x,x指示的就是子网掩码部分的位数。
子网掩码必然满足的规则:所有1连续,所有0连续,且所有1在所有0的左侧。

  • 网络号:IP地址与子网掩码进行按位与
  • 主机号:IP地址与子网掩码的反码进行按位与
  • 广播地址:把网络号的从最右侧开始(32 - x)位全部填上1.广播地址用于向该子网的所有主机同时进行发送。
  • 子网中的可用IP地址范围:网络号 + 1 ~ 广播地址 - 1
  • 已知IP地址和子网掩码,计算一个网段被划分成了几个子网:
    先看子网掩码有几个255;假设有2个255,说明这个掩码在B类范围内。B类网络默认用16位来表示可分配的IP地址(主机号部分)。然后再看这个掩码的第三段有几个1,假设有n个1,则这个网段被分成了\(2^n\)个子网。其他两类与此类似。每个子网都有一个广播地址。这些子网段中,去掉\(2^n\)个网络地址和\(2^n\)个广播地址,剩下的都是可用的主机地址。
  • 路由聚合:路由聚合就是把一些子网聚合起来,减小路由表规模。需要把所有子网地址进行比较,找出高位所有连续相同的位数,从开始有不同的位置到最后一位全部填0.结果就是聚合后的IP。

路由器核心部分——交换结构

  1. 经内存交换
  2. 经总线交换
  3. 经互联网络交换
    纵横式交换机:可并行的(只要输出端口不同),非阻塞的

分组调度

  1. FIFO / FCFS
  2. 优先权排队
    抢占/非抢占
  3. 循环排队

流表动作

  • 转发:单播/广播/多播,也可能被发到远程控制器上操作
  • 丢弃:没有动作时直接丢弃
  • 修改字段:被转发之前,分组首部的10个字段(除了IP协议之外的所有二三四层字段)都可以被重写

OSFP和iBGP的区别

OSFP在域内,在同一个AS内部为每个路由器都创建一个以自身为根节点的最短路径树。
iBGP在域内传播的信息是关于“如何访问到一个其他AS中的主机”,比如AS2中的2c通过iBGP,向AS2中的所有其他路由器通报“AS3 x”,意位AS2中的所有主机都可以先访问到AS3,进而访问到其中的x主机。或者说iBGP其实就是AS内部的网关路由器,向本AS中所有的非网关路由器,传播自己收到的eBGP信息中的内容。
总结:都是在AS内部传播,OSFP传播的是AS内部的信息,iBGP传播的是关于其他AS的信息

路由选择

  1. 热土豆算法
    选择“最低开销”将分组送出当前AS的路径(开销可能是指穿越的链路数最少等)。自私的算法,对于同一个AS中的不同路由器,可能做出不同选择。
  2. 路由选择算法
    决策要素优先级:
    1)路由器本地偏好
    2)最短AS-PATH(如果这是唯一的规则,则会采用DV算法,距离测度是AS的跳数,而不是路由器跳数,也就是希望经过尽量少的AS)
    3)热土豆算法(即选择最接近NEXT-HOP的路径)
    4)BGP标识符

多路访问协议

  1. 信道划分
    TDM;FDM;CDMA
  2. 随机接入
    1)时隙ALOHA
    2)ALOHA
    3)CSMA载波侦听多路访问
    4)具有碰撞检测的载波侦听多路访问CSMA/CD
  3. 轮流协议
    轮询;令牌传递

各种服务的默认端口

21 FTP
22 SSH
23 Telnet
25 SMTP
53 DNS
67 DHCP server
68 DHCP client
80 HTTP
110 POP3
143 IMAP
3306 MySQL
6379 redis

一些缩写的中英文对照

CIDR 无类别域间路由选择
SDN 软件定义网络
AQM 主动队列管理
RED 随机早期检测
WFQ 加权公平排队
TOS 服务类型(IP首部字段)
OSFP 开放最短路优先
BGP 边界网关协议
SNMP 简单网络管理协议
EDC 差错检测和纠正比特
SNR 信噪比
CDMA 码分多址
PDU 协议数据单元

各种报文

  1. HTTP请求
    1)请求行:方法字段、URL字段、HTTP版本字段
    2)首部行
    首部行与实体体之间有一个空行
    3)实体体:GET的实体体为空 POST的不为空
  2. HTTP响应
    1)状态行:HTTP版本字段、状态码、状态信息
    2)首部行
    3)实体体
  3. DNS(查询0和回答1报文格式相同)
    1)首部区域:12个字节
    2)问题区域:查询名字和字段类型
    3)回答区域:对最初查询名字的资源记录
    4)权威区域:其他权威服务器的记录
    5)附加区域
  4. UDP首部
    4 * 2 = 8个字节,包括源端口号、目的端口号、长度(首部+数据)和校验和(计算首部和数据部分)
  5. TCP首部
    通常为20字节(选项字段一般为空),包括源端口号、目的端口号、序号、确认号、接收窗口、首部长度(4比特,可以表示20-60字节)、标志字段
  6. IPv4首部
    通常为20字节(选项字段一般为空),包括5行,每行4字节。
    包括IP协议版本、首部长度(4比特,可以表示20-60字节)、服务类型TOS、数据报长度(首部+数据,16比特,所以理论最大长度为65535字节)、标识(identification,每生成一个分段就+1)、标志(tag,3比特,其中只有2比特有意义,最低位是MF,MF=0表示这是当前数据报的最后一个分片;中间位是DF,DF=0时允许分片)、片偏移(计算时不包括首部长度)、TTL、协议(在到达终点时用于确定应该交给哪个运输层协议)、首部检验和、源IP、目的IP、选项、数据(有效载荷)
  7. 以太网帧
    1)数据:承载IP数据报,46-1500字节
    2)目的地址
    3)源地址
    4)类型字段:标识这个帧应该被交给哪一个网络层协议
    5)CRC
    6)前同步码:8字节,前7个字节是10101010,第8个是10101011.用于唤醒接收方并使其与发送方时钟同步

有来有回的协议

  1. DNS
    一般采用从本机到本地服务器是递归(直接返回最后结果),从本地服务器分别(依次)到根服务器、TLD服务器和权威服务器的查询是迭代查询
  2. DHCP(服务器用67监听,客户用68监听)
    发现:源0,目的255,yia0,id是a
    提供:源DHCP服务器,目的255,yia分配的IP,id是a
    请求:源0,目的255,yia分配的IP,id是a+1
    确认:源DHCP服务器,目的255,yia分配的IP,id是a+1
    ACK发完之后,分配的IP才生效
  3. ARP(只在第二层工作)
    一般是用网关的IP来获取网关的MAC地址
posted on 2024-03-10 11:22  ww0809  阅读(18)  评论(0编辑  收藏  举报