朝花夕拾——《网络是怎样连接的》

注:本文基于《网络是怎样连接的》一书。

背景:毕业4年了,很多当初在学校学的计算机网络知识都忘了,此文为工作几年后的一次再回顾、思考和梳理,以供后续查阅。

一、IP 地址


注意:IP 跟 IP 地址不是一个概念,IP 是 Internet Protocol,是一个协议,而 IP 地址 Internet Protocol Address,是 IP 中的一个概念。

但有时候有些场景,会习惯直接说 IP,其实指的是 IP 地址。知道就好。(网络这个领域很多名词都是使用混乱的)

1、IP 地址的表示

IP地址(Internet Protocol Address)是由32位二进制位组成的 xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx。

如果按每8位为一组,转换成十进制的话,可以写成由三个句点分隔的4位数字的形式,即点分十进制表示法:例如192.168.0.1。

所以,IP地址只有32位,满打满算42.9亿个地址

2、IP 地址的作用

IP地址有两个主要功能:

  • 标识设备(IP 地址是网络设备的逻辑地址,以此来屏蔽物理地址(即 MAC 地址))
  • 网络寻址

3、查看我的 IP 地址

(1)私网 IP

① 命令行

以 linux(CentOS)为例:

  • 方法一:ifconfig
  • 方法二:ip addr

linux的ip命令和ifconfig命令类似,但前者功能更强大,并旨在取代后者。

扫描二维码关注公众号,回复: 11189283 查看本文章

ifconfig是net-tools中已被废弃使用的一个命令,许多年前就已经没有维护了。


② OS GUI

以 MAC 为例,打开 设置 -> 网络:

(2)公网 IP

上面看到的 IP 其实都是私网 IP(跟现实中大量使用 NAT 有关,下面会介绍),公网 IP 则需要通过别的方法:

4、IP 地址的编址方式

(1)最早

一开始,32位的IPv4地址只由8位的网络地址和“剩下的”24位的主机位。

这种格式用在局域网出现之前。在那时,只有一些很少很大的的网络,例如 ARPANET。

IP地址 = 网络地址 + 主机地址

问:为什么要分网络地址和主机地址?

是因为网关(路由设备)当中有一张路由表,该路由表记录了所有ip地址的位置,这样就可以进行包的转发了,如果我们不区分网络地址,那么这张路由表当中就要保存有所有IP地址的方向,这张路由表就会很大。而有了网络地址,就可以限定拥有相同网络地址的终端都在同一个范围内,那么路由表只需要维护这个网络地址的方向,就可以找到相应的终端了。

所以,我们把网络号相同的主机称之为本地网络主机,网络号不相同的主机称之为远程网络主机。本地网络中的主机可以直接相互通信;远程网络中的主机要相互通信必须通过本地网关来传递转发数据。

(2)[拓展] 网关

网关(Gateway)在网络层以上实现网络互连,是复杂的网络互连设备。

网关地址实质上是一个网络通向其他网络的IP地址。

网关设备有:

  • 路由器(在消费领域,日常用的路由器=网关)
  • 启用了路由协议的服务器(实质上相当于一台路由器)
  • 代理服务器(也相当于一台路由器)
(3)分类划分(有类网络)

① A类IP地址 —— 非常大的网络

一个A类IP地址是指,在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。

只有 126 个组织可以分配 A 类网络地址,每个组织都可以为 16,000,000 台主机提供地址。

A 类地址适合那些特大型的公司/组织或政府部门。例如,通用电气公司拥有 3.0.0.0/8,苹果电脑公司拥有 17.0.0.0/8,美国邮政总局拥有 56.0.0.0/8。(几乎现在所有的A类地址都在美国)


② B类IP地址 —— 数量较多规模中等的网络

一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码,剩下的两段号码为本地计算机的号码。

最多 16,384 个组织可以分配 B 类网络地址,每个网络可以支持 65,534 台主机。


③ C类IP地址 —— 为数众多的小网络

一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。

C类网络地址数量较多,有200多万个,适用于小规模的局域网络,每个网络最多只能包含254台计算机。


④ D类IP地址 —— 用于组播

D类地址不分网络地址和主机地址,其IP地址前8位以“1110”开始,它是一个专门保留的地址。


⑤ E类IP地址 —— 用于研究和实验之用

E类地址不分网络地址和主机地址,其IP地址前8位以“1111”开始,它是一个专门保留的地址。


⑥ 总结

区分的ABCDE类的IP地址的办法就是根据第一个8位组来判断

  • A类网络的IP地址范围为:1.0.0.1~127.255.255.254
  • B类网络的IP地址范围为:128.0.0.1~191.255.255.254
  • C类网络的IP地址范围为:192.0.0.1~223.255.255.254
  • D类网络的IP地址范围为:224.0.0.0~239.255.255.255
  • E类网络的IP地址范围为:240.0.0.0~247.255.255.255

可以看到 ABCDE 类的 IP 地址范围并不是完全覆盖 0.0.0.0 ~ 255.255.255.255。因为被保留 IP 地址占用了。


⑦ 保留地址

保留地址有很多,下面只列出一些常见的:

  • 全零(“0.0.0.0”),严格说来,已经不是一个真正意义上的IP地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。对本机来说,它就是一个“收容所”,所有不认识的“三无”人员,一律送进去。
  • 全“1”的IP地址(“255.255.255.255”),是当前子网的广播地址,不能被路由器转发。

  • A 类中的 127.0.0.1,本机地址,主要用于测试。用汉语表示,就是“我自己”,还有一个别名“Localhost”。无论什么程序,一旦使用回送地址发送数据,协议软件立即返回之,不进行任何网络传输。
  • B 类中的 169.254.X.X,如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器,就会得到其中一个IP。

  • 私有地址:在本地局域网上的IP,不会被Internet(公网)分配的:
    • A类中:10.0.0.0~10.255.255.255
    • B类中:172.16.0.0~172.31.255.255
    • C类中:192.168.0.0~192.168.255.255

更多保留地址可参考:https://zh.m.wikipedia.org/zh-hans/保留IP地址


⑩ 缺点

分类划分的主要缺点是,不能灵活随意的划分网络号和主机号,这会导致几个问题:

  • 1、IP地址分配上的“贫富不均”

对于主机地址有很多的 A 类地址,自然是抢手货,但因为 IP 地址的分配机构掌握在美国手里,这样,像麻省理工学院、AT&T等机构,一下子就把A类地址瓜分殆尽,而当因特网在全世界发展起来以后,其他国家只能申请 B类、C类地址。现在(听说)整个中国连一个A类地址都没有,B类地址估计也只有十多个。

  • 2、浪费和不够用

”富人“得到了,却有很多主机地址用不完;”穷人“得到了,但主机地址却不够用。旱的旱死,涝的涝死。


所以,分类划分是一个历史概念, 在现在已经失去了意义。(接下来会介绍改进他的新办法)

问:如何解决有类网络的不灵活 —— 子网掩码

① 作用

上面提到 分类划分 的缺点是,不能灵活随意的划分网络号和主机号,而子网掩码正是要解决这个问题。

即子网掩码只有一个作用,就是将某个IP地址划分出网络地址和主机地址两部分。

子网掩码需要搭配 IP 地址一起出现才有意义。


② 原理

注意:子网掩码是一串与 IP 地址长度相同的 32 比特数字,其左边一部分都是 1,右边一部分都是0。

③ 有类网络 结合 子网掩码

即每类地址都具有默认的子网掩码:

  • 对于A类为255.0.0.0
  • 对于B类为255.255.0.0
  • 对于C类为255.255.255.0
(4) 无分类划分(无类网络) —— CIDR/VLSM

① VLSM 与 CIDR 对比

1、介绍

  • VLSM(Variable Length Subnet Mask,可变长子网掩码)
  • CIDR (Classless Inter-Domain Routing,无类别域间路由)

2、原理

采用借位的方法。

  • 在使用VLSM划分子网时,即分成几个小型网络(子网),是将原来有类IP地址中的主机位按照需要划出一部分作为网络位使用。

    即:IP 地址= 网络号 + 子网号 + 主机号

  • 在使用CIDR聚合地址时,即合成一个大的网络(超网),是将原来有类IP地址中的网络位划出一部分作为主机位使用。

在某种程度上来说,VLSM 和 CIDR 之间可以看做是逆过程


3、无类网络 结合 子网掩码

  • VLSM:子网掩码往右边移,掩码增长了。
  • CIDR:子网掩码往左边移,掩码缩短了。

[拓展] 斜线记法

又称 “CIDR 记法”,即在IP地址后面加上一个斜线“/”,然后写上网络前缀所占的比特数,即子网掩码二进制表示法中,连续的 1 的 个数。

如 192.168.0.0/24,24 表示子网掩码为:11111111·11111111·11111111·00000000,即 255.255.255.0。

这样的写法比直接写子网掩码要简洁。

推荐一个已知 CIDR 记法 ,算出可用 IP 范围的计算器:https://www.ipaddressguide.com/cidr


4、好处

  • VLSM:解决了有类网络不能灵活随意的划分网络号和主机号的问题。
  • CIDR:让路由器的路由条目得到有效的减少,降低路由器负担。
