一、计算机网络概述

1.1 计算机网络

计算机网络是通信技术与计算机技术紧密集合的产物。



计算机网络就是一种通信网络,是互连的(互联互通,通过通信链路)、自治(无主从关系)的计算机集合。

主机距离很远,通信链路不起作用;通过交换网络互联主机,主机连接到交换节点(路由器/交换机)来完成互连。





1.2 网络协议

计算机网络中的数据交换必须遵守事先约定好的规则。计算机网络的所有通信过程都必须遵守某些规则,即协议。

网络协议(network protocol)规定了通信实体之间所交换的消息的格式、意义、顺序以及针对收到信息或发生的时间所采取的动作(actions)。

协议的三要素:

  • 语法(syntax):数据与控制信息的结构或格式
  • 语义(semantics):需要发出何种控制信息,完成何种动作/做出何种响应
  • 时序(timing):事件顺序,速度匹配

协议规范了网络中所有信息发送和接收的过程,比如TCP、IP、HTTP......

协议标准:RFC文档。


1.3 计算机网络的结构

计算机网络的结构可以分为下面几个部分:

  • 网络边缘:主机、网络应用。
  • 接入网络,物理介质:有线或无线通信链路。
  • 网络核心(核心网络):互联的路由器(或分组转发设备)。



接入网络:将网络边缘接入核心网。


  • 利用电话线将数据和语音分离,接入Internet/电话网。



  • 利用电视机有线电视电缆,连接头端或中心局,把数据和电视信号利用不同频率传输。






  • 机构、企业等利用以太网。



网络核心:互联的路由器网络,关键功能为路由+转发。




1.4 Internet结构:网络之网络



  • 将家庭/公司/大学的网络再连接到一起,成为一个网络。
  • 数以百万计的ISP连接到一起。



  • IXP:实现互联网ISP之间的互联。

1.5 数据交换



  • 使用交换网络,实现动态转接,动态分配传输资源。

数据交换的类型:电路交换、报文交换、分组交换。


1.5.1 电路交换



  • 电路交换中最显著的特点就是独占资源,二者交换时候占用的电路资源不能被第三方使用。
  • 电路交换网络中希望共享中继线,同时使用:多路复用(Multiplexing)。


多路复用:



  • 将链路资源划分为资源片,将资源片分配各路,各路独占。









  • 不划分空间、频率,为每个用户分配一个唯一的码片序列。








1.5.2 报文交换

报文:源(应用)发送信息的整体,比如一个文件。

最早的是电报发送。


1.5.3 分组交换

分组:即将报文分拆出来的一系列相对较小的数据包。格式通常为:头+数据。

分组交换需要对报文进行拆分与重组,会产生额外的时间开销。





  • 分组交换使用统计多路复用来分享链路。A和B都要发送数据,那么都按照一个相同的速度进行传送,如果A数据多,B数据少,那么按照统计概率,A占的带宽就多,按需分配。








  • 上面这个例子,报文交付时间为7.5/1.5=5秒送到第一个路由器,再经过5秒到第二个路由器,再5秒到达目的主机,一共需要15秒。由于报文交换,中间的路由器至少需要7.5MB的缓存。
  • 分组交换的话,分成了5000个小组,每个小组的在1.5Mbps的传输时间只需要1ms,只要有一个分组到达第一个路由器,这个分组就可以向第二个路由器传送,同时主机也在传送第二个分组到第一个路由器。这样当5000个分组从M向第一个路由器传送时,4998已经到达目标主机,因此一共只需要5002ms,即5.002秒即可传送完毕。这种情况下,理论上每个路由器的缓存只需要分组大小,即1500bits即可。现代的计算机网络主要都采用的分组网络的结构。



  • n = h-1,跳步即从主机到路由器,或路由器之间的链路。



  • N个用户共用链路,电路交换中将链路分给每个用户(按照分频、分波等)。
  • 用户使用网络的时候,只有“活动”的时候(10%的概率),才进行通信。分组交换不把链路分给用户,可以允许更多用户同时使用网络,因为对于用户来说,大家同时都在“活动”的概率很低,因此一般不会超过链路带宽,可以满足。



  • 分组交换来解决电路级的性能保障,还有待提高。

1.6 计算机网络性能

  • 速率/比特率:单位时间(秒)传输信息(比特)量,b/s(bps)、kb/s、Mb/s...
  • 网络带宽:数字信道所能传送的“最高数据率”,单位bps。
  • 延迟/时延(delay/latency):结点处理延迟、排队延迟、传输延迟(发送一个分组需要的时间)、传播延迟(从一点传播到下一点需要的时间)。







排队是为了等待输出线路可用,引入流量强度。




  • 时延带宽积:传播时延×带宽,又称为以比特为单位的链路长度。即链路上能容纳多少个比特。
  • 丢包(分组丢失):队列的缓存容量优先,分组到的已满队列将被丢弃。丢的包可能由前序结点重发,也可能不重发。
  • 吞吐量/率:表示在发送端与接收端之间传送数据速率bps。分为即时吞吐量和平均吞吐量。
  • 瓶颈链路:端到端的路径上,限制端到端吞吐量的链路。



1.7 计算机网络体系结构

