nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial

第一章 计算机网络和因特网

网络边缘

端系统: 通常把与因特网相连的计算机和其他设备称为端系,因为它们位于因特网的边缘, 故而被称为端系统 ,端系统也称为主机 host , 因为它们容纳(即运行)应用程序,如 Web 浏览器程序、 Web 服务器程序、电子邮件客户程序或电子邮件服务器程序等。

Page: 7

当你理解了端系统中端的意思以后,端到端,点到点的名词就不会搞混了

接入网

这是指将端系统物理连接到其边缘路由器 (edge router) 的网络 边缘路由器是端系统到任何其他远程端系统的路径上的第一台路由器

Page: 8

以太网和WIFI接入

在公司和大学校园以及越来越多的家庭环境中,使用局域网 (LAN 将端系统连接到边缘路由器 尽管有许多不同类型的局域网技术,但是以太网到目前为止是公司、大学和家庭网络中最为流行的接入技术

Page: 12

其他接入方式

3G , LTE(源于3G)、电缆、拨号等

网络核心

分组交换(packet switching)

端系统需要彼此发送报文,报文进入接入网,并通过网络核心到达目标接入网,最后到达目标端系统,报文往往很大,不利于传输,他会被分组传输,每一个分组(packet)都会独立地经过网络核心,在网络过核心中,使用分组交换机来进行传输

分组交换机一般指的是路由器和链路层交换机

储存转发传输

交换机使用储存转发传输技术,即必须接受到完整的packet以后,才会进行转发。这也导致了网络延迟会随着中间层的交换机数量呈线性增长。

排队时延和分组丢失

交换机往往有多条链路,当一个packet到达的时候,他将要进行传输的那条链路可能正在进行着其他packet的传输,那边这个packet必须放入队列进行缓存,于是产生了排队时延,当队列缓存满了以后,新到达的packet将会被丢弃。

转发表和路由协议

路由器应该选择哪条链路进行packet的转发?

每台路巾器具有 转发表( forwarding table) , 用于将目的地址 (或目的 地址的 部分)映射成为输出链路 当某分组到达一台路由器时,路由器检查该地址,并用这个目的地址搜索其转发表,以发现适当的出链路 路由器则将分组导向该出链路

Page: 18

转发表怎么来?我们后续再谈。

电路交换(circuit switching)

分组交换涉及到的问题是可能发生的丢包,和未知的包延迟,参考以前的电话,当我们打电话的时候,会有一个接线员给我们接线,于是我们和电话的另一端就有了真实的连接,电路交换就是这样,当端到端会话的时候,交换网络上会为这个会话预留缓存资源、传输速率资源。

分组交换和电路交换的区别

分组交换简单,高效,但是会有不可预测的丢包和延迟

电路交换稳定,复杂

分组交换网中的时延、丢包和吞吐量

时延

处理时延:

检查分组首部和决定将该分组导向何处所需要的时间是处理时延的一部分 处理时延也能够包括其他因素,如检查比特级别的差错所需要的时间

Page: 25

排队时延:

在队列中,当分组在链路上等待传输时,它经受排队时延

Page: 25

传输时延:

仅当所有已经到达的分组被传输后,才能传输刚到达的分组

Page: 25

传播时延: 在链路上传播的时间

传输时延是路由器推出分组所需要的时间.它是分组长度和链路传输速率的函数,而与两台路由器之间的距离无关。

传播时延是一个比特从一台路由器传播到另一台路由器所需要的时间,它是两台路由器之间距离的函数,而与分组长度或链路传输速率无关。

Page: 26

从packet到第一个bit开始离开路由器到最后一个bit离开路由器叫做传输时延,从最后一个bit离开路由器到最后一个bit被目标路由器接受,叫做传播时延。

10辆车组成这对依次经过收费站A,途径100km到达收费站B,收费站处理速度5辆车/min,车速100km/h

则传输时延=(10辆车)/(5辆车/min)=2min

传播时延=100km/(100km/h) = 1h

总时延为62min

丢包

假设bit到达的速率(车速)为La bps,传输速率为R(推出bit到速率)(收费站处理的速度),则流量强度为La/R

如果La/R > 1,说明车在路上跑的速度比车经过收费站的速度快,这时候,如果路上满流,一定会引发堵车。

在网络中,路由器会丢掉这些packet。

协议层次及其服务模型

因特网5层协议

应用层: HTTP,SMTP(邮件报文传输),FTP(文件传输),DNS(域名系统),我们把这层的packet称为报文(message)

传输层: TCP/UDP,我们把这层的packet称为报文段(segment)

网络层: IP,传输数据报(datagram)

链路层:负责点到点传输,传输帧(frame)

物理层:pass

OSI模型

表示层的作用是使通信的应用程序能够解释交换数据的含义 这些服务包括数据压缩和数据加密(它们是自解释的)以及数据描述(这使得应用程序不必担心在各台计算机中表示/存储的内部格式不同的问题)

会话层提供了数据交换的定界和同步功能,包括了建立检查点和恢复方案的方法

Page: 36

第二章 应用层

HTTP,SMTP,FTP

pass(这篇blog主要考虑网络层和传输层)

DNS

DNS 通常是由其他应用层协议所使用的,包括 HTTP MTP FTP, 将用户提供的主机名解析为 IP 地址

分布式、层次数据库

为了处理扩展性问题, DNS 使用了大量的 DNS 服务器 ,它们以层次方式组织且分布在全世界范围内 没有 DNS 服务器拥有因特网上所有主机的映射 相反,这些映射分布在所有的 DNS 服务器上

Page: 86

客户端访问DNS服务器有限访问本地DNS服务器,如果其中找不到信息,然后使用递归或者迭代的方式在DNS树上访问。

DNS数据库

储存4元组(Name,Value,Type,TTL)

Type=A, Name为主机名,Value为IP

Type=NS,Name为域,Value为知道这个域到DNS服务器的主机名

Type=CNAME,Value为别名为Name的主机的规范主机名

Type=MX,Value是个别名为Name的邮件服务器的规范主机名

第三章 传输层

多路分解和多路复用

将运输层报文段中的数据交付到正确的套接字的工作称为 多路分解 (demult plexing)

在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息(这将在以后用于分解)从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用 multiplexing)

