计算机网络笔记

https://www.bilibili.com/video/BV19E411D78Q?p=75&vd_source=78951f3f7dcd752bebcfd9734a584537

计算机网络的分类:

按分布范围:广域网 WAN、城域网 MAN、局域网 LAN、个人区域网 PAN

按交换技术:电路交换(就像电话线一样,通信时独占线路)、报文交换、分组交换(这俩组合起来就是,通信路径被分割成多个节点的转发,数据也被切分为一个一个的报文,这样就不用独占一条线路且可以同时发送多条数据)

按传输技术分:广播式网络、点对点网络(使用分组存储转发和路由选择机制,两台计算机通信可能经过多个节点,并且数据只有目的主机才能收到)

性能指标

速率、带宽(宽带是网络设备支持的最高速率)、吞吐量(单位时间内通过某网络节点的数据量)

时延:发送时延(发送设备带宽限制)+ 传播时延 + 排队时延(路由器可能处理不过来,数据先放在缓存中等待) + 处理时延(检错、找出口等)

时延带宽积:传播时延 * 带宽 可以用来计算某一时刻,链路中存在的比特数

往返时延RTT:从发送方发送数据开始,到发送方收到接收方的确认信息(立即返回)。传播时延 * 2 + 接收方处理时延

分层结构

主要目的是将网络中出现的大问题分解成各种可能的小问题

法定标准:OSI七层模型

事实标准:TCP/IP四层模型

两者结合可以总结出5层体系

数据在传输过程中,在中间系统(路由器、网桥等)会解码到第3层,源/目的主机会解码所有的7层。

应用层:

和用户交互并能产生网络流量的程序,例如浏览器、邮箱等

典型的应用层服务有 文件传输(FTP)、电子邮件(SMTP)、万维网(HTTP)等

表示层:用于数据解码和加密等,例如 JPEG、MP4等文件格式都算是表示层协议

会话层:。。。

传输层:负责主机两个进程的通信,传输单位是报文段或用户数据报,主要协议:TCP/UDP

》功能:可靠/不可靠传输、差错控制(数据传输出错怎么办)、流量控制、复用分用(使用端口号区分数据报的目的程序)

网络层:将数据从源发送到目标端,IP、IPX、ICMP、ARP等协议

》功能:路由选择、流量控制、差错控制、拥塞控制(流量控制是针对某端口的,而拥塞控制是针对整个网络的宏观控制)

数据链路层:将网络层传下来的数据报组装成帧

》功能:定义帧的开始和结束(一堆01中哪些是开始哪些是结束)、差错控制(帧错、位错等)

物理层

解决如何在连接各种计算机的传输媒体上传输“数据比特流”,功能是确定传输媒体接口有关的特性,例如接口形状、引脚数目、电压范围、传输速率等

单工通信:只有一条信道,且信息只能单向传输

半双工通信:只有一条信道,但通信双方都可以发送和接收信息,同一时刻只能单向流动

全双工通信:两条信道,双向同时通信

什么是码元?高低电平可以表示1和0,高低电平就是两个码元,但我可以直接使用电压表示更多的数,例如0-3v表示01,3-6v表示11,6-9v表示10,9-12v表示00。那么这里一个有四个码元,一个码元就能表示两位数了,一次就能传输更多的数据。

香农定理可以计算出信道在有噪声的情况下数据传输速率的上限。

基带信号和宽带信号:将信号调制为数字信号进行传输就是基带信号,如果是在模拟信道上传输就是宽带信号。近距离一般使用基带传输,远距离使用宽带传输(不是数字信号更适合远距离传输吗?)

编码/解码:数据转换为数字信号

调制/解调:数据转换为模拟信号

报文交换和分组交换:数据在发送途中会经历很多的路由设备,某设备在接收到数据后先将数据存储起来然后排队转发,对报文大小没有限制就是报文交换,有限制就是分组交换(将原来一个大的报文分割成小报文并行发送)。之所以要限制是因为路由设备的容量是有限的

分组交换将源报文切割后还需要进行编号,避免乱序

这两种交换方式典型特征是数据在某路由器的下一跳在哪是不一定的(即使是同一台目的主机,因为有些路由器可能突然比较忙,就需要绕道),与之对应的就是电路交换,它会先确定一条完整的线路。