计算机网络是分层结构,每一层遵循某个/些网络协议完成本层的功能。计算机网络体系结构是计算机网络的各层及其协议的集合。



  • 协议是水平的。
  • 任一层,使用下层服务,遵循本层协议,实现本层功能,向上层提供服务。
  • 下层协议对上层服务用户是透明的,即用户不知道。
  • 相邻层使用接口进行交互,通过SAP交换原语(相当于系统调用)。


1.8 OSI参考模型





  • 主机之间完成七层,中间系统只需要完成下面三层。
  • 实线为数据的真正通信方向,为实通讯/物理通讯;虚线为遵循的协议,水平的,不是数据的物理通信方向。
  • 上面的四个层次,不通过中间系统,称为端到端层。



  • 从上到下数据封装,加入每一层的控制信息,即PDU(构造协议数据单元),经过物理介质传播,到达目的主机之后,开始一层层还原。






  • 物理层:完成每个比特的传输(对比特进行编码),定义数据传输速率,定义规范接口特性。
  • 传输模式:单工为单向通信,半双工则是不能同时双向(比如对讲机),全双工可以同时双向通信。





  • 数据链路层:负责结点到结点数据传输(两个物理直接相连的设备的传输),以帧作为单位进行传输。
  • 物理寻址是在数据链路层






  • 网络层负责源主机到目的主机的数据分组交付(通过逻辑寻址,确保数据分组送到目的主机)。
  • 唯一的逻辑寻址。
  • 路由以及分组转发功能也在网络层。



  • 传输过程中,网络层的信息是不变的,SD,即逻辑寻址。




  • 负责端到端的完整报文传输。
  • 对上层接收的完成报文,进行分段与重组。
  • SAP寻址:确保完整报文提交给正确的进程,如端口号



  • 连接控制:一种逻辑连接,不是电路连接。
  • 流量控制以及差错控制。








1.9 TCP/IP参考模型

先有协议,然后做成了模型。



  • 网络接口层没有具体的协议,只要能完成IP分组互传即可。



  • 将网络接口层拆开。



  • 应用层报文、传输层段、网络层数据报、链路层帧。


1.10 计算机网络历史

  • 1961-1972:早期分组交换原理的提出与应用。
  • 1972-1980:网络互连,大量新型、私有网络涌现。
  • 1980-1990:新型网络协议与网络的激增。
  • 1990,2000s:商业化,Web,新应用。
  • 2005- :智能手机与平板应用,宽带接入,无线接入,在线社交网络。


二、 应用层

应用层在最上层。




2.1 网络应用的体系结构

网络应用,需要网络运行环境,一部分软件运行在本地设备中,另外的许多设备运行在其他地方(应用运行商服务器等),两部分组合、协同工作成网络应用。


网络应用的体系结构:

  • 客户机/服务器结构(Client-Server,C/S结构),
    • 服务器负责对外提供服务,7*24小时不断,永久性访问地址/域名,利用大量服务器实现可扩展性。
    • 客户机与服务器通信,使用服务器提供的服务,是间歇性接入网络的,可能使用动态IP地址,不与其他客户机直接通信。
    • Web就是最典型的C/S结构。


  • 点对点结构(Peer-to-peer,P2P结构),
    • 没有永远在线的服务器,任意端系统/节点之间可以直接通讯,节点间是间歇性接入网络的,节点可能改变IP地址。
    • 优点是高度可伸缩,缺点是难于管理。
    • BT是典型的P2P结构。


  • 混合结构(Hybrid)
    • 两种结构的混合。
    • 比如Napster,文件的传输使用P2P结构,文件的搜索使用C/S结构。每个节点向中央服务器登记自己的内容,每个节点向中央服务器提交查询请求,查找内容。



2.2 网络应用进程通信


同一主机上运行的进程之间的通信:操作系统提供的进程间通信机制。

不同主机上运行的进程之间的通信:消息交换。

客户机进程是发起通信的进程,服务器进程是等待通信请求的进程。


Socket:套接字,相当于门。





  • 对进程进行标识。使用IP地址标识主机,使用端口号标识主机上需要通信的进程。
  • 有些端口号是默认的,HTTP:80、Mail:25。


应用层协议

网络应用需要遵循应用层协议。

  • 公开协议一般由RFC组织定义,标准化,允许互操作,比如HTTP、SMTP...
  • 私有协议,多数P2P文件共享应用这种协议。


应用层协议的内容

  • 消息的类型(type):请求消息、响应消息。
  • 消息的语法格式(syntax):消息中有哪些字段,每个字段如何描述。
  • 字段的语义(semantics):字段中信息的含义。
  • 规则(rules):进程何时/如何,发送/响应消息。




2.3 网络应用的需求与传输层服务






Internet提供的传输服务:TCP服务和UDP服务。





  • 网络电话一般使用UDP传输层服务。


2.4 Web应用



  • 网页包含多个对象,对Web对象进行寻址,使用URL(统一资源定位器)。
  • URL的基本格式是,协议(省略即为http)+host+path,Web上所有的url都是唯一的。


2.4.1 HTTP协议概述(请求响应模式)

HTTP

  • 超文本传输协议,是C/S结构的。
  • 客户是浏览器,发送请求。
  • 服务器是Web Server,响应请求,发送Web对象。
  • 使用TCP传输服务。



  • 无状态协议,因为有状态的协议更加复杂。


2.4.2 HTTP连接

