计算机网络

计算机网络的笔记和总结,方便日后回顾用

概述

基本概念

因特网

网络是节点和边,计算机网络就是以计算机为节点的网络。因特网就是全球节点数量最多,覆盖范围最大的一个计算机网络。

  • 节点就是主机和路由器交换机

  • 边就是通信链路。通信链路有接入链路(与主机相连)和主干链路。

主机包括个人电脑、手机、平板物联网系统,还有公司的服务器等等

因特网是一个非常复杂的网络,它有两种解读方式。

  • 从组成来看,因特网是由网络边缘、网络核心和接入网构成的

  • 从功能来看,因特网是分布式应用进程和为分布式进程提供服务的基础设施

    分布式应用进程就是各种需要网络的软件

协议

对等通信实体之间交换的报文的规范的集合(包括语法、语义、时序等)

因特网的组成

网络可以分为网络边缘(就是主机)和网络核心,还有接入网

网络边缘就是主机,网络核心是网络中的交换节点,通讯链路将网络边缘接入网络核心

主机和端系统是同一个东西

网络边缘

网络的边缘就是一堆主机。这些主机的通讯有两种模式,它们的通讯也有两种服务

根据主机(应用)之间通讯的模式,可以分为

这里的模式是主机和主机之间的通讯,不考虑网络核心和接入网的内容。

  • C/S 模式:就是客户端/服务器模式。这里向服务器发出指令的就是客户端,接受指令并返还数据给客户端的就是服务器。一般一台服务器需要服务很多客户端。这种模式的弊端就是可拓展性差,当服务器不够时,需要耗费很高的成本来更新。
  • P2P模式:就是对等模式,P2P模式没有服务器,或服务器非常少。这里的主机既是服务器,又是客户端,各自为各自提供服务。

根据网络其他部分为它提供的服务,可以分为

  • 面向连接的服务(TCP服务):数据传输之前要先握手,同时保证数据传输的可靠有序,同时提供流量控制和拥塞控制的服务
  • 无连接的服务(UDP服务):数据传输不需要握手,直接传,不保证数据一定到达。适用于流媒体等的应用程序

接入网

接入网就是把主机连入网络核心。

接入方式

网络的接入方式有以下几种

  • 住宅接入

    • DSL ( Digital Subscriber Line ), ADSL:电话线用来当网线
    • 电缆接入 ( cable Internet access ):电视线当网线
    • FTTH ( Fiber To The Home )光纤入户
  • 企业接入

    • 以太网 ( Ethernet )
  • 无线接入
    • 无线局域网 (LAN):WiFi
    • 广域无线接入:4G,5G

物理媒体

  • 引导型媒体:双绞铜线(电话线),同轴电缆(电视),光纤
  • 非引导型媒体:微波、LAN (WiFi)、广域 (蜂窝数据)、卫星

网络核心

网络的核心就是链路、路由器和交换机的地盘了。

这一块的核心就是数据的传输。有两种传输方式

  • 电路交换

    把链路划分成一份一份的(按照原理不同可以分为 时分(TDM)、频分(FDM)和波分 )。进行数据传输时,建立起一条从源主机到目标主机连接,同时这个连接独占所经过的链路的其中一份。

    这种方式常被电话网络使用。连接独占资源,有性能保障。

    电路交换并不适合于计算机网络。因为计算机网络具有突发性,比较浪费,同时建立连接的时间比较久

  • 分组交换

    把传输的数据分成一组一组的。传输的时候每个数据组单独传输,独占这条链路的所有资源,同时路由器会把数据组存储起来,等数据组传输完毕后再转发到下一个路由器,最终一个个分组被传输到目标主机。

    分组交换有两个关键功能:路由和转发

    • 路由:决定分组采用的源到目标的路径
    • 转发:将分组从路由器的输 入链路转移到输出链路

    分组交换也有两种方式:数据报(分组的目标地址决定下一跳,在不同的阶段,路由可以改变)和虚电路(在呼叫建立时决定路径,在整个呼叫中路径保持不变。每个分组都带标签,标签决定下一跳)

    路由器存储的目的时为了实现资源的共用。不存储的话,就相当于直接独占了整个链路。

    线路交换能够实现多路复用,提高资源利用率,容纳更多的应用

因特网的结构

松散的层次结构

  1. 各个接入ISP 接入一个全球 ISP
  2. 有多个全球 ISP相互竞争又相互连接(通过IXP连接)
  3. 业务进行细分,出现区域ISP
  4. 内容提供商 (ICP) 建立自己的网络

ISP之间的连接:对等连接、IXP

因特网的实现

这一块是最关键的。

复杂的功能通过分层来实现。总共有 5 层:

分层实现结构清晰,易于维护和升级,但是效率低。