(5)[拓展] DHCP

DHCP(Dynamic Host Configuration Protocol, 动态主机配置协议)指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。同时服务器会自动配置网关和 DNS 服务器地址。

DHCP(协议)采用的是C/S模型。

好处:如果我们手动分配IP地址,电脑多了,很多可能会分到重复的IP地址,改起来就麻烦了。但 DHCP 服务器可以集中管理,还能动态分配,保证网络的稳定性。

实际生活:在路由器设置中,有专门 DHCP 服务器的设置,默认是开启的。

5、ip 地址枯竭

(1)IP 如何分配

IP地址是由互联网号码分配局(英语:Internet Assigned Numbers Authority,简称:IANA)以及其他5个区域互联网注册管理机构(英语:Regional Internet Registry,简称:RIR)在其指定区域内分配给本地Internet注册表,例如网络服务提供商(英语:Internet Service Providers,简称:ISP)和其他最终用户。

(2)IP 是怎样的稀缺

(3)如何解决? —— NAT

除了 IPv4 本身在最初设计的时候,总量就是偏少的以外。虽然后来无类网络的诞生,部分缓解了 IPv4 地址稀缺的问题,但是还不够,于是,我们需要更好的解决方案……

NAT(Network Address Translation,网络地址转换)是一种在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术。

原理:

通过映射表。如果是一对一转换,那压根节省不了IPv4地址空间;所以一般NAT都是一对多的,即一个公网IPv4映射多个私网IPv4。

好处:

  • 解决了IP地址不足
  • 避免来自网络外部的攻击,隐藏并保护网络内部的计算机
  • 宽带分享

坏处:

  • 让主机之间的通信变得复杂,导致了通信效率的降低。
  • 没有公网 IP(因国内公网 IP 很稀缺,所以普遍使用 NAT 技术,导致个人用户是没有公网 IP 的,且私网 IP 是动态的)
(4)如何解决? —— IPv6

NAT 是一个非常好的解决方案,但 IPv6 明显是一个更加拥抱未来的办法。

① 介绍

IPv6 形如:2001:0db8:85a3:08d3:1319:8a2e:0370:7344

由两个逻辑部分组成:一个64位的网络前缀和一个64位的主机地址。

② 好处

1、主要就是数量多

  • IPv4 有2的32次方,也就是约42.9亿个。
  • IPV6 有2的128次方(可以给地球上每一颗沙子都分配一个IP)。

    应用场景:

    • 物联网
    • 实现真正的网络实名制

2、IPv6具有更高的安全性通过IPv6协议的安全机制
3、IPV6传输速度更快IPv6的地址分配一开始就遵循聚类的原则,这大大减小了路由器中路由表的长度
4、IPv6加入了对自动配置的支持这是对DHCP协议的改进和扩展
5、IPv6拥有更好的头部格式IPV6使用新的头部格式,其选项与基本头部分开,这简化和加速了路由选择过程,提高了效率


③ 发展情况

国外:

在2019年12月,通过IPv6使用Google服务的用户百分率首次超过30%。

国内:
工信部发布了《工业和信息化部关于开展2020年IPv6端到端贯通能力提升专项行动的通知》,通知中明确了2020年IPv6发展的三大目标、七项任务和四项保障措施。
……
发展基于IPv6的下一代互联网,也为5G、数据中心等新型基础设施建设奠定基础,更为未来发展大规模的物联网、工业互联网开拓网络空间,搭建基础环境。


④ 阻碍

  • 对运营商和ISP来说,也意味着很大的资金投入(例如更新老设备)
  • 影响某些公司卖公网 IP 的业务
  • NAT的普及,让人产生路径依赖,避免投入太大的成本

二、DNS


1、什么是 DNS

DNS: Domain Name System,域名服务系统,是将域名和IP地址相互映射的数据库。

DNS 的功能并不仅限于此,它还可以将邮件地址和邮件服务器进行关联,以及为各种信息关联相应的名称。

有域名,通过 DNS 查询对应 IP 地址的操作,称为域名解析

2、客户端 —— DNS 解析器

客户端通过 DNS 解析器(DNS resolver)向DNS服务器发出查询。

解析器实际上是一段程序,它包含在操作系统的 Socket 库中。

(1)[拓展] Socket 库

Socket 库可以让其他的应用程序调用操作系统的网络功能,用于调用网络功能的程序组件集合。而 DNS 解析器就是这个库中的其中一种程序组件。

(2)发送查询消息

来自客户端的查询消息包含以下 3 种信息。

(a)域名

服务器、邮件服务器(邮件地址中 @ 后面的部分)的名称

如 www.baidu.com

(b)Class

在最早设计 DNS 方案时,DNS 在互联网以外的其他网络中的应用也被考虑到了,而 Class 就是用来识别网络的信息。不过,如今除了互联网并没有其他的网络了,因此 Class 的值永远是代表互联网的 IN

(c)记录类型

表示域名对应何种类型的记录。

例如,当类型为 A 时,表示域名对应的是 IP 地址(A 是 Address 的缩写);当类型为 MX 时,表示域名对应的是邮件服务器。

就像 gmail.com 的 A 和 MX 对应的肯定不是同一个 IP 地址。

3、DNS 服务器

DNS 服务器会接受客户端发来的查询消息,然后从 域名与 IP 地址的对照表中查找相应的记录,并返回 IP 地址

(1)怎么存? —— 域名的层次结构

问题:互联网中的域名太多了,将这些信息全部保存在一台 DNS 服务器中是不可能的。

解决方案:将信息分布保存在多台 DNS 服务器中,这些 DNS 服务器相互接力配合,从而查找出要查询的信息。

问题:怎么分布保存?

解决方案:

第 ① 步:使用域名的层次结构。域名都是用句点来分隔的,越靠右的位置表示其层级越高

比如 www.nikkeibp.co.jp 这个域名, 最上层的 jp 代表分配给日本这个国家的域;下一层的 co 是日本国内进行分类的域,代表公司;再下层的 nikkeibp 就是分配给某个公司的域;最下层的 www 就是服务器的名称

注意:jp 的上面还有一级域,称为根域。根域不像 jp 那样有自己的名字,因此在一般书写域名时经常被省略,如果要明确表示根域,应该像 www.nikkeibp.co.jp.

WWW 是 World Wide Web的简称,译为万维网或全球网。它是 Web 的提出者最早开发的浏览器兼 HTML 编辑器的名字。现在已经成为惯例。

第 ② 步:每一层级(域)都由不同的 DNS 服务器去存储。

实际上, 一台 DNS 服务器可以存放多个域的信息。(这里为了交代清楚,不考虑这种情况了)

第 ③ 步:

首先,将负责管理下级域的 DNS 服务器的 IP 地址注册到它们的上级 DNS 服务器中,然后上级 DNS 服务器的 IP 地址再注册到 更上一级的 DNS 服务器中,以此类推。

这样,我们就可以通过上级 DNS 服务器查询出下级 DNS 服务器的 IP 地址,也就可以向下级 DNS 服务器发送查询请求了。

其次,将根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。 因此,客户端只要能够找到任意一台 DNS 服务器, 就可以通过它找到根域 DNS 服务器, 然后再一路顺藤摸瓜,找到位于下层的某台目标 DNS 服务器。

分配给根域 DNS 服务器 的 IP 地址在全世界仅有 13 个,而且这些地址几乎不发生变化,因此将这些地址保存在所有的 DNS 服务器中也并不是一件难事。实际上, 根域 DNS 服务器的相关信息已经包含在 DNS 服务器程序的配置文件中了,因 此只要安装了 DNS 服务器程序,这些信息也就被自动配置好了。

根域 DNS 服务器在运营上使用多台服务器来对应一个 IP 地址,因此尽管 IP 地址只有 13 个,但其实服务器的数量是很多的。

(2)[拓展] 为什么根域名 DNS 服务器只有 13 台 ?

IPv4中DNS协议使用的UDP数据包限制了最多只能有13台根服务器;(即:当时一个udp包是512字节,为了把13个都放进去,限制了13个而不是130个)

分布情况:美国拥有1台主根服务器,在其余的12台辅根服务器中,其中9台部署在美国,2台在欧洲(英国和瑞典),1台在亚洲(日本)。

隐患:

目前美国掌握着全球互联网13台域名根服务器中的10台。理论上,只要在根服务器上屏蔽该国家域名,就能让这个国家的国家顶级域名网站在网络上瞬间“消失”。在这个意义上,美国具有全球独一无二的制网权,有能力威慑他国的网络边疆和网络主权。譬如,伊拉克战争期间,在美国政府授意下,伊拉克顶级域名“.iq”的申请和解析工作被终止,所有网址以“.iq”为后缀的网站从互联网蒸发。

中国的防治措施:

CNNIC(中国互联网络信息中心)作为中国的域名管理机构,采取了以下的应对措施:

  • 1.CNNIC成立前,将.CN域名服务器从德国搬回中国,这是掌握国家域名主导权的前提。
  • 2.2003年,CNNIC开始推广 .CN域名。
  • 3.2006年,CNNIC开通五大顶级节点,实行备灾管理;对于.CN域名的网站就算全部国际线路中断,CNNIC也有应急措施保障其能够被正常访问。
  • 4.2006月12月,中国开通“根域名中国镜像服务器”,这意味着今后中国网民在访问任何以.COM和.NET为后缀的网站时不必再绕道美国,在本土即可完成访问请求。

到了IPv6,根服务器的数量终于可以突破13个的限制。

2017年11月28日,由下一代互联网国家工程中心牵头发起的“雪人计划”,已在全球完成25台IPv6 DNS根服务器架设,中国部署了其中的4台,由1台主根服务器和3台辅根服务器组成。

据说(只是据说),以前中国也是有DNS根服务器的,因为某墙的污染可能会导致其他国家的人无法正常的访问被中国封杀的网站,所以后续中国的根服务器被踢出了DNS服务器的信任名单。


再之后,根域名 DNS 服务器只有 13 台这个说法并不成立了,因为 DNS 根服务器利用任播技术,拓展到了更多节点。

至今(2020.2.15)在全球已经有1089个根域名服务器节点了,当前由12个组织负责运营,我们可以在https://root-servers.org/看到部署情况。(其中我国有26个根域名服务器节点)

(3)怎么找? —— 响应查询消息

问:最近 DNS 服务器本身的查找也很耗时,怎么办?

解决方案:通过缓存加快响应。

DNS 服务器中保存的信息都设置有一个有效期(TTL),当缓存中的信息超过有效期后,数据就会从缓存中删除。而且,在对查询进行响应时,DNS 服务器也会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的 DNS 服务器。

(4)本机配置 DNS 服务器

解决方案:尽量选大型的、离你近的 DNS 服务器。

实际生活(以 MAC 为例):

  • 首选:8.8.8.8(google 的)
  • 次选:114.114.114.114(国内最大的)

4、DNS 服务器 容易出现的问题

(1)DDoS 攻击

例如:

2010年1月12日,由于美国负责百度域名解析的根服务器遭到了DDoS 攻击,百度首页出现大面积的访问故障,全国绝大多数地区均无法访问百度网站。

(2)DNS 劫持

DNS劫持 就是通过劫持了 DNS 服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原 IP 地址转入到修改后的指定 IP,其结果就是对特定的网址不能访问或访问的是假网址。

例如:

输入一个错误或不存在的 URL 后,本应该出现404页面,而我们看到的却都是电信、联通等运营商的网址导航页面。

或者上面提到的 114.114.114.114 DNS 服务器,就提供无劫持和劫持两者类型:

  • 纯净 无劫持
    服务ip为:114.114.114.114 和 114.114.115.115

  • 拦截 钓鱼病毒木马网站 增强网银、证券、购物、游戏、隐私信息安全
    服务ip为:114.114.114.119 和 114.114.115.119

  • 学校或家长可选拦截 色情网站 保护少年儿童免受网络色情内容的毒害
    服务ip为:114.114.114.110 和 114.114.115.110

(3)DNS 污染

DNS污染是一种让一般用户由于得到虚假目标主机 IP 而不能与其通信的方法,是一种 DNS 缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的 DNS 查询没有任何认证机制,而且 DNS 查询通常基于的 UDP 是无连接不可靠的协议,因此 DNS 的查询非常容易被篡改,通过对 UDP 端口 53 上的 DNS 查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。

例如:

2014年1月21日,由于解析中国所有通用顶级域的根服务器出现DNS污染事件,百度、新浪、腾讯、京东等许多网站的在此次事件中均被劫持到65.49.2.178这个位于美国IP地址上,一度无法访问。

5、Hosts 文件

(1)什么是 Hosts 文件

在没有 DNS 的时代,是靠本地的 Hosts 文件 来维护 主机名(域名) 和 IP 地址 的对应关系。

后来有了 DNS,但 Hosts 文件依然还有作用:

  • 1、加快域名解析
  • 2、方便记忆。例如你有个远程服务器有 ip 却没买域名的、或者局域网内某个主机设备。
  • 3、自定义屏蔽或者中转某个网站
(2)怎么用?

以 mac 为例:

sudo vi /etc/hosts

内容如下(只写前三行,剩下的省略):

127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost

可以看到我们常用的 localhost 其实就是对应的 127.0.0.1。

三、TCP


TCP:传输控制协议(Transmission Control Protocol)

1、协议

(1)TCP 头

注意:

  • 仅当控制位 ACK=1 时 ACK号 才有效。

问:为什么需要源端口和目标端口?

答:即使你按照 ip 送达到了目的设备,但是同一台计算机上还跑着多个网络程序,每一个网络程序都对应着不同的端口。(例如你是给浏览器还是给QQ?)

(2)连接 —— 三次握手

注:A 为发起连接的客户端,B 为接收连接请求的服务器端。(下同)

步骤1、A 给 B 传

  • SYN = 1
  • 序号(随机,如1000)

步骤2、B 给 A 传

  • SYN = 1
  • ACK = 1
  • ACK号 = 1001(1000+1)
  • 序号(随机,如2000)

步骤3、A 给 B 传

  • ACK = 1
  • ACK号 = 2001(2000+1)
  • 序号(1001)
  • 可以携带要传的数据了

注:

  • 序号 为 发送方告知接收方该网络包发送的数据相当于所有发送数据的第几个字节
    • 为什么序号要随机,而不是 A 和 B 都从 1 开始?为了安全。
  • ACK号 为 接收方告知发送方接收方已经收到了所有数据的第几个字节。其中,ACK 是 acknowledge 的缩写
  • 控制位的 SYN(synchronize)是同步(序号)的意思,ACK(acknowledgement)是我已确认收到的意思。

问:为什么要三次握手才可以?

答:为了确认 A 和 B 双方同时具有发送和接受能力,即:

  • A 知道 B 的发送能力 —— 通过步骤2
  • A 知道 B 的接收能力 —— 通过步骤2
  • B 知道 A 的发送能力 —— 通过步骤1
  • B 知道 A 的接收能力 —— 通过步骤1

(3)收发数据

假设:A 给 B 发两次长度为 1000 的数据,且 A 序号从 40000 开始,B 序号 从 70000 开始。

步骤1、A 给 B 传

  • ACK = 1
  • ACK号 = 70000
  • 序号(40000)
  • 携带 1000 的数据

步骤2、B 给 A 传

  • ACK = 1
  • ACK号 = 41000(40000 + 1000)
  • 序号(70000)

步骤3、A 给 B 传

  • ACK = 1
  • ACK号 = 70001(70000+1)
  • 序号(41000)
  • 携带 1000 的数据

步骤4、B 给 A 传

  • ACK = 1
  • ACK号 = 42000(41000 + 1000)
  • 序号(70001)

注:

  • 即使 B 给 A 传的只是 ACK 包(不含数据),序号也是要 +1 的。
  • TCP 是全双工的,即 A 可以给 B 传,B 也可以给 A 传。
  • 发送方不需要告诉接收方数据的长度,接收方会自己算:网络包的长度减去头部的长度就等于数据的长度
(4)断开连接 —— 四次挥手

假设:A 给 B 主动发出断开连接的请求,且 A 序号从 80000 开始,B 序号 从 90000 开始。

步骤1、A 给 B 传

  • FIN = 1
  • ACK = 1
  • ACK号 = 90000
  • 序号(80000)

步骤2、B 给 A 传

  • ACK = 1
  • ACK号 = 80001(80000 + 1)
  • 序号(90000)

步骤3、假设 B 还有没发完的数据,需要再给 A 发 3 次,每次 1000

步骤4、B 给 A 传(B 发送完成,也要断开连接了)

  • FIN = 1
  • ACK = 1
  • ACK号 = 80004(80001 + 1 * 3)
  • 序号(93000)

步骤5、A 给 B 传

  • ACK = 1
  • ACK号 = 93001(90001 + 1000 * 3)
  • 序号(80004)

步骤6、B 收到 A 的 ACK 后 CLOSE,但是 A 得等到 2 倍的 MSL 时间才 CLOSE

A 给 B 发了 ACK 后,面临两种可能:

  • 1、B 收到了,但是 B 不会回应我,已经 close 了
  • 2、B 没收到,于是会重新给我发 FIN

于是 A 需要考虑这两种情况的总时间,即 发去的 ACK 时间和 发来的 FIN 时间,恰好等于 2 倍的 MSL(Maximum Segment Lifetime,报文最大生存时间)时间。(他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃)。

例如,这种方式可以防止 A close 后,又向 B 发起新的 TCP 连接,但是 B 没有关闭之前的旧连接,产生了脏连接。


问:为什么握手是三次,挥手是四次?

答:因为挥手得考虑 B 的数据有没有发完,所以多预留了一次。


问:必须是客户端主动断开连接吗?服务器端可以吗?

答:其实都可以。但一般都是数据发送完毕的一方会发起断开过程。

以 Web 为例, 浏览器向 Web 服务器 发送请求消息,Web 服务器再返回响应消息,这时收发数据的过程就全部结束了,服务器一方会发起断开过程。