HTTP连接有两种类型:

  • 非持久性连接:每个TCP连接最多允许传输一个对象。
  • 持久性连接:每个TCP连接允许传输多个对象。





  • 每一次发送jpeg都需要这个过程,因此效率不高。




2.4.3 HTTP消息格式

HTTP协议有两类消息,请求消息和相应消息。

请求消息使用ASCII码表示。






  • 请求行:方法、URL、版本号。
  • 头部行:字段名、值
  • 下面是消息体(entity body),请求消息也可能会携带数据(比如填写用户名,密码)。



  • 输入信息比较少的话,可以将要输入的信息通过URL字段上传。





响应消息也是使用ASCII码写的。



  • 第一行为状态行。200是OK,301是页面永久性挪走,404 Not Found...
  • 头部行,存放各种信息,字段+值。
  • 最后是data


2.4.4 Cookie技术

http协议无状态,不记录历史行为。

Cookie技术:某些网站为了辨别用户身份,进行session跟踪而储存在用户本地终端上的数据(通常经过加密),RFC6265。



  • 在http的响应消息和请求消息中增加cookie的头部行。
  • 在客户端的主机上增加cookie文件,浏览器管理。
  • web服务器端增加后台数据库管理。




2.4.5 Web缓存技术(代理服务器技术)

能够在不访问服务器的前提下满足客户端的HTTP请求。





  • 代理服务器proxy server,用户的请求发给代理服务器,而不是源服务器。
  • 如果所请求对象在缓存中,则缓存服务器直接返回对象即可;如果没有,缓存服务器向原始服务器发送请求,获取对象,返回给客户端,并保存。









  • 在机构内部增加一个代理服务器,假设命中率为0.4。这样只有60%的请求通过原始服务器满足。


如果判断Web缓存服务器中有用户的请求:



  • 缓存服务器发送http请求,如果对象没改变,收到服务器的响应消息304 not modified如果改变了,返回200 ok,将新的发送回来。



2.5 Email应用

2.5.1 构成





  • 典型的异步应用,不需要同时。


2.5.2 SMTP协议(请求响应模式)

  • 使用TCP进行email消息的可靠传输。
  • 端口为25。
  • 传输过程三个阶段:握手阶段、消息的传输、关闭。
  • 采用命令/响应(请求响应)的交互模式:命令是ASCII码,响应为状态代码和语句(同样是ASCII)。
  • Email消息只能包含7位的ASCII码。





  • SMTP使用持久性连接,利用.来确定消息的结束。




2.5.3 Email消息格式

文本的消息格式



希望扩展,支持多种多格式,MIME多媒体邮件扩展。



  • 在邮件的头部增加额外的行。


2.5.4 POP协议



  • 发送使用SMTP协议,接收者从接收邮件服务器收信时,使用邮件访问协议。
  • 使用HTTP协议也可以进行邮件访问,是基于Web的方式。






  • IMAP协议(是有状态的)




2.6 DNS应用

2.6.1 概述

DNS(Domain Name System),域名系统。主要解决互联网上主机/路由器的识别问题。

将域名和IP地址之间进行映射。网络层工作时,使用IP地址,我们人使用的是域名。



  • DNS是在应用层实现的Internet核心功能。



  • 负载均衡:可以映射到多个IP地址,不断调整顺序,映射到空闲的服务器,完成负载均衡。










  • 每个ISP提供商都有一个本地域名服务器。
  • 每个主机进行DNS查询是,发送到本地域名服务器,它作为代理来继续查询(在分层次中)。
  • 同样进行缓存。


迭代查询与递归查询








2.6.2 DNS记录和消息格式



  • DNS服务器中记录的格式很简单(name,value,type,ttl)。
  • 记录有上述几种类型。


DNS协议(查询/回复模式,查询和回复的消息格式相同)





  • DNS在区域传输时使用TCP(辅域名服务器进行数据更新),在域名解析时使用UDP。




2.7 P2P应用



以文件分发为例比较c/s和p2p:





  • 这两类时间的最大值,即为需要的分发时间。对于N较大的话,需要很长的时间。



  • 服务器至少发送一个副本,客户机互相之间可以分享F的任意部分文本块。
  • 每个客户机都可以上传,因此速度快。




  • tracker跟踪参与该torrent的节点,建立连接之后,交换文件块。





  • 向正在给我发送,且速率最快的4个邻居发送chunk。每30秒,随机选择一个其他节点。


2.7.1 P2P应用:索引技术





  • 集中式索引:任何节点加入的时候,通知中央目录服务器。
  • 虽然内容和文件传输是分布式的,但是内容定位是高度集中式的,会导致单点失效问题(目录服务器宕机,整个P2P系统都无法工作),性能瓶颈取决于目录服务器。


分布式索引,洪泛式查询





  • 覆盖网络是虚拟连接的网络。
  • 查询的时候通过已有的TCP连接来发送,节点间转发查询消息,如果某节点命中了(有这个文件),则发回查询节点。


两种方法结合,层次式覆盖网络



  • 普通节点直接没有连接,超级节点之间TCP连接。
  • 普通节点与超级节点之间是集中式的,超级节点之间是洪泛式的。


2.8 Socket编程

2.8.1 应用编程接口(API)



  • 应用层和传输层之间的接口,socket编程。



  • 应用进程的控制权和操作系统的控制权进行转换的一个系统调用接口。