Page:125

网络层为我们提供了主机到主机的传输,但是主机上可能有多个程序在同时通信,那么传输层在网络层收到数据报的时候,如何把数据报交付到正确的进程呢?

实际上进程使用传输时,会使用socket,一个socket会对应一个端口,传输层UDP协议为数据报增加了UDP头,其中包含了原端口和目的端口信息,传输层通过端口把报文段交给正确的socket。

UDP报文

为什么UDP要提供校验和?

你可能想知道为什么 UDP 首先提供了检验和、就像许多链路层协议(包括流行的以太网协议)也提供了差错检测那样 其原因是不能保证源和目 的之间的所有链路都提供差错检测;这就是说,也许这些链路中的一条可能使用没有差错检测的协议 此外,即使报文段经链路正确地传输,当报文段存储在某台路由器的内存中时,也可能引入比特差错在既无法确保逐链路的可靠性,又无法确保内存中的差错检测的清况下,如果端到端数据传输服务要提供差错检测, UDP 就必须在端到端基础上在运输层提供差错检测 这是在系统设计中被称颂的端到端原则 (end-e nd principle) 的例子[ Saltzer 1984 ] , 该原则表述为因为某种功能(在此时为差错检测)必须基于端到端实现:”与在较高级别提供这些功能的代价相比、在较低级别上设置的功能可能是冗余的或几乎没有价值的

Page: 133

TCP

RTT估计

均值+4倍方差

EstimatedRTT = (1 - a ) ·EstimatedRTT + a·SampleRTI