(5)补充 —— ACK 号的等待时间 和 重发机制

返回 ACK 号的等待时间(这个等待时间叫超时时间)需要设为一个合适的值,不能太长也不能太短。

但因为网络情况复杂,波动大,所以将等待时间设置为一个固定值并不是一个好办法。 因此,TCP 采用了动态调整等待时间的方法,这个等待时间是根据 ACK 号返回所需的时间来判断的。 具体来说, TCP 会在发送数据的过程中持续测量 ACK 号的返回时间,如果 ACK 号返回变慢,则相应延长等待时间;相对地,如果 ACK 号马上就能返回,则相应缩短等待时间。

如果超过了等待时间,则会触发重发机制。这就是 TCP 可靠传输的保证。

因此,网卡、集线器、路由器都没有错误补偿机制,一旦检测到错误就直接丢弃相应的包。应用程序也是一样。

不过,如果发生网络中断、服务器宕机等问题,那么无论 TCP 怎样重传都不管用。 因此 TCP 会在尝试几次重传无效之后强制结束通信,并向应用程序报错。

(6)补充 —— 滑动窗口

每发送一个包就等待一个 ACK 号的方式是最简单也最容易理解的, 但在等待 ACK 号的这段时间中,如果什么都不做那实在太浪费了。

所谓滑动窗口,就是在发送一个包之后,不等待 ACK 号返回,而是直接发送后续的一系列包。这样一来,等待 ACK 号的这段时间就被有效利用起来了。

接收方有必要告诉发送方自己最多能接收多少数据,然后发送方根据这个值对数据发送操作进行控制(否则接收缓冲区中的数据就会越堆越多,最后就会溢出),这称为窗口大小

窗口大小是 TCP 调优参数中非常有名的一个。


2、具体实现

(1)Socket

Socket 的英文单词原意就是插座,翻译到中文就是套接字

Socket 可以指任何点对点的通信。例如:

  • 最早,施乐(Xerox)公司在开发以太网技术的时候就设计过一个叫 XNS 的协议,那里面就用到socket这个词了。
  • WebSocket,一个应用层上实现客户端-服务端全双工的协议。

所以,用 Socket 这个词的不仅仅只有 TCP/IP 协议,但,计算机网络的术语使用混乱和不严谨是有目共睹的,所以,还有另一种惯例,即 Sokcet 就是指 TCP/IP 协议栈(所提供的对外接口)。

这个接口,最有名的当属 Berkeley sockets

而下面的叙述,都以更常见的 Python 的 socket 模块为例。而 Python 的 socket 模块就是基于 Berkeley sockets。

(2)创建套接字

服务器端 / 客户端:

应用程序调用协议栈的 socket 方法创建套接字

本来套接字就只是一个概念而已,并不存在实体,如果一定要赋予它一个实体,我们可以说,在协议栈内部有一块内存空间,用于存放通信操作的控制信息(例如存了通信对象的 IP 地址、端口号、通信操作的进行状态等,便于协议栈根据这些信息判断下一步的行动),这些控制信息就是套接字的实体,或者说存放控制信息的内存空间就是套接字的实体。

对应的,操作系统的 netstat 命令支持显示套接字内容,-ano 选项表示下面的意思:

  • a 不仅显示正在通信的套接字,还显示包括尚未开始通信等状态的所有套接字
  • n 显示 IP 地址和端口号
  • o 显示使用该套接字的程序 PID

(3)连接阶段

① 服务器端

  • 应用程序调用协议栈的 bind 方法,参数为 ip(域名) 和 端口号(80/443 端口)
  • 再调用 listen 方法,参数即挂起的最大连接数量(用于TCP监听,有点像数据库连接池)
  • 再调用 accept 来接受客户端来的连接

listen 和 accept 的等待连接的机制如下:

问1:为什么多个客户端可以连接服务器的同一个端口

socket 的唯一标识并不仅仅是 port,而是 server ip + server port + client ip + client port。


② 客户端

应用程序调用协议栈的 connect 方法,参数为 ip(域名) 和 端口号。


问1:为什么客户端的端口很随意,但服务器的端口却是固定的 80?

答:

本来,早期的互联网存在过通过 DNS 服务器查询端口号的机制,只能说并没有广泛普及。

现在的规则,即端口号的规则是全球统一的,由 IANA(Internet Assigned Number Authority,互联网编号管理局)这一组织来统一管理的。规定了:

  • 端口号小于 1024 的是Internet标准服务的端口,端口号大于 1024 的,可以任意使用

但也要注意别跟常见的应用程序默认的端口重复,比如 Postgres 的端口是 5433。

  • 端口号小于 1024 里面,规定了 Web 是 80 号端口(HTTP)和 443 端口(HTTPS),电子邮件是 25 号端口等。

所以用户使用浏览器访问一个 url ,虽然端口号是缺省的,但浏览器底层是帮你默默加了 80/443 端口的。


问2:为什么叫连接(connect)而不是准备(ready)?

使用“连接”这个词是有原因的。 通信技术的历史已经有 100 多年,从通信技术诞生之初到几年之前的很长一段时间内,电话技术一直都是主流。而电话的操作过程分为三个阶段:

  • 1、拨号与对方连接;
  • 2、通话;
  • 3、挂断。

人们将电话的思路套用在现在的计算机网络中了,所以也就自然而然地将通信开始之前的准备操作称为“连接”了。 如果没有这段历史的话,说不定现在我们就不叫“连接”而是叫“准备”了,毕竟通信开始前,网络就是连接好的,而以前的电话不是

(4)收发数据

服务器端 / 客户端:

  • 应用程序调用协议栈的 write 方法发数据。
  • 应用程序调用协议栈的 read 方法收数据。

注意:这两种都是先写入缓冲区,再由 TCP 自行收发。


问1:在 write 后,协议栈发送数据的时机是?

答:

write 只是写入缓冲区的意思,并不等于 send,那协议栈什么时候发送数据呢?

如果协议栈一收到数据就马上发送出去,就可能会发送大量的小包,导致网络效率下降,因此需要在数据积累到一定量时再发送出去。至于要积累多少数据才能发送,不同种类和版本的操作系统会有所不同,不能一概而论,但都是根据下面几个要素来判断的:

1、第一个判断要素是每个网络包能容纳的数据长度

协议栈会根据 MTU(Maximum Transmission Unit,最大传输单元)MSS( Maximum Segment Size,最大分段大小) 来进行判断。当超过或者接近 MSS 时再发送出去。

MTU 在以太网中一般是 1500 字节,TCP 和 IP 的头部加起来一般是 40 字节, 所以 MSS 一般是 1460 字节。

2、另一个判断要素是时间

当应用程序发送数据的频率不高的时候,如果每次都等到长度接近 MSS 时再发送,可能会因为等待时间太长而造成发送延迟,这种情况下,即便缓冲区中的数据长度没有达到 MSS,也应该果断发送出去。

3、总结

判断要素就是这两个,但它们其实是互相矛盾的。因此,在进行发送操作时需要综合考虑这两个要素以达到平衡。

这就跟旅游景区的大巴一样,等车上游客坐满了再走,赚的钱更多,但是如果等了段时间还没有来新人,那越等损失越大,还是走比较好。

但协议栈也给应用程序保留了控制发送时机的余地。应用程序在发送数据时可以指定一些选项,比如如果指定“不等待填满缓冲区直接发送”,则协议栈就会按照要求直接发送数据。

4、拓展 —— ACK 与窗口的合并

协议栈不光会累计些数据一起发,还会累计些包一起发。

  • 当需要连续发送多个 ACK 号时, 可以减少包的数量
  • 当需要连续发送多个 窗口更新 号时,可以减少包的数量
  • 当需要连续发送多个 ACK 号 和 窗口更新 号时,也可以减少包的数量

问2: 一次 write 太多,协议栈要怎么发送数据?

对较大的数据进行拆分

注意:对 HTTP 头部 + 消息体 视为一个整体进行拆分。


注:read 的这方,其实也会碰到 问1、问2 的情况该如何制定策略(涉及多久读一次数据或者拼接传来的拆分好的原始大数据)。这里就不赘述了。


write 和 read 方法是很基础的,因此 python 提供了更方便的 sendrecv 方法,后者更加常用。

(5)断开连接

服务器端 / 客户端:

应用程序调用协议栈的 close 方法。

服务器端 / 客户端谁都可以主动调用 close 方法。

会删除套接字。

四、UDP


用户数据报协议(User Datagram Protocol)

1、UDP 跟 TCP 的区别

  • 不需要三次握手和四次挥手
  • 没有 ACK 确认机制
  • 没有重发机制
  • 不需要滑动窗口
  • ……

UDP 就像一张白纸,但灵活度比 TCP 更高。

所以现在冒出一些新的协议基本上都是基于 UDP 而不是 TCP。

2、UDP 头部

3、UDP 适用场景

  • 不需要重发的数据,例如直播
  • 不能容忍延迟,如动作游戏
  • 控制用的短数据:基本上都可以在一个包的大小范围内解决,例如向 DNS 服务器查询 IP 地址

