计算机网络概述
网络边缘和核心
边缘
- 边缘节点:靠近用户侧,负责“接入”。
- 核心节点:位于网络中心,负责“高速转发”。
边缘节点数量庞大,直接面对用户
核心节点是网络的骨干层,是网络的心脏,负责处理海量数据的超高速转发和互联。
网络核心主要就是负责数据交换switch。
接入网络可以通过有线或者无限。
常见的通信模式
核心
数据怎么样通过网络传输?
电路交换
:为每个呼叫预留一条转悠线路:如电话网

这个线路是独享的,打电话不说话也是收钱的。通信的性能是有保障的。因为双方的带宽是独享的。
电话的网络都是电路交换网络。但是不适合计算机使用。通信之前需要建立通道。
那么这里的分片是怎么分的呢?
- 频分多路复用:交换节点,频分多路复用可以在一个频率上
一根电缆的可用频率范围是 0~100 MHz:
用户 A 使用 0~20 MHz,用户 B 使用 20~40 MHz,用户 C 使用 40~60 MHz
三个人的信号同时传输,但因为占用不同频率,所以不会互相干扰。
- 时分多路复用:节点之间不同时间传输不同的数据。每个时间片给不同的人用。
- 波分多路复用:光线有不同的波段,每个用户使用不同的波段。光纤就常用波分。
但是计算机之间的通信有突发性,如果使用线路交换,则浪费的时间片较多。即使这个呼叫没有数据传递,其所占用的片也不能够被别的呼叫使用。我们还需要维护每一个片之间的映射关系。当管理映射的节点被毁坏会产生巨大的损失。
分组交换
- 将要传送的数据分成一个个单位
- 将分组从一个路由器传到响领的路由器hop,一段段最终从源传到目标端
- 每段:采用链路的最大传输能力。
网络以分组为单位存储转发。为什么要存储下来再转发呢?
比如A和B要传输10个G的数据,那么这段时间所有内容都是A发给B的,那A就会直接独享整个带宽,直到数据发送完毕。因此要将每个数据分组。
为什么必须存? 因为线路是共享的。如果瞬间有100个包涌向同一个出口,出口只有1条线。如果不存,后面的包就会直接“撞车”丢失。存储,就是为了让数据包在“堵车”时能有个缓冲区排队,这样线路始终能被填满,利用率从电话网的~30%提升到了接近100%。
线路交换,每个节点要耽误一个bit的时间(收到发送这个bit),分组交换要耽误整个分组的存储时间(检查数据包,然后看目标地址才能发送)此外还要耽误一个排队的时间。发送和接受需要的耗时是相同的(发送对另一方来说是接受)。
但是好处是网络是共享的,按需使用。如果到达速率>链路的输出速率。分组将会排队,等待传输,如果路由器缓存用完了,分组将会被丢弃。
在网络交换存在突发性的情况下分组交换能支撑更多的主机。不用的时候其他人用。
网络核心关键功能主要是俩个
- 路由:决定分组采用的源到 目标的路径
- 转发:将分组从路由器的输入链路转发到输出链路
核心思想类似时分多路复用,但是分组交换划分时间片的方式是不固定。这种多路复用方式叫做统计多路复用。但是过渡使用会造成网络拥塞分组延时和丢失。
分组交换根据有没有连接分为俩种方式。数据报是有连接的,虚电路是无连接的。
数据报网络:源主机发给目标主机的分组携带了完整地址。这种方式被称为数据报。交换节点之间不需要维护主机之间通信的状态。但是由于路由表可能产生改变,因此每次数据交付的路径可能是不同的。
虚电路(virtual circuit):在交换节点之间建立一条虚拟的线路,每个分组按照虚电路号来进行存储转发。
接入网络和物理媒体
接入方式
modem:调制解调器。运营商希望接入更多的用户。要把所有的光缆铺到每个家庭门口投入十分巨大。
但是最开始每家每户都有电话线。这个电话线是4Khz的带宽,语音的带宽通常很窄。但是我们要通过光猫把电话信号调为网络信号。我们可以通过调整频率相位等方式在载波信号上面传输上网的数据。然后运营商那边就可以解调数据。带宽通常是6kbps。此外打电话的时候就不能上网了。
DSL:另外的一种方式也是使用调制解调的方式。还是用电话线。0-4khz用于语音通讯。4k以上,一部分用于上行,一部分用于下行。DSL的高频信号在铜线上衰减极快。离电信机房(或街边的光交接箱)越近,能用的频率就越高,带宽就越大;如果超过3-5公里,高频信号几乎衰减殆尽,速度就会直线下降。但是上下行带宽是不对称的,仍然采用调制和解调来进行。这样就可以电话的时候上网了这就是ADSL。
有线电视公司也有类似的方式。通过同轴电缆广播给电视数据,但是这个广播信号是单向的。有线电视信号线缆双向改造。FDM:在不同频段传输不同信道的数据,数字电视盒上网数据。(现在很多用户已经不订购有线电视了,听过光纤到户)
线缆网络:非对称。线缆和光纤网络将家庭用户接入到ISP。哥哥用户共享到线缆头端的接入网络。与DSL不同,DSL每个用户一个专用线路接到CO(central office)
我们可以通过光猫接入到各种不同的运营商。
家用路由器是将路由器跟无线AP组合在一起了,企业路由是路由,AP是AP。
| 功能 | 交换(Switch) | 路由(Router) |
|---|---|---|
| 连接对象 | 同一个网络里的设备 | 不同网络 |
| 看什么地址 | MAC地址 | IP地址 |
| 作用 | 找设备 | 找网络路径 |
| 例子 | 电脑连打印机 | 家庭网络连互联网 |
无线接入网络:可以通过wifi或者广域无线接入(4g,5g)。
物理媒体
物理链路:在每个传输-接受对,跨越一种物理媒体。
引导型媒体:信号沿着固体媒介被引导。同轴电缆,光纤,双绞线。
非导引型媒体:无线电
双绞线:俩根绝缘的铜线。5类:100MBPS ethernet gbps以太网。6类:10GBPS。
同轴电缆:俩跟同心的铜导线。
光缆:光脉冲,每个脉冲表示一个bit。点到点高速传输。100GBPS。低误码率:在俩个中继器之间可以有很长的距离,不收电磁噪声的干扰。
光纤 ≈ 电线里的铜芯
光缆 ≈ 包了绝缘层、护套、保护结构的完整电缆
多模光纤能够让不同光的传播路径同时在光线中传输的光纤。用于断句路高速数据通信。单模光纤适合长距离。光纤是非常优秀的通信介质。因为它是全反射的,不向外泄漏信号。
主流运营商的骨干链路都是采用光缆传输的。
无线电路是在开放空间的,受环境影响,干扰性强。现在除了wifi还有li-fi,3g,4g,5g。还有卫星通信(数百毫秒的延迟)。
internetr结构和ISP
端系统通过接入ISP(internet service providers)连接到互联网。
这个接入可以是在住宅,公司大学。接入ISP响应的必须是互联的。
如果我们俩俩连接所有网络那么需要进行N方个连接。这种方式是不可扩展的。将每个接入ISP连接到全局ISP。