名称 作用 例子 数据单元
应用层 网络应用 HTTP, FTP 报文 Message
传输层 主机之间的数据传输,区分进程 TCP, UDP 报文段 Segment (TCP : 段,UDP: 数据报)
网络层 为数据报从源到目的选择路由(端对端通信) IP, 路由协议 分组 Packet
链路层 相邻网络节点间的数据传输(点对点通信) 以太网, WiFi 帧 Frame
物理层 在线路上传送bit 位 Bit

每层通过层间接口访问下层服务获取报文,从而为上层提供服务,最终实现复杂功能。

服务(Service):低层实体向上层实体提供它们之间的通信的能力,是通过原语(primitive)来操作的

服务有两种类型:面向连接的服务(事先要建立连接,通信结束后去除连接)和无连接的服务

上层使用下层提供的服务通过层间的接口,这个接口叫做服务访问点

协议(protocol) :对等层实体(peer entity)之间在相互通信的过程中,需要遵循的规则的集合

本层协议的实现要靠下层提供的服务来实现,本层实体通过协议为上层提供更高级的服务

各层传输时,对加上本层的信息,对数据进行封装和解封装

封装和解封装的过程

  • 第 n 层要往第 n + 1 层发送的数据包括这一层的头和上一层的数据单元,这个数据叫做服务数据单元(SDU)。往下层发的时候,不光要发SDU,还要发送一些接口控制信息(ICI)(类似于n + 1层采用什么样的协议这些的)。
  • ICI 和 SDU 在服务访问点把数据传递给 n + 1 层(SAP可以当作是一些函数)。
  • n + 1 层拿到数据后把 ICI 和 SDU 分开,并且把SDU重新整合(分组或者合并)载加上自己的头,就形成了协议数据单元(PDU)。当 n + 1 层向下传递时,PDU就变成了SDU(本层的PDU为下层的SDU,本层的SDU为上层的PDU)

因特网的性能

  • 延时:有四种延时
    • 传播延时:当两台主机距离过长的时候,就要考虑光的传播速度了
    • 传输延时:数据在网线中传播要考虑网线的带宽
    • 处理延时:路由器存储转发过程中的处理的时间
    • 排队延时:当路由器正在发的时刻,数据又来了,新的数据就需要排队等待路由器发完
  • 流量强度 $L\alpha/R$:
  • 吞吐量
  • 丢失
    • 缓冲区溢出
    • 出错抛弃

应用层

应用层是网络存在的理由。应用层的特点是协议很多,比较重要的有HTTP,SMTP等等,然后DNS也是运行在应用层当中的。

应用层协议原理

网络应用的体系架构

应用层有三种体系架构

  • C/S 模式

  • P2P 模式:拓展性强,管理困难

  • 混合模式:一部分任务在C/S模式,一部分在P2P模式

    例如文件传输应用,文件的检索可以是C/S模式,文件到的下载是P2P模式;即时通讯软件:在线状态的判断是C/S模式,两个用户聊天的时候是P2P模式

应用需要解决的问题

两个应用进程之间通讯,如果是同一台主机,就使用操作系统的通信方式,如果是不同的主机,就要用到网络了。

写应用要考虑三个问题

如何区分主机的应用进程

这个就是靠Socket了。Socket是一个整数,代表了 IP + 端口号了。

  • 对于TCP,Socket是两个主机的 IP 和 端口号。两边的IP确定了主机就确定了,两边的端口号确定了,对应的应用进程也就确定了。这四个数字就可以唯一确定一条连接。
  • 对于UDP,Socket是本地的 IP 和 端口号。

如何用传输层提供的服务

传输层向应用层提供的服务有两类

  • TCP(面向连接)
    • 可靠保序字节流
    • 流量控制
    • 拥塞控制
  • UDP(无连接)
    • 快速

对于任何一个连接,需要告诉别人三个东西

  • 目标主机IP和应用进程的端口号(收件人)
  • 自己的主机IP和应用进程端口号(寄件人)
  • 要传输的报文(寄出去的东西)

有了这3个内容后,就可以选择一种传输层的服务往下传了

在实际传输过程中,对TCP,前两个被打包成了 socket ;对UDP,只把第二个打包成了socket,但是传输过程中要额外提供第一个。

如何实现编写程序

这个就靠协议了。

C/S模式

HTTP

为了实现Web应用,就有了HTTP协议。

Web是由对象构成的。一个对象就是一个文件(像是图像、文本这些的)。Web一般会有Html文件。Html文件包含文本,还包含其他对象(比如说图片)。这些对象在Html中是以url地址的形式储存的。浏览器绘制网页时,就一个个找出html文件中的对象,然后把他们画出来。

url 格式:Prot://user:psw@www.someSchool.edu/someDept/pic.gif:port

特点

HTTP协议采用 C/S 模式,通过 TCP 协议进行传输,端口号为80,无状态

无状态:HTTP不保存任何用户相关的信息