2.8.2 Socket API概述



  • socket为应用层之间提供了一种应用进程间通信的抽象机制。



  • 不同应用进程会创建自己的套接字,一个进程可能会创建多个套接字。
  • 客户的套接字需要找到服务器对应的套接字,对每个套接字进行编号,称为端口号。
  • 操作系统内部管理套接字时候,使用套接字描述符来管理。





2.8.3 Socket API函数



  • 必须先调用startup,结束之后使用cleanup。







  • 创建之后返回对应的套接字描述符,之后都通过描述符来使用。
  • 协议族说明这个套接字面向的协议族,第二个参数表示套接字类型,第三个参数表示协议号,0表示默认。



  • 面向TCP,是sock_stream流式套接字。
  • 面向UDP,是sock_dgram数据套接字。
  • 直接面向网络层,是sock_raw原始套接字。(可能需要root权限才能创建)





  • 为套接字绑定本地端点地址(IP+端口号)。



  • 只用于服务器端的TCP套接字。



  • 只用于客户端。
  • 对于TCP连接,发送连接请求,放到队列中,等待。
  • 对于UDP客户端,指定了服务器的端点地址。



  • 只用于服务器端的TCP套接字,提取出最前面一个客户请求,创建一个新的套接字来与客户建立连接,进行服务。
  • 使用新的套接字服务,以此来实现并发。



  • 发送数据















2.8.4 客户端软件设计



  • 客户端可能使用域名或ip地址,ip协议需要32位二进制ip地址,因此需要进行映射。







  • 系统自动完成分配本地端点地址




2.8.5 服务器软件设计





  • 创建UDP的套接字,绑定端点地址(INADDR_ANY地址通配符+端口号)。
  • 完成一个客户的要求,进行下一个。












三、传输层



3.1 传输层服务

传输层协议为运行在不同host上进程提供了一种逻辑通信机制。(端到端的)



  • 网络层把segment(报文段)发送过去。



  • 传输层是不同主机的不同进程之间的逻辑通信机制。



  • UDP基本是直接基于网络层的服务,是不可靠的。


3.2 复用与分用



  • host1和host3同时给host2发送报文段,因此host2同时接受两个,要进行分用,把对应的segment交给对应的socket,交给对应的进程。
  • 如果发送端进行复用,发送给多个host,要使用统一的网络层进行发送,发送之前需要给每一块数据加上对应的头部信息,产生正确的segment,发送出去。



  • 网络层不关心端口号的信息。



  • UDP的socket用二元组标识



  • A和B发送的源地址不同,但是目的端口号相同,就被导向了同一个socket。



  • TCP中的socket,四元组标识。



  • TCP是一对一的,因此需要使用S-IP的不同来区分P456。



  • P4可以分为多个线程,来使用线程来进行一对一。


3.3 UDP协议



  • 是一种无连接的数据报的形式,每个报文段之间是独立的。
  • UDP头部只有8字节(源端口,目的端口,长度,校验和)。




UDP校验和(checksum)




3.4 可靠数据传输(rdt)原理





  • rdt_send和deliver_data是单向的。
  • 下面的udt_send和rdt_rcv是双向的,需要双向的控制信号流动来确保实现可靠信号传输。



  • 如果只考虑单向数据传输,虽然数据是单向传输的,但是控制信息是双向流动的。



  • 1.0假定低层信道完全可靠。
  • 因此sender只需要发出去就不用管了,接收方只要接收,解压发送到上层即可。




  • rdt2.0认为底层信道只可能反转分组中的位。
  • 利用校验和来检测位错误。
  • 接收方使用ACK/NAK表示是否发生错误。发送方如果收到NAK,重传分组。
  • 这种rdt协议称为ARQ(Automatic Repeat reQuest)协议。



  • 发送方有两个状态,一个是等待调用,一个是等待接收方消息的状态。
  • 发送的包中,要加入校验和。
  • 等待,如果收到对方的控制消息rdt_rcv,即确实收到了,且NAK,消息发生错误,那么就重发这个包。


  • 接收方只有一个状态,等待下层调用。
  • 收到分组如果有错误,发送给发送方NAK。
  • 如果收到分组没有错误,那么解压提取向上层发送,并给发送方发送ACK。




  • 添加额外的控制消息也可能会坏掉,不行。
  • 重传是一个方法,但不能简单的重传。

Rdt2.1(为每个分组增加序列号):



  • 序列号为0或1,因此有4个状态。






Rdt2.2(无NAK消息):



  • 在ACK中加入最后一个被确认的分组的序列号。




Rdt3.0:



  • 信道既可能发生错误,也可能丢失分组。
  • 发送方等待合理的时间,如果没收到ACK,则应该重传,但是如果只是延迟了并没有丢失,在合理时间之后到达,会引起重复,重复可以序列号解决
  • 因此需要定时器。



  • 发出包之后,启动定时器;
  • 如果timeout,重传,再次启动定时器。
  • 收到ACK,则停止计时器。
  • 同样,序列号还是0/1。








  • 停等操作,造成性能很差,利用率很低,因为RTT很大。




3.5 滑动窗口协议

停等操作浪费时间。

使用流水线机制来提高资源的利用率。



  • 这里三线流水,即可提升3倍的利用率。



  • 发送多个包,那么序列号范围需要变大,且发送/接收方的缓存空间需要更大。


滑动窗口协议:



  • 图中,绿色的是已经发送完了并且确认了的。黄色的是发送了待确认的,蓝色的是还可以发送的范围。