竞争:如果全局的ISP是可行的业务,那么会有利可图,因此一定会有竞争者。
合作:通过ISP之间的合作可以完成业务的扩展,肯定会有互联,对等互联的结算关系。

此外每个区域还有小ISP,然后通过大ISP接入全球范围内的通信。一些内容提供商,不满足于ISP的资费,可能部署专网,把不同的数据中心连接在一起。ISP提供商出于成本,无法提供非常高质量的网络。对于谷歌这种公司,就有这样的需求,需要减少线路的跳数。

在网络的最新一些为数不多的充分连接的大范围网络

| 层级 | 核心特点 | 主要客户 | 知名实例 |
|---|---|---|---|
| Tier 1 (一级) | 互联网的骨架。拥有全球性骨干网络,通过不付费的对等互联与同级网络交换流量,理论上能抵达互联网上任意一个IP地址。 | 主要为下级ISP提供网络连接,不直接面向普通消费者。 | AT&T, Verizon, NTT, Lumen, GTT, Tata Communications 等。 |
| Tier 2 (二级) | 区域性网络。通常覆盖一个国家或地区。需要通过向 Tier 1 ISP 购买IP转接服务来访问全球互联网。 | 终端用户、企业、以及更小型的Tier 3 ISP。 | Cogent, Qwest, Savvis 等(有时也会与部分Tier 1网络对等)。 |
| Tier 3 (三级) | 本地接入网络。规模最小,通常只为特定城市或社区的最终用户提供“最后一公里”的互联网接入服务。 | 家庭、小型企业等个人和商业用户。 | 通常为本地运营商,数量众多。 |
POP:高层ISP面向客户的网络接入点,设计费用结算。一个低层ISP接入多个高层ISP。
对等接入:2个ISP对等连接,不涉及费用结算
IXP:多个对等ISP互联互通之处,不涉及费用结算。
ICP:自己部署专用网络,同时和各级ISP连接。
分组延迟丢失和吞吐量
分组延迟
分组需要等待排到队头才能被传输。这会产生延迟。除此之外还有传播延迟。
太长的分组队列是没意义的。比如几个T的队列,等待消息发送出去之后,如果需要过几个小时,用户可能就不在了。
- 节点处理延时:检查分组首部,决定将分组导向何处。
- 排队延时:再输出链路上等待传播的时间。依赖于路由器的拥塞程度。
- 传输延迟:R=链路带宽bps。L=分组长度(bits)。将分组发送到链路上的时间=L/R。
- 传播延迟:物理链路的长度。在媒体上的传播速度约等于2x10^8m/s
总延迟等于上面四者相加。每一跳都要耽误以上四点延迟。
信道容量就是在信道中传播的信号总量。
a=分组到达队列的平均速率
流量强度La/R.当流量强度大于1.比特到达队列速率超过该队列的输出速率,平均排队延迟趋向于无穷大。
ICMP(Internet Control Message Protocol,互联网控制报文协议)不负责传输也有数据。当路由器或主机发现网络通讯有问题时,可以通过ICMP告诉对方发送了什么。ICMP不是TCP、UDP。没有端口号,最常见的ping命令用的就是icmp协议。
吞吐量:在源端盒目标端之间的速率。数据量/时间单位。吞吐量存在木桶效应。
协议层次和服务模型
网络是一个非常复杂的大型系统。我们可以通过分层的方式解决这个问题。每一层向上提供服务。
本层协议是为了更好的向上层提供服务。在实现本层协议的时候,直接使用了下层协议提供的功能。
服务service:底层实体向上层实体提供它们之间的通信能力。
- 服务用户(service user)
- 服务提供者(service provider)
- 原语(primitive):上层使用下层服务的形式,高层使用底层提供的服务,以及底层向高层提供服务都是通过服务访问原语来进行交互的。
- 服务访问点(SAP service access point)上层使用下层提供的服务通过层间的接口-地点。套接字就是SAP, 上层可能有多个进行socket的应用程序,需要区分数据包分发给哪个应用程序。
面向连接的服务:俩个通信实体为通信而建立的一种结合。面向链接的通信过程:建立链接,通信,拆除连接。适合对于大数据块传输。
无连接服务:俩个对等实体在通信前不需要建立一个连接,公布预留资源;不需要通信双方都是活跃的。特点是不可卡片、可能重复、可能失序。