HTTP协议有两种非持续性连接(HTTP 1.0)和持续性连接(HTTP 1.1)

  • 非持续性连接:客户端收到服务器的响应后关掉TCP连接

  • 持续性连接:客户端收到服务器的响应后依然保持连接,超过一定时间后关闭

    这里还可以细分

    • 流水线模式:请求收到回复前接着请求
    • 非流水线模式:一个请求得到回复后再发另外一个请求

报文格式

HTTP有两种报文格式:请求报文和响应报文

  • 请求报文

    有GET,POST,HEAD,PUT,DELETE等命令

名称 内容举例
请求行 GET /somedir/page.html HTTP/1.1
首部行 Host: www.someschool.edu\nUser-agent: Mozilla/4.0\nConnection: close\n Accept-language:fr
空行
实体主体 (数据)

客户端向服务器提交信息不是必须使用POST请求,还可以使用 GET + 参数 的形式

  • 响应报文

    有一些状态码

响应状态码 解释
200 OK 请求成功,请求对象包含在响应报文的后续部分
301 Moved Permanently 请求的对象已经被永久转移了;新的URL在响应报文的Location: 首部行中指定;客户端软件自动用新的URL去获取对象
400 Bad Request 一个通用的差错代码,表示该请求不能被服务器解读
404 Not Found 请求的文档在该服务上没有找到
505 HTTP Version Not Supported -

报文的形式大概是这样的

名称 内容举例
状态行 HTTP/1.1 200 OK\r\n
首部行 Connection close\r\n Date: Thu, 06 Aug 1998 12:00:15 GMT\r\n Server: Apache/1.3.0 (Unix) \r\n
空行
数据 (数据)

由于Http是无状态的,但是网页有识别应用的需求。因此就有了Cookie来让Http识别。

Cookie的实现是这样的

Cookie的四个组成部分

  • 在HTTP响应报文中有 一个cookie的首部行
  • 在HTTP请求报文含有 一个cookie的首部行
  • 在用户端系统中保留有 一个cookie文件,由用户的浏览器管理
  • 在Web站点有一个后端数据库

Web缓存(代理服务器)

Web由于采用C/S模式,源服务器压力会很大,为了改善上网体验就有了Web缓存,可以不直接访问源服务器就可以获取请求内容。

用户设置浏览器通过缓存访问Web后,浏览器将所有的HTTP 请求发给缓存,然后根据

  • 对象在缓存中:缓存 直接返回对象
  • 对象不在缓存:请求原始服务器,然后再将对象返回给客户端

有了缓存,有以下的好处:

  • 降低客户端的请求响应时间
  • 可以大大减少一个机构内部网络与Internent接入链路上的流量
  • 互联网大量采用了缓存,可以使较弱的ICP也能够 有效提供内容

为了实现缓存的功能,Http添加了条件Get语句

  • 缓存器: 在HTTP请求中指 定缓存拷贝的日期 If-modified-since:<date>
  • 服务器:
    • 如果缓存拷贝陈旧,则正常响应报文,比如:HTTP/1.0 200 OK
    • 如果缓存拷贝最新,则响应 HTTP/1.0 304 Not Modified

FTP

文件传输协议

HTTP协议采用 C/S 模式,通过 TCP 协议进行传输,端口号为21,有状态,将数据与控制分开

FTP协议需要两条TCP连接

  • 控制连接:获得身份认证,以及实现浏览远程目录
  • 数据连接:收到传输命令后开始连接,这个连接就专门用来传输文件

这种控制与数据分开的连接就叫做 带外传送

FTP的响应报文和Http一样

邮件

邮件系统由 用户代理、邮箱服务器和SMTP 组成。

用户写完邮件之后把文件通过用户代理发送给邮件服务器。

  • 用户代理:管理邮件,撰写、编辑和阅读邮件都在这个上面
  • 邮箱服务器:收、发、管理邮件

发送邮件的过程:

  1. 用户写好邮件后,用户代理将用户的邮件发送到发件人的邮件服务器,
  2. 发件人邮件服务器将邮件放入外出报文队列中。
  3. 当队列积攒到一定程度后,发送方邮件服务器与接收方邮件服务器建立TCP连接,使用SMTP协议传输文件。
  4. 接收方将收到的邮件放入对应用户的邮箱中
  5. 接收方通过用户代理访问接收方邮件服务器的该用户的邮件内容

SMTP

HTTP协议采用 C/S 模式,通过 TCP 协议进行传输,端口号为25

SMTP与HTTP的区别

  • HTTP是一个拉协议,用户通过请求拉取服务器的内容。

    SMTP是一个推协议,用户把文件推向服务器

  • HTTP把文件中的图片这些对象封装在其他的响应报文中

    SMTP把所有对象都放在一个报文中

  • HTTP报文可以是非7位ASCII码

    SMTP报文必须是7位ASCII码,图片这些通过MIME转成ASCII

MIME: 多媒体邮件拓展

邮件访问协议

邮件的访问是通过邮件访问协议实现的

  • POP3:有用户身份确认 (代理<—>服务器) 、事务处理(用户代理获取邮件、删除邮件)、更新三个阶段。无状态
  • IMAP:在POP3的基础上增加的很多新的内容,比如说文件夹的管理。有状态。
  • Http