中继器:信号在传输时会出现损耗,中继器就是对信号进行强化还原

集线器:也叫多口中继器,将输入信号还原后发给其他所有的端口,跟总线一样,把所有设备连接在一起

一个集线器连接的所有设备构成一个冲突域,即任意时刻只能有一台主机能够发送信息

数据链路层

将数据封装成帧并透明传输

封装成帧:将原本的数据头和尾加上帧边界符

透明传输:要发送的数据内容不会影响传输过程,即数据对数据链路层是透明的(例如假设数据中包含了帧边界符的比特码应该有相应的处理方式)

如何做到透明传输?

  1. 字符计数法:以一个数字开头记录一帧的长度,但如果一个长度记录错误后面的全错
  2. 字符填充法:以特定字符标记帧起始和开始位置,数据中出现的边界符前加转义字符
  3. 零比特填充法:。。。
  4. 违规编码法:每个码元都有自己的编码方式,但有些编码方式没有码元用到,就可以用这些编码作为边界符

检错:

  1. 奇偶校验:在数据后添加一位记录数据中1是奇数还是偶数
  2. CRC循环冗余码:常用

纠错:

不仅要发现有错,还得知道哪里错,并且能纠正错误

纠错可以使用海明码

海明距离:两个二进制数不同位数称之为这两个码字海明距离,多个二进制中,两两海明距离中最小的那个海明距离就是这个编码集的海明距离

海明码的基本思想就是将接收到的数据每k个二进制数切分成n组,然后对每一组进行分类,每组都可能对应多个类别。当某数据位出错后,根据出错的那些类别的交集就能定位到出错的位置。

流量控制:避免发送端发送过快。链路层和传输层都有流量控制,但链路层控制流量的方式为接收方收不下就不回复确认,而传输层则会给发送端一个窗口公告(接收方告诉发送方应该发送多少数据)

流量控制方法:

  1. 停止-等待协议,收到确认信息后才发下一个帧,否则超时重发,重收丢弃
  2. 滑动窗口协议

滑动窗口协议又分为:

  1. 后退N帧协议:发送方维护一个发送窗口,同时将发送窗口的数据发送出去,接收方接收数据后,返回一个成功接收的最大窗口数(累计确认),例如发送端发送了 1,2,3,4,5 五个数,接收端只接收到1,2,3,5(注:发送的数据都是带递增序号的),它就会返回3,发送端就会从4开始发送数据,例如 4,5,6,7,8(4,5会被重新发送),窗口最右边的帧成功发送后,窗口向右移动一位
  2. 选择重传协议:后退N帧协议存在批量重传的问题,即某一位传输出错,起后面的都重新传(后退N帧协议可以看作是接收方窗口长度为1 的选择重传协议)。解决方法是在接收方维护一个同样大小的窗口,每次只接收窗口内的帧序号,窗口最左边确认接收到帧后就向后移动

滑动窗口的不能太大,例如帧的序号最多只能为n,如果窗口过大(一定小于n),则可能出现例如0号帧被正确接收后,接收方的窗口向后移动,最右边又出现序号0,接收方向发送方返回0的确认消息,但如果该确认消息丢失,发送方会重新发送0序号帧,接收方接收0序号帧就会当作最右边那个0序号的帧数据了,后退N帧协议同理,只不过它的滑动窗口长度为1

介质访问控制:只有一条线如何满足多台主机间的通信?

三个方式:多路复用(给各主机分配时间切片)、随机访问MAC协议(所有主机想发就发,可能出现冲突,出现冲突重发)、轮询访问MAC协议(不断轮询所有主机是否要发送数据)

以太网:

每个网卡上都有一个全球唯一的mac地址,mac地址是物理地址,ip地址是逻辑地址,ip地址会转换为mac地址

传统局域网的局限性:1)缺乏流量隔离,局域网可能使用广播通信(ARP、RIP、DHCP等协议)2)管理用户不方便,如果主机在不同组间移动,需要修改布线。3)局域网内使用多个路由器成本高

VLAN(虚拟局域网)用于解决上述问题:将局域网内的设备划分为多个与物理位置无关的逻辑组,每个VLAN是一个单独的子网