分层实现结构清晰,便于标示网络组件,以及描述其相互关系。但是封层导致低效。但是一般认为好处要比坏处多。
- 应用层:为人类用户或者其他应用进程提供网络应用程序,http,SMTP,HTTP,DNS
- 传输层:主机之间的数据传输,在网络层提供的端到端通信基础上,细分为进程到进程,将不可靠的通信变成可靠的通信。TCP,UDP。进程到进程的传输。
- 网络层:为数据包从源到目的选择路由。主机主机之间的通信。端到端通信,不可靠。IP,路由协议。传输单位是分组。
- 链路层:相邻网络节点之间低数据传输。2个相领节点通信,PPP协议。区分帧开头和结束,传输以帧为单位的数据。
- 物理层:在线路上传送BIT。把数据变成物理信号,接收端还原为数据。
希昂对于OSI模型,少了表示层,会话层。TCP中让应用程序自己进行这来个操作。

每次交换设备都要进行一次解封装和再封装。
各层的协议数据单元是不同的。
- 应用层:报文(message)
- 传输层:报文段(segment):TCP段,UDP数据包
- 网络层:分组packet(如果无连接方式:数据报 datagram)
- 数据链路层:帧(freame)
- 物理层:位(bit)
历史
1960年计算机网络 使用线路交换。线路建立时间过长。独享方式占用通信资源,不适合突发性很强的计算机之间的通信。
1961-1972年:早期分组交换。最早时候每个节点都是交换节点,数据源,目标节点。
1972年-1980年专用网络和互联。
ISO标准被提出,但是效率非常低。
cerf and kahn 互联网原则:定义了今天的internet体系结构。
- 极简,自治
- 尽力而为(best effort)服务模型
- 无状态路由器
- 分布控制
- 1983年TCP/IP部署,标记日。NCP划分成俩个层次TCP/IP,从而出现UDP。
- 1982:smtp e-mail协议定义
- 1983年:DNS定义,完成域名到IP转换。
- 1985年FTP协议定义
- 1988年TCP拥塞控制
1985年:ISO、OSI提出,,时机不对且过于繁琐。
互联网的特性就是赢者通吃。
1990年-2000年商业化 web,新的应用。2001网络泡沫,使得一些好公司沉淀下来。谷歌、微软、苹果、思科。
2205年-现在
50亿主机:包括手机平板宽带接入设备快速部署。电子商务,网络社交。
应用层
原理
TCP
进程为了接受报文,必须要有一个标识,即SAP(发送也需要标识)
主机:唯一的32位IP地址。一个进程:用IP+port标识 端节点。本质上一堆主机进程之间的通信由俩个端节点构成。
传输层提供服务需要穿过层间的信息。层接口必须要协议的信息
要传输的报文,对本层来说SDU。谁传的,对方应用进程标示:IP+TCP(UDP)端口号。
传输层实体(TCP或UDP实体)根据这些信息进行TCP报文段(UDP数据报)的封装
源端口号,目标端口号,数据等。
将IP地址往下交IP实体,用于封装IP数据报:源IP,目标IP。
如果socket API每次传输报文都携如此多的信息,太繁琐,容易出错,不便于管理。用带好标识通信的双方或者单方:Socket。
就像OS打开文件返回的操作句柄一样,对句柄的操作,就是对文件的操作。
TCP socket:TCP服务,俩个进程之间通信会先建立连接。 可以用一个整数表示俩个应用实体之间的通信关系。
TCP socket:源IP,源端口,目标IP,目标端口。这样我们就可以只用一个整数,操作系统就知道从自己的哪个端口,发送给对方的哪个端口,避免了4元组表示浪费性能。这是四元组具有意义的本地标识。不必在每次发送的时候都需要指定这个四元组。就像操作系统打开一个文件,OS分安徽句柄一样,以后使用这个文件句柄,而不是使用这个文件的目录名、文件名。简单,便于管理。

UDP
UDP 服务,俩个进程之间通信无需建立连接。每个报文都是独立传输的。前后报文可能给不同的分布式进程。因此只能用一个整数表示本应用实体的标示。因为这个报文可能传给另一个分布式进程。穿过层间的信息大小最小。UDP socket:本IP本端口。但是传输报文时,必须提供对方IP,port。 接受报文时,传输层需要上传对方IP,Port。
对于无连接的应用而言,套接字的是2元组的一个具有本地意义的标示。
2元组:IP,port(源端指定)
UDP套接字指定了应用所在的一个端节点(end point)
在发送数据报时,采用创建好的本地套接字(标识ID),就不必发送报文中指名自己采用的IP和port。
但是在发送报文时,必须要制定对方的IP和udp port。
应用协议
应用层协议定义了在不同系统上的应用进程如何相互交换 报文。应用协议仅仅是应用的一个组成部分。
有些应用需要可靠,因此使用TCP,一些不在乎丢失数据因此采用UDP。此外不同的应用有不同的要求,比如
- 数据丢失率
- 吞吐
- 延迟
- 安全性
例如,音频,视频可以允许丢失,但是对于吞吐有要求。
UDP的必要性:可以区分不同的进程。无需建立连接,节省时间。不做可靠工作。没有拥塞和流量控制,应用能够按照设定的速度发送数据。