3.5.1 GBN(Go-Back-N)协议



  • 窗口尺寸N,序列号k位,则序列号范围有2 ^ k。
  • 采用累积确认,ack(n)表示序列号0-n,包括n,都已被接收。
  • timeout(n)会把n,n+1...N的分组全都重新发送,这样可能会造成资源浪费。



  • 如果nextseqnum<base + N,还有位置,发送一个新的。如果用光了,则refuse,不发送。
  • 如果timeout了,重启timer,把还未确认的分组全都发一遍。
  • 如果收到了,正确,且之前的都确认了,base++,窗口滑动了。



  • 只有一个希望收到的seqnum,接收方中没有缓存。
  • 如果希望5号,7号先来了,会直接丢掉7。




3.5.2 SR(Selective Repeat)协议



  • SR对每个分组单独确认,设立缓存,可以缓存乱序。
  • 只重传没收到ACK的分组。
  • 每个分组一个定时器。



  • 接收方窗口中,红色的是收到的分组,已发送回ACK,灰色的是没收到的,期待收到的。



  • timeout(n)只表示序列号为n的分组超时。同理ack
  • 如果ack收到的是最小的发送未确认的,则窗口滑动。






  • 接收方无法区分ab两种情况。
  • 对于a,这个0是重传,而对于1,这个0是第5个分组。
  • 因此序列号空间大小与窗口尺寸需要满足一定关系。


3.6 TCP

3.6.1 TCP概述



  • 点对点的方式,传输的是可靠的、按序的字节流。介于GBN和SR的一种协议。
  • 全双工,面对连接的(必须建立连接)。
  • 提供流量控制机制和拥塞控制机制。





  • TCP中的序列号指的是字节的编号,不是segment的编号。
  • 使用累计确认。该序列号之前所有字节都已被正确接收到。


3.6.2 TCP可靠数据传输





  • 合理设置超时时间,大于RTT。对RTT进行估计,指数加权移动平均。
  • 使用这个估计值+安全边界,来设置超时时间。






  • 只会重传引起超时的哪一个segment。



  • 对于右边的,第二次接收到92-100,返回ACK120,因为是累计确认。



  • 这种情况,虽然没收到ACK100,但是收到了ACK120就证明120之前已经收到了。sendbase更新为120。


接收方:



  • 等待一下,看看有没有新的,没有就发ACK
  • 如果等待的时候有新的来了,直接发新的ACK
  • 如果有乱序的,直接发送重复的ACK,来指示需要的段。



  • 快速重传:在定时器超时之前即进行重传,发送方收到对同一个数据的3个ACK,那么假定这个数据之后的段已经丢失,直接重传。



两次duplicated ACK肯定是乱序造成的!丢包肯定会造成三次duplicated ACK!


3.6.3 TCP流量控制



  • 上层应用层可能处理较慢,因此发送方不应该传输过快,会导致淹没接受放的buffer。



  • 接受方通过segment头部字段来告诉发送方自己还有多少空间。
  • sender接受之后调整发送的数据量。
  • 如果接收方空间=0,发送方仍然可以发送一个很小的段,来得到更新的接收方空间信息,避免死锁。


3.6.4 TCP连接管理



三次握手建立连接:

  • 客户向服务器发送一个SYN段(标志位置1),不携带数据,传递初始的序列号。
  • 服务器收到SYN,同意建立连接,返回SYNACK,分配缓存,选择初始的序列号。
  • 客户机收到SYNACK,返回一个ACK段(标志位不置1),确认客户机自己收到了SYNACK,这个段可以发送数据。








3.7 拥塞控制原理

拥塞(congestion):太多发送主机发送了太多数据或发送速度太快,以至于网络无法处理。

会导致分组丢失(路由器缓存溢出),分组延迟过大(在路由器缓存中排队)。

可靠数据传输解决的是端对端的分组丢失问题,拥塞控制是解决多对一的分组丢失问题。

拥塞控制是不要发送太多太快使得网络处理不了,流量控制是不要发送太快使得接收方处理不了。



  • 路由器无限缓存,不会丢包,不需要重传,但是会有延迟,因为路由器的出口带宽是固定的,达到极限就不会增长了,数据在缓存中排队。









  • 当丢包的时候,上游传输这个包的传输能力被浪费掉了。


拥塞控制:控制网络的负载。





  • 路径没有拥塞,使用可用的带宽;如果阻塞,使用最低保障速率发送。
  • RM资源管理cell,发送方发送,交换机设置位,接收方返回RMcell,告诉发送方网络的拥塞状态。



  • 接收方返回RMcell。发送方获取路径所能支持的最小速率。


3.8 TCP的拥塞控制



  • congwin拥塞控制的窗口,这个窗口的大小动态调整。如果网络目前较拥塞,窗口调小,如果没有拥塞,可以调大。
  • 为了感知网络拥塞:发生超时/3个重复ack,这样就降低发送速率。
  • AIMD和SS来调整速率。



  • 线性加CongWin,一个MSS(最大段的长度)。
  • 乘性减,发生拥塞,直接Congwin减半。



  • 初始速率很小,增长如果使用线性增长,很慢。
  • 因此,刚开始连接时,指数性增长。





  • 当指数增长到达threshold时,转换为线性增长模式。



  • timeout的拥塞更严重。