VLAN的创建和原理:可以使用带有VLAN功能的交换机划分VLAN,即交换机有多个端口,可以将其中部分端口单独划分为一个子网,交换机内部会维护一张转发表(每个主机连接在哪个端口下)和一个VLAN表,每个端口对应于哪个VLAN,数据在发送时先根据转发表找到目标主机所在的交换机端口,然后根据该端口查找VLAN表判断是否在同一VLAN下,如果不在则发送失败。

注意:既然是逻辑子网,那么不同交换机下的主机也是可以分配到同一个子网下的。交换机之间的通信数据还会包含一个VLAN标记,用于判断在哪个子网

多个局域网连接组成广域网,主要使用PPP协议

网桥和交换机:集线器会将数据转发给所有端口,而网桥会根据数据包中的目的mac地址选择转发给那个端口,网桥是交换机的前身,区别在于网桥只有两个口,而交换机有多个口

网桥/交换机怎么知道mac地址对应哪个端口?

  1. 透明网桥(自学习转发表):每个网桥维护一张转发表,最开始是空的,当有转发请求时,它会先查询表,如果表中没有记录,就会转发给所有端口,并记录下这个发送主机mac和接收端口,下次如果数据发送给该主机时就可以直接找到端口了。
  2. 源路由网桥:网桥会先通过试探的方式找到最佳路径

网络层

提供主机与主机之间的通信,主要设备就是路由器,路由器主要功能是 分组的转发(路由器内) 和 路由选择(路由器间)及拥塞控制

分组和数据报:数据报较大,切分为多个分组

转发:对单个路由器来说,数据从一个端口进来应该从哪个端口出去

路由选择:对多个路由器来说,如何找到一条最优路径

SDN:一种新型的路由选择方法,传统的路由选择方法是路由器之间自己沟通协调找到最优路径,而SDN则相当于将路由选择方法单独抽取出来在一台服务器上运行,由这个服务器决策最佳路由选择路径,然后分发给各路由器,该服务器会维护一个网络的拓扑图,此时就能通过写程序控制路由选择过程

路由器会维护一张路由表(AKA 转发表),用于记录ip、子网掩码和端口的对应关系,如何生成和维护这张表呢?

  1. 静态路由算法:管理员手动配置
  2. 动态路由算法:路由器之间自动通信,并自动优化转发表

动态路由又分为:

  1. 链路状态路由算法 OSPF:每台路由器都掌握完整的网络拓扑信息
  2. 距离向量路由算法 RIP:只掌握邻居的状态信息

不同的路由协议创建的路由表是不一样的

层次路由:有些网络内部使用RIP协议,有些使用OSPF协议,有些使用其他私有协议,如何将这些网络又连接成一个大网络呢?就需要使用特定的路由器将它们连接起来,而这些特定的路由器和内部网络使用的路由器的区别在于,它使用的是外部网关协议 BGP

IP数据报文格式

当一个分组过大时(超过MTU值),就需要进行分片(可以对分组设置禁止分片),也就是将一个IP数据报拆分为多个数据报进行传输,拆分后的数据报会通过标识、标志、片偏移进行重新组合。

IP地址

数据传输分为两个部分:目的主机在哪个网络?是网络中的哪台主机?

为了达到仅使用一个ip地址就能得到上述两个信息的目的,需要对IP地址进行不同形式地解读,解读方法主要有三种:网络地址分类、子网划分、无分类编址CIDR

网络地址分类:

每个IP地址可以拆分为:网络号 + 主机号

例如:192.168.1.2中,192.168.1就可以是网络号,最后的2表示主机号

IP地址可以分为 A、B、C三类,它们的区别在于网络号长度不同,用于适用不同规模的网络

一些特殊的地址:

  1. 全0:表示本机地址
  2. 全1:本网广播地址
  3. 网络号+全0:表示一个网络
  4. 127.*:回环地址,可以作为源地址或目的地址,但不会走真正的网络

网络地址转换NAT

NAT是路由器上的一个软件,用于将内网中主机的端口号映射到路由器的公网端口上,这种路由器上之上又一个有效的外部全球IP地址

子网划分:

上述方法将ip地址拆分为网络号和主机号,仍然不够灵活,例如对于某网络,可能B类地址主机数太多,但实际用不了那么多,而C类又太少,为避免浪费,可以将主机号进一步进行划分,则:

ip地址 = 网络号 + 子网号 + 主机号