TCP和UDP都不提供任何安全性。可以通过应用层运行SSL来提供安全性。
UDP需要TLS可以使用DTLS,quic等技术来实现。
http
HTTP 协议本身不会自动记住“上一次请求是谁发的、做过什么”。每一次请求在协议层面都被当作一个独立的新请求处理。
服务端收到俩次http请求时并不知道俩个请求是不是同一个用户乏力的。cookie就是用来帮网站记住这一个状态的。
http会对数据进行缓存
强制缓存:在浏览器缓存有效期内,直接请求本地缓存,完全不发起请求到服务器。
协商缓存:浏览器缓存虽已过期,但想确认资源是否真的变了。会发一个请求给服务器“验证一下”,由服务器决定是否使用缓存。
强制缓存大于协商缓存。
FTP
文件传输协议。早期都是采用FTP上传文件,或者下载文件。服务器默认端口为21
FTP需要完成用户认证工作,然后进入某些目录。客户端可以浏览上传下载文件。FTP都是明文传输账号密码,因此现在用的大部分都是SFTP,基于SSH协议运行,默认用22端口。或者FTPS。
FTP的控制连接和数据连接不是同一个TCP连接。
| 特性 | 控制连接 (Control Connection) | 数据连接 (Data Connection) |
|---|---|---|
| 主要用途 | 发送命令(如登录、目录操作、上传/下载指令)和接收服务器响应 | 实际传输文件内容或目录列表数据 |
| 默认端口 | 服务器端使用 TCP 21 端口 | 服务器端在主动模式下使用 TCP 20 端口 |
| 生命周期 | 贯穿整个FTP会话,从登录到退出始终存在 | 仅在每次文件传输时临时建立,传输完成后立即关闭 |
FTP是一个有状态协议。

主要组成部分分为
- 用户台历
- 邮件服务器
- 简单邮件传输协议SMTP
输入和输出邮件都保存在服务器 上。

RFC 2821
使用TCP在客户端和服务端之间传送报文,端口为25。
从发送方服务器到接收方服务器。
报文必须为7位ascii码