P2P模式

P2P有以下3类

  • 集中式目录
  • 完全分布式
  • 混合体

P2P 模式相比 C/S 模式的有点是可拓展性强。并且随着节点数量的增加,C/S 模式的文件分发时间随线性增加,P2P 模式增加的很慢

假设服务器要分发N个大小为F的同一个文件给用户,服务器的上传带宽为 $u_s$,客户端的下载带宽为 $d$。

  • C/S 模式,服务器需要一个一个的发出去,分发的时间为 $t_{\text{C/S}}=\max\{\frac{NF}{u_S},\frac{F}{d_\min}\}$
  • P2P 模式,服务器只需要发送一个文件,其余的各个P2P的对等体互相传输,分发的时间为 $t_{\text{P2P}}=\max\{\frac{F}{u_S},\frac{F}{d_{\min}},\frac{NF}{u_s+\sum u}\}$

典型 P2P 应用:Napster,Gnutella,KaZaA,BT,DHT

DNS

应用层层面的网络基础设施

DNS是运行在53号端口上的应用服务,是网络运行在应用层上的核心功能,主要使用UDP实现

DNS的作用主要是把域名变为IP地址,不过还有其他作用

  • 主机别名与规范名之间的转换
  • 邮件服务器别名与规范名之间的转换
  • 负载分配

DNS的主要思路是

  • 分层次、基于域的名字划分
  • 分布式的数据库完成域名到IP的转换

IP地址的划分

DNS采用层次树结构的命名方法,域名的根在全球13个根名字服务器上。这些根被划分成了很多顶级域。从顶级域往下,划分为若干子域名。树的叶子就是一个主机。