从外部网络来看,该ip仍然是网络号加主机号的方式,子网划分只是内网自己的事情

子网掩码:

网络号和子网号使用1表示,主机号使用0表示,

网络地址分类(ABC)可以看作是特殊的子网划分情况。

无分类编址CIDR:

ip地址分类将ip地址分为 网络号+主机号,而子网划分仍然是在已分类网络下添加了一个子网号,而CIDR则是之间丢去ip地址分类的做法,将网络号加主机号合并为一整个网络号。

写法为:128.14.32.0/20

ARP协议

数据报在发送前,需要封装源主机和目的主机的ip地址和mac地址,ip地址负责多网络间的传输,mac地址负责网络内部的传输,那么我应该如何才能知道目的主机的mac地址呢?

每个主机和路由器都会有一个ARP高速缓存,存的是所在子网内部的ip地址与mac地址的映射。如果源主机的ARP缓存没有目的主机的mac地址:

  1. 如果在同一网段,它就会向所在子网广播一条ARP消息,如果目的主机在子网内,则会直接告诉源主机自己的mac地址,源主机会将其保存在ARP缓存中,
  2. 如果不在同一网段,则目的主机的mac地址填写网关的mac地址(下一跳的地址),如果不知道网关地址,则使用1中的方法广播查询

DHCP协议

主机获取IP的方式:手动配置和自动配置(DHCP)

DHCP使用 客户/服务端 的结构,两者通过基于UDP的广播方式进行通讯,它是应用层协议

流程:

  1. 主机向子网内广播:有没有DHCP服务器
  2. DHCP收到询问后广播一条包含ip地址的配置信息(假如此时有多个主机请求ip地址,则谁先收到该消息谁就获取该配置)
  3. 主机收到配置信息后广播确认收到信息
  4. DHCP收到确认信息后广播确认信息(有可能第2步广播的ip没人用,则该ip还得收回)

ICMP协议

基于ip地址,用于发送一个ICMP报文,用于差错或异常的报告或者网络探寻

ICMP差错报文分为:

  1. 终点不可达:路由器收到报文后发现无法交付给终点,就返回这个
  2. 网络拥塞:路由器由于拥塞丢掉了该报文,就向源主机返回这个
  3. 超时:报文的TTL=0则丢弃并返回这个,每个报文都有TTL,每经过一跳TTL减一
  4. 参数有问题:报文头信息错误
  5. 重定向路由:告诉主机下次别找我了,找另一个路由器

询问报文:

  1. 回送请求和回答报文:测试目的站是否可达,如ping
  2. 时间戳请求回答报文,用于时钟同步

ICMP的应用有 ping(询问报文) 和 traceroute(差错报文)

traceroute原理:

为了测算源主机到目的主机的距离,源主机生成多个不同TTL的数据报文,这些报文走到TTL为0时的路由器就会返回,从而得到两端之间各网络节点状态

IPv6

过渡方式

  1. 一台主机或路由器同时启用ipv4和ipv6协议栈,这样一来它就同时又两个地址
  2. 隧道技术:将ipv4或ipv6数据报封装成另一种数据报格式

路由选择协议:RIP和OSPF协议

RIP协议(距离向量算法):

路由器的路由表中会记录当前路由器到达目标网络所需要的最小跳数(作为距离)和下一跳的路由器地址。那么这些信息怎么来呢?

相邻路由器会每30秒交换一次路由表,如果没收到邻居的信息,则会在自己的路由表中将该邻居设为不可达。经过若干次更新后,每个路由器中的路由表就会达到收敛的状态,每个路由器就会知道到达该网络中任意目标主机的距离和下一跳地址。这也限制了使用RIP协议的网络不能太大。(如果路由表都比较大,并不会同步整个路由表,而是最多同步25条记录)

开放最短路径优先OSPF协议(使用Dijkstra算法计算最短路径):

当网络链路发生变化时(添加删除路由等),每个路由器向网络内所有路由器广播(仍然向邻居路由发送,邻居路由器又会向它的邻居发送,达到广播的目的,又叫泛洪发送)自己的状态(邻居路由、链路代价等,这里的代价可以设置为费用、时延等各种信息),最终每台路由器都能根据Dijkstra算法计算出完整的数据链路图。

OSPF协议可以分区域,所以它可以适用于较大型的网络