SMTP是使用推的模式。从服务器下载邮件一般使用的是POP3或者IMAP协议协议,工作在应用层。
| 对比项 | POP3 | IMAP |
|---|---|---|
| 邮件主要存在哪里 | 通常下载到本地设备 | 主要保留在邮件服务器 |
| 多设备同步 | 较差 | 很好 |
| 已读/未读状态同步 | 通常不同步 | 会同步 |
| 文件夹/标签同步 | 支持有限 | 支持 |
| 删除邮件 | 可能只删本地,取决于设置 | 通常会同步删除到服务器 |
| 适合场景 | 单台电脑、本地归档 | 手机+电脑等多设备使用 |
现在IMAP用的更多。
DNS
域名解析是给其他应用的协议。浏览器,ftp客户端需要通过DNS服务器获取对应的IP。
IP地址标识主机 路由器,但是ip地址不好记忆,不方便人类使用。
如何命名设备:用有意义的字符串便于人类的使用
命名到ip地址如何转换:分布式的去给不同的节点维护不同域名到ip的映射
如何维护:增加或者删除一个域名需要哪些工作。
arpanet的解决方案是存在一个集中维护站点:维护着一张主机名到ip地址的映射文件。host.txt。每台主机定时从维护站提提取文件。
但是网络中主机数量很大时, 没有层次的主机名称很难分配,文件的管理,发布,查找都很麻烦。
DNS:Domain name system的主要思路
分层的基于域的命名机制。若干分布式的数据库完成名字到IP地址的转换。运行在UDP上,端口号为53的应用服务器。
internet根被划分为几百个顶级域。比如
通用的:com .edu .gov .net
国家:.cn .us .nl .jp
每个子域下面看一划分为若干个子域(subdomian),每过一个层次用逗号来区分。主机名是从树叶往树根走。
DNS共有13个根服务器。这样我们可以从最近的树根开始找。域和物理网络是无关的,一个域的主机可以在不同的物理网络。
区域的划分由区域管理者自己决定。将DNS名字空间划分为互补相交的区域,每个区域都是树的一部分。
区域名字服务器维护的资源记录
- Domain_name域名:例如www.xxx
- TTL time to live 生存时间, 用来缓存的时间,不需要每次到服务器来查询。权威服务器是无限大。
- class 对于internet 值为IN
- value值:可以是数字,域名或ascii 对应的ip地址。
- type类别:资源记录的类型。可以提供除了名字到ip转换,还有别名到正规名字转换,
type类型
- A:name为主机,value为ip地址。IPv4地址
- AAAA:IP V6地址
- CNAME:name为规范名字的别名
- NS:name域名,value为该域名的权威服务器的域名。告诉 DNS 系统,某个域名或子域名应该由哪些 DNS 服务器负责解析。
- MX:value为name对应的邮件服务器的名字
NS在一些情况下会用到
比如你买了 example.com,想让 Cloudflare、阿里云 DNS、Route 53 来负责解析,就需要在域名注册商那里设置 NS。
此外可能需要由公司自己的DNS进行管理,想把某个域名交个另一个DNS系统。
搭建自己的权威DNS服务器。就需要通过NS告诉外界,这个域名由这几台服务器负责。
A 记录是告诉别人“地址在哪”,NS 是告诉别人“这个域名的解析应该问谁”。
应用调用解析器(resolver)解析器作为客户端,像name server发出查询报文封装在UDP段中。name server返回响应报文。
本地名字服务器 local name server
并不严格属于层次结构。每个ISP都有一个本地DNS服务器。带那个一个主机发起一个DNS查询时,查询被送到本地DNS服务器。这个服务器由缓存直接返回,每缓存直接向上级请求记录。直到查询跟服务器。
DNS还存在迭代查询,如果DNS服务器不知道最终答案,就告诉你下一步应该去问谁,由查询放继续往下问,直到找到最终结果。
总结来说DNS比较健壮。理论上不需要每次从根来查询。
P2P
没有(或极少)一直运行的服务器。任意端系统都可以直接通信。利用peer的服务能力。
当用户数量增加,服务器的上行和下行带宽会成为平均。而P2P模式的可扩展性非常好。
p2p分为非结构化p2p和DHTC结构化p2p
- 非结构化p2p:网络之间形成了Overlay逻辑网络。
- 结构化:构成一个有序的环或者树的结构。提供不断嵌入的关系。
集中式索引p2p的问题是如何定位所需资源,如何处理对等方的加入与离开。一个简单的方法是每个节点上线的时候,要像集中式的服务器上报信息。告诉服务器自己有哪些资源。但是存在目录服务器故障的单点问题。
完全分布式:gnutella查询泛洪。全分布式没有中心服务器。所有节点构建Overlay。节点之间相互连接。当要进行查询的时候,向所有邻居发送查询。这种查询模式被我们叫做泛洪flooding。我们需要设置TTL防止泛洪持续,或者让中转节点记住。此外gnutella还需要建立网络。但是要一个或几个存活的节点来让当前自己的节点来加入。加入之后随机挑选其他节点作为邻居。
还有一种混合体,KaZaA。每个对等方要么隶属于组长要么是一个组长。对等方和组长有TCP连接,组长对之间有TCP连接。组长跟踪所有孩子的内容,组长与其他组长联系。通过哈希值确保文件是唯一的。
bitTorrent工作模式:
文件被分为一个个256KB的快,网络中这些peers发送吗接受文件块,相互服务.
每个peer要加入到一个洪流(torrent)当中,用来互通有无。用bitmap来表述自己有哪些小块。所有节点定期在bt网络中交换这个bitmap。这样各个节点就能知道其他节点拥有的数据信息。新加入的节点bitmap中就都是0。随机请求其他节点,当有4个bitmap时,然后请求网络中稀缺的快。因此稀缺的块就得以补齐,防止稀缺文件服务器下线。当拿到稀缺资源,有更大的概率被别人请求。每个人都向为自己提供更好服务的人提供服务。如果一个节点拥有文件的全部,就被称为种子,否则就被称为吸血鬼。当你为别人提供更多的资源,别人也会为你提供更快的下载速度。如果评估之后选不出最好的节点就随机为其他节点提供服务。
那么节点如何加入到洪流呢?这是带外解决的。节点需要找到tracker server,来、介绍其他节点。
结构化p2p维护的是有序结构,每个节点使用ip地址作为哈希值,然后给构成一个环。我们通过这种有序关系就可以找到对应的节点。
CDN
视频业务是互联网的杀手级应用。如何向上百万的用户提供视频服务呢?我们通过CDN解决这个问题。视频服务常常是一个流服务。一边下载一边播放视频。
DASH:dynamic adaptive streaming over http。将视频文件分割为多个块, 每个块独立存储,编码于不同码率。如果带宽足够可以选择最大的带宽。
客户端根据自身条件动态请求视频块。比如缓冲区减底了,就更适合下载低码率的视频块,来保证用户的流畅播放。
但是如何解决并发数量较大的问题?这些服务器到客户端的跳数可能比较多。服务器瓶颈会制约吞吐量。
CDN:content distbution network,通过CDN,全网部署缓存节点,存储服务内容,就近为用户提供服务,提高用户体验。用户定向到离自己最近的缓存节点。这样跳数比较少。主要分为俩种策略。
- ent er deep将CDN服务器深入到许多接入网,更接近用户数量多,离用户近,管理困难。
- bring home:部署在少数(10个左右)关键位置,如将服务器簇安装于POP附近。
服务商会给用户一个清单文件,客户端自己选择来访问哪个服务器。这些访问流量都是运行在应用层的而不是核心层。
中国有个很大的CDN厂商叫做蓝讯。
OTT(Over the top)挑战:从哪个CDN节点中获取内容。用户在网络拥塞时的行为。哪些CDN节点中存储什么内容。
DNS可以帮助用户,让用户更快更合理的找到合适的CDN节点。会根据用户这次 DNS 查询携带或暴露出来的信息,决定返回哪个 CDN 节点 IP。这里判断一句包含了DNS来源IP,判断地区和运营商。然后根据物理位置ECS等信息来指派处理节点。
传输层
传输层通过添加端口号来区分不同进程。
如果是 TCP/UDP 通过 IP 网络发送数据:
- IP 地址在 IP 包头里,用来说明“从哪台主机发到哪台主机”。
- 端口号不属于 IP 协议本身,而是在 TCP/UDP 头里,用来说明“交给这台主机上的哪个程序”。
- 你的应用数据本身通常不用手动重复加 IP 和端口,操作系统的网络协议栈会自动封装。
最终网络上传输的包大致是:
目标IP:192.168.1.10
目标端口:8080
数据:hello不过如果 "hello" 很大,被拆成多个 IP 包,那么每个 IP 包都会有自己的 IP 头;如果是 UDP,每个 UDP 数据报也有端口信息。TCP 的每个 TCP 段同样带 TCP 头,其中包含端口号。
multiplexing
发送方多路复用:电脑可能同时运行多个软件,这些软件都会产生不同的数据。然后给每一份数据加上运输层首部。 统一交给下面的IP层发送。这里的多路复用就是把多个进程的数据,通过运输层汇聚起来,交给网络层。虽然他妈呢通过一个网卡出去,但运输层利用端口号把它们区别开。
接受方的多路复用:接收方收到很多 TCP/UDP 报文后,需要判断:这个数据需要交给哪个程序。
UDP和TCP的多路分解还要区别。UDP主要根据目标IP+目的端口找到socket。不管是A客户端还是B客户端发过来,都会被交给同一个UDP socket。但是TCP更复杂,因为服务器的一个端口可以同时服务成千上万个客户端,TCP一般利用四元组区分连接作为唯一的连接标识。
UDP有源端口,但是不像TCP那样用四元组区分每一条连接。
运输传输都试试transport layer
对,从应用层把数据交给 UDP 时,通常需要额外告诉传输层“要发给谁”。
因为 UDP 是无连接的。它不像 TCP 那样先建立连接,所以 UDP 自己不会提前记住“对端是谁”。
比如应用要通过 UDP 发送一段数据时,通常需要提供:
- 数据本身
- 目的 IP 地址
- 目的端口号
UDP可以通过一个socket向多个不同的ip端口发送数据,但是TCP做不到。
TCP和UDP可以监听同一个端口。
UDP
用户数据报服务,UDP能够提供进程到进程,IP只能提供主机到主机的服务。除此之外,UDP没有在IP基础上增加额外的内容。报文可能丢失,可能乱序。UDP常被用于,DNS,SNMP,流媒体。在UDP上课实现可靠传输。在应用层增加可靠性,应用特定的差错恢复。
UDP效率更高。UDP包括了源端口号,目标端口号,程度,校验和(EDC)。报文的头部很小(开销小)。没有拥塞控制,UDP可以进口柠檬块的发送报文段。
UDP 单个数据报理论最大长度是 65,535 字节,这个长度包括 UDP 头部 8 字节。大约64KB。
由于没有拥塞控制,应用发送速度和网络的发送速度是一样块的。
接收方根据校验和,如果是相同,那么可能有错可能没错,但是不相等一定有错。校验和的大小是16bit。如果校验和不一致会直接丢弃数据,不会让发送方重传,也不会告诉应用层。
RDT
有些网络在在网络层实现了可靠数据传输。
RDT在应用层、传输层和数据链路层都很重要。是网络TOP10问题之一。RDT的问题是如何在下层服务不可靠的情况下,向上层提供可靠的服务。
RDT 这个名字本身主要用于教学,但 RDT 里面的核心机制是真实网络协议的基础,而且应用非常广泛。
我们添加一些对底层通道的假设,然后放宽这些假设,加入更多的机制来对抗这些不可靠的情况。底层越不可靠,上层就需要更复杂的机制。
可以先考虑单项数据传输,因为双向的数据传输相当于俩个单向的数据传输。虽然数据是单向发送的,但是一些底层的控制信息可能是双向的。
FSM:你可以把它理解成:一个系统在任何时刻都处于某个状态;发生某个事件后,它按照规则切换到另一个状态。
我们使用有限状态机(FSM)来描述协议的机制。状态:在该状态时,下一个状态只由下一个事件唯一缺点。用边代表在状态的迁移。
- 首先是Rdt1.0:在可靠信道上的可靠数据传输,下层信道完全可信,没有比特出错,没有分组丢失。
发送方将数据发送到下层信道,接收方从下层信道接受数据。
- Rdt2.0:具有比特差错的信道。下层通道可能会出错,将分组中的bit翻转。
需要考虑怎么样从差错中恢复。
Rdt2.1修复:
我们可以通过ACK和NAK。告诉发送方,分组是否被正确的接受。如果收到了NAK就把就旧的分组重新发送。由于存在重传机制发送方需要留下副本。只有收到ACK才能继续发送下一条数据。但是这种情况下ACK,NAK也可能出错。因此这种机制可能不完备。 这种情况下我们可以用序号解决问题。避免他同一个消息收到俩次。如果发现对方发送了重复的数据就丢弃。
假设在等待1号数据,但来的是0号数据,就直接发送ACK,这样发送方就知道继续发送数据了。
接收方不知道ACK能否发送给对方。双方不可能对确认进行一次确认。
Rdt2.2:无NAK的协议。
接收方对最后正确的分组法ACK,以替代NAK。接收方必须显式包含被正确接受分组的序号。当收到重复ACK时,发送方宇收到NAK采用相同的动作:重传当前分组。