3.9 TCP性能分析







  • 如果需要达到10Gbps,需要丢包率非常非常低,可能需要重新设计新的TCP。



  • TCP是具有公平性的。


四、网络层

4.1 网络层服务



  • 将传输层的数据段进行发送与接收。
  • 不再是端到端的,每个主机和路由器都要运行网络层协议。



  • 路由器有转发表(事先建立的),决定如何转发。
  • 通过路由算法确定端到端的路径,记录在转发表中,收到数据报时,根据转发表转发。



  • 网络层之间的连接,需要中间所有设备的参与(记录这个连接信息);传输层的连接对中间的网络设备是透明的。
  • 网络层之间的连接是主机到主机之间的连接,传输层的连接是两个应用进程之间的连接(只在两端主机进行记录)。




  • Internet提供的是尽力服务(best effort),什么都不保障。



  • 后者,提前建立逻辑连接,所有分组都是通过同样的路径传输。分组传输顺序可以得到保障。


4.2 虚电路网络






  • 虚电路:一条从源主机到目的主机,类似于电路的路径(逻辑连接)。是分组交换的,每个分组的传输利用链路的全部带宽(实际电路是复用的),源到目的路径经过的每一个网络层设备共同完成虚电路功能。
  • 建立虚电路(呼叫),每个分组携带虚电路标识(VC ID),每个设备维护经过自己的每条虚电路。带宽缓存等资源,可以面向VC预先分配。



  • 虚电路是一条路径,每条虚电路有多个虚电路号(VC ID),即电路的每段链路一个编号。
  • 传输的分组。携带对应虚电路的VCID,不是目的地址。
  • 每个设备记录转发表,来记录经过它的每条虚电路。



  • 虚电路的建立和拆除都对应这VC转发表的更新。



  • 用于虚电路的建立、维护、拆除。并进行路径选择。
  • 目前的Internet不采用,它是数据报网络。


4.3 数据报网络



  • 网络层无连接,每个分组都携带目的地址,路由器根据目的地址进行转发分组。
  • 每个分组独立选路,传输的路径不一定相同(转发表可能会更新)。这样到达目的主机的时候,数据报的顺序可能是乱的。
  • 分组携带目的主机的IP地址,如果按照目的地址来进行转发,转发表太大,因此转发表使用目的地址的范围来进行转发。



  • 实际上地址范围的划分不会这么完美。






4.4 IPv4协议

4.4.1 IP数据报



  • Internet网络层是数据报网络,提供路由和转发功能。
  • 路由协议计算,路径选择,得到转发表。
  • IP协议使用转发表进行转发分组。
  • ICMP协议,提供信令信息的传输,可以看做是IP协议的伴随协议。



  • 首部+数据(上层的协议)
  • 版本号:4个bit,IP协议的版本号,4/6。
  • 首部长度:4个bit,给出首部的长度,以4个字节为单位,最大范围是60字节(15 * 4)。
  • 服务类型(TOS):8个bit,指示期望获得哪种类型的服务,又叫区分服务。只有在网络提供区分服务时使用,不使用则默认为00H。
  • 总长度:占16位,指示IP分组的总字节数(首部+数据),最大为65535B,首部最小为20B,因此一个分组最大封装数据为65535-20 = 65515B。
  • 生存时间(TTL):占8位,IP分组在网络中可以通过的路由器数(跳步数),路由器转发一次分组,TTL减1,当TTL=0时,路由器丢弃该IP分组。
  • 协议:占8位,指示IP分组封装的数据是哪个协议的数据包,实现复用/分解,比如6表示TCP,17表示UDP。
  • 首部校验和:占16位,对IP分组的首部进行差错检测,计算校验和时,都置为0。每跳一步都要重新计算。
  • 源IP地址和目的IP地址:都是32位的IP地址。
  • 选项字段:长度不确定,携带安全、源选路径等内容,实际上很少被使用。
  • 填充字段:长度可变,为了补充整个首部,符合32位对齐,保证首部长度是4个字节的倍数。


4.4.2 IP分片


  • 链路最大可封装的数据上限,不同的链路的MTU不同。



  • 大的IP分组可以分片为多个小的IP分组,传送到目的主机之后再进行重组。目的主机负责重新组装。
  • 分片之间的相互关系,在IP首部的某些字段中给出。



  • 标识:占16位,标识一个IP分组,IP协议利用一个计数器,每产生一个IP分组加1,作为该分组的标识。只使用标识不能唯一的确定IP分组,要根据源地址、目标地址以及其他首部信息共同结合起来确定唯一的分组。





  • 如果没有分片,那么片偏移量是0。片偏移量是以8个字节为单位的。



  • 分片的标识与原来的相同。






4.4.3 IP编址



  • 数据报是从主机的接口发送到目的主机的接口。
  • 与链路相连的这些接口需要进行编址。



  • 点分十进制的IP地址表示形式。



  • 网络号+主机号。具有相同网络号的设备,在一个IP子网中。
  • 同一子网中的接口,不跨越路由器就可以彼此物理互连。


4.4.4 有类IP地址

网络号和主机号占用多少位,这是不确定的。

因此对IP地址进行分类。



  • A类:最高比特位为0的地址。前八位作为网络号。
  • B类:最高两位为10的地址,前16位为网络号。
  • C类:最高三位为110的地址,前24位为网络号。
  • D类:1110开头的地址,不区分网络号长度,用来标识互联网中的一组主机。
  • E类:1111开头的地址,不区分网络号长度,保留,作为研究使用。





  • 只能在组织的内部使用。