4、UDP 优缺点

好处:

  • 灵活(上面有提)
  • 高效

缺点(除了跟 TCP 比):

  • 容易会被防火墙阻止

5、实例 —— 微信是用 UDP 还是 TCP 还是?

微信用的比较综合:

  • HTTP(s),如登录和获取头像
  • TCP:如文字聊天、语音聊天
  • UDP:如视频聊天

而 QQ 由于历史原因,基础的聊天用的还是 UDP(但是上层做了可靠性的保证)。

五、网络分类


1、按拓扑结构分类

  • 总线型结构
  • 环型结构
  • 星型结构
  • 树型结构
  • 网状结构
  • 等等

2、按照覆盖的地理范围进行分类

简单理解:一个小区就是个局域网(LAN),一个城市里由一个个小区构成,就构成了城域网(MAN),城与城连接起来就构成了一个非常大和远的网,可以叫广域网(WAN),全世界的连在一起的就是互联网

问:互联网 和 因特网 的区别?

互联网的英文是 internet,它的意思是“网络的网络”,是一个通用名词,泛指有多个计算机网络互连而成的网络,这些网络之间的通信协议(即通信规则)是可以任意的。

因特网,即 Internet,记住它与 internet 之间绝对不能使用等于号,因为 Internet 是一个专有名词,它是指当前全球最大的、开放的、有众多网络互相连接而成的特定的计算机网络。

2002年起,有学者开始提议将“internet”一词用小写表示,理由是互联网已经成为人类生活的一部分,失去了专有的意义;2016年,美联社认为“互联网”已和“电话”一样成为一件一般的事物,不具有专属商标的意义,于是开始在其格式手册中规定“internet”和“web”一词全部小写,纽约时报也随后跟进,但同时亦有媒体提出不同意见。

问:万维网 和 互联网 的区别?

互联网上面已经说了,这里不赘述。

万维网(World Wide Web)亦作 WWW、Web,是一个透过互联网访问的,由许多互相链接的超文本组成的系统。

万维网的核心部分是由三个标准构成的:

  • 统一资源标识符(URI),这是一个统一的为资源定位的系统。
  • 超文本传送协议(HTTP),它负责规定客户端和服务器怎样互相交流。
  • 超文本标记语言(HTML),作用是定义超文本文档的结构和格式。

此外还需要网页浏览器和网页服务器。
此外 HTML 还需搭配 CSS 和 JavaScript 语言。

蒂姆·伯纳斯-李是万维网的创始者,现在是万维网联盟(W3C)的领导人。2017年,他因“发明了万维网、第一个浏览器和使得万维网得以扩展的基础协议及算法”而获得2016年度的图灵奖。

六、网络的体系结构


1、垂直分层的参考模型

网络的体系结构是计算机网络各层次及其协议的集合,其层次结构一般以垂直分层模型来表示。分为:

  • OSI 的参考模型
  • TCP/IP 的参考模型
  • 五层协议的参考模型

他们的关系如下图所示:

一般采用折中的方法,采用五层协议的参考模型,自上而下分别为:

  • [5] 应用层
  • [4] 运输层
  • [3] 网络层
  • [2] 数据链路层
  • [1] 物理层

下面的叙述,如没提,都默认以这个模型划分为准。

2、协议

网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

简单理解就是不同的实体之间的通信,都需要一种规则,而我们就把这种规则称为协议(protocol)

(1)五层参考模型下的协议划分
  • [5] 应用层 - 如 HTTP
  • [4] 运输层 - 如 TCP
  • [3] 网络层 - 如 IP
  • [2] 数据链路层 - 如 ARP
  • [1] 物理层 - 如 IEEE802

上面各层中,可以换用任何一种与之层相对应的其他协议。

(2) TCP/IP 参考模型下的协议

互联网协议套件(IPS:Internet Protocol Suite)是一个网络通信模型,以及一整个网络传输协议家族,为网际网络的基础通信架构。它常被通称为TCP/IP协议族(TCP/IP Protocol Suite),简称为TCP/IP

注意:TCP/IP 不是指 TCP 协议 + IP 协议。这么称呼只因为该协议家族的两个核心协议:TCP(传输控制协议)和IP(网际协议),为该家族中最早通过的标准。(另一种说法:最早的 TCP/IP 原型设计相当于现在的 TCP 和 IP 合在一起的样子,后来才拆分成为 TCP 和 IP 两个协议。)

可以理解成:TCP/IP 是互联网相关的各类协议族的总称。

(3) 协议栈

首先,协议栈(Protocol stack),是计算机网络协议套件的一个具体的软件实现

其次,TCP/IP 协议栈 就是对 TCP/IP 协议的一个具体的软件实现。

注:下文所说的协议栈,默认就指 TCP/IP 协议栈。不再赘述。

协议栈在不同的操作系统上,实现方式并不相同,但是大同小异。

七、局域网


上面我们提到了 广域网、城域网、局域网的区别,前两者的具体实现我们不涉猎了,但是局域网值得好好聊聊。

局域网属于数据链路层+物理层

1、以太网

要知道,最早的互联网就是从局域网演变而来的。而局域网最早的实现又是以太网(Ethernet)

以太网最早是由Xerox(施乐)公司创建的,在1980年由DEC、Intel和Xerox三家公司联合开发为一个标准。

2、其他的局域网实现

  • 令牌环网(Token Ring)
  • 异步传输模式网(ATM)
  • 光纤分布式接口网络(FDDI)
  • Wi-Fi —— 这个大家最常见

问:Wi-Fi 和 无线局域网 的区别?

Wi-Fi 是 无线局域网(WLAN)的一种技术实现,采用 IEEE 802.11 的标准。

3、局域网中运用最广泛的是以太网

上面提到了 TCP/IP 是包含了很多网络传输协议的家族,所以 TCP/IP 在 网络接口层(即五层模型里的数据链路层 + 物理层)可以依托各种的局域网实现。但主流的还是以太网,称为 TCP/IP over Ethernet

而互联网则是由大大小小的运营商、公司、机构、用户连接起来网络的总称,里面可就不止仅有以太网,还包含其他的局域网实现。

问:为什么以太网比其他的局域网实现更广泛的普及?

答:1、配置简单 2、组网灵活 3、价格低廉。

4、以太网的特征

IEEE 组织的 IEEE 802.3 制定了以太网的技术标准。

(1)物理层传输媒介
  • 同轴电缆
  • 双绞线(常见)
  • 光缆

双绞线的极限距离是 100 米,但光纤的连接距离可以长达几公里。

物理层传输媒介的不同,影响最大的是传输速率。在以太网的标准中,包括了:

  • 标准以太网(10Mbps)
  • 快速以太网(100Mbps)
  • 千兆以太网(1000Mbps)
  • 10G以太网(10000Mbps)
(2)CSMA/CD

以太网采用的是带冲突检测的载波帧听多路访问冲突检测(CSMA/CD)机制。

  • CS:载波侦听(Carrier Sense),发送数据之前进行侦听,确保线路空闲时再发送数据,减少冲突机会。
  • MA:多路访问(Multiple Access),每个站点发送的数据,可同时被多个站点接收。也即网络上所有的工作站共享数据信道,并且以广播方式发送数据。
  • CD:冲突检测(Collision Detection),边发送边检测,发现冲突就停止发送,然后延迟一个随机时间之后继续发送。

优点:原理比较简单,技术上容易实现,网络中各工作站处于平等地位,不需集中控制,不提供优先级控制。

缺点:在网络负载增大时,会导致发送时间增长,发送效率急剧下降。

5、MAC 地址

MAC 地址(Media Access Control Address)是用于以太网标识

也适用于基于以太网搞的其他类型的网络,比如 Wi-Fi 等。

每块网卡的MAC 地址是全世界唯一的。

(1)MAC 地址格式

MAC 地址有 48 比特(6 字节)。

跟 IP 地址比,MAC 地址不是层次化的结构,即不分网络号主机号。

  • 写法一:用“-”分隔的写法 00-80-C8-2D-82-EA
  • 写法二:用“:“分隔的写法 00:80:C8:2D:82:EA

它们的意思是一样的,使用任何一种写法都可以。

(2)常见问题

问:怎么查看 MAC 地址?

下面都以 MacOS 为例:

方法一:跟查看的 IP 的方法一样,输入 ifconfig 命令,ether 后面的即是:

方法二:直接看网络设置


问:MAC 地址可以修改吗?

sudo ifconfig en0 ether 20-7C-8F-73-B1-1E

注意1:上面的 en0 不是固定的,对应着用 ifconfig 命令看到的对应的网卡。
注意2:电脑重启后,MAC 地址会恢复原样。

八、包


这里的包,默认基于 TCP/IP + 以太网

包是由头部数据两部分构成的。

高级研究计划局网络(英语:Advanced Research Projects Agency Network),通称阿帕网(英语:ARPANET)是美国国防高级研究计划局开发的世界上第一个运营的数据包交换网络,是全球互联网的鼻祖