这样还可以为之后的多组连续发送做准备。和之前的2.1没有太大区别,就是把NAK去掉变成之前一个编号的ACK。
- Rdt3.0:具有比特差错和分组丢失的信道
下层可能会丢失数据。发送方等待ACK一段合理的时间,如果没有收到ACK,就进行重传。这个超时定时器需要比正常一次RTT要来的长。虽然双方还是可以正常工作,但是这会导致性能的下降,一半的分组和确认是重复的。因此设置一个合理的超时时间是比较重要的。
但是这里在信道容量长的情况下,效率是比较低的。造成信道的录用率比较低。即便升级信道的带宽也没意义。这种情况下我们需要流水线协议。
一次要发送多个bit,所以我们需要更长的序号。
流水线协议
允许发送方在未得到对方确认的情况下一次发送多个bit。必须用多个bit表示分组的序号,在发送方和接收方要有缓冲区。
- 发送方缓冲:得到确认,可能需要重传
- 接收方缓存:上层用户取数据的速率不等于收到数据的速率:接收到的数据可能乱序,需要排序交付。
滑动窗口协议 slide window
发送方缓冲区:
内存中的一个区域,落入缓冲区的分组可以发送。用于存放已发送,但是没有得到确认的分组。需要重发时可以用。
发送缓冲区的大小:
一次可以发送多少个未经确认的分组。停止等待协议=1,流水线协议>1看,合理的值不能很大,链路录用率不能超100%。
发送缓冲区中的分组
未发送的:落入发送缓冲区的分组可以连续发送出去;已经发送出去的、等待对方确认的分组,发送缓冲区的分组只有得到确认才能删除。
发送窗口:发送缓冲区内容的一个范围。哪些愿意发送但是未经确认分组的序号构成的空间。每发送一个分组向前移动一个单位。

