前言

为了准备秋招及春招,现阶段的任务是将所学过的知识进行复习,并串联起来。计算机网络为后续开展网络编程提供支撑,其中的要点包括了IP、UDP、TCP等

具体的还包括了:OSI 七层模型和 TCP/IP 四层体系结构,TCP 三次握手与四次挥手,常见的网络协议(网桥、ARP、IP、ICMP、TCP、UDP、DHCP、DNS)、TCP 粘包、流量控制 + 拥塞控制、数字签名原理、http + https,http 的状态码,https 的安全机制,网络安全、输入 www.baidu.com 背后发生了什么等等问题。

其实工作中,有时就会出现,网络抖动、网络延迟,网络拥塞的情况,此时就需要具备一定的网络知识,及时的解决问题,计算机网络是面试中常见问题之一。

网络层

把分组从源端传递到目的端,为分组交换网上的不同主机提供通信服务。

传输单位:数据报(由分组组成)

功能:

  • 路由选择与分组转发
    • 路由选择:根据选定的路由选择协议,构造出路由表,并不定期更新和维护该路由表
    • 分组转发:根据转发表(由路由表得出),对分组进行转发,从路由器的某个端口发送出去
  • 异构网络互联
  • 拥塞控制

所要掌握的协议:

SDN

软件定义网络,是路由器两大功能的拓展。
在SDN中,将两个功能分别对应了两个平面,数据平面(分组转发)和控制平面(路由选择)。

在传统的设计中,路由选择中计算路由表由每一个路由器自己实现。而SDN中,在控制平面中多加了一层,将计算转发表这一功能从每个路由器中剥离出来,形成了网络控制应用程序

在这里插入图片描述

在这之下,是控制平面的另一个层次,也就是SDN控制器(网络操作系统),它包括了北向接口网络范围状态管理层南向接口

  • 北向接口:与网络控制应用程序交互
  • 网络范围状态管理层:保存主机、链路、路由器的最新信息
  • 南向接口:与受控网络设备(路由器)交互

IP

IP提供了一种尽力而为无连接数据报 交付服务。

IPv4数据报格式

IPV4数据报格式,重点在于理解每一个字段代表什么意思

表示方法:点分10进制

IP数据报格式
这里记录一些注意格外注意的点,具体的内容可查阅参考资料中的书籍

  1. 首部长度(4B)、总长度(1B)、片偏移(8B)的单位需要作一个区分
  2. 首部长度:因为IPv4数据报的头部至少要为20B,又因单位是4B,所以首部长度的范围在0101~1111,即20B~60B
  3. 总长度:指IP头部+数据部分,因占了16位,所以总长最大为21612^{16}-165535B
  4. 标志:只用到了中间位(DF)与最低位(MF)
  5. 协议:TCP-6,UDP-17
  6. 源、目的地址:即IP地址

分类寻址

4B,32位

IP地址::={<网络号><主机号>}IP地址::=\{<网络号>,<主机号>\}

  • 网络部分:用于识别接口使用的IP地址在哪个网络中可被发现
  • 主机地址:用于识别由网络部分给出的网络中的特定主机

有几类特殊的IP地址需要格外注意:

  • 网络号正常,主机号为0:网络地址,表示一个网络
  • 网络号正常,主机号全为1:直接广播地址,对特定网络上的所有主机进行广播

这里也解释了IP地址中,最大主机数为什么要-2

  • 网络号为0:表示本网或本网内的某个特定主机
  • 网络号127,主机号非全0/1:本地软件环回测试,称为环回地址
网络类别 最大可用网络数 第一个可用的网络号 最后一个可用的网络号 最大主机数
A 2722^7-2 1 126 22422^{24}-2
B 21412^{14}-1 128.1 191.255 21622^{16}-2
C 22112^{21}-1 192.0.1 223.255.255 2822^8-2

注:A类和B类网络号通常浪费太多主机号, 而C类网络号不能为很多站点提供足够的主机号

子网寻址

在子网寻址中,主机号被进一步划分为子网号和主机号:

IP地址::={<网络号><子网号><主机号>}IP地址::=\{<网络号>,<子网号>,<主机号>\}

注意,只有划分子网的网络中的主机和路由器知道子网结构。

在需要进行子网寻址之前, Intemet其他部分仍将它作为站点相关的地址来看待。

子网掩码:确定如何从一个IP地址中,获得网络和子网信息

当子网掩码与IP地址作与操作,就可以得到子网号

使用子网时分组的转发
存在路由器转发分组的算法

  1. 提取目的IP地址
  2. 是否直接交付
  3. 特定主机路由
  4. 检测路由表中有无路径
  5. 默认路由0.0.0.0

CIDR(无分类编址)

CIDR记法:IP地址后面加上/,然后写上网络前缀(可以任意长度)的位数

e.g. 128.14.32.0/20128.14.32.0/20

IP地址::={<网络前缀><主机号>}IP地址::=\{<网络前缀>,<主机号>\}

路由聚合(构成超网

将多个子网聚合成一个较大的子网

方法:取所有网络的最大前缀

最长前缀匹配

使用CIDR时,查找路由表可能得到多个匹配结果,这时应该选择具有最长网络的前缀的路由。
前缀越长,地址块越小,路由越具体

方法:用目的地址,去和路由表中的地址掩码作与操作,观察最长的匹配

IPv6

基本首部40B,IPv6地址128位(16B)

表示方法:冒号16进制记法,如

4BF5:AA12:0216:FEBC:BA5F:038A:BE9A:21704BF5:AA12:0216:FEBC:BA5F:038A:BE9A:2170

每个数有16种表示,一共有32个数。

1632=2128=3.4103816^{32}=2^{128}=3.4*10^{38},如此庞大的数,“ 可以为地球上的每一粒沙子分配一个IP地址

IPv6数据报格式

  • 流标签:流本质是数据报,指的是特定源点到特定终点的一系列数据报。所有属于同一个流的数据报具有相同的流标签
  • 有效载荷长度:扩展首部1/2/3 + 数据

ARP(MAC地址和IP地址的映射)

地址解析协议:完成主机路由器 IP地址 到 MAC地址 的映射

ARP用于确定本地可达的IPv4子网使用的IPv4地址对应的硬件地址

它在数据报的目的地与发送方处于[同一子网]时使用,
还用于数据报的目的地[不在当前子网时]将其转发到一台路由器的网关

ARP协议的使用过程

  • 检查ARP高速缓存,有对应表项则直接写入MAC帧
  • 如果没有,则发送目的MAC地址为FF-FF-FF-FF-FF-FF的帧封装并广播ARP请求分组。同一局域网内的主机都会收到此请求,但只有目的主机才会做出响应
  • 目的主机收到请求后,会向源主机发送单播ARP响应分组(IP+MAC),源主机收到后将此映射写入ARP缓存(10-20min更新一次)

ARP协议两类典型情况

  1. 同一局域网:用ARP找到【主机】的硬件地址
  2. 跨网:用ARP找到本网络上一个【路由器】的硬件地址

DHCP(动态获取IP地址)

应用层、UDP、客户/服务器、广播

动态主机配置协议,用于获取IP地址

信息包括了IP地址、子网掩码、默认网关、DNS服务器的名称和IP地址

工作流程如下:

  1. 主机广播DHCP发现报文
  2. DHCP服务器广播DHCP提供报文(拟分配)
  3. 主机广播DHCP请求报文(请求分配)
  4. DHCP服务器广播DHCP确认报文(正式分配)

ICMP(差错+探询)

网际控制报文协议,为了更有效地转发IP数据报和提高成功交付的机会

位于IP数据报的数据部分,因此是网络层协议

功能:

  • 差错报告
  • 网络探询

ICMP差错报文
  1. 终点不可达(无法交付)
  2. 时间超过(TTL=0),traceroute
  3. 参数问题(首部字段有问题)
  4. 改变路由(重定向)

ICMP询问报文
  1. 回送请求与回答报文:测试目的站是否可达并了解其相关状态 ping
  2. 时间戳请求和回答报文:用来进行时间同步和测量时间

IGMP(IP组播)

网际组管理协议,运用在多播组,使用IP数据报传送报文

提到这个协议,首先要明确一个概念多播。
多播,又称为组播,指定的几个人可以收到组播包。区别于广播,一个局域网内所有主机都能收到。

IP数据报的三种传输方式:

  • 单播:点对点。用于发送数据包到单个目的地,使用单播IP地址作为目的地址
  • 广播:点对多点。指发送数据包到同一广播域子网内的所有设备的一种数据传输方式
  • 组播:点对多点。只有某些特定的用户才能收到数据包

D类地址:224.0.0.0224.0.0.0 ~ 239.255.255.255239.255.255.255
只能作为目的地址


IGMP协议是让连接在本地局域网上的【多播路由器】知道,本局域网上是否有主机参加或者退出了多播组

工作阶段:

  1. 当有主机加入多播组时,该主机要向该多播组的多播地址发送一个IGMP报文,声明想要成为该组的成员。
  2. 当本地的多播路由器收到IGMP报文时,要用 多播路由选择协议 向Internet上的其它路由器发送这种组成员关系
  3. 本地多播路由器要周期性的探询本地局域网上的主机,确认其是否还是多播组内的成员

路由选择协议

RIP(距离-向量)

路由信息协议 RIP (Routing Information Protocol) ,应用层协议,使用UDP传送数据

  • RIP 是一种分布式的、基于距离向量的路由选择协议
  • RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。

三个要点:(复习这里的时候,想起了wzq老师,谢谢王老师

  1. 仅和相邻路由器交换信息(和谁交换信息)
  2. 交换自己已知的全部信息,即自己的路由表(交换什么信息)
  3. 固定的时间间隔交换路由信息 or 当网络拓扑发生变化时(什么时候交换信息)

RIP适用于小的互联网,
其允许一条路由最多只能包含15个路由器,因此距离为16表示网络不可达


执行过程

在这里插入图片描述

  1. 先将此 RIP 报文中所有的“下一跳”字段值改为发送报文的相邻路由器,并把所有的“距离”字段值加 1。
  2. 再对修改后的 RIP 报文中的每一个项目,执行距离向量算法:
    • 若项目中的目的网络不在路由表中,则把该项目加到路由表中。
    • 否则:若项目中的下一跳字段值相同,则用收到的项目替换原路由表中的项目(拓扑可能发生变化,导致距离变长或缩小)。
    • 否则:若项目中的距离小于路由表中的距离,则进行更新。
    • 否则:什么也不做。
  3. 若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达路由器。

Q:如何理解RIP坏消息传得慢?(慢收敛)

A:在一个网络(网1)已经发生故障后,与它相邻的路由器(R1)最先知道了故障。但是这时其它路由器(R2)还不知道它已经故障了,仍保留着通向它的路径信息。
这时,相邻的路由器(R1)就会以为通过这一路由器(R2)可以通向本已故障的网络(网1)。如此往复,直到距离增加至16,双方才最后知道该网络已经故障了。

OSPF(链路状态)

开放最短路径优先 OSPF (Open Shortest Path First),采用分布式的链路状态协议,直接用IP数据报发送

三个要点

  1. 使用可靠的洪泛法,向本自治系统中所有路由器发送信息。(即路由器通过端口向所有相邻路由器发送信息,而每一个路由器又再次将此信息发送给其相邻路由器。是一种广播的形式)
  2. 发送的信息是与本路由器相邻的所有路由器链路状态。(“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric))
  3. 只有当链路状态发生变化时,路由器才向所有路由器发送此信息

所有的路由器最终都能建立一个链路状态数据库。这个数据库实际上就是全网拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。


OSPF的区域:

  • OSPF会将一个AS划分为若干个更小的范围,叫做区域。
  • 用32位标识符,点分10进制表示
  • 区域<=200

BGP(路径-向量)

外部网关协议,应用层协议,借助TCP发送

BGP 是不同自治系统的路由器之间交换路由信息的协议

  1. 其它AS的邻站BGP发言人交换信息
  2. 交换网络可达性的信息,即要到达某个网络所要经过的一系列AS
  3. 发生变化时更新有变化的部分(如果是首次,则发送全部信息)

三层设备的区别

冲突域:一个站点向另一个站点发出信号,除目的站点外,有多少站点能收到这个信号,这些站点就构成一个冲突域。基于物理层

广播域:在网络中能接收任一设备发出的广播帧的所有设备的集合。基于数据链路层

能否隔离冲突域 能否隔离广播域
物理层(中继器、集线器) × ×
链路层(网桥、交换机) ×
网络层(路由器)

传输层

只有主机才有层次

  1. 传输层为 进程与进程 之间提供逻辑通信。区别于网络层为主机提供逻辑通信
  2. 复用(传->网)和分用(网->传)
  3. 对收到的报文进行差错检测
  4. TCP + UDP

端口号的概念:
长度16bit,能表示65535个不同的端口号

  • 0~1023:服务端-熟知端口号,给TCP/IP最重要的一些应用程序
  • 1023~49151:服务端-登记端口号
  • 49152-65535:客户端,仅在客户进程运行时才动态选择

套接字Socket=(主机IP地址,端口号)套接字Socket=(主机IP地址,端口号)

套接字唯一标识了网络中的一个主机和它上面的一个进程

UDP

无连接的用户数据报协议,数据报

UDP5大特点

  1. 无连接
  2. 尽最大努力交付
  3. 面向报文,处理对象为一整个报文,不删不减
  4. 无拥塞控制,但提供差错检测(体现在计算校验和)
  5. 首部开销小,仅8B。而TCP是其2.5倍

UDP首部格式

各2B:源端口号目的端口号UDP长度(首部+数据)、UDP校验和

UDP检验

在发送端时,先添加上伪(IP)首部(只在计算校验和时出现)
全0填充校验和字段和数据字段,二进制反码求和,得出结果再取反码作为校验和

在接收端,依然先添加上伪首部,伪首部+UDP首部+数据部分 二进制反码求和
这时如果全为1,则无差错。否则,丢弃此数据报或交给应用层附上出错的警告

TCP

面向连接的传输控制协议,报文段,广播、多播

  1. 面向连接(虚连接)的单播协议

  2. 点对点

  3. 提供可靠交付(可靠有序,不丢不重)

  4. 全双工通信

    • 发送缓存+接收缓存将TCP的可靠交付,全双工通信体现的淋漓尽致!!!
    • 发送缓存:准备发送的数据 & 已发送但尚未接收到确认的数据
    • 接收缓存:按序到达但尚未到应用程序读取的数据 & 不按序到达的数据
  5. 面向字节流。TCP把应用层交下来的数据看成一连串无结构的字节流

TCP报文段首部格式

极其重要,重点掌握!!!

  • 20B,是UDP的2.5倍
  • 序列号:本报文段所发送数据的第一个字节的序号
  • 确认号:期望收到的下一个报文段第一个字节的序号
  • 头部长度,也被叫做数据偏移,单位4B
  • 窗口大小:指的是己方所能接收的数据的大小。确认号+窗口大小可以得出接收大小,是TCP发送方调节发送速率的依据
  • 检验和:记得和UDP一样要加上伪首部进行检验,协议字段为6
  • 紧急指针:URG=1时生效,本报文段中紧急数据的字节数

TCP连接管理

一个TCP连接由一个4元组构成,它们分别是两个IP地址和两个端口号

建立一个TCP连接需要3个报文段,而关闭一个TCP连接需要4个报文段

三 次 握 手

握手需要在客户和服务器之间交换三个 TCP 报文段。称之为三报文握手。

  1. 客户发送连接请求报文段后,进入【同步已发送】状态
  2. 服务器收到客户发来的报文后,发送同步确认报文,进入【同步收到】状态。并为本次连接分配缓存和变量
  3. 客户再次发送确认报文,【连接建立】。为本次连接分配缓存和变量,开始发送数据。B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。

三次握手中的前两次握手均不携带应用层数据

值得注意的是,FIN和SYN只会在请求和应答的时候各出现一次

四 次 挥 手

无论客户还是服务器,都能发起连接释放,也就是发起四次挥手这个过程
TCP 连接释放过程是四报文握手

  1. 客户发送连接释放报文段
  2. 服务器收到客户发来的报文段后,进行确认,至此从客户->服务器的单向通道关闭。服务器还能向客户传送数据
  3. 服务器也发送连接释放确认报文段
  4. 客户收到报文段后,必须再进行确认

Q:A为何必须等待2MSL(最大报文段长度)?
A:保证最后一次挥手能够到达B。如果没有到达,B可再次发送第3次挥手,A收到后重新发送第4次并重新等待2MSL。等待2MSL以此来保证连接能够释放

可靠机制

TCP提供了如校验序号确认重传来保证可靠传输

确认:两点

  1. 在发送缓存中,尽管数据已经发送了,但只有收到接收方的确认,才会将其移出发送缓存。
  2. 如果接收方在接收数据时,中间有一部分丢失了,那么【报文段首部确认号字段】仍为丢失部分的第一个字节序号

重传:发送方在规定时间内如果没有收到确认,就要重传已经发送的报文段

流量控制

TCP使用可变滑动窗口机制实现流量控制

区别于拥塞控制的地方在于,流量控制是一种点对点、一对一的控制,即具体的一个接收方对发送方施加的发送数据多少的控制

TCP发送端滑动窗口结构

在通信过程中,接收方根据自己的接收缓存的大小,动态地调整发送方发送窗口的大小

方法:接收方通过设置报文段中的【窗口大小字段】来将rwnd通知给对方

发送方的发送窗口:min(rwnd,cwnd)min(rwnd, cwnd)
接收窗口和拥塞窗口中的最小值


零窗口与TCP持续计时器

通告窗口指示了接收端可接收的数据量。当窗口值变为0时,可以有效阻止发送端继续发送,直到窗口大小恢复为非零值。

只要一方收到零窗口通知,就会启动一个持续计时器。

若持续计时器到期,就会发送一个零窗口探测报文,来得到当前的窗口大小

TCP的流量控制机制完成了对发送速率的调节,它是基于ACK数据包中的通告窗口大小字段来实现的。这种方式提供了明确的接收方返回的状态信息,避免接收方缓存溢出。

拥塞控制

拥塞:路由器因无法处理高速率到达的流量,而被迫丢弃数据信息的现象

当接收速率或网络传输速率过慢时,我们需要降低速率。”——《TCP/IP详解 卷1:协议》
接收速率用流量控制中的接收窗口衡量,而网络传输速率就是这里即将提到的拥塞控制。

拥塞控制是整个网络环境,对发送方施加的发送速率的控制

  • 采取机制:超时重传 + 快速重传
  • 拥塞窗口(cwnd):反映网络传输能力的变量,由发送方自己估算拥塞程度而设置的窗口值

这里先假设了发送窗口的大小只取决于拥塞窗口

慢开始 & 拥塞避免

  • 传输轮次:发送了一批报文,并收到它们的确认的时间
  • ssthresh慢开始门限值,超过这一阈值,从慢开始算法改为拥塞避免算法。如果某一时刻发生网络拥塞,则将这一值更新为发生拥塞时cwnd的一半

快重传 & 快恢复

  • 快重传:收到3个冗余ack,发送报文出现丢失
  • 快恢复:在执行后快重传后,不用将cwnd降低到1,而是降到新的ssthresh(收到3个重复确认时的一半)

DNS(域名解析协议)

参考资料

  1. 《TCP/IP详解 卷1:协议》
  2. 《王道408—计算机网络》
  3. ICMP协议/IGMP协议详解
  4. 详解广播域和冲突域的区别