1、参考模型下包的划分

  • [5] 应用层 - 无
  • [4] 运输层 - 数据段(Segment)
  • [3] 网络层 - 数据包(Packet)
  • [2] 数据链路层 - 数据帧(Frame)
  • [1] 物理层 - 无,就是比特

关于段、包、帧,虽是不同叫法,但都是一回事。

每一层都负责给包添加上自己独属的头部:

2、协议栈对包的处理

TCP 模块在执行连接、收发、断开等各阶段操作时,除了添加 TCP 头部,其他都需要委托 IP 模块将数据封装成包发送给通信对象。

IP 模块会添加 IP 头部和 MAC 头部这两种头部。

注意:IP 模块不光添加 IP 头部,还添加 MAC 头部。(这是 ARP 的内容,下面会介绍)

3、分组交换 与 存储转发

  • 传统的电话机,必须经过”建立连接(分配通信资源)、通话(一直占用通信资源)、释放连接(归还通信资源)“三个步骤,这种交换方式称为电路交换
  • 计算机网络通常采用分组交换技术。即把要发送的整块数据称为一个报文(message),发送之前,先把较长的报文划分成为一个个更小的等长数据段。在每一个数据段前面加上必要的控制信息(如目的地址、源地址等)组成的首部(header),这样就构成了一个分组(packet)。分组又称为“包”,而分组的首部也可称为“包头”。计算机将分组通过通信链路直接发送给分组交换机(如交换机、路由器),分组交换机收到一个分组则暂时存储下来,先校验错误,再检查其首部,按照首部中的目的地址查找转发表,找到合适的端口(就是分组交换机和外部连接的接口)转发出去,把分组交给下一个分组交换机,这样一步一步把分组转发到最终的目的计算机。由于每个分组交换机都是将收到的分组先存储下来再转发出去,因此该方法被称为存储转发方式(与之对应的是直通转发方式)。

① 分组交换比电路交换好的地方:

  • 不存在建立时延
  • 信道利用率高
  • 当某条传输线路故障时可选择其他传输线路,可靠性高。

不足:

  • 存在转发时延
  • 比较复杂,例如处理头部控制信息的开销
  • 有出现失序的可能性

② 存储转发比直通转发好的地方:

  • 错误检验
  • 自动缓存
  • 策略功能(ACL)

不足:

  • 转发慢

九、网络设备


下面的介绍都基于 以太网 + TCP/IP 。

1、网线

(1)双绞线

例如局域网中,网线普遍使用的是双绞线,其中“双绞”的意思就是以两根信号线为一组缠绕在一起,这种拧麻花一样的设计是为了抑制噪声的影响。

双绞线的性能是以“”来区分的,如下图:

建议:家用六类或超六类,不建议用七类(此为工业所用)

2、网卡

(1)网卡的组成

网卡中的 PHY(MAU) 模块负责包与电信号之间的转换,电信号通过 RJ-45 接口进出网线(电信号的本质是正负变化的电压)。

  • 现在 100 Mbit/s 以上的以太网中叫作 PHY(物理层装置),以前低速方式中则叫作 MAU(介质连接单元)
  • RJ-45,是以太网使用双绞线连接时常用的一种连接器插头。
  • MAC 地址是在网卡生产时写入 ROM 里,全世界唯一。
  • 主要厂商的网卡驱动程序已经内置在操作系统中了,无需单独安装。

问:MAC 模块是怎么知道自己的 MAC 地址的?

答:网卡的 ROM 写入了出厂前写入的 MAC 地址,在网卡初始化的时候,将这个值读出并进行设置,MAC 模块就知道自己对应的 MAC 地址了。但也有一些特殊的方法,比如从命令或者配置文件中读取 MAC 地址并分配给 MAC 模块,这种情况下,网卡会忽略 ROM 中的 MAC 地址。

(2)MAC 头部

(3)网卡收包

步骤1:电信号转成数字信号

  • PHY(MAU)模块将信号转换成通用格式并发送给 MAC 模块。
  • MAC 模块 通过报头的波形同步时钟,然后遇到起始帧分界符时开始将后面的信号转换成数字信息,到达信号的末尾时,还需要检查 FCS,最后存放到缓冲区中。

    如果检查 FCS 不正确,即当作错误包丢弃。

步骤2:检查 MAC 地址

MAC 模块需检查缓冲区中已变成数字信号的包的内容,即检查 MAC 头部中 接收方 MAC 地址与网卡在初始化时分配给自己的 MAC 地址是否一致,以判断这个包是不是发给自己的。如果是,继续放在缓冲区,如果不是,则丢弃。

步骤3:网卡交付给协议栈

  • 网卡向扩展总线中的中断信号线发送信号,该信号线通过计算机中的中断控制器连接到 CPU。当产生中断信号时,CPU 会暂时挂起正在处理的任务,切换到操作系统中的中断处理程序。然后,中断处理程序会调用网卡驱动,从网卡的缓冲区中取出收到的包。
  • 网卡驱动通过 MAC 头部中的以太类型字段判断协议的类型,交给不同的协议栈。

    如 0080(十六进制)代表 IP 协议,网卡驱动就会把这样的包交给 TCP/IP 协议栈;如果是 809B 则表示 AppleTalk 协议,就把包交给 AppleTalk 协议栈,以此类推。

(4)网卡发包

这个是上面的反操作,就不赘述了。

3、中继器

中继器主要完成 [1] 物理层的功能。负责在两个节点的物理层上按位传递信息,完成信号的复制、调整和放大功能,以此来延长网络的长度。

4、集线器(Hub)

集线器工作在 [1] 物理层。集线器每个端口相当于一个中继器。

(1)为什么要用集线器

最早期的局域网所用的拓扑结构为总线型