顶级域大致有两类:通用的(.com)和国家的(.cn

域名到IP的转换

由于使用单服务器会产生单点故障、拓展性差和距离远近等问题,DNS采用分布式的数据库。

每个域被划分成一块一块的区域,一个区域内的主机有一个权威名字服务器,权威名字服务器中记录这个区域中每个主机的IP和域名的对应关系,找到权威名字服务器就找到了这个区域所有主机域名和IP的对应关系。同时,每个ISP都有一个本地服务器

DNS服务器以资源记录(RR格式)的方式记录域名和IP的对应关系

类型名称 解释
Domain_name 域名
Ttl 生存时间(权威,缓冲记录)
Class 对于Internet,值为IN
Value 可以是数字,域名或ASCII串
Type 见下表
类型 Name Value
A 主机 IP地址
CNAME 规范名别名 规范名
NS 域名 该域名的权威服务器域名
MX 邮件服务器别名 邮件服务器规范名

域名解析有以下步骤

  • 域在DNS缓存中或在就在该区域中:直接访问这个区域的本地DNS服务器就可以得到IP地址
  • 域不在缓存中或该区域中:联系根名字服务器顺着根 -> TLD 一直找到权威名字服务器

通过缓存可用提高效率,缓存中每个记录有TTL来实现数据更新

这种查询分为迭代查询和递归查询两种

递归查询问题是根服务器负担过大

DNS的维护

DNS的请求和响应报文格式相同:

互联网视频服务

随着因特网视频的火热,需要为成千上万的人提供并行的视频播放服务,这时候需要解决两个问题

  • 同时向超大规模的用户提供并行的服务(告示文件+域名解析重定向+CDN内容靠近客户)
  • 不同的用户,处理数据的能力不同(DASH协议)

CDN就是来解决着两个问题的

DASH协议

Dynamic Adaptive Streaming over HTTP,经HTTP的动态适应流。用来解决第二个问题的

  1. 对服务器的每个视频,把视频写成一块一块的,然后处理成各个不同清晰度的版本。通过告示文件提供各个版本的URL。
  2. 客户端根据网络情况动态的请求不同清晰度的版本。

CDN

由于单服务器有 单点故障、服务器到客户端跳数多、网络重复流量多,因此采用CDN的服务。

CDN在全球部署服务器,视频提供商购买CDN的服务,预先将视频缓存到CDN的服务器上。用户通过域名的重定向,访问离用户最近的缓存节点,从而实现加速。

CDN部署服务器有两种策略

  • 深入,CDN在local ISP的附近部署缓存节点。跳数少,用户享受服务好,但是服务器多,维护成本高
  • 邀请做客,在少数一些关键的地方设置缓存节点

套接字编程

TCP

UDP

cad 和 sad 是两个结构体,里面放着 IP 和端口号,cad是客户端的,sad是服务器的

传输层

传输层就只有两个协议了,TCP和UPD,这一章的重点是TCP保证数据传输可靠的原理

传输层的服务是保证应用进程之间的逻辑通信,而网络层的服务是保证主机之间的逻辑通信,而这样的逻辑通信往往是不可靠的。传输层就是要通过自己把不可靠的服务变为可靠的服务。

提供了进程的区分加强了网络层的服务

有一个很好的例子

1
2
3
4
5
应用报文=信件上的字符
进程=堂兄弟姐妹
主机=家庭
运输层协议=把家里的信分给个人
网络层协议=邮政服务

传输层多路复用/解复用

多路复用 就是发送方应用层给传输层很多不同的Socket,传输层把Socket对应的IP和端口号封装在头部生成报文段,从而可以统一通过网络层发送的过程。

多个应用都采用 TCP 或 UDP 传输数据

多路分解(解复用) 就是接收方传输层从报文中提取IP和端口号,把报文信息交给对应的应用进程

数据解封装,区分应用进程

TCP多路复用解复用

TCP 的 Socket 是一个包含源IP,源端口,目标IP,目标端口的一个四元组,因此只要其中一个不同,就是不同的Socket,分发给不同的应用进程

UDP多路复用解复用

UDP 的 Socket 是 本地 IP,本地端口的二元组

UDP

User Datagram Protrol。UDP就是在 IP 的基础上加了多路复用解复用的功能和校验和的功能,其他基本上和 IP 的一样。

优点

  • 不会建立连接(建立连接有额外的延时)
  • 简单
  • 报文头部开销少
  • 无拥塞控制和流量控制,可以尽可能快的发送数据

报文

就8个字节,4个字段。每个字段两个字节,分别是:目标IP,目标端口,长度和校验和

校验和

校验和的目的就是将报文段的内容看成 16bit 的数字,然后这些数字和校验和相加后,每一位都要是1

校验和的计算:将报文段看成 16bit 的整数加起来,最高位进位了则回卷(在结果的最低位加1)。得到的数字取反就是校验和

可靠数据传输原理

传输模型如下

rdt1.0

假设:网络层提供的服务是可靠的(不出错,不丢失)

实现:此时只需要封装解封装就可以了,只起到一个区分应用进程的作用

rdt2.0

假设:传输的数据可能出错

实现:增加 差错检测接收方反馈重传

问题:没有考虑反馈出错的可能性

rdt2.1

实现:增加序号

rdt2.2 :把NAK变为了ACK+序号的机制

rdt3.0

假设:传输的数据既可能出错,又可能丢失

实现:增加超时重传机制

流水线

rdt3.0的是停止转发协议。发一下停一下,效率比较低。然后通过设置缓冲窗口,可以用流水线的方式来提高效率.

就是在未经确认的情况下,连续发送多个分组。

名称 发送窗口 接收窗口
停止转发 = 1 = 1
GBN > 1 = 1
SR > 1 > 1

发送窗口的大小就是未经确认分组的数量

GBN协议

回退N步协议(Go Back N)

对于发送方,一次性的把发送窗口中的所有的数据全部发送出去,并且缓存不抛弃,然后等待接收方的反馈。

  • 收到接收方的接收成功的数据:把成功的那个数据包和它之前的标记为已发送,然后抛弃掉,后面的数据包进入发送窗口,向接收方发送
  • 接收超时:把发送窗口中的所有发送未确认的数据包全部依次发送给接收方

累计确认

对于接收方:只能顺序的接收分组

  • 接收到正常分组:向发送方发送ACK对应序号
  • 收到重复分组,或者不是接收方正在等待的分组:抛弃,并发送之前的确认信号

序号是0,1,2,3,4:如果2出错了,即使3,4正常收到了也丢弃掉

其中的2,4号数据传过去了但是抛弃掉了,就很浪费

SR协议

选择重传协议(Selective Repeat)

由于接收窗口也可以缓存了,那么就可以乱序的接受分组了。另外,接收方的确认也不再是累计确认,而是收到一个发送对应的确认。

对于接收方,分组只对没有收到确认回复的分组重新发送

项目 GBN SR
优点 简单,占用资源少 出错时重传代价大
缺点 一旦出错,回退N步,代价大 复杂,占用资源多
用途 出错率很低的情况 链路容量大的情况

总结

名称 用途
校验和 确认分组是否正确
肯定确认 确认分组是否收到
序号 检查重复
定时器 处理丢失
流水线 解决停止转发效率低的问题

拥塞控制原理

拥塞原因与代价

原因是主机向网络核心发送的数据过多,超过了网络核心所能承载的能力

代价:

  • 当分组的到达速率接近链路容量时,路由器的排队延时会趋向于无限大
  • 网络延时很大,造成丢包严重。
  • 发送包在遇到大的时延,会发送重复的副本,降低链路的利用率
  • 分组丢失使得上游路由器的传输容量浪费了

拥塞控制手段

  • 端到端的拥塞控制

    TCP就是使用的这种,端系统根据自己的探知,判断网络的拥塞情况。

  • 网络辅助的流量控制

    网络核心向发送网络拥塞的状态信息给端系统

TCP

特性

  • 可靠保序字节流,流水线,流量控制,拥塞控制;面向连接,全双工

单工:$A\rightarrow B$

双工:$A\leftrightarrow B$

全双工:$A\rightleftharpoons B$

段结构

  • TCP的序号:TCP的序号发送端和接收端是不同的,一般来说这个序号是一个随机的序号。这个序号表示PDU首字符在字节流中的位置。确认是对下一个字节的期待(顺序收到的字节的最后一个+ 1)。

    TCP连接在连接握手阶段两台主机会事先交换各自的序列号

    发送端和接收端是不同的原因:这两个不同目的是为了防止老的TCP连接的数据对新TCP连接的数据造成干扰

超时时间的设置

$\alpha,\beta$ 是任取的,推荐 $\alpha=0.125.\beta=0.25$

公式不重要。主要是超时时间的设置是一个平均数+4倍的方差的形式。然后这个平均数是指数移动平均,随着时间的增加,前面的数据会越来越不重要。

可靠数据传输

TCP用的是GBN和SR的混合,它和GBN一样是采用的累计确认的方式。

它还增加了 快速重传(在超时定时器中断之前,如果连续3个冗余的ACK的,它会立即重传)

同时当它还会 延迟确认,当对另一个按序报文段的到达最多等待500ms。如果下一个报文段在这个时间间隔内到达,立即发第二个的ACK。没有到达,则发送一个自己的ACK。

还有超时事件发生时,超时间隔会加倍。

流量控制

目的:防止淹没接收方

手段:将接收窗口以捎带的方式发送给发送端,发送端发送的数据始终小于接收方的缓存空间。

连接管理

连接管理就两个部分,连接的建立和拆除

3次握手

因为发送端和接收端的序号是不同的,3次次握手主要是为了交换这个序号,并且做确认。

如果这两边的序号相同,就只需要两次握手了,但是两次握手会产生两个问题,第一个是半连接(只在服务器维护了连接),还有一个是老数据当新数据接收了

4次挥手

采用对称式的设计,有两军问题,靠定时器凑活解决

这里等 2MSL 是为了防止服务器的FIN丢失,重传的那一段,保证客户端发送的最后一个ACK报文能够到达服务器。同时,可以防止老的数据

拥塞控制

探知

  • 超时定时器超时
  • 收到3个冗余的分组

行为

发送端需要维护一个发送窗口,和一个发送窗口警戒值的两个值。

  • 发送端超时定时器超时:发送窗口变为1,发送窗口警戒值变为原来的一半
  • 收到3个冗余的分组:发送窗口变为原来的一半+3MSS,发送窗口警戒值变为发送窗口的一半 快速恢复阶段
  • 正常情况:
    • 发送窗口 < 发送窗口警戒值:每发送一个发送窗口就翻倍 慢启动阶段
    • 发送窗口 > 发送窗口警戒值:每发送一个发送窗口 + 1 拥塞避免阶段

MSS 最大报文长度,一般是1460字节. 他需要保证加上一个TCP和一个IP的头部(20+20)后能在链路中传输(1500字节)

网络层

网络层提供的服务主要是主机到主机之间的通讯。

网络层有两大功能:路由转发

  • 路由:路由器相互配合,传递路由信息,然后根据路由选择算法来计算路由表。
  • 转发:路由器收到一个分组后,把分组缓存下来,匹配分组的字段,根据路由表决定这个分组应该从那个端口发出去

网络层的协议包括 IP 协议、路由选择协议和 ICMP协议

原理

由于网络层本身十分的复杂,根据网络层两个重要功能,网络层可以被分为两个部分

  • 数据平面:负责实现转发的功能,决定从输入路由器的数据报要输出到那个输出链路。
  • 控制平面:负责实现路由的功能,控制数据报从源主机到目标主机的传输路径。

网络层的这两个平面有两种实现方式

  • 传统方式
    • 数据平面和控制平面竖直的集成在每一个设备中(路由器)
    • 路由器分布式的计算路由表
  • SDN通用转发方式(Software Define Network)
    • 控制平面与数据平面分离,在不同的设备上实现
    • SDN控制器上的网络层应用集中式的计算流表,SDN控制器向路由器下发流表
    • 路由器根据分组的多个字段匹配流表,进行转发

数据平面

路由器原理

路由器由三个部分组成:输入端口、交换机构、输出端口、路由处理器

  • 输入端口和输出端口都实现物理层、链路层和网络层的功能。其中输入端口负责查询路由表,输出端口涉及到分组调度

    为了防止堵塞的情况,输入端口和输出端口的都有缓存,以实现排队

  • 交换机构有三种实现方式:经内存交换、经总线交换、经互联网络交换

    这个互联网络是电路上的一种称呼,与本文的互联网概念完全不同

  • 路由处理器协调各个部分的工作

IPv4

IP协议为上层提供的服务是尽力而为的一种服务(可能会丢包、乱序、重复)

报文格式

分片重组的原因:分组的大小超过了链路的MTU(最大传输单元)

分片的实现:IP协议的报文中有 identifier,flags,fragment offset 三个值。identifier 用于表示这些分片所属的分组,flag 判断是否是最后一个分片,fragment offset 表示这个分片数据的首字节在整个分组中的偏移量。

IPv4编址

IP地址:主机或路由器网络接口的标识,分为网络部分和主机部分

网络层为了提高效率,有 路由汇聚 的效应:连续子网前缀的子网可达信息可以做汇聚,以减少路由器路由表计算胡传输。(同一个子网的前缀相同,这样,他们就可以通过一个IP计算可达信息)

子网:

  • 子网内的主机通信不需要借助路由器,链路层交换机即可
  • 子网内主机的网络部分(子网前缀)相同

子网掩码

子网掩码和IP地址配合使用,子网掩码为 1 表是这个位在IP地址中是网络位。

IP地址分类

其中 D 类是多播,E类是预留的IP地址

DHCP

上网的主机通过DHCP获取 IP、子网掩码、默认网关和 Local Name Server

主机加入互联网后,向同一子网的所有主机广播 DHCP发现报文。同一子网的多个 DHCP 服务器收到报文后,广播DHCP提供报文,并在报文中附上自己的IP。主机收到 DHCP提供报文后

NAT

网络地址转换,工作方式如下

IPv6

从32位变为128位

IPv4到IPv6的迁移:隧道

SDN

工作原理

  • 模式匹配 + 行动

    SDN一次匹配报文的多个字段(传统模式下只匹配目标IP一个字段),行动除了传统的转发之外,还有泛洪、阻塞和修改字段等等

  • 分组按照各级字段匹配流表,然后按照响应的行为动作执行

  • 按照优先级进行判断,之后统计计数

优点

  • 集中在控制器上实现逻辑,使得网络可编程,实现复杂网络的功能
  • 形成开发生态(控制器,网络应用在一个框架下协作)
  • 分组交换机按照流表转发,十分便宜,通用,便于升级

控制平面

控制平面的功能是路由:按照某种指标,找到源到目标的较好路径

网络层提供主机到主机的数据传输,或者说是 IP 到 IP 的数据传输,但是 IP 数量太大了,为每一个 IP 提供路由成本太高,现实是将IP汇集,实现从子网到子网的数据传输,这样大大减少了网络路由节点的数量。

路由选择算法

链路状态算法 (LS)

链路状态算法是一种全局的、集中式的算法。该算法在计算之前就拥有所有节点之间的联通性和链路开销信息。

具体过程:

  1. 发现相邻节点,获取对方IP
  2. 测量相邻节点代价
  3. 组装LS分组,描述相邻节点之间代价
  4. 以泛洪的方式扩散分组到其他路由器。路由器获得各节点LS分组,从而得到整个网络拓扑。
  5. 运用 Dijkstra 算法找出最短路径

Dijkstra 算法回顾:https://www.bilibili.com/video/BV1ts41157Sy

链路状态法会出现震荡的现象,当一条路径代价是0的时候,所有用LS算法的路由器都将将分组指向这条链路,从而使得这条链路代价增大。

距离向量算法 (DV)

距离矢量算法是一种局部的、分散式的算法。该算法维护自己和邻居节点之间的连通性和和链路开销信息。算法以迭代的方式最终到目标。

每个节点维护一个距离矢量(表),上面记录它到所有其他节点的下一跳和代价值。它和邻居节点定期交换 DV

DV算法使用 Bellman-Ford 公式不断迭代生成到所有目标的代价和响应的下一跳。

从 x 到 y 的代价 $d_x(y)$ = 从 x 到它邻居 v 的代价 $c(x,v)$ + 从 v 到 y 的代价

DV算法具有好消息传的快,坏消息传的慢的特点。

比较

  • 报文复杂性:LS > DV
  • 收敛速度:LS > DV
  • 健壮性:LS > DV

路由选择协议

由于互联网过于复杂,实际的情况是采用层次化的结构。互联网被分为一个个 自治系统 (AS) ,他们之间有一个路由选择协议。各个自治系统中的路由器也有自己的路由选择协议。因此实际的路由选择协议被分为 内部网关协议外部网关协议

层次化解决了规模性问题和管理性问题

规模性:路由设备数量大,路由选择信息的通信开销十分巨大

管理性:ISP希望按照自己的意愿运行路由器,同时希望对外界隐藏细节

内部网关协议

自治系统内一个主机到任意一个主机的路由选择协议,比较关注效率和性能

  • OSPF开放最短路优先:基于LS算法

外部网关协议

自治区之间的路由选择协议,比较关注经济策略和政治策略

外部网关协议只有一个,就是 BGP 边界网关协议。BGP协议将因特网中数以前千计的ISP连接起来,基于DV算法。

BGP协议中,每个AS有一个连接其他AS的网关,这个网关既参与内部网关的运算,又参与外部网关的运算。该网关将自身AS中的每一个设备进行路由聚集,通报给其他AS中的网关。其他网关收到消息后,发送给这个自治区内部的所有路由器

BGP在 DV 算法的基础上增加了一个 AS-PATH 字段,这个字段包含了已经走过的AS,用于进行环路检测。

SDN控制平面

关键特征:

  • 数据平面与控制平面分离
  • 基于流的 匹配 + 行动模式
  • 控制平面功能在数据交换设备外实现
  • 网络可编程

ICMP协议

作用:主机和路由器之间沟通网络层消息。常见的消息有差错报告(404这些的)

链路层

链路层提供端到端的通信

网络层相当于是从 武汉 到 宁波,链路层相当于是其中的 公交车-高铁-公交车-走路 其中一段。

链路有两种类型的信道,一种是点到点的广播式的信道(多点连接),另外一种是多点连接的通信链路

多点连接的方式适合于局域网,点到点的连接方式适合于广域网

链路层在主机和路由器上的网卡实现

链路层提供服务

  • 成帧(封装解封装)
  • 链路访问控制
  • 检错和纠错
  • 相邻节点进行可靠数据传输
  • 流量控制:使发送方和接收方的速度匹配
  • 全双工和半双工服务

以上是一般化的链路层服务,对电缆等一些本来就很可靠的链路就不需要可靠数据传输,像 WiFi 这样的需要。

差错检测和纠正

奇偶校验

发送方附加一个比特,使得整个数据比特1的个数和为偶数/奇数

还可以将数据分组,形成二维偶校验

校验和方法

将数据以 k 位为一组作为一个整数,然后把整个帧的所有整数加起来,用得到的和作为差错检测比特。

CRC(循环冗余检测)

这个比较重要,CRC主要应用到了异或。发送方的帧给接收方后要恰好被能被 $G$ 整除

$D$ 表示要发送的数据比特,$R$ 表示跟在 $D$ 后面的 $r$ 位CRC 比特。国际标准规定了 $G$ 的值。

因此发送方只需要在原有的数据 $D$ 上增加

的比特位即可

1
2
3
4
|<------d 比特----->|<--d 比特-->|
-----------------------------
┃D: 被发送的数据比特┃ R: CRC比特
-----------------------------

CRC 能检测数据比特小于 r + 1 位的差错,对大于 r + 1 位的有 $1-0.5^r$ 概率被检测到

多路访问协议

就是多点连接的协议,还有一种是单点访问协议,那个比较简单,就完成封装解封装和校验就可以了。多点访问主要需要解决的问题是冲突(多个点一起发送)。有 3 种方式

  • 信道划分:将信道划分为时分、频分和码分
  • 随机访问:允许冲突的产生,并且检测冲突。遇到冲突了就等待一会重新发送
  • 轮流

信道划分协议

  • TDMA
  • FDMA
  • CDMA

随机接入协议

CSMA/CD

具有碰撞检测的载波监听多路访问(Carrier Sense Multiple Access with Collision Detection),用于局域网。

主要特点是

  • 发送之前先监听(载波监听):如果此时链路中有一小段时间没有传输数据,才开始发送数据

  • 如果于其他人在同时说话,则停止(碰撞检测):传输时一直监听信号,如果检测到另一个节点传输了干扰帧,就停止传输

    中止传输后,发送方会随机的选择一个时间发送。这里采用 二进制指数退避 的方法进行:当此时连续发生了 $n$ 次碰撞,就在 $\{0,1,2,\cdots,2^n-1\}$ 中随机选择一个数设为等待时间

CSMA/CA

用于无线局域网。由于无线局域网有 信号强度随距离递减、有其他源的干扰、多路径传播 等特点,和有限局域网使用同样的逻辑就不太适用了。无线局域网还有隐藏终端和信号太弱无法检测的问题

无线局域网使用的是 带碰撞避免的CSMA/CA (CSMA with Collision Avoidance)

  • 当发送方检测到信道空闲时,发送方会等待一个短时间后,进行发送,无论是否冲突把帧一次性发完。发送完毕后等待接收方的确认。
    • 收到确认:如果要发下一帧,执行下面的操作(发送方检测到信道正在传输时对应的操作)
    • 没收到确认:执行下面的操作(发送方检测到信道正在传输时对应的操作)
  • 当发送方检测到信道正在传输时,发送方会选择一个随机的等待时间,信道空闲的时候等待时间递减。当等待时间减少到 0 时,发送整个数据帧

CSMA/CA 还有一个可选项:就是遇到大文件要传输时,先发送一个很短的 RTS 帧。接收方收到后向其邻居发送 CTS 帧。发送方收到后等一段时间开始发送,接收方的邻居收到后延迟发送。

轮流协议

  • 令牌传递协议

交换局域网


计算机网络
https://fu-qingchen.github.io/2021/05/02/HUST/ComputerNetworking/
作者
FU Qingchen
发布于
2021年5月2日
许可协议