当收到0分组的确认,就可以先前移动。

接下来看接受窗口也就是接受缓冲区。
接收窗口用于控制哪些分组可以接受:只有收到分组序号落入接受窗口内才允许接收。若序号才窗口之外,则只能丢弃。
如果窗口尺寸Wr=1,那么只能顺序接受,如果Wr>1,则可以乱序接受。
滑动窗口分为
- 回退N帧协议(GO-BACK-N,GBN):发送方可以连续发送多个帧,如果某一帧丢失,比如第三帧,你把么3和之后的所有发出的帧都要重新发送,接收方通常只按需接受
- 选择重传(selective repeat,SR):一次发送多帧,哪一帧丢了重传哪一帧。接收方可以暂存后面到达的帧,效率更高,实现更复杂。
加入有五条个分组数据,第三个丢失了,其他的都ACK了
SR:4、5 可以提前 ACK,但窗口左边界卡在 3。
GBN:3 丢了,4、5 通常也得跟着重传。

俩菏泽不同之处在于GBN接收窗口尺寸=1,SR接收窗口尺寸>1。
Go-Back-N协议接收端只是发送累计型确认 cumulative ack。selective repeat是针对每个到来的分组进行单独的确认。
TCP
TCP提供了点对点,可靠按字节流的传输。TCP要给每个报文段加上TCP的头部。发送和接收方都有自己的缓冲区。数据是全双工的,面向连接的,还有流量控制(发送方不会淹没接收方)。
MTU(Maximum Transmission Unit) 是链路层对一个 IP 包大小的限制;
MSS(Maximum Segment Size) 是 TCP 层单个 TCP 段里“纯数据 payload”的最大长度。MSS = MTU - IP 头 - TCP 头
UDP没有MSS这个概念。 TCP 的 MSS 是在三次握手时通过 TCP Option 告诉对端的。
最大的报文段是MTU 1500个字节。MSS就是TCP、 payload的最大值。

俩个连接每次需要商量一个初始开始的数据编号,这是为了防止老的数据还在网络中留存,可能会对新的连接造成影响。
TCP的发送和ACK的报文数据结构是一样的。这里的RSF是建立TCP连接用的标志位。(三次握手用的也是同一种TCP segment格式)
序号:报文字段首字节在字节流的编号
确认号:期望从另一方收到的下一个字节的序号。接收方如何处理乱序的报文段没有规定。理论上可以丢弃,然后ACK仍然指向确实位置,灯发送方以后重传。也可以将乱序段存起来,灯确实段到大以后重新组织,现代TCP通常实现第二种。
如果双方支持 SACK(选择确认),就更明确了:接收方可以告诉发送方:
ACK = 1500
SACK: 2000~3000 已收到
于是发送方知道
1500~1999 缺失
2000~2999 已经收到
只需要补丢失的数据。因此TCP的机制是俩者的混合体,但是更接近选择重传。
TCP中的ACK也是可以传输数据的。
TCP采用的是自适应的策略来设置超时时间的。比RTT要长,但RTT是变化的。
采样RTT测量报文从发出到收到确认的时间。如果有重传忽略此次测量。采样RTT会变化,因此估计的RTT应该比较平滑,对几个最近的测量求平均值,而不是只用当前采样RTT。
快速重传:超时周期往往太长,通过重复的ACK来检测报文丢失发送方通常连续发送大量报文段,如果 报文段丢失,通常会引起多个重复ACK。如果发送方收到同一数据的三个冗余ACK,重传最小的段。在定时器过时之前重发报文段。它假设跟在被确认的数据后面的数据丢失了。
比如40-49收到,50-59未收到60-69,70-79,80-89都收到了。这种情况下会连续发送三个ACK=50,因为接收方始终没有收到50-59的数据,但是后面的三个部分数据都收到了。这意味着中间可能缺失了,这种情况就可以直接再次发送这段数据(50-59)。

流量控制的主要目的是防止发送方发送过快,导致 接收方缓冲区溢出。接收方在其向发送方的TCP段头部的RWND字段通告空闲buffer的大小。RcvBuffer典型大小通过socket选项设置,典型默认大小为4096字节,很多系统会自动调整这个值。
TCP有三次握手。如果把三次握手变成俩次。加入A发送连接请求,B回复同意建立连接。如果A没收到这次回复,就可能导致A又要建立一次连接,此时对于B来说建立的连接还是半连接(半连接要准备资源和状态,会浪费很多资源)。

此外还可能导致老数据被当成新的数据接收。因此解决方案是三次握手。
避免了服务器收到虚假的连接,避免服务器把旧数据当新数据来收。发送方发送x,接收方回复x+1,并且捎带一个y,发送方发送y+1.完成三次握手。
第三次握手通常和第一次数据传递放在一起。

连接拆除需要拆除俩个方向的连接。A发送给B方向的数据传输和B发给A的数据传输。
但是TCP的连接拆除并不完美。有可能存在一方维持连接,另一方把连接拆除的情况。因此这里添加了一个定时器。

拥塞控制
网络里的资源是共享的,而且网络能承受的流量是有限的。如果所有主机都只顾着“尽快发”,一旦发送总量超过链路、路由器的处理能力,就会出现排队、丢包,严重时甚至发生拥塞崩溃。
理想情况下如果主机能够知道路由器缓冲区的大小就能避免这个问题。假设比例越多的分组是重传的分组,意味着有效的输出越来越小。
分组丢弃:为了达到一个有效的输出,网络需要做更多的工作(重传)。
分组滞留导致延迟变大。超时重发机制进行重发,因此这种重发其实是不必要的。在网络拥塞的情况下灌入更多的数据,导致网络进一步拥塞。