这么一种设计其实是去中心化的思想,也是互联网诞生的初衷,即美国军方为了战备考虑(没有中心设备,被摧毁任何一台,其他的照样可以继续工作。

其实现在为了容灾,在重要的节点上会采用网状拓扑结构。

但日常的局域网中,运用最广泛的还是星形拓扑结构(比较简单,方便管理),而星形拓扑的中心节点,即由集线器承担。

当信号到达集线器后,会被广播到整个网络中,被所有连接在它上面的设备收到。(然后由设备根据接收方 MAC 地址来判断是否应该接收。)

集线器可以说是以太网思想的最好体现。

(2)集线器的结构

因为集线器要跟别的网卡连接,所以也具备:

  • PHY(MAU)
  • RJ-45

他们负责把电信号转化成通用格式。

但有自己特殊的模块:中继电路,用于实现信号的广播。

5、交换机(Switch)

交换机工作在 [2] 数据链路层。交换机每个端口相当于一个网卡。

但跟网卡的区别是,交换机的端口不具有 MAC 地址。相对的,交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。

(1)交换机的结构

咱们平时所说的交换机,其实专业说法叫以太网交换机。也有支持其他(局域网)协议的交换机。

(2)为什么要用交换机?

首先我们看看集线器为什么被淘汰,因为集线器是广播的形式,拥有之前我们提到的以太网 CSMA/CD 机制的全部缺点,主要有:

  • 信号碰撞
  • 共享带宽

这些都会造成:

  • 容易故障
  • 效率低下

而交换机是怎么解决问题的呢?

交换机内部有一张 MAC 地址与网线端口的对应表,叫 MAC 地址表。然后根据地址表,用交换电路(内部交换矩阵)迅速将数据包传送到目的端口,即转发

若目的MAC在地址表里找不到,交换机才广播到所有的端口,接收端口回应后交换机会“学习”新的地址,并把它添加入内部地址表中。(还有一种情况会广播,是接收方 MAC 地址是一个广播地址。)

当交换机发现一个包要发回到原端口时,就会直接丢弃这个包。

优点:

  • 不用广播,即不会碰撞
  • 独享带宽(同时执行多个转发操作)
(3)地址表的维护
  • 每次收到包,将发送方 MAC 地址以及其输入端口的号码写入 MAC 地址表中。
  • 每隔一段时间(例如30s),就删除地址表中某些记录的操作,这是为了防止设备移动时产生问题。

总之,交换机会自行更新或删除地址表中的记录,不需要手动维护。

当地址表的内容出现异常时,只要重启一下交换机就可以重置地址表,也不需要手动进行维护。

具备管理功能的高端交换机是提供手动维护地址表的功能的, 但一般的低端机型中没有这个功能,想手动维护也不行。

(4)拓展:工作模式 —— 全双工 与 半双工

其实交换机比集线器还好在一个地方,即交换机支持全双工,集线器只支持半双工

问:什么是全双工 与 半双工?

答:发送和接收同时并行的方式叫作“全双工” ,相对地,某一时刻只能进行发送或接收其中一种操作的叫作“半双工”。


问:怎么判断两个设备之间该用全双工还是半双工?

这里需要用到自动协商

首先,在以太网中,在没有数据信号时就填充连接脉冲,这使得网络中一直都有一定的信号流过,从而能够检测对方是否在正常工作,以及网线有没有正常连接。体现在以太网设备的网线接口周围有一个绿色的 LED 指示灯。

难怪叫以太网叫以太,这个脉冲信号跟宇宙中的以太太像了。

自动协商功能就利用了这样的脉冲信号,即通过这种信号将自己能够支持的工作模式和传输速率相互告知对方,并从中选择一个最优的组合(参考下表)。

(5)拓展:三层交换机

因交换机工作于 OSI 模型的第 2 层(数据链路层),故而称为二层交换机

顾名思义,三层交换机就是也可以工作在第 3 层(网络层),具有部分路由器功能的交换机。

三层交换机可以同时工作在三层和二层。

感兴趣可以戳:为什么三层交换机无法替代路由器?

6、路由器(Router)

路由器工作在 [3] 网络层。路由器每个端口相当于一个网卡。

前面提到交换机端口虽然相当于网卡,但是端口本身不具有 MAC 地址,而路由器的端口具有 MAC 地址(还有 IP 地址),所以他更像网卡。

实际上,我们家里用的路由器已经集成了集线器和交换机的功能,像我们介绍的这种独立设备的情况很少见。不过,把每个功能独立出来更容易理解。

冷知识:交换机比路由器更加简单,因此可能有人以为交换机应该比路由器出现得更早,其实是路由器先问世的。

(1)路由器的结构

端口模块:不同的路由器端口模块有所不同,例如支持 ADSL 的路由器,支持 FTTH 的路由器,支持专线等线路的路由器等。(就跟网卡一样,也有支持不同协议的网卡)

(2)路由器接收包

步骤1:确认收包,去 MAC 头部

跟网卡一样,路由器的端口都具有 MAC 地址,只接收与自身 MAC 地址相匹配的包,否则丢弃。

完成包接收操作后,丢弃包开头的 MAC 头部。

步骤2:查询路由表确定输出接口

上面去掉包的 MAC 头部后,获取到 IP 头部,然后查询路由表判断转发目标。

查看路由表命令(以 MacOS 为例):netstat -r

① 匹配规则:

  • find 目标地址(即 IP 地址)+ 子网掩码,只判断网络号而忽略主机号,找到后转发到对应的接口。
  • 如果匹配到多条候选记录,那就优先选择网络号比特数最长的一条记录。这叫“最长匹配”原则

    网络号比特数越长,说明主机号比特数越短,也就意味着该子网内可分配的主机数量越少,即子网中可能存在的主机数量越少,这一规则的目的是尽量缩小范围,所以根据这条记录判断的转发目标就会更加准确。

  • 如果还匹配到多条候选记录,那就选择跃点数最小的一条记录。

    跃点计数越小说明该路由越近,因此应选择跃点计数较小的记录。

  • 如果最终无法找到匹配的记录,路由器会丢弃这个包,并通过 ICMP 消息告知发送方。

    ICMP(Internet Control Message Protocol,Internet 控制报文协议),属于网络层协议,提供可能发生在通信环境中的各种问题反馈。


问:交换机因为连接的设备相对少,姑且可以在 MAC 地址表中放入所有设备的信息,但是路由器连接的设备那么多,路由表怎么放的下?

答:确实放不下,所以一般路由器都会配默认路由,即路由表最后一行(IP 地址 0.0.0.0,子网掩码 0.0.0.0),那么任何地址都能匹配到这一条记录。

这一行配置的网关地址被称为默认网关


② 确定转发目标(接口):

  • 如果路由表的网关列内容为 IP 地址, 则该地址就是下一个转发目标。

    这就是上面提到的默认路由。

  • 如果路由表的网关列内容为空,则 IP 头部中的接收方 IP 地址就是下一个转发目标。

补充:对路由表进行维护的方法有几种,大体上可分为以下两类。

  • 由人手动维护路由记录
  • 根据路由协议机制, 通过路由器之间的信息交换由路由器自行维护路由表的记录

    路由协议有很多种,例如 RIP、OSPC、BGP 等都属于路由协议。

步骤3:转发前,确定 MAC 头部填什么 —— ARP

路由器知道要从哪个接口转发后,接下来需要组装 MAC 头部,这里使用 ARP(Address Resolution Protocol),即地址解析协议,它可以根据 IP 地址查询 MAC 地址。ARP 会利用广播对所有设备提问:“××× 这个 IP 地址是谁的?请把你的 MAC 地址告诉我。”然后就会有人回答:“这个 IP 地址是我的, 我的 MAC 地址是 ×××。” 路由器也有 ARP 缓存表,因此首先会在 ARP 缓存中查询,如果找不到再发送 ARP 查询请求。

  • ARP 属于 TCP/IP协议,工作在网络层,所以是实现在 TCP/IP 协议栈中的。

    在 OSI 模型中 ARP 协议属于数据链路层;而在 TCP/IP 模型中,ARP 协议属于网络层。

  • ARP 缓存表跟之前介绍的交换机的 MAC 地址表一样,也会(在几分钟左右)定时删除。
  • arp -a 命令可以显示 ARP 缓存内容。

拓展:ARP 欺骗

ARP 是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。

至于应对的方法有很多种,这里略。

步骤4:改写 MAC 头部,发包

  • 加 MAC 头前,需要对 IP 头做一些修改:上面说到默认路由,它的想法是本网络找不到,就让他去别的网络找把。但会有一个问题,如果一直找不到,会无休止的投递,造成死循环。解决方法就是在包的 IP 头部加上包的有效期TTL(Time to Live, 生存时间)。一般发送方在发送包时会将 TTL 设为 64 或 128,然后路由器在转发包的时候,都要减 1,当这个值变成 0 时,就表示超过了有效期,这个包就会被丢弃。

现在的互联网即便访问一台位于地球另一侧的服务器,最多也只需要经过几十个路由器。

  • 将通过 ARP 获取到的 MAC 头部加在 IP 头部的前面,整个包就完成了,发送。

    MAC 头部很容易被误解为是由网卡来处理的,实际上它是由 TCP/IP 软件来负责的。

(3)路由器跟交换机的区别
  • 交换机是基于 MAC 地址的,路由器是基于 IP 地址的。

    MAC 地址表示物理地址,IP 地址表示逻辑地址。
    IP 地址本质上是终点地址,它在跳过路由器的时候不会改变,而 MAC 地址则是下一跳的地址,每跳过一次路由器都会改变。

  • 交换机的每个端口都没有 MAC 地址,路由器的每个端口都有 MAC 地址和 IP 地址。

    所以交换机只是将进来的包转发出去而已,自己并不会成为发送方或者接收方。

  • 交换机用 MAC 地址表,路由器用路由表。
  • 交换机在地址表中只匹配完全一致的记录,而路由器则会忽略主机号部分,只匹配网络号部分。
  • 交换机中对 MAC 地址表的维护是包转发操作中的一个步骤 ,而路由器中对路由表的维护是跟与包转发操作相互独立的,也就是说,在转发包的过程中不需要对路由表的内容进行维护。

    即 路由表管 IP 地址的转发,ARP 管 MAC 地址的转发。

也请注意,MAC 地址表、ARP 表、路由表 的区别。

(4)路由器的附加功能

① NAT

上面我们讨论过 NAT(Network Address Translation,网络地址转换) 来缓解 IPv4 地址稀缺的问题。那技术上是如何实现的呢?

早期的地址转换机制是只改写 IP 地址,不改写端口号的(解决内网中的设备不能和互联网直接收发网络包的问题)。即映射表一对一的关系(一个公网地址对应一个私网地址),但这节省不了IPv4地址空间。

后来,IPv4 地址稀缺,NAT 的作用来了,即,既改写 IP 地址,也改写端口号。而映射表一对多的关系(一个公网地址对应多个私网地址,用端口号区分)

端口号是一个 16 比特 的数值,总共可以分配出几万个端口。


额外加成:

NAT 有防火墙的作用,即对于没有在访问互联网的内网设备,是无法从互联网向其发送网络包的。

但有时候我们希望能够从互联网访问公司内网,这需要进行一些设置才能实现。之所以无法从互联网访问内网,是因为映射表里没有相应的记录,那么我们只要事先手动添加这样的记录就可以了。


② 路由器的包过滤功能

包过滤指的是,路由器在对包进行转发时,根据 MAC 头部、IP 头部、TCP 头部的内容,按照 事先设置好的规则决定是转发这个包,还是丢弃这个包。

我们通常说的防火墙设备或软件,大多数都是利用这一机制来防止非法入侵的。

7、关于不同模块对包的头部的越权操作的思考

(1)IP 模块为什么越权去添加 MAC 头部?

严格来说,IP 模块和 MAC 模块有各自的责任范围,MAC 头部应该由 MAC 模块(例如网卡)去添加,而不是 IP 模块,但从现实来看,让 IP 负责是有利的。 如果在交给网卡之前,IP 模块能够完成打包工作,那么网卡只要将打好的包发送出去就可以了(至于接收操作也一样),对于除 IP 以外的其他类型的包也是如此。这样一来,同一块网卡就可以支持各种类型的包。与其机械地设计模块和设备之间的分工,导致网卡只能支持 IP 包,不如将分工设计得现实一些,让网卡能够灵活支持各种类型的包。

(2)TCP 模块为什么越权去直接获取 IP 头部中的接收方和发送方 IP 地址?

严格来说,TCP 模块和 IP 模块有各自的责任范围,TCP 头部属于 TCP 的 责任范围,而 IP 头部属于 IP 模块的责任范围。而现实中是,当包交给 TCP 模块之后,TCP 模块需要查询 IP 头部中的接收方和发送方 IP 地址来查找相应的套接字,这个过程就显得有点奇怪。因为 IP 头部是 IP 模块负责的,TCP 模块去查询它等于是越权了。

如果要避免越权,应该对两者进行明确的划分,IP 模块只向 TCP 模块传递 TCP 头部以及它后面的数据,而对于 IP 头部中的重要信息,即接收方和发送方的 IP 地址,则由 IP 模块以附加参数的形式告知 TCP 模块。然而,如果根据这种严格的划分来开发程序的话,IP 模块和 TCP 模块之间的交互过程必然会产生成本, 而且 IP 模块和 TCP 模块进行类似交互的场景其实非常多,总体的交互成本就会很高,程序的运行效率就会下降。因此,就像之前提过的一样,不妨将责任范围划分得宽松一些,将 TCP 和 IP 作为一个整体来看待,这样可以带来更大的灵活性。

8、常用命令

(1)ping

ping 可以说是 ICMP 协议最著名的应用。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。

用法:ping baidu.com

原理:用类型码为0的ICMP发请求,收到请求的主机则用类型码为8的ICMP回应。

(2)如何 ping 端口?

ping 是 ICMP 协议,工作在网络层,所以肯定是 ping 不了端口的。

方法一:telnet

以 CentOS 为例,默认是没有安装 telnet 的,所以需要安装下: yum install telnet

用法:telnet baidu.com 80

方法二:nc( MacOS 下)

MacOS 下有自带的 nc 命令,跟 telnet 命令一样,他也可以操纵 TCP or UDP

用法:nv -vz -w 2 baidu.com 80

(3)traceroute

traceroute 是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。

用法:traceroute baidu.com

原理:traceroute 的原理是非常非常的有意思,它收到到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据报。如此往复直到到达目的主机。这样,traceroute就拿到了途径所有的路由器IP。

十、接入网


接入网用于连接网络运营商(ISP)的线路,连接用户与互联网。

接入网这个词表示的是通信线路的用法,而并不表示通信线路的结构。例如公司里使用的专线,当它用来连接互联网时就叫作接入网,而用来连接总公司和分公司时就不叫接入网。 此外,接入网这个词也不仅限于互联网,当使用运营商提供的通信服务时,一般都会将用户与运营商之间的线路叫作接入网。

1、接入网种类

一般家用的接入网方式包括 ADSL、FTTH 、CATV、电话线、ISDN 等,公司则还可能使用专线。接入网的线路有很多种类,我们无法探索所有这些线路,下面值介绍两种最常用的。

专线是固定连接线路,不需要进行身份认证,其实,这就是最古老的互联网接入方式。

(1)ADSL 接入网

ADSL:Asymmetric Digital Subscriber Line,不对称数字用户线。它是一种利用架设在电线杆上的金属电话线来进行高速通信的技术,它的上行方向(用户到互联网)和下行方向(互联网到用户)的通信速率是不对称的。

用户端所需设备:

  • 安装一个将电话信号和 ADSL 信号分开的设备,这个设备叫分离器
  • ADSL ModemModem调制解调器,其实是Modulator(调制器)与Demodulator(解调器)的简称。

    有些情况下会使用集成了互联网接入路由器和 ADSL Modem 的多功能 ADSL Modem(也叫路由型 ADSL Modem),其实就是把路由器和 ADSL Modem 装到一个外壳里而已。

(2)光纤接入网(FTTH)

FTTH:Fiber To The Home,光纤到户。指的是将光纤接入家庭的意思。


① 光纤

先将数字信息转换成电信号,然后再将电信号转换成光信号。亮表示 1,暗表示 0。

发送端是光源

接收端有可以感应光线的光敏元件,光敏元件可以根据光的亮度产生不同的电压。当光信号照射到上面时,光亮的时候就产生高电压,光暗的时候就产生低电压,这样就将光信号转换成了电信号。


② 单模光纤和多模光纤

单模光纤多模光纤在光的传导方式上有所不同,这决定了它们的特性也有所不同。

  • 多模光纤中可以传导多条光线,这意味着能通过的光线较多,对光源和光敏元件的性能要求也就较低,从而可以降低光源和光敏元件的价格。
  • 单模光纤的纤芯中只能传导一条光线,能通过的光线较少,相应地对于光源和光敏元件的性能要求就较高,但信号的失真会比较小

使用场景:单模光纤的失真小,可以比多模光纤更长,因此多模光纤主要用于一座建筑物里面的连接,单模光纤则用于距离较远的建筑物之间的连接。

FTTH 主要使用单模光纤。


③ 直连和分路

一种光纤的接入方式是用一根光纤直接从用户端连接到最近的电话局。 用户端使用光纤收发器(即光 Modem),将电信号转换成光信号的设备。

另一种光纤的接入方式是在用户附近的电线杆上安装一个名为分光器的设备,通过这个设备让光纤分路,同时连接多个用户。在这种方式下,用户端不使用光纤收发器,而是使用一个叫作 ONU(Optical Network Unit, 光网络单元)的设备,它和光纤收发器一样,可以将电信号转换成光信号。

通过光纤分路连接多个用户的光纤接入模式统称为 PON(Passive Optical Network, 无源光网络), 可分为 GE-PON、WDM-PON、B-PON、G-PON 等多种方式,现在大多使用最高速率为 1 Gbit/s 的 GE-PON 方式。

终端盒可以当是对光纤收发器和 ONU 等光纤终端设备的统称。

 

2、接入网中使用 PPPoE

(1)BAS

顺着上面的内容,用户发送的网络包会通过 ADSL 和 FTTH 等接入网到达运营商的 BAS(Broadband Access Server,宽带接入服务器)

BAS 又称 BRAS(Broadband Remote Access Servers),同样是宽带接入服务器。

问:BAS 也是一种路由器,那与一般的路由器有什么不同?

答:BAS 可以提供用户认证和配置下发功能。例如 BAS 让终端用户需要先输入用户名和密码,登录之后才能访问互联网。

(2)PPPoE

BAS 通过 PPPoE(Point-to-Point Protocol over Ethernet,以太网的点对点协议) 来实现上面的功能。

PPPoE 是由传统电话拨号上网上使用的 PPP 协议发展而来的,属于数据链路层

PPPoE 包的头部组成:

十一、网络运营商


互联网的实体并不是由一个组织运营管理的单一网络,而是由多个运营商网络相互连接组成的。

1、网络运营商的设备

(1)POP

POP: Point of Presense,中文一般叫作“接入点”

ADSL、FTTH 等接入网与用户签约的运营商相连的设备,称为 POP。

互联网的入口就位于这里。
 

(2)NOC

NOC: Network Operation Center,网络运行中心

NOC 是运营商的核心设备,从 POP 传来的网络包都会集中到这里,并从这里被转发到离目的地更近的 POP,或者是转发到其他的运营商。

这里需要配备高性能的路由器。到底需要多高的性能才行呢?我们来看实际产品的参数。面向运营商的高性能路由器中有些产品的数据吞吐量超过 1 Tbit/s ,而一般面向个人的路由器的数据吞吐量也就 100 Mbit/s 左右,两者相差 1 万多倍。当然,路由器的性能不完全是由吞吐量决定的,但从这里可以看出规模和性能的差异。

(3)POP 和 NOC 的边界

其实,NOC 和 POP 并没有非常严格的界定。NOC 里面也可以配备连接接入网的路由器,很多情况下是和 POP 共用的。因此,大家可以简单地认为,NOC 就是规模扩大后的 POP

(4)IX

IX: Internet eXchange,互联网交换中心

用于不同运营商之间的连接

这里的路由器会使用到 BGP: Border Gateway Protocol,边界网关协议。且路由交换可分为两类:

  • 一类是将互联网中的路由全部告知对方,称为转接
  • 另一种类型是两个运营商之间仅将与各自网络相关的路由信息告知对方。这样,只有双方之间的网络可以互相收发网络包,这种方式称为非转接,也叫对等

2、线路的连接

  • 室内:公司的机房一般使用双绞线来连接设备
  • 室外:对于距离较远的 NOC、POP 和 IX 来说,更多的使用光纤

拓展:租借光纤

只有有限的几家大型运营商才拥有自己的光纤。那么,其他运营商怎么办呢?其实也不难,只要从其他公司租借光纤就可以了,拥有光纤的公司一般都会提供光纤租用服务,这个光纤租用不一定租用的就是光纤,可能也是将自己的光纤的一部分通信能力租借给客户。

这种服务就叫作通信线路服务

3、机房建设

为了保证在遇到停 电、火灾等事故,以及地震等自然灾害时,路由器等网络设备还能继续工作,IX 所在的大楼都装有自主发电设备,并具有一定的抗震能力。其实这样的要求也不仅限于 IX,运营商的 NOC 也是一样。

猜你喜欢

转载自www.cnblogs.com/xjnotxj/p/12875855.html