BGP协议(基于TCP连接,属于应用层协议):

AS表示内部网络组成的一个自治系统,自治系统内部使用RIP或OSPF协议,BGP为外部网络协议

广播 vs 组播(多播)

广播将数据报复制多份发给网络内所有主机,组播有选择性地发给多台主机,并且数据报不会在一开始就复制,而是快到终点了才复制

例如直播中,同一个主播的观众就能使用组播发送,组播或广播需要受支持的路由器

每个主机可以同时拥有ip地址和组播地址,多主机可以拥有同样的组播地址,表示同一个组,组播地址可以作为目的地址,不能作为源地址

广播的mac地址全为f,组播的mac地址为 01-00-5E 开头

IGMP协议:让路由器知道本局域网内是否有主机参与或退出了某个组播组

移动ip:固定的ip在不同网段之间漫游,如何保证该ip代表的主机在漫游过程中的权限不会发生改变?

假如某固定ip设备从网络A移动到网络B,则会通过主动或被动的方式获取网络B的“外部代理地址”,由外部代理地址发送消息给网络A “该设备已经到我这了”,网络A收到该消息后就会创建一个隧道,任何发送给该设备的数据都会经过该隧道发给网络B的外部代理地址,然后由它转发给设备。如果设备又转移到其他网络中,其他网络的外部代理也会走这个流程。

传输层

提供不同主机间的进程通信,故只有主机才有的层次,路由器啥的都没有,主要是TCP/UDP协议

通过端口号(区别于交换机的物理端口,这里说的是逻辑端口)区分进程。

UDP:1)无连接 2)不可靠 3)面向报文(数据报文不会在网络层分片)4)无拥塞控制,适合实时应用,例如网络电话,视频通信 5)UDP首部开销小

如果数据到达目的主机无法根据端口号找到对应进程,就会丢掉该报文并给发送方返回ICMP“端口不可达”的差错报告报文

TCP:1)面向连接(数据传输前需要建立连接,结束后需关闭连接) 2)有序不丢不重 3)全双工通信 4)面向字节流(将整个待发送的数据看成一连串无结构的字节流,要打包封装时也只是截取一段打包,但不会根据字节流的内容截取,比如我有一句话需要传输,它在截取时并不会考虑分词句子等情况,而是任意从中间截断打包)5)TCP的发送方和接收方都有一个缓存区域

TCP连接管理:建立连接 -> 数据传输 -> 连接释放

建立连接:三次握手

其中,SYN或ACK是TCP报文帧格式的头部中的信息

可以看到,当服务器收到握手请求后会分配缓存空间,也就是会消耗服务器资源,假如有人一直发送握手请求,就会对服务器发起洪泛攻击,解决方法有 1)使用单独的服务器处理握手请求,只有连接建立成功后才转移到真正的服务器。2)对长时间不返回确认信息的客户端ip限制。3)设置连接超时时间。4)在ROUND 2阶段不创建缓存,而是创建一个与客户端发送的头信息相关的cookie,当ROUND 3完成后再找到这个cookie再创建缓存等

四次挥手(以客户端申请结束为例):

  1. 客户端发送关闭连接请求 FIN=1,seq=u
  2. 服务器返回确认报文 ACK=1,seq=v,ack=u+1,此时服务器可以继续传送未传完的数据
  3. 服务端发完数据,也发送关闭请求 FIN=1,ACK=1,seq=w,ack=u+1
  4. 客户端返回确认报文,等待计时器设置的最长报文寿命后,连接关闭 ACK=1,seq=u+1,ack=w+1。为什么要等一会?因为如果服务端没有收到确认报文,服务端还可以在这段时间内再次发送一个关闭连接的请求报文

TCP的可靠传输:接收方收到的和发送方发送的保证一致

手段:

  1. 校验:在报文头部增加校验位
  2. 序号:接收方收到数据报文后会返回确认信息,确认信息中会包含目前收到的从头开始的 连续序列 最大序号,1,2,3,5,的最大序号为3
  3. 确认
  4. 重传:如果超时没有收到确认,就重传。另外还有快速重传机制:假如接收方已经接收了 1,2,3号报文,此时预计需要接收4号报文,但却收到了5号报文,在返回5号的确认信息时,附带上3号的确认信息,如果后续又收到6号报文,则返回6号的确认信息同时,带上3号的确认信息,当连续三次都带有3号的确认信息时,发送方就判断4号报文丢失,就会重新发送4号。这种方法称作冗余ACK。