DevRTI = (1 -{3)·DevRTI +/3· I SampleRIT- EstimatedRTT

Timeoutlnterval = EstimatedRTT + 4 ·DevR’IT

超时时间加倍

如果一个包被认定为丢失,则TCP会触发重传,但这个包重传的超时时间会被设为两倍,因为丢包往往因为网络拥塞引起,所以这个方案很优雅

快速重传

当收到多从冗余ACK以后,那个包很大概率丢了,不用等到计数器结束了。直接重新发这个包。

流量控制服务

TCP 通过让发送方维护 个称为接收窗口 (receive window) 的变量来提供流量控制通俗地说,接收窗口用于给发送方一个指示——该接收方还有多少可用的缓存空间

前面提到过, TCP 发送方也可能因为 IP 网络的拥塞而被遏制,这种形式的发送方的控制被称为拥塞控制 (congestion control) , 即使流量控制和拥塞控制采取的动作非常相似(对发送方的遏制),但是它们显然是针对完全不同的原因而采取的措施 不

Page: 164

三次招手四次挥手

SYN洪泛攻击

我们在 TCP 三次握手的讨论中已经看到,服务器为了响应一个收到的 SY N, 分配并初始化连接变量和缓存 然后服务器发送一个 SYNACK 进行响应,并等待来自客户的ACK 报文段 如果某客户不发送 ACK 来完成该三次握手的笫 三步,最终(通常 在一分多钟之后)服务器将终止该半开连接并回收资源

Page: 168

SYN cookie, 服务器接收到SYN后不会分配资源,他直接对当前时间、原端口、目标端口、源IP、目标IP进行加密,然后作为初始序列号返回,当他收到第三次招手时,重新加密后与第一次加密结果(取出ACK的值-1)比较,如果相等才分配资源。

拥塞控制

这张图要背下来。一共12条边。

状态转化:

  • 只要发生了重复3个ACK则进入快速恢复 *2

  • 只要发生了超时,则进入慢启动 *2

  • 快速恢复情况下发生了NEW ACK,则进入拥塞避免 *1

  • 慢启动情况下发生了CWND达到了ssthresh则进入拥塞避免 *1

CWND

拥塞窗口表示为 cwnd,他对一个 TCP发送方能向网络中发送流量大速率进行了限制, 特别是,在一个发送方中未被确认的数据量不会超cwnd与rwnd(接受窗口) 中的最小值

慢启动

CWND开始为1,每到达一个ACK,CWND自动加1,

慢启动结束:

  1. 如果发生了超时引发的丢包,TCP会把CWND设为1并赋值ssthresh=CWND/2,然后重新开始慢启动。

  2. 当CWND达到ssthresh后,慢启动结束,转移为拥塞避免模式

  3. 如果收到了3个冗余的ACK,则执行快速重传,然后进入快速恢复

慢启动很慢,如果用户离云服务器很远,则更慢,有一个结局办法为TCP分岔技术

1 部署临近用户的前端服务器

2 分岔TCP,客户向前端服务器建立TCP链接,前端服务器向云服务器维护一个窗口很大的TCP链接

这样慢启动就只会出现在用户和前端服务器之间,这个过程要比用户与云服务器建立连接快很多。

拥塞避免

拥塞避免阶段每个RTT让CWND增加1,慢启动是每个ACK后CWND增加1

何时停止增加:

丢包后停止增加,并让CWND减半,记录ssthresh=CWND/2,最后进入快速恢复

快速恢复

在快速恢复中,对于引起 TCP 进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK, cwnd 的值增加 MSS, 最终,当对丢失报文段的 一个 ACK 到达时, TCP 在降低cwnd 后进入拥塞避免状态 ,如果出现超时事件,快速恢复在执行如同在慢启动和拥塞避免中相同的动作后,迁移到慢启动状态:当丢包事件出现时, cwnd 的值被设置MSS, 并且 ssthresh 的值设置为 cwnd 值的一半

第四章 网络层: 数据平面

输入端口处理

正是在这个地方, 路由器使用转发表来查找输出端口,使得到达的分组能经过交换结构转发到该输出端口

Page: 205

路由器转发规则

在路由表中,每一个路由项都有两个字段,前缀和链路接口,当一个packet进入路由器时,路由器读取他的目标地址,并与路由表中的前缀进行匹配,如果能够匹配多项,则选择最长匹配,最后从这条记录的接口处进行转发。

交换结构

使用内存交换: 输入输出端口的功能和传统操作系统的IO设备一样

使用总线交换:一次只有一个分组可以跨越总线,所有的出口都能接收到这个分组,所以可以在分组进入总线前设置一个标志,只有正确的出口会接受这个分组,其他出口会忽略这个分组。

使用网络进行交换,纵横式交换中通过电路之间控制网络中线路的交叉点,然后执行传输。

输出端口处理

何时出现排队

输入排队

两个输入队列要去往的输出端口相同,一个处于传输,那另一个就只能阻塞,对于阻塞的队列,不光队首阻塞,整个队列都阻塞。这被称为线路前部(Head-Of-the-Line,HOL)阻塞

输出排队

如果交换结构的速度快于输出端口推出分组的速度,那么输出端口会产生排队。

分组调度

先来先服务,优先权排队(有多个队列排队时,优先选择优先级高的队列进行传输),循环和加权公平排队(在多个队列中循环调度)

IPv4

名称 备注 大小
版本 IP协议的版本 4
首部长度 确定可变选项的大小 4
服务类型 表明是实时数据包(电话)还是非实时数据包(FTP) 8
数据报长度 IP数据报的总长(Bytes) 16
标识,标志,偏移 与IP分片有关 32
寿命 TTL,保证报文不会永远在链路中循环
协议 上层协议(TCP还是UDP),
可类比传输层的端口号的作用
首部校验和 注意是首部,不包含数据部 16
源IP 32
目标IP 32
选项 很少被使用,用于拓展,在IPv6中被移除
数据 有效负载

IPv4报文分片

IP4的设计者将标识、标志和片偏移字段放在IP数据报首部中。当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时贴上标识号。发送主机通常将它发送的每个数据报的标识号加1。当某路由器需要对一个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址、目的地址与标识号。当目的地从同一发送主机收到一系列数据报时,它能够检査数据报的标识号以确定哪些数据报实际上是同一较大数据报的片。由于IP是一种不可靠的服务,一个或多个片可能水远到达不了目的地。因为这种原因,为了让目的主机绝对地相信它已收到了初始数据报的最后个片,最后一个片的标志比特被设为0,而所有其他片的标志比特被设为1。另外,为了让目的主机确定是否丢失了一个片(且能按正确的顺序重新组装片),使用偏移字段指定该片应放在初始IP数据报的哪个位置

不同的链路能承受不同的帧大小,对于路由器而言,如果接收到的包太大无法传输怎么办?路由器负责分包吗?如果路由器分包,那下游节点要负责重组包吗?

IPv4 的设计者决定将数据报的重新组装工作放到端系统中,而不是放到网络路由器中

IPv4编址

层次化IP分配,把地址按照块分给ISP,ISP分给客户组织,地址聚合有利于路由器路由算法。

DHCP

动态主机配置协议,Dynamic Host Configuration。

DHCP协议是四个步骤

  1. DHCP服务发现,新用户通过发送DHCP发现报文来完成,使用广播的方式。【目标地址255.255.255.255 源地址 0.0.0.0】

  2. DHCP服务提供,当DHCP服务器收到了DHCP发现报文,使用DHCP提供报文来进行回复【源地址 223.1.2.5 目标地址 255.255.255.255】

    因为在子网中可能存在几个 DHCP 服务器,该客 也许会发现它处能在几个提供者之间进行选择的优越位置 每台服务器提供的报文包含有收到的发现报文的事务 、向客户推荐的 IP 地址 网络掩码以及 IP 地址租用期 (acldress lease time) , 1P 地址有效的时间 服务器租用期通常设置为几小时或几天

    Page: 224

  3. DHCP请求,新用户再次广播,从多个服务中选择一个IP,

  4. DHCPACK,DHCP服务器使用ACK进行响应。

网络地址转换

每个设备都要一个IP,但IP数量不够,考虑多个设备共用一个IP,在NAT下构建LAN局域网,通过NAT与WAN进行交互,在NAT处完成地址转换,端口映射

IPV6

IPv6扩大了地址容量,新增任播地址(向任意一个注解交付报文),舍弃了许多IPv4字段

名称 备注 大小
版本 版本号 4
流量类型 参考IPv4的服务类型 8
流标签 能够给某些流标签的数据报更高的优先级 20
有效负载长度 16 比特值作为一个无符号整数,给出了 IPv6 数据报中跟在定长 16
下一个首部 参考IPv4的上层协议
跳限制 TTL

在IPv4中的分片/首部校验和/选项都被删除了,IPv6不允许中间层重组和分片;IPv4中每次计算校验和太慢了,所以删除了首部校验和;选项被下一个首部替代

所以IPv6首部固定长度为40字节

IPv6 in IPv4

通过隧道的方式,对于那些不支持IPv6的场合,对IPv6进行封包,变为IPv4

第五章 网络层: 控制平面

路由选择算法

pass(较复杂)

SDN

pass

ICMP

被主机和路由器用来彼此沟网络 的信息, ICMP 最典型的用途是差错报告 例如,当运行 HTTP 会话时,你也许会遇到一些诸如 “目 的网络不可 ”之类的错误报文 这种报文就来源于 ICMP 在某个位置, IP 路由器不能找到一条通往 HTTP 请求中所指定的主机的路径、该路由器就会向你的主机生成并发出 ICMP 文以指示该错误

ICMP 通常被认为 IP 的一部分,但从体系结构上讲它位于 IP 之上,因为 ICMP 报文是承载在 IP 分组中的 这就是说, ICMP 报文是作为 1P 有效载荷承载的,就像 TCP,UDP 报文段作为 IP 有效载荷被承载那样 类似地,当一台主机收到 个指明上层协议为ICMP IP 数据报时 (上层协议编码为 )’ 它分解出该数据报的内容给 ICMP, 就像分解一个数据报的内容给 TCP UDP 一样

Page: 272

SNMP

pass