这里可能导致网络流量死锁。这个流量穿过了一段,但是最终被丢弃掉了。被抛弃的分组上游的传输能力就会被浪费掉。
拥塞控制有俩种常见方法。
端到端的拥塞控制:没有来自网络的显式反馈,段系统根据延迟和丢失事件推断是否拥塞。这是TCP采用的方法
网络辅助的拥塞控制:路由器提供段系统反馈信息,单个bit置位,显式有拥塞。显式提供发送端可以采用的速率。
拥塞控制主要想在不产生拥塞的情况下,尽可能发送数据。
网络辅助信息的拥塞控制
ATM 拥塞控制,ABR和RM是配套工作的。
有俩种方式
ABR:available bit rate
弹性服务,如果发送端路径轻载发送方使用可用带宽我,如果发送方的路径拥塞了,发送方限制器发送的速度到一个最小的保障速率上。
RM:(资源部管理)由发送端发送,在数据信元中间隔插入。RM信元中的比特被交换机设置网络辅助。
- NI bit no increase in rate 轻微拥塞,速率不要再增加了
- CI bit:congestion indicate 拥塞指示
发送端发送的RM信元被接收端返回,接收端不做任何改变。
现在 ATM(Asynchronous Transfer Mode)已经用得很少了,基本可以把它看成一种 legacy(遗留)网络技术。它的标准和资料仍然存在,某些运营商旧设备/旧承载网也可能继续运行,但新建网络通常不会再选择 ATM。
TCP拥塞控制
tcp采用的是端到端的拥塞控制,路由器不向设备发送额外反馈信息。符合网络核心简单的TCP/IP架构原则。
端系统根据自身判断得到信息判断是否发生拥塞。但是也引出了几个问题。如何检测轻微拥塞和拥塞,控制策略:在拥塞时如何降低发送速率。在拥塞减缓的时候如何增加速率。
某个数据段超时可能是因为俩种情况。1网络拥塞,概率大。2出错被丢弃概率小。
由于出错没有通过校验被抛弃掉的可能性相比于由于拥塞被抛弃掉的可能性非常小。
拥塞控制机制本身就限制了能连续向网络中发送都数据量。
如何控制发送端的发送速率:维持一个拥塞窗口的值congwin,发送端限制已发送但是未确认的数量的上线
LastByteSent-LastByteAcked<=CongWin。从而粗略的控制网络的发送速率。
CongWin是动态的,是感知到的网络拥塞程度的函数
如果超时或者3个重复ack。
超时时,Conwin,降为1MSS进入到SS阶段然后再倍增到CongWin/2(每个RTT),从而进入到CA阶段。否则(正常收到ACK,没有发生以上情况)CongWin跃跃欲试。
- SS阶段:线性增加(每个RTT)
- CA阶段:线性阶段(每个RTT)
TCP拥塞控制和流量控制是联合动作。发送端控制发送但是未确认的量同时也不能超过接受窗口。
TCP 里的 CongWin(cwnd,拥塞窗口) 不是通常所说的“滑动窗口”本身,而是限制发送窗口大小的一个因素。
TCP 实际允许发送但尚未确认的数据量,大致是:
发送窗口=min(cwnd,rwnd) 。其中:
- cwnd(Congestion Window,拥塞窗口):发送方根据网络拥塞情况自己维护,用于拥塞控制
- rwnd(Receive Window,接收窗口):接收方通告,用于流量控制
滑动窗口:描述的是 ACK 到来后,整个可发送数据范围向前“滑动”的机制。
双方可以通过通信时捎带的ReviceWindow知道对方缓冲区的大小。
拥塞控制的策略为:慢启动,AIMD 线性增,乘性减,超时时间后的保守策略。
MSS 是 Maximum Segment Size,最大报文段长度。1460.
刚建立连接CongWin=1MSS。当连接开始时,指数上升。每收到一个确认,CongWin+1,从而导致了每个RTT拥塞窗口值加倍(不超时或收到重复ACK)。
会,所以你这个疑问正好说明:“每个 RTT 一定翻倍”其实是理想化说法。
TCP 接收端通常不是“每收到 1 个段就立刻回 1 个 ACK”。它可能使用 Delayed ACK(延迟确认)。例如连续收到多个按序报文段时,接收端可能每收到 2 个段才回一个 ACK,而不是 5 个只回最后一个;具体行为取决于实现和算法。
由于存在这种机制,在强大的网络最终也会承受不了这么大的流量。网络一定会发生超时。
AIMD(Additive Increase, Multiplicative Decrease,加性增、乘性减):TCP 主要通过 拥塞窗口 cwnd 控制“允许有多少数据尚未被 ACK、同时在网络中飞行”。cwnd 越大,发送速率通常越高。如果TCP判断网络出现阻塞,例如通过丢包或ECN得到拥塞信号,就不能继续一点点减,而需要快速踩刹车。典型行为是cwnd/2。这里乘的一个系数一般是0.5。慢启动是指数增长,AIMD的additive increase是线性增加。通常是一个锯齿形的曲线。
当CongWin<Threshold发送端处于慢启动阶段,窗口指数增长。当CongWin>Threshold,发送端处于拥塞避免阶段,窗口线性增长。当收到三个重复ACK的情况下Threshold设置为ConWin/2,CongWin=Threshold+3。 当发生事件超时,Threshold=CongWin/2。进入SS阶段。
流量在W和W/2之间浮动。算上RTT就是3W/4RTT。
公平性:假设有俩个主机分享了同一个带宽。最终每个主机会获得1/2的带宽。10个就是10分之一。
但是如果其中一个主机用了UDP,那么对TCP就不那么友好。