1. 概述
计算机最开始的目的是计算,后来随着需求的增加,不同的计算机之间需要“交流”。因此,计算机之间开始通信,和人类社会一样,计算机之间通过通信形成了“小团体”。这些小团体则被称为网络(或者说,计算机之间通信的途径称为网络)。为了方便,不同的团体之间通过少数线路进行通信,这些少数线路称为互连网,互联网则是全球范围内的互连网,也就是说,互联网是将全世界最多的不同团体连接起来的网络。
和人类之间交流一样,我们为什么可以听懂对方说的话呢?因为遵守了同一种规则、语法(比如汉语、英语等等)。如果遵守不同的规则,那么就会听不懂(比如中国人在没有学习英语的情况下,是听不懂英语的,比如不知道I是我的意思,不知道like是喜欢的意思)。因此,计算机之间通信也需要制定规则,比如我要把一段信息发给哪台计算机,这段信息中哪些数据是重要的,哪些数据是附加的语气词等等。
为了方便,将通信规则分成不提供的层次,不同的组织制定了各种体系结构。比如OSI制定了七层体系结构(理论上),而开发商们则形成了四层体系结构(实际应用)。目前流行的则是将二者优点融合形成的五层体系结构。
这里的分层实际上就是通信报文数据中层层的包装。为什么要分层呢?这是为了报文数据准确无误地被对方计算机中的特定应用接收。计算机之间通信,首先要找到对面的计算机(运输层及其以下),然后找到计算机中具体的应用接收这条数据(应用层)。因为有多个网络,而且因为报文传输的限制,所以要定位到计算机并保证数据完整地到达,需要分多层。
如何定位区分网络中的计算机呢(准确地说是网线的终点),答案就是IP地址。给接入到网络中的计算机分配IP地址,用于定位。而IP地址是由互联网服务提供商(ISP)分配的。
1.1 ISP
互联网服务提供商ISP可以从互联网管理机构获得许多IP地址,同时拥有通信线路以及路由器等互联网设备,个人或机构向ISP缴纳一定的费用就可以接入互联网。
目前互联网是一种多层次ISP结构,ISP根据覆盖面积的大小分为第一层ISP、区域ISP和接入ISP。互联网交换点IXP允许两个ISP直接相连而不用经过第三个ISP。
1.2 主机之间的通信方式
在经过ISP分配IP地址后(即获得了主机的标识、名字、身份证号),在逻辑上,两台主机就可以进行通信了。
联想现实生活中,两个人交流主要有两种方式,一种是比较自由的,两个人互相索取信息(比如学生之间),这种方式成为P2P,即对等模式;而另一种则是身份明确的,比如一个人向另一个人提供信息(比如老师和学生),这种成为客户-服务器模式(C/S),客户就是学生,表示请求服务,而服务器则就是老师,为客户提供服务。
同样,计算机之间也可按照这两种方式进行通信,P2P典型的就是区块链网络,CS模式则是日常中比较常用的。
1.3 电路交换与分组交换
计算机通信内容怎么在网络中传输呢?是像打电话那样,每次通信都要建立一条完整路线吗?还是说和快递那样,可以把大件拆分成若干个小件,每件都打包成快件发送出去,最后由用户自己组装?
我们知道,电话,最开始是专用线路,但是随着用户的增多,以及线路之间的繁杂,不可能点对点都建立一条物理线路;之后就出现了中转站,即接线员,所有客户都达到接线员这里,由接线员临时建立物理线路,这样在一定程度上减少了资源浪费。但是每次通话过程中,这条链路仍然是两个用户专有的(电路交换)。
计算机更是如此,显然,全世界这么多计算机,不可能像传统电话那样进行物理连接。但是也不能像接线员那样,在网络通信中始终占用着链路资源(电路交换)。因为计算机通信,为计算机提供服务,其实和操作系统中时间片轮转类似,人类的分辨率没那么精确,可以是断断续续的(比如26帧/s)。
因此,可像快递那样,采用时间片轮转,将一次通信,拆分成若干个子内容,每个子内容作为一个报文发送出去,最终在客户端进行自行组装即可(报文交换)。这时候,就无需每时每刻都占用通信线路了。
1.4 时延
报文在传输过程中的时间称为时延。根据不同介质以及不同阶段,时延分为:排队时延、处理时延、传输时延和传播时延四种。
- 排队时延:指的是路由器接收到之后进入处理阶段这个间隔,以及处理完之后,将其转发之间的这段时间开销(因为路由器作为中转站,肯定会收到很多的报文,那么这些报文就会竞争路由器的资源,由路由器逐个处理,处理完之后,逐个转发)。
- 处理时延:指的是路由器对报文进行处理的开销,比如分析头部,找到IP地址、MAC地址等等,从而能够找到具体的转发子网端口;比如进行差错检验,确认本报文是有效的等等。
- 传输时延:指的是主机将报文输送到信道的时间或者从信道接收到完整报文的时间开销。
- 传播时延:指的是报文在信道中的传输时间。(一般情况下,传播速度接近光速)
1.5 计算机网络体系结构
在上述讲解中,只是逻辑上的思想。
- 比如获得IP地址后,就相当于知道了这个人,可以进行通信了;
- 然后计算机之间主要有两种通信方式,C/S和P2P,可根据需求和目的按照不同方式进行通信;
- 计算机之间是需要网络线路来连接的,而为了使得网络更加简洁,一般都是共用线路,因此多条通信内容可能就会强占线路,此时就需要对通信内容的形式以及通信内容的传输进行规范。通信的全部内容(报文)有多种形式在计算机之间传输,比如一次性全部传输完(电路交换,抢占整条线路或者单独建立一条两台主机之间的专属线路,效率较低);或者根据IP地址等附属信息,将报文进行切割,每次传输一小部分,类似操作系统中的时间片轮转,每次传输该信息的一小部分(分组交换)。
- 另外,报文传输还需要时间开销。
但是这些仅仅是逻辑上的,对于上述通信协议的体系结构,并没有明确指出各层在计算机通信中的作用。下面具体描述每一层及其作用。
2. 物理层
物理层,这里指的是在介质中如何传输比特流,物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使得链路层感觉不到这些差异。
2.1 通信方式
传输信息主要有三种方式:
- 单工通信:单向传输,即采用该方式,只能是一台主机向另一台主机进行发送数据。
- 半双工通信:双向交替传输,两台主机可以互相发送数据。但是同一时刻,只能是一台主机向另一台主机发送数据。
- 全双工通信:双向同时传输,两台主机可以互相发送数据,并且在同一时刻,即可发送也可以接收。即介质中允许存在双向的信息流。
2.2 总结
物理层就是研究如何在介质中传输比特流,为链路层提供了物质基础。
3. 数据链路层
由于计算机太多,所以一般情况下计算机会在一个小网络内。因此要想发出报文,需要先找到所在子网(同一链路)的出口。链路层协议就是为同一链路的主机提供数据传输服务。从自顶向下的角度看,下面一层都是将上面一层发送的数据进行打包,比如加上本层的报头、报尾,将上一层的数据拆分成若干个数据报文等等。
数据链路层则是把网络层传下来的分组封装成帧,方便在子网内进行传输。
3.1 基本问题
3.1.2 封装成帧
数据链路层将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束。
3.1.2 透明传输
这里的透明传输,指的是对于用户来说,用户察觉不到数据链路层的封装,即无需对数据进行特殊限制。
因为首部和尾部的存在,这两个标识符必定是真实存在的字符,用于表示本帧的开始和结束。那么如果IP数据包中出现了相同字符,那么计算机会不会认为这是数据帧的开始或者结束呢?其实是不会的,因为在封装的时候,本层会对数据内容进行检查,如果出现了首部or尾部,会自动在该字符前面加上一个转义字符,表明本字符不是开始或者结束。那么如果出现了IP数据包中出现了转义字符呢,也会自动在前面加上一个转义字符,表明本字符不是转义字符。
在接收端进行处理之后可以还原出原始数据。这个过程透明传输的内容是转义字符,用户察觉不到转义字符的存在。
3.1.3 差错控制
因为信号的原因,可能存在失真或者解码失败。为了避免数据流比特级的差错出现,数据链路层广泛使用循环冗余检验(CRC)来检查比特错。
3.2 信道分类
数据链路层,主要是方便在一条链路上的主机之间进行通信。链路可以认为是小团体(局域网),比互连网更加小。这里面的通信方式主要有两种:
广播通信
即一对多通信,一台计算机发送的信息可以被广播信道上所有的计算机接收到。所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,否则,不同计算机都在信道上通信就会造成冲突(碰撞)。为了避免冲突,控制广播信道的方式有:信道复用技术和CSMA/CD协议。
点对点通信
即一对一通信,即两台计算机使用专有信道进行通信。在这个点对点信道中,不会有冲突。该信道使用PPP协议进行控制。
3.3 信道复用技术
既然是一对多通信,并且需要不同的计算机在信道内都能发送,为了高效利用信道,可以采用信道复用技术。
频分复用
频分复用的所有主机在相同的时间占用不同的频率带宽资源。
时分复用
时分复用的所有主机在不同的时间占用相同的频率带宽资源(类似CPU时间片轮转)。
统计时分复用
使用频分复用和时分复用进行通信,在通信的过程中主机会一直占用一部分信道资源。但是由于计算机数据的突发性质,通信过程没必要一直占用信道资源而不让出给其他用户使用,因此这两种方式对信道的利用率都不高。
波分复用
光的频分复用。由于光的频率很高,因此习惯上用波长而不是频率来表示所使用的光载波。
码分复用
为信道中的用户分配一个 m bit的码片。这些码片互相正交,因此每个用户发出的数据都会与自身码片进行运算,如果发送的数据为bit 1,那么就发送自身码片,如果是bit 0,那么就发送码片的反码。这样,只需要用所有码片与之进行运算,如果是0,那么就不是该码片用户发送的;如果是1,那么就是该码片用户发送的,并且数据为bit1;如果是-1,那么就是该码片用户发送的,并且数据为bit 0。
另外,可以看到码分复用需要发送的数据量为原先的m倍。
3.4 CSMA/CD协议
CSMA/CD 表示载波监听多点接入 / 碰撞检测。
- 多点接入 :说明这是总线型网络,许多主机以多点的方式连接到总线上。
- 载波监听 :每个主机都必须不停地监听信道。在发送前,如果监听到信道正在使用,就必须等待。
- 碰撞检测 :在发送中,如果监听到信道已有其它主机正在发送数据,就表示发生了碰撞。虽然每个主机在发送数据之前都已经监听到信道为空闲,但是由于电磁波的传播时延的存在,还是有可能会发生碰撞。
记端到端的传播时延为 τ,最先发送的站点最多经过 2τ 就可以知道是否发生了碰撞,称 2τ 为 争用期 。只有经过争用期之后还没有检测到碰撞,才能肯定这次发送不会发生碰撞。
当发生碰撞时,站点要停止发送,等待一段时间再发送。这个时间采用 截断二进制指数退避算法 来确定。从离散的整数集合 {0, 1, .., (2^k-1)} 中随机取出一个数,记作 r,然后取 r 倍的争用期作为重传等待时间。
3.5 PPP协议
PPP协议主要用于点对点通信。
互联网用户通常需要连接到某个ISP之后才能接入到互联网,PPP协议是用户计算机和ISP进行通信时所使用的数据链路层协议。
PPP 的帧格式:
- F 字段为帧的定界符
- A 和 C 字段暂时没有意义
- FCS 字段是使用 CRC 的检验序列
- 信息部分的长度不超过 1500
3.6 其他
3.6.1 MAC地址
除了网络层的IP地址,还有链路层的MAC地址。该地址长度为6字节(48位),用于唯一标识网络适配器(网卡)。
注意,这里和IP地址是有区别的。IP地址是谁连接在这个网络内,由ISP来分配,而ISP在地理位置上是固定的,因此IP地址也算是地理位置固定的。而MAC地址则是表示网卡的,即硬件,这个网卡是永久不变的,无论在哪里,无论接入到哪个ISP下。
一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因此就有两个 MAC 地址。
3.6.2 局域网
局域网是一种典型的广播信道,主要特点是网络为一个单位所拥有,且地理范围和站点数据均有限。主要有以太网、令牌环网、ATM等局域网技术,目前以太网占领着有线局域网市场。
可以按照网络拓扑结构对局域网进行分类:
3.6.3 以太网
以太网是一种星型拓扑结构局域网。
早期使用集线器进行连接,集线器是一种物理层设备, 作用于比特而不是帧,当一个比特到达接口时,集线器重新生成这个比特,并将其能量强度放大,从而扩大网络的传输距离,之后再将这个比特发送到其它所有接口。如果集线器同时收到两个不同接口的帧,那么就发生了碰撞。
目前以太网使用交换机替代了集线器,交换机是一种链路层设备,它不会发生碰撞,能根据 MAC 地址进行存储转发。
以太网帧格式:
- 类型 :标记上层使用的协议;
- 数据 :长度在 46-1500 之间,如果太小则需要填充;
- FCS :帧检验序列,使用的是 CRC 检验方法;
3.6.4 交换机
交换机主要根据交换表进行存储转发。交换机具有自学习能力,学习的是交换表的内容,交换表中存储着 MAC 地址到接口的映射。
正是由于这种自学习能力,因此交换机是一种即插即用设备,不需要网络管理员手动配置交换表内容。
下图中,交换机有 4 个接口,主机 A 向主机 B 发送数据帧时,交换机把主机 A 到接口 1 的映射写入交换表中。为了发送数据帧到 B,先查交换表,此时没有主机 B 的表项,那么主机 A 就发送广播帧,主机 C 和主机 D 会丢弃该帧,主机 B 回应该帧向主机 A 发送数据包时,交换机查找交换表得到主机 A 映射的接口为 1,就发送数据帧到接口 1,同时交换机添加主机 B 到接口 2 的映射。
3.6.5 虚拟局域网
虚拟局域网可以建立与物理位置无关的逻辑组,只有在同一个虚拟局域网中的成员才会收到链路层广播信息。
例如下图中 (A1, A2, A3, A4) 属于一个虚拟局域网,A1 发送的广播会被 A2、A3、A4 收到,而其它站点收不到。
使用 VLAN 干线连接来建立虚拟局域网,每台交换机上的一个特殊接口被设置为干线接口,以互连 VLAN 交换机。IEEE 定义了一种扩展的以太网帧格式 802.1Q,它在标准以太网帧上加进了 4 字节首部 VLAN 标签,用于表示该帧属于哪一个虚拟局域网。
3.7 总结
数据链路层主要是为了在一条链路(局域网)上进行通信,可以一对多,也可以一对一。
一对多需要信道复用技术以及CSMA/CD协议;一对一则需要PPP协议。因为是在局域网中,为了方便,设置了MAC地址,通过交换机可很方便地缩小目标主机所在的局域网范围。
局域网,最经典的局域网就是以太网。
除了在局域网内通信,数据链路层还有一个作用就是差错控制,检验数据帧是否传输过程中出现了bit错误。
4. 网络层
网络层是为主机提供数据传输服务。网络层把传输层传递下来的报文段或者用户数据报封装成分组。通过网络层,可以找到具体的主机。
因为网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。使用 IP 协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络。网络层可以将各个小局域网连接起来,形成一个更大的网络。
网络层用到的协议有:
- IP协议(Internet Protocol)
- 地址解析协议ARP(Address Resolution Protocol)
- 网际控制报文协议ICMP(Internet Control Message Protocol)
- 网际组管理协议IGMP(Internet Group Management Protocol):主要是建立并管理维护组播成员关系。
4.1 IP协议
网络层的数据称为数据报,遵循IP协议的数据报也被称为IP数据报,现在主要有IPv4和IPv6两种格式。
4.1.1 IP数据报
报文格式如下所示:
- 版本 : 有 4(IPv4)和 6(IPv6)两个值;
- 首部长度 : 占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为固定部分长度为 20 字节,因此该值最小为 5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。
- 区分服务 : 用来获得更好的服务,一般情况下不使用。
- 总长度 : 包括首部长度和数据部分长度。
- 生存时间 :TTL,它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报。
- 协议 :指出携带的数据应该上交给哪个协议进行处理,例如 ICMP、TCP、UDP 等。
- 首部检验和 :因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。
- 标识 : 在数据报长度过长从而发生分片的情况下,相同数据报的不同分片具有相同的标识符。
- 片偏移 : 和标识符一起,用于发生分片的情况。片偏移的单位为 8 字节。
4.1.2 IP地址编址
我们知道MAC地址是网卡的硬件地址,是全球唯一的。而IP地址则是地理位置上的地址,也是全球唯一的。IP地址怎么划分呢?主要经历了如下三个历史阶段:
分类
由两部分组成:网络号和主机号。其中不同分类具有不同的网络号长度,并且是固定的。IP 地址 ::= {< 网络号 >, < 主机号 >}。
子网划分
子网划分则是将主机号再次划分,拿出一部分作为子网号,使得IP地址不被浪费。IP 地址 ::= {< 网络号 >, < 子网号 >, < 主机号 >}。要使用子网,必须配置子网掩码。一个 B 类地址的默认子网掩码为 255.255.0.0,如果 B 类地址的子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0。注意,外部网络看不到子网的存在。子网只是逻辑上,在大网络中划分更多的子网,使得充分利用所分配的IP地址。
无分类
无分类编址感觉像是对子网的进一步统一,即一方面不再局限于ABC类地址。无分类编址 CIDR 消除了传统 A 类、B 类和 C 类地址以及划分子网的概念,使用网络前缀和主机号来对 IP 地址进行编码,网络前缀的长度可以根据需要变化。IP 地址 ::= {< 网络前缀号 >, < 主机号 >}。
CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。CIDR 的地址掩码可以继续称为子网掩码,子网掩码首 1 长度为网络前缀的长度。
一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 构成超网 。在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。
4.2 ARP协议
网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。
换句话说,计算机应用要发送数据,显然,要形成数据【应用层】;接着要根据应用的特点,指明使用可靠传输还是不可靠传输【传输层】;接下来就要指明要到达的主机【网络层】;因为有若干个网络,显然不能一步到达该主机,因此先逐步到达离该主机近的子网,也就是在每个子网内找【数据链路层】(判断是否在本子网内,如果没有,那么就找本子网内的出口计算机,即路由器);最后就是在物理介质中传输比特流【物理层】。
既然在链路中通信,那么就需要知道MAC地址。这时需要ARP协议。如下所示:
但是既然要知道某一台计算机的MAC地址,肯定要知道它的IP地址,这样才能通信。ARP 实现由 IP 地址得到 MAC 地址。
具体来说,每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。
但是怎么知道主机B的IP地址呢?首先查看本数据包的目的地址,判断是否在本局域网内,如果没有那么就直接查找本局域网内的路由器IP地址【本局域网内的路由器IP地址肯定是有的】,找到其MAC地址,发送数据包到该路由器,直接出本局域网。
4.3 ICMP协议
ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。
ICMP 报文分为差错报告报文和询问报文。ICMP主要有以下两个应用:
4.3.1 Ping
Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。
4.3.2 Traceroute
Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。
- 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文。
- 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。
- 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
- 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。
似乎这个就是为了测试到达目的主机的所有路由器IP地址等信息,本质上还是基于ICMP协议。
4.4 其他
4.4.1 虚拟专用网VPN
由于 IP 地址的紧缺,一个机构能申请到的 IP 地址数往往远小于本机构所拥有的主机数。并且一个机构并不需要把所有的主机接入到外部的互联网中,机构内的计算机可以使用仅在本机构有效的 IP 地址(专用地址)。
有三个专用地址块【内网地址】:
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0 ~ 192.168.255.255
VPN 使用公用的互联网作为本机构各专用网之间的通信载体。专用指机构内的主机只与本机构内的其它主机通信;虚拟指:好像是,而实际上并不是,它有经过公用的互联网。【换句话说,VPN是通过公网搭建的一个虚拟的局域网,只允许局域网内的主机访问某些服务,而外网访问不到。并且本质上两台主机利用的是局域网内的IP地址在公网上通信。】
下图中,场所 A 和 B 的通信经过互联网,如果场所 A 的主机 X 要和另一个场所 B 的主机 Y 通信,IP 数据报的源地址是 10.1.0.1,目的地址是 10.2.0.3。数据报先发送到与互联网相连的路由器 R1,R1 对内部数据进行加密,然后重新加上数据报的首部,源地址是路由器 R1 的全球地址 125.1.2.3,目的地址是路由器 R2 的全球地址 194.4.5.6。路由器 R2 收到数据报后将数据部分进行解密,恢复原来的数据报,此时目的地址为 10.2.0.3,就交付给 Y。
4.4.2 网络地址转换NAT
我们知道,IP地址是有限的。因此,怎么为接入互联网的每一台计算机都分配IP地址呢?可以让若干台计算机对外共用一个IP地址【公网地址】,对内使用不同的IP地址【私网地址,不能在公网上识别】。那么外网计算机和内网的计算机怎么通信呢?这就需要NAT技术。
专用网内部的主机使用本地 IP 地址又想和互联网上的主机通信时,可以使用 NAT 来将本地 IP 转换为全球 IP。
在以前,NAT 将本地 IP 和全球 IP 一一对应,这种方式下拥有 n 个全球 IP 地址的专用网内最多只可以同时有 n 台主机接入互联网。为了更有效地利用全球 IP 地址,现在常用的 NAT 转换表把传输层的端口号也用上了,使得多个专用网内部的主机共用一个全球 IP 地址。使用端口号的 NAT 也叫做网络地址与端口转换 NAPT。
4.4.3 路由器
在链路中转发数据帧,需要交换机;而在网络中传输数据报,则需要路由器。
4.4.3.1 路由器的结构
路由器从功能上可以划分为:路由选择和分组转发。
4.4.3.2 路由器分组转发流程
分组转发其实就是转发数据报,找到与该目的IP最相近的路由器或者主机并转发【重新封装MAC地址】。
分组转发结构由三个部分组成:交换结构、一组输入端口和一组输出端口。
- 从数据报的首部提取目的主机的 IP 地址 D,得到目的网络地址 N。
- 若 N 就是与此路由器直接相连的某个网络地址,则进行直接交付;
- 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给表中所指明的下一跳路由器;
- 若路由表中有到达网络 N 的路由,则把数据报传送给路由表中所指明的下一跳路由器;
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;
- 报告转发分组出错。
4.4.3.3 路由选择协议
前面提到,在分组转发的时候需要查找路由表。那么路由表是怎么生成的呢?需要路由选择协议,路由选择协议都是自适应的,能随着网络通信量和拓扑结构的变化而自适应地进行调整。互联网可以划分为许多较小的自治系统 AS,一个 AS 可以使用一种和别的 AS 不同的路由选择协议。
可以把路由选择协议划分为两大类:
- 自治系统内部的路由选择:RIP 和 OSPF
- 自治系统间的路由选择:BGP
内部网关协议RIP
RIP 是一种基于距离向量的路由选择协议。距离是指跳数,直接相连的路由器跳数为 1。跳数最多为 15,超过 15 表示不可达。RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。
距离向量算法:
- 对地址为 X 的相邻路由器发来的 RIP 报文,先修改报文中的所有项目,把下一跳字段中的地址改为 X,并把所有的距离字段加 1;
- 对修改后的 RIP 报文中的每一个项目,进行以下步骤:
- 若原来的路由表中没有目的网络 N,则把该项目添加到路由表中;
- 否则:若下一跳路由器地址是 X,则把收到的项目替换原来路由表中的项目;否则:若收到的项目中的距离 d 小于路由表中的距离,则进行更新(例如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);否则什么也不做。
- 若 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为 16。
RIP 协议实现简单,开销小。但是 RIP 能使用的最大距离为 15,限制了网络的规模。并且当网络出现故障时,要经过比较长的时间才能将此消息传送到所有路由器。
内部网关协议OSPF
开放最短路径优先 OSPF,是为了克服 RIP 的缺点而开发出来的。开放表示 OSPF 不受某一家厂商控制,而是公开发表的;最短路径优先表示使用了 Dijkstra 提出的最短路径算法 SPF。
OSPF 具有以下特点:
- 向本自治系统中的所有路由器发送信息,这种方法是洪泛法。
- 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示。
- 只有当链路状态发生变化时,路由器才会发送信息。
所有路由器都具有全网的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程收敛的很快。
外部网关协议BGP
BGP(Border Gateway Protocol,边界网关协议)
AS 之间的路由选择很困难,主要是由于:
- 互联网规模很大;
- 各个 AS 内部使用不同的路由选择协议,无法准确定义路径的度量;
- AS 之间的路由选择必须考虑有关的策略,比如有些 AS 不愿意让其它 AS 经过。
BGP 只能寻找一条比较好的路由,而不是最佳路由。
每个 AS 都必须配置 BGP 发言人,通过在两个相邻 BGP 发言人之间建立 TCP 连接来交换路由信息。
4.5 总结
网络层目的是两台计算机之间的通信,采用IP协议,需要目的主机的标识(IP地址),发送的数据成为IP数据报。网络层是跨链路的,因此在链路内仍然需要MAC地址。但是IP地址容器获得,而MAC地址则不容易获取,因此需要根据IP地址获取到其MAC地址,从而在链路层进行通信。这时候需要ARP协议。为了方便两台计算机之间进行通信,可采用ICMP协议进行信息测试。
因为IP地址是有限的,因此在局域网内,可采用内网地址,进行内部通信;对外用少量的公网IP地址向外通信,内网和外网计算机之间的通信,此时需要NAT(NAPT)协议进行地址映射。
另外,计算机之间不是直连的,即需要有中转设备进行转发,即路由器。那么路由器怎么选择向哪里转发呢?这就需要路由表,存储离该目的IP主机最近的路由器地址。因此需要生成路由表,此时就需要计算机通信来明确路径信息,有RIP协议、OSPF协议以及BGP协议。
总体来说,网络层就是为了在不同网络之间传输。
5. 运输层
通过网络层,可以找到这个主机。但是主机之间有多个端口(这时的主机,可以看成是不同的国家;这时的端口就相当于国家的港口,因此,数据链路层有MAC地址,网络层有IP地址,运输层则有端口号)。端口是计算机通信的一个逻辑渠道。运输层是为主机中的进程(端口)提供通用数据传输服务。
为什么需要这个层呢?似乎应用层和网络层已经可以实现应用通信了。其实应用通信主要有两种基础形式,一种是可靠连接,即需要两个应用一旦建立连接,就保证那边发送了数据,这边一定能接收到数据,此时就保证了接收到的数据是有序的(比如银行交易);一种是不可靠连接,即对数据无需按顺序重新组装,直接接收和发送(比如聊天),而不管对方是否真正接收到。
因此将这种形式抽象出来,形成新的一层。而应用层就可以完全针对应用进行开发即可。由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。
总体来说,网络层只是把分组发送到目的主机,但是真正通信的并不是主机,而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。
应用之间传递数据,只要有两种方式,一种是必须保证对方接收到数据,另一种则无需保证对方接受到数据。因此运输层包括两种协议:
传输控制协议 TCP,提供面向连接、可靠的数据传输服务,数据单位为报文段;
传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
用户数据报协议 UDP,提供无连接、尽最大努力的数据传输服务,数据单位为用户数据报。
用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
由上可以看出,TCP 主要提供完整性服务,UDP 主要提供及时性服务。
5.1 UDP
UDP报文首部格式如下所示:
首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。
5.2 TCP
TCP报文首部格式如下所示:
- 源端口和目的端口就是运输层的“地址”。
- 序号:用于对本数据包中的字节流编号【因为TCP会对应用报文进行拆分,为了客户端能够还原成报文,所以需要编号】。
- 确认号:同序号,确认号是期望收到的下一个报文段的序号。
- 数据偏移:指的是数据部分起始处距离报文起始段处的偏移量。
- 确认ACK:当ACK为1时,本字段有效。TCP规定,在连接建立后,所有传送的报文段都必须把ACK置为1。
- 同步SYN:在连接建立时,用来同步信号。当SYN=1,ACK=0时,表明这是一个连接请求报文段。若对方同一建立连接,则响应报文为SYN=1,ACK=1。
- 终止FIN:用于释放一个连接,当FIN=1时,表示此报文段的发送方的数据已经发送完毕,并要求释放连接。
- 窗口:窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的,注意窗口值和最大报文长度是不一样的,窗口值表明能够缓存的数据的长度。
5.2.1 TCP的三次握手
因为TCP是可靠传输,所以为了保证可靠,必须要建立连接通道。建立通道需要进行三次握手,如下所示:
- 首先要建立连接,肯定是客户主要请求。即发送SYN=1,seq=x的报文。
- 服务器收到后,要进行回复确认收到的报文,即SYN=1,ACK=1,ack=x+1,seq=y。
- 这里为了保证客户收到了服务器的响应报文,客户需要对服务器进行再次确认【无需SYN】,ACK=1,ack=y+1,seq=x+1。
通过三次报文,使得客户端和服务器之间建立了连接。第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。
客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,此时服务器就会收到两个同样的连接,那么服务器就会返回两个同样的确认,就会打开两个连接。
如果有第三次握手,客户端就会根据seq来确认是否是历史连接,因此客户端会忽略服务器之后发送的对滞留连接请求的连接确认,即不进行第三次握手,会发送RST报文,来终止该重复连接,因此就不会再次打开连接。
5.2.2 TCP的四次挥手
三次握手是建立连接,而四次挥手则是为了释放连接。如下所示:
因为是双向通信,所以关闭连接需要双方都关闭。
- 客户端发送FIN报文,终止连接
- 服务端收到后,发送确认报文,此时TCP处于半关闭状态,即CLOSE_WAIT,客户端不能向服务器发送“数据”。
- 当服务器也不需要向客户端发送报文时,同样发送FIN报文,终止连接。
- 客户端收到后,发送确认报文,此时进入TIME-WAIT状态,等待2 * MSL(最大报文存活时间)后释放连接。
- 服务端收到报文后释放连接。
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
TIME_WAIT:客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:
- 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
- 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
5.3 可靠传输
TCP是可靠传输,通过超时重传来实现可靠传输。
超时重传:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。
一个报文段从发送到接收到确认所经过的时间称为往返时间RTT。
5.4 滑动窗口
在5.2节提到过窗口字段。窗口是缓存的一部分,用来暂时存放字节流。
发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。
接收窗口只会对窗口内最后一个按序到达的字节进行确认【注意,这里说的是按序到达的最后一个字节】,例如接收窗口已经收到的字节为{31, 34, 35},其中{31} 按序到达,而{34, 35}就不是,因此只对字节31进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
5.5 流量控制
流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
5.6 拥塞控制
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
为了便于讨论,做如下假设:
- 接收方有足够大的接收缓存,因此不会发生流量控制;
- 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。
5.6.1 慢开始与拥塞避免
发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …
注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。
如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。
5.6.2 快重传与快恢复
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。
在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。
5.7 总结
网络层是找到具体的IP主机,进行主机间通信。而网络层则是为了主机上的某个应用通信而设置的协议。应用可分为两大类:
- 要求数据必须到达【可靠传输】
- 不要求数据必须到达,到达不了,你可以再次请求【不可靠传输】
网络层将上述两类封装成两个协议TCP、UDP。UDP协议是为了尽可能多的传输数据,即不可靠传输。而TCP协议则是为了可靠传输,保证数据安全达到,如果到达不了,服务器会再次重新发送。
TCP协议首先需要建立连接:三次握手,建立连接的目的是保证对方主机端口可达,让对方应用在该端口监听,以及获得一些额外的信息等等。建立连接之后,可进行数据传输。因为是双向通信,所以断开连接需要四次挥手。
可靠传输主要通过超时重传来实现,客户端在收到数据后会返回一个确认收到包,那么此时如果服务端在一个往返时间内收不到,会再次重传该数据包。
此外,TCP协议字段中有一个窗口字段,表名本机目前可用于接收数据包的缓存空间,用于限制对方发送的数据量,即流量控制。
另外,TCP协议也可针对网络状况进行拥塞控制。【暂时认为没有窗口流量控制】首先在发送数据包的时候:
- 以慢开始(2倍)逐渐增大数据包的数量
- 当数据量超过了某个阈值之后,开始拥塞避免(每次增加1)
- 如果出现超时,此时阈值减半,重新进行慢开始。
- 如果出现了单个数据包丢失(注意,这里是单个数据包丢失,服务端会收到三个确认包。而超时,则意味着服务端不会收到数据包),服务端会进行快重传,重新发送该数据包。
- 然后进行快恢复,即阈值减半,并且发送的数据量等于阈值,即直接进入拥塞避免阶段。
6. 应用层
应用层是针对计算机中特定应用程序提供的数据传输服务,例如 HTTP、DNS、OICQ 等协议,主要是为了不同的特点和目的【应用传输数据的特点】,而研发的特定的协议【其实就是数据传送格式】。数据单位为报文。本节介绍常用的应用层协议。
6.1 域名系统(DNS)
DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名。
DNS既可以使用UDP,也可使用TCP进行传输,使用的端口号都为53。大多数情况下DNS使用UDP协议,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。以下两种情况会使用TCP进行传输:
- 如果返回的响应超过512字节(UDP最大只支持512字节数据,此时就需要TCP进行分包传送)
- 区域传送(就是主域名服务器向辅助域名服务器传送变化的那部分数据)
6.2 文件输送协议(FTP)
FTP使用TCP进行连接,它需要两个连接来传送一个文件:
- 控制连接:服务器打开21端口等待客户端的连接,客户端主动建立连接后,使用这个连接将客户端的命令传送给服务器,并传回服务器的应答。
- 数据连接:用来传送一个文件数据。
根据数据连接是否是服务端主动建立【注意,控制连接一定是客户端主动建立的】,FTP有主动和被动两种模式:
主动模式:服务器端主动建立数据连接,端口号为20,客户端的端口号随机,但必须大于1024【因为0~1023是熟知端口号】。
被动模式:客户端主动建立数据连接,客户端的端口号自己指定,服务端的端口号随机。
主动模式要求客户端开放端口号给服务器,需要去配置客户端的防火墙。被动模式只需要服务端开放端口号即可,无需客户端配置防火墙。但是主动模式只需要开放特定的端口号(20)即可。而被动模式,因为客户端随机指定端口,此时服务端应该开放尽可能多的端口,导致安全性减弱。
6.3 动态主机配置协议(DHCP)
本协议(Dynamic Host Configuration Protocol)主要用于自动配置接入互联网的主机的IP地址、子网掩码以及网关IP地址等等。
DHCP的工作过程如下:
- 客户端接入网络后,发送Discover报文,该报文的目的地址为
255.255.255.255:67
,源地址为0.0.0.0:68
,被放入UDP中,随即被广播到同一个子网的所有主机上。如果客户端和DHCP服务器不在同一个子网,就需要使用中继代理。 - DHCP服务器收到Discover报文之后,发送Offer报文给客户端【依据请求包的MAC地址来发送】,该报文包含了客户端所需要的信息。因为客户端可能收到多个DHCP服务器提供的信息,因此客户端就需要进行选择。
- 如果客户端选择了某个DHCP服务器提供的信息,那么就发送Request报文给该DHCP服务器。
- DHCP服务器发送ACK报文,表示客户端此时可以使用提供给它的信息。
6.4 远程登录协议(TELNET、SSH)
TELNET 用于登录到远程主机上,并且远程主机上的输出也会返回。TELNET 可以适应许多计算机和操作系统的差异,例如不同操作系统系统的换行符定义。
不过Telnet是明文传输,不安全;而SSH是密文传输,相对安全。
6.5 电子邮件协议
一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。
邮件协议包含发送协议和读取协议,发送协议常用SMTP,读取协议常用POP3和IMAP。如下所示:
整个过程还是比较容易理解的。邮件就是一段数据,可以看成是普通数据。但是和普通数据不同的是,并不是客户端服务器这种模式。因为邮件服务器一般是某个公司搭建的,而我们使用的是某个公司的邮件服务器,但是我们发送的目的邮箱可能是另一个公司的。此时我们先通过用户代理将邮件发送到公司邮件服务器,由公司的邮件服务器发送到接收方的邮件服务器中,然后再由用户代理从服务器读取邮件到接收方。
总体来说,用户代理采用SMTP协议将邮件发送到发送方邮件服务器;发送方邮件服务器采用SMTP协议将邮件发送到接收方邮件服务器,然后接收方用户代理采用POP3协议读取邮件发送到接收方。
SMTP(Simple Mail Transfer Protocol)
SMTP 只能发送 ASCII 码,而互联网邮件扩充 MIME 可以发送二进制文件。MIME 并没有改动或者取代 SMTP,而是增加邮件主体的结构,定义了非 ASCII 码的编码规则。
POP3(Post Office Protocol - Version 3)
POP3 的特点是只要用户从服务器上读取了邮件,就把该邮件删除。但最新版本的 POP3 可以不删除邮件。
IMAP(Internet Message Access Protocol)
IMAP 协议中客户端和服务器上的邮件保持同步,如果不手动删除邮件,那么服务器上的邮件也不会被删除。IMAP 这种做法可以让用户随时随地去访问服务器上的邮件。IMAP只是访问服务器,并不是将服务器上的邮件下载到本地。相当于远程访问。
6.6 常用端口
应用 | 应用层协议 | 端口号 | 传输层协议 | 备注 |
---|---|---|---|---|
域名解析 | DNS | 53 | UDP/TCP | 长度超过512字节时使用TCP |
动态主机配置协议 | DHCP | 67/68 | UDP | |
简单网络管理协议 | SNMP | 161/162 | UDP | |
文件传送协议 | FTP | 20/21 | TCP | 控制连接21,数据连接20 |
远程终端协议 | TELNET | 23 | TCP | |
超文本传送协议 | HTTP | 80 | TCP | |
简单邮件传送协议 | SMTP | 25 | TCP | |
邮件读取协议 | POP3 | 110 | TCP | |
网际报文存取协议 | IMAP | 143 | TCP |
6.7 Web页面请求过程
下面讲解一下Web页面的请求过程。首先本机接入互联网,其次需要知道网关路由器的IP和MAC地址,最后还要知道目的网站域名的IP地址。
- 本机接入互联网,需要DHCP协议来分配IP地址、DNS服务器IP地址、默认网关路由器的IP地址和子网掩码等等。
- 假设主机最开始没有 IP 地址以及其它信息,那么就需要先使用 DHCP 来获取。
- 主机生成一个 DHCP 请求报文,并将这个报文放入具有目的端口 67 和源端口 68 的 UDP 报文段中。
- 该报文段则被放入在一个具有广播 IP 目的地址(255.255.255.255) 和源 IP 地址(0.0.0.0)的 IP 数据报中。
- 该数据报则被放置在 MAC 帧中,该帧具有目的地址 FF:FF:FF:FF:FF:FF,将广播到与交换机连接的所有设备。
- 连接在交换机的 DHCP 服务器收到广播帧之后,不断地向上分解得到 IP 数据报、UDP 报文段、DHCP 请求报文,之后生成 DHCP ACK 报文,该报文包含以下信息:IP 地址、DNS 服务器的 IP 地址、默认网关路由器的 IP 地址和子网掩码。该报文被放入 UDP 报文段中,UDP 报文段有被放入 IP 数据报中,最后放入 MAC 帧中。
- 该帧的目的地址是请求主机的 MAC 地址,因为交换机具有自学习能力,之前主机发送了广播帧之后就记录了 MAC 地址到其转发接口的交换表项,因此现在交换机就可以直接知道应该向哪个接口发送该帧。
- 主机收到该帧后,不断分解得到 DHCP 报文。之后就配置它的 IP 地址、子网掩码和 DNS 服务器的 IP 地址,并在其 IP 转发表中安装默认网关。
- 因为我们只知道域名,接下来就是需要解析该域名。但是解析域名,需要将DNS报文发送到DNS服务器中来查询。默认的DNS服务器已经由DHCP获取到了。此时在子网内将数据包发送到网关路由器上即可(IP地址已经获得了)。而子网需要用到数据链路层协议,需要MAC地址,即需要ARP协议来获得MAC地址。
- DHCP 过程只知道网关路由器的 IP 地址,为了获取网关路由器的 MAC 地址,需要使用 ARP 协议。
- 主机生成一个包含目的地址为网关路由器 IP 地址的 ARP 查询报文,将该 ARP 查询报文放入一个具有广播目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该以太网帧,交换机将该帧转发给所有的连接设备,包括网关路由器。
- 网关路由器接收到该帧后,不断向上分解得到 ARP 报文,发现其中的 IP 地址与其接口的 IP 地址匹配,因此就发送一个 ARP 回答报文,包含了它的 MAC 地址,发回给主机。
- 此时在本子网内发送DNS报文所需的字段都已经获取到了,接下来就是发送报文,通过DNS协议来解析域名了。
- 知道了网关路由器的 MAC 地址之后,就可以继续 DNS 的解析过程了。通过MAC地址,发送到网关路由器。
- 网关路由器接收到包含 DNS 查询报文的以太网帧后,抽取出 IP 数据报,并根据转发表决定该 IP 数据报应该转发的路由器。
- 因为路由器具有内部网关协议(RIP、OSPF)和外部网关协议(BGP)这两种路由选择协议,因此路由表中已经配置了网关路由器到达 DNS 服务器的路由表项。
- 到达 DNS 服务器之后,DNS 服务器抽取出 DNS 查询报文,并在 DNS 数据库中查找待解析的域名。
- 找到 DNS 记录之后,发送 DNS 回答报文,将该回答报文放入 UDP 报文段中,然后放入 IP 数据报中,通过路由器反向转发回网关路由器,并经过以太网交换机到达主机。
- 经过DNS协议,获得了目标网站的IP地址。接下来利用HTTP协议来发送Web请求获得数据。【应用层基于传输层,所以此时二者一起陈述】
- 有了 HTTP 服务器的 IP 地址之后,主机就能够生成 TCP 套接字,该套接字将用于向 Web 服务器发送 HTTP GET 报文。
- 在生成 TCP 套接字之前,必须先与 HTTP 服务器进行三次握手来建立连接。生成一个具有目的端口 80 的 TCP SYN 报文段,并向 HTTP 服务器发送该报文段。
- HTTP 服务器收到该报文段之后,生成 TCP SYN ACK 报文段,发回给主机。
- 连接建立之后,浏览器生成 HTTP GET 报文,并交付给 HTTP 服务器。
- HTTP 服务器从 TCP 套接字读取 HTTP GET 报文,生成一个 HTTP 响应报文,将 Web 页面内容放入报文主体中,发回给主机。
- 浏览器收到 HTTP 响应报文后,抽取出 Web 页面内容,之后进行渲染,显示 Web 页面。
6.8 总结
应用层协议其实本质就是不同应用在服务端和客户端之间传输数据的格式要求。比如HTTP、FTP、SMTP、DNS等等,都是为了某种应用而设计的不同格式。注意,这些应用都需要依托TCP或者UDP来传输数据。
7. 总结
总体来说,计算机网络几层协议:
最上面的应用层是最核心的数据,为了将数据安全完整地到达目的地,需要添加各种协议来约束,比如运输层中的TCP和UDP来保证是否可靠传输。比如网络层的IP协议来保证到达某个子网或者主机。比如数据链路层中的协议来保证在子网内传输数据等等。
在向下的过程中,需要添加本层协议所需要的首部或者尾部,而在向上的过程中不断拆开下层协议首部和尾部。
路由器只有下面三层协议,因为路由器位于网络核心中,只是将数据转发到不同网络中,不需要在进程或者应用程序层面提供服务,因此也就不需要运输层和应用层。
交换机则只有两层,即通过MAC地址来转发到对应的链路中。