TCP的流量控制:让发送方慢点

TCP利用滑动窗口来实现流量控制:核心思想是每次接收方返回确认信息时都会附加上自己目前缓存容量,发送方根据该值调整发送窗口大小,发送方不一定要一次就发送整个窗口大小的数据,它可以分多次发送,接收方只需要适时返回一次确认信息即可。接收方可以返回窗口大小为0,意味着发送方暂停发送,接收方有可用缓存后会主动给发送方发送新的窗口大小。如果新发送的信息丢失,则两端都会陷入等待。此时发送方在接收到0窗口数据报后会有一个计时器,计时器到点后,发送方会主动发送一个探测报文,接收方收到探测报文后会返回目前窗口大小。

TCP的拥塞控制:防止过多的数据注入到网络中,具有全局性,不同于流量控制,当有多个发送方给一个接收方发送数据时,由于中间网络节点的性能限制,使得数据传输较慢,但接收方此时并不知道是哪个发送方较慢,或者说正是由于大家一起发数据才导致整体较慢,而流量控制是通过点对点的控制,接收方是知道谁慢的。另一种角度来看,流量控制是由于接收方处理性能决定的,而拥塞控制是由于中间网络节点的性能决定的。

接收窗口:接收方告知发送方的,目前接收方的接收容量

拥塞窗口:发送方通过估算网络拥塞的情况,自己设置的窗口值

真正的发送窗口大小取两者的最小值

策略:

  1. 慢开始 + 拥塞避免:一开始发送方将发送窗口(拥塞窗口)设置为1,收到确认信息后,如果网络没有拥塞,则将窗口长度翻倍,此为慢开始。多次翻倍后到达一个阈值,就不再翻倍,而是窗口长度加1,此为拥塞避免。一直加加加,知道网络真正出现拥塞后,发送方会将发送窗口重新设置为1,重复上述过程,并将翻倍阈值设置为上次出现拥塞时窗口的一半大小。
  2. 快重传 + 快恢复:即上面说过的快速重传,连续收到3个重复的冗余ACK就会立即执行重传。如果出现快重传,则说明可能出现了拥塞,此时不需要像慢开始那样将发送窗口置为1,而是之间置为当前窗口的一半,后续也只是加一。

这两组策略组合使用,整体使用慢开始和拥塞避免算法,当遇到快重传的场景时就使用快重传和快恢复算法。

应用层

DNS:

查询流程:dns请求 -> 本地域名服务器(有就返回,没有往下走) -> 根域名服务器(记录 .com .cool 等顶级域名服务器地址) -> 顶级域名服务器(记录 woyou.cool baidu.com 等二级域名服务器地址) -> 权限域名服务器(负责一个区的域名服务器,例如stream.woyou.cool a.stream.woyou.cool虽然后一个是前一个的子域名,但它们可能是两个区,如果是两个区的话那它们就是对等关系,一个权限域名服务器只能负责一个区。如何分区是人为划分的)

查询方式:

  1. 递归查询(转发):一级一级向下查询,然后一级一级向上返回
  2. 迭代查询(重定向):本地域名服务器查询根域名服务器,根域名服务器返回顶级域名服务器地址,再由本地域名服务器去发起请求。注意,仍然是由本地域名服务器而不是主机去发送查询请求的。

FTP:

C/S架构,提供文件的是FTP服务器,下载文件的是FTP客户机

使用TCP协议保证可靠传输

电子邮件:

SMTP负责发,POP3/IMAP负责读

HTTP:

URL不区分大小写

非持久连接情况下(Connection=close),一个http请求就是一个tcp连接

持久连接情况下(Connection=keep-alive),建立了三次握手后就能多次发送请求和响应了

在http1.1中,单个TCP连接在某时刻只能处理一个请求,且必须等上一个请求收到响应后才能发送下一个请求。

而使用了管线化技术后,可以同时发送多个请求,但这种管线化技术在很多情况下受限

在http2.0中引入了多路复用的技术实现管线化技术的效果。将多个请求合并为一个请求通过一个TCP连接进行发送。

Leave a Comment