4.4.5 IP子网划分与子网掩码

把IP子网继续划分子网。



  • 借用主机号的一部分高比特位,作为子网号。



  • 子网掩码形式上与IP地址一样。把网络号部分和子网号部分都置为1,剩余主机号部分全为0,这样就可以看出借用了多少位。



  • 分为4个,借用主机号最高两位比特位作为子网号。



  • 目的地址与子网掩码按位求与,就可以得到子网地址。




4.4.6 CIDR与路由聚集



  • 消除传统ABC类的地址界限。
  • 在CIDR地址中,不再设置前缀的长度,网络地址+子网地址=网络前缀。
  • 融合了子网地址和子网掩码,方便子网划分。
  • 子网地址+/+前缀长度。



  • 路由聚合:让路由选择协议能够用一个地址通告众多网络,旨在缩小路由器中路由选择表的规模,以节省内存,并缩短IP对路由选择表进行分析以找出前往远程网络的路径所需的时间。




4.4.7 DHCP协议





  • 新来的主机向DHCP服务器发送请求报文,服务器给它分配IP地址,发送确认报文。






4.4.8 NAT网络地址转换

使得私有地址可以在网络空间出现使用。











  • 16位的端口号,可以做到60000多台机器同时共享一个IP地址。







4.5 ICMP(互联网控制报文协议)



  • 支持主机和路由器完成差错的报告。
  • 通过发送特定的ICMP报文来完成。












4.6 IPv6简介



  • IPv6的数据包格式,固定长度为40字节基本首部,不允许分片。
  • 一般来说选项首部路由器不需要处理,只需要处理固定长度的40字节。



  • 如果包过大,让源主机进行分片。






  • 冒号分隔的16进制表示。压缩形式,把连续多个0,使用两个冒号表示。
  • 不使用掩码,使用CIDR形式。



  • 单播地址,一对一通信。
  • 多播地址,只能出现在数据报的目的地址中,表示一类地址。(类似于v4的广播地址)





  • 使用隧道,将v6的数据报作为数据封装到v4数据报中。


4.7 路由算法



  • 路由算法确定转发表。



  • 路由器抽象成节点,路由器之间的链路抽象为边。
  • 每段链路有对应的传输费用(可能与带宽、拥塞程度有关)。
  • 关键的问题就是找到最小费用路径(路由算法)。



  • 静态路由一般是人工配置的,更新较慢,但是优先级高。
  • 动态路由是基于某些算法更新的。


4.7.1 链路状态路由算法

  • 按照图的Dijkstra算法



  • 所有路由器掌握网络的拓扑和链路费用,即知道图的拓扑结构。





  • 会出现震荡现象。


4.7.2 距离向量路由算法



  • dp的方法。
  • 结点获得最短路径的下一跳,该信息用于转发表中。









  • 从4变成60之后,此时y到x根据z到x的计算,为6,这个更新了之后,z到x又变成了7......
  • 但是实际上4变成60之后,z到x的5就不存在了,因此会导致无穷计数的问题,在这里面,需要40多次计算才得到结果。






4.7.3 层次路由





  • 自治系统AS内的路由器运行相同的路由协议。
  • 每个自治系统有网关路由器,通过网关路由器与其他自治系统进行相连,完成互连。








4.8 Internet路由

4.8.1 RIP协议



  • RIP协议利用距离向量路由算法



  • 利用跳步数来度量距离大小。
  • 最大有效跳步数是15,解决无穷计数问题。





  • RIP路由协议需要使用UDP协议。


4.8.2 OSPF协议(开放最短路径优先)

AS内部的协议。



  • 链路状态路由算法。
  • OSPF报文封装到IP数据报中(没有使用上层的传输层协议)。



  • 支持对AS进一步的分层。



  • 每个area区有区边界路由器。
  • backbone中间为主干路由器,在主干区运行OSPF算法,区边界路由器也是主干路由器。
  • 最上面的是AS边界路由器,与其他AS相连。


4.8.3 BGP协议(AS间协议)





  • 路由器之间交换报文,称为会话。
  • BGP交换的是完整的路径。基于半永久的TCP连接(应用进程来实现,使用了传输层的TCP协议)。





  • eBGP在AS之间,iBGP是AS内部会话。




BGP的路由选择







  • 一般提供商网络只为自己的客户网络来服务。




五、数据链路层

5.1 数据链路层服务



  • 数据链路层负责通过链路从一个节点向物理相连的另一个节点传送数据报。
  • 帧封装网络层的数据报。



  • 将高层的数据报构成数据帧,通常加首部尾部。
  • 帧同步,通过首尾加特殊字符(或字符串),使得下层物理层以比特传输过去之后,接收方可以找到帧的分隔位置。
  • 如果链路是共享的,需要解决信道接入问题(谁来使用)。链路层寻址使用MAC地址。





  • 最常见的就是网卡,同时实现了链路层和物理层的功能。



  • 通常是网卡之间的通信。


5.2 差错编码



  • 增加一些冗余信息(比特)作为差错检测与纠正比特。
  • R作为冗余信息来描述正确的比特的某种编码信息。



  • 汉明距离,两个编码的比特位的不同位数。编码集的汉明距离:任意两个编码之间汉明距离的最小值称为这个码组的最小汉明距离。



  • 1比特校验位,加一个冗余位1/0,使得总的1的个数为奇数(奇校验)或偶数(偶校验)。只能检测到奇数位差错,如果错了两位,检测不出来。





  • 找到一个好的G,那么检错能力很强。



  • 余式为R,<D,R>即为编码。


5.3 多路访问控制(MAC)协议


网络中的链路:



  • 无线网络共享频率。



  • MAC协议来协调共享链路的使用。






5.3.1 信道划分MAC协议



  • 每个结点占一个周期的固定长度时隙。



  • 每个结点分配一个固定的频带。


5.3.2 随机访问MAC协议



  • 可能会出现冲突,需要检测冲突,并冲突恢复。


时隙ALOHA协议:



  • 假设所有帧的大小相同,每个时隙传输一个帧。只能在时隙开始时刻发送。
  • 发现冲突,该结点在下一个时隙开始时候,以概率p重新发送。






ALOHA协议:



  • 在任何时刻都可以发送帧,冲突的概率增大了。




CSMA协议:



  • 每个节点发送帧之前,监听信道,看有没有载波。
  • 由于信号的传播延迟,也可能会发生冲突。



  • 边发边听,发现冲突了,不继续发了,减少浪费。



  • L/R > 2d/V。






5.3.3 轮转访问MAC协议

综合了上面两种方式的优点。



  • 网络中有一个主节点,负责轮流的邀请从属节点发送数据,每次邀请一个,这样不会冲突。且如果从属节点发送数据可以利用全部带宽的信道。



  • 令牌是一个特殊帧,在网络中传递。
  • 有令牌的节点才可以发送数据。




5.3.4 MAC地址



  • MAC层是用于链路层的物理地址。
  • 来表示链路层的数据帧从哪个接口发出,到达哪个物理相连的其它接口。
  • 局域网中的每一块网卡都有一个唯一的MAC地址。




  • MAC地址是唯一的,这个网卡无论在哪里都是唯一的。
  • IP地址依赖于连接到哪个子网。


5.3.5 ARP协议(地址解析协议)

网络层的IP地址和数据链路层的MAC地址进行联系。



  • 直到目的接口的IP地址,确定其MAC地址。
  • 每个结点(主机、路由器)都维护一个ARP表,存放IP/MAC地址映射关系。






  • A可能知道B的域名,直接从DNS知道了B的地址。
  • R左口即为LAN默认网关,因此A知道这个接口的IP地址。
  • 局域网内,根据ARP协议,A知道接口的MAC地址。



  • 帧从A发送到R,R接收帧之后,提取IP数据报,传递给上层的IP协议。这时不改变数据报,但是如果A或B是内网,那么需要使用NAT更改源/目的IP地址。



  • B收到之后,把IP数据报提供到上一层。
  • A不是利用ARP协议直接提取B的MAC地址的,因为不在同一个LAN内,因此A发送到默认网关(利用ARP找到R左端的MAC地址),借助R来完成(同样通过ARP协议找到B的MAC地址)。


5.4 以太网



  • 使用最广泛的有线局域网(LAN)技术。






  • 以太网是不可靠的、无连接服务。
  • 以太网的MAC协议采用CSMA/CD协议。



  • NIC是网卡。



  • 一般来说,前导码不算在帧的长度中。



  • 类型指示上层的协议。
  • 数据部分至少为46B,为了满足CSMA/CD的要求。



5.4.1 交换机






  • 主机利用的是独享的链路,直接连接交换机。
  • 不会发生冲突,且可以全双工。可以并行交换。



  • 使用交换表,对应每个接口和对应的主机MAC地址,还有时间戳,时间过了之后删掉记录。



  • 交换机不需要类似网络层的路由协议得到转发表,交换机是自学习的。



  • 如果目的主机和收到帧的网段一致,那么不需要转发了,直接丢弃。
  • 交换表中找不到,向其他的所有接口转发,泛洪,找到后更新交换表。









  • 网桥与交换机的原理没有差别。
  • 集线器是物理层设备。
  • 直通传输(边收边发,接收某个数据时候,直接转发它)。


5.4.2 虚拟局域网(VLAN)











  • 把一个LAN,通过软件,划分成多个VLAN。通过路由器,完成不同VLAN之间的转发。


5.5 PPP协议



  • 点对点一般不存在第三方使用同一链路问题,因此一般不需要MAC。








  • 定界符,作为帧开始和结束的标志。
  • 因为是点对点的传输,因此地址暂时没有意义。
  • 协议表示上层协议,作为复用分用。
  • info:上层协议分组数据,一般是IP数据报。



  • 数据中可能存在flag,因此对数据中与flag相同的数据,前面加上额外的字节填充。
  • 这样接收端如果接收到连续两个flag,丢弃第一个,第二个作为数据接收。




5.6 WLAN










  • 每个AP选择一个频率,相邻AP可能会存在干扰。需要MAC协议解决冲突问题。
  • 主机需要与某个AP进行关联(连接WIFI的过程),扫描信道,监听AP的信标帧,选择进行认证。






  • 距离增加,信号强度很弱,因此不能边发送边检测冲突。




  • 使用CSMA/CA协议,避免发送数据时候的冲突。










  • 这里面所有的地址都是MAC地址。