计算机网络
- 前言
- web 浏览器
- 协议栈
- 创建套接字阶段。
- 连接阶段。
- 断开阶段。
- IP模块
- 网卡
- 网络设备 --- 集线器、交换器和路由器
- 集线器
- 交换器
- 路由器
- 路由器的附加功能一 :地址转换
- 路由器的附加功能一 :包过滤功能
- 互联网内部
- 接入网
- 光纤接入网(FTTH)
- 接入网使用的PPP
- 接入网的整体工作流程
- 网络运营商的内部
- 服务器端的局域网
- 负载均衡
- 后记
前言
或许我们们在学完计算机网络之后,由于课程的性质,一方面是基于比较古老的经典技术,二是依据网络的各个层次来讲述的,如此就导致了在学完之后,各个层次之间都明白了,但是各个层次之间的具体联系却没有那么清晰。
在现阶段其带来的后果,一是在学习计算机网络的时候遇到一些问题感觉无法解释或者答案的解释不好理解,二是不好进行学以致用,因为首先课本是没有对接到现实生活中的,其次每个层次在现实世界中的具体实现机器采用的是较为古老的经典机器了。这第二点我感觉很明显,就导致我在学完之后还是无法对现实生活中的具体计算机网络进行解释。
在学校的时候也在图书馆中看了一本具体描述现实生活中计算机网络是如何运转的,但是个人感觉不是很好。在这个寒假的时候,偶然看到户根勤/周自恒两位编写的《网络是怎样连接的》在看得工程中直呼666,在看完之后对之前的大多数问题有了较为深刻的理解。因此在此想写结合自己所学写一篇读书笔记,来记录自己吧。
下图是书中章节的次序,因此我也是借用此结构来进行描述。
在客户端中,涉及到的结构大致如下图
web 浏览器
- 当我们在浏览器输入一个网址的时候,首先浏览器会对该URL进行解析,解析主要是通过网址知道Web服务器名称、文件路径(该文件路径一般不等价于在服务器中的路径,因为如果是一致的那么不就是说明服务器的路径对外界是公开的了,因此一般在服务器这端会有路径映射的操作)等信息。
- 接下来,浏览器会使用HTTP协议来访问服务器。HTTP协议定义了客户端与服务器之间交互的消息内容和步骤。客户端向服务器发送的请求消息,包含的内容是“对什么”和“进行怎样的操作”两个部分。①对什么,就是访问的目标,我们一般称之为URI(统一资源分配标识符,一般来说是一个存放网页数据的文件名或者一个CGI程序的文件名)。②进行怎样的操作,我们称之为方法,表示需要让Web服务器完成怎样的工作,其中常见的是GET(读取URI表示的数据)和POS(将客户端输入的数据发送给URI表示的程序,因此在请求消息中,除了方法和URI之外,还要加上传递给应用程序和脚本的数据,Web服务器会将这些数据发送给URI指定的应用程序。最后Web服务器从应用程序接收输出的结果,返回给客户端)
- 浏览器会依据HTTP协议生成HTTP请求消息,给消息在格式上有严格规定。格式如下图所示
- 生成HTTP消息之后,浏览器需要委托操作系统将消息发送给Web服务器。在这个工作之前需要查询Web服务器的IP地址,就是说我们需要通过网址的域名要查询出IP,这就是在计算机网络中提到的DNS技术了。查询IP地址只需要询问最近的DNS服务器即可。在计算机中相当于DNS客户端的部分我们称之为DNS解析器,简称解析器,解析器是一段程序,其包含在操作系统的Socket库中。(Socket库,是基于c语言设计的,包含很多用于发送和接收数据的程序组件,可以让其他的应用程序调佣操作系统的网络功能,式网络开发中的一种标准库)。通过解析器向DNS服务器发出查询的调用如下图
调用之后,获取到IP地址后,连同HTTP请求消息一起交给操作系统。 - 我们来谈一下DNS,我们查询DNS服务器自然也需要知道DNS服务器的IP地址,那么这个地址如何知道的呢?这个IP地址是作为TCP/IP的一个设置事先设置好的,不需要再去查询了。如下图为Windows中的DNS设置,解析器会根据这里设置的DNS服务器IP地址来发送消息。
如下图客户端会访问最近的一台DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址)。如果最近的DNS服务器中没有存放我们要查询域名的IP信息,我们就需要从顶层开发向下查找,在这里最近的DNS服务器都会保存跟域DNS服务器的信息。
将客户端的查询信息转发给跟域DNS服务器。这个时候的查询如下图所示
就像图中所表示的一样,我们客户端只需要通过查询最近的DNS服务器最终就会从该DNS服务器中得到想要的IP地址,其余过程都由最近的DNS服务器来进行操作,同时我们发现,从跟域换下查询的工程都是最近的DNS服务器对下一个域名进行查询,知道问道IP地址。
上边为理论情况,在现实生活中,一个DNS服务器可以管理多个域的信息,也就是说现实中上级域域下级域有可能共享一台DNS服务器。那么在访问的时候如果没有,就可以直接返回再下一级的DNS服务器的相关信息。同时DNS服务器有一个缓存功能,可以记住之前查询的域名,该缓存的信息是由一个有效期的。(返回的信息中,也会告知客户端该响应的结果是来自缓存还是管理该域名的服务器)
协议栈
委托操作系统内部的协议栈向目标IP地址发送信息。这里也是需要使用Socket库中的程序组件,按照指定的顺序调用多个程序组件。在进行数据收发之前,双方需要先建立一条通信管道(抽象意义的)。而建立管道的关键在于管道两侧的数据出入口,这些入口称为套接字。大致操作可以分为以下4点。
- 创建套接字
- 将管道连接到服务器端的套接字上
- 收发数据(通信阶段)
- 断开管道并删除套接字(断开阶段)
四个操作都是由操作系统的协议栈来执行的,在每个阶段,Socket库中的程序组件都会被调用来执行相关操作。
创建套接字阶段。
客户端是调用Socket库中的socket程序组件,在创建完套接字后,协议栈会返回一个描述符,应用程序会将收到的描述符放在内存中。(描述符是用来描述不同套接字的,因为同一台计算机上可以同时存在多个套接字)。之后,只要出示描述符,协议栈就能判断出我们希望用哪一个套接字来连接或者收发数据了。
套接字在Windows中可以在cmd中使用netstat -ano
命令显示套接字的内容。如下图,图中每一行就相当于一个套接字。当创建套接字时,就会在这里增加一行新的控制信息。
PID为Process ID(进程标识符),是操作系统为了标识程序分配的编号,与任务管理器中的是一致的。如果本地IP地址和远程IP地址都是0.0.0.0的话就标识通信还没有开始,IP地址不确定。
连接阶段。
-
应用程序会调用Socket库中的名为connect的程序组件来完成,需要指定描述、服务器IP和端口号这3个参数。连接的目的主要有两个,一个是将服务器的IP地址(通过DNS获取)和端口号(规定)等信息告知协议栈;第二个则是客户端向服务器传达开始通信的请求,其中会告知服务器客户端的IP地址与端口号。(这些控制信息,一类是在计算机网络中就是存放在TCP、IP、MAC的头部中,另一类则是在套接字中)
-
连接的具体步骤大致是 先在TCP模块处创建表示连接控制信息的头部,然后通过TCP头部中的发送方和接收方端口号可以找到要连接的套接字。之后进行的大致是在TCP中谈到的三次握手协议了。
③通信阶段。调用Socket库中的write程序组件。用于接收的则是read程序组件,用于存放接收到的响应信息的内存地区称为接收缓冲区。
首先协议栈并不会关心应用程序传来的数据是什么内容,其次协议栈会先将数据存放在缓冲区中。之后,根据套接字中记录的控制信息标记发送方和接收方的端口号,交给IP模块来执行发送数据的操作。 -
在这里会涉及到TCP中谈到的ACK序号(有效管理ACK序号使用的就是在计网中提到的滑动窗口方式了)机制。(在现实中,ACK与窗口信息传递不是单独进行的,因为如果每一次接收方收到一个包之后都想发送方发送这两个独立的包,那么接收方发送给发送方的包就太多了,会导致效率下降。因此接收方在发送方在发送ACK号和窗口更新时,会等待一段时间,如果这个过程有其他的通知操作,这样就可以将两种通知合并在一个包里边发送了)通过这一个机制,就可以确认接收方有没有收到某个包,如果没有则重新发送。这样一来,我们就不需要再其他地方对错误进行补救了。因此网卡、集线器和路由器都没有错误补偿机制,而是一旦检测到错误的就直接丢弃即可。
-
有发送自然有接收,使用的是rend组件。首先,协议栈会检查收到的数据块和TCP头部的内容,判断是否有数据丢失,如果没有问题则返回ACK序号。然后,将数据块先放入缓冲区中,并将数据库按顺序连接起来还原出原始的数据,最后将数据交给应用程序。
断开阶段。
- 使用的是close程序组件。 在之前的HTTP协议中是将HTML文档和图片都作为单独的对象来处理的,没获取一次数据都要执行一遍上面的四个阶段。因此如果一个网页包含很多张图片,那么就必须重复进行很多次。因此在后来的版本中,能在一次连接中收发多个请求和响应。在这种情况下,是当所有数据都请求完成后,浏览器会主动触发断开连接的操作。
- 在通信结束后,用来通信的套接字也就不会再使用了。不过套接字并不会立即被删除,而是会等待一段时间之后再被删除。目的是为了防止误操作。
IP模块
- 虽然说是IP模块负责将包发送给对方,但实际上将包从发送发传输到接收方的工作是由集线器、路由器等网络设备来完成的,因此IP模块可以说仅仅是这个包传输过程的入口而已。
- 包收发操作的起点是TCP模块委托IP模块发送包,这个委托的过程就是TCP模块在数据块前面加上TCP头部,然后整个传递给IP模块。
- IP模块主要负责添加如下两个头部,一个是MAC头部,没错IP模块的时候加上了MAC头部,包含的是通过以太网的局域网将包传输至最近的路由器所需的控制信号。IP头部中包含的是IP协议规定的、根据IP地址将包发往目的地所需的控制信息。
- 接下来,封装好的包会被交给网络硬件(可能是插在计算机主板上的板卡,也可以是笔记本电脑上的PCMCIA卡或者是计算机主板上集成的芯片,我们统一称之为网卡)。传递给网卡的网络包是由一连串的0和1组成的数字信息,网卡会将这些数字信息转换为电信号或者光信号,并通过网线(或光纤)发送出去,然后这些信号就会到达集线器、路由器等转发设备,之后一步步地送达接收方。
- IP模块接收TCP模块委托负责包的收发工作,首先其会生IP头部附加在TCP头部前面,在IP头部中的发送方IP地址,IP地址是分配给网卡的而不是给计算机的,每一块网卡都会有自己的IP地址。如果有多快网卡,那么一台计算机就有多个IP地址,在填写的时候应该判断使用哪一块网卡来发送这个包。也相当于判断应该将包发往那个路由器,也就是说,只要确定了目标路由器,也就确定了应该使用哪块网卡,也就是发送发的IP地址。
- 那么如何判断发往哪块网卡呢?使用的方式如路由器中的路由表类型。在命令行中输入route print 可以看到类似如下图的显示。也就是说会依据前两列的目标IP与子网掩码来匹配选择那一条,之后对于该项,使用的本地IP地址就是第四列的IP,之后转发的下一路由地址(网关)是第3列的IP地址。第一行为默认网关,如果均不匹配则自动匹配到这一行。
我在自己电脑(只有一块网卡中),显示内容如下。可以看到只要一个网关,是我电脑所连接的路由器的IP地址吧。因为我连接了两个不同的WiFi的输出是不一样的。
-
生成IP头部之后,接下来IP模块还需要在IP头部的前面加上MAC头部。IP头部中的接收方IP地址表示网络包的目的地,通过这个地址我们可以判断要讲包发到哪里。但是在以太网中,判断网络包目的地时和TCP/IP时的方式时不同的,使用的是MAC地址,因此需要加上MAC头部。发送方的MAC地址填写的是网卡本身的MAC地址,MAC地址是在网卡生产时就写入ROM里的了(目前的网卡的MAC地址是全球唯一不可更改的,但是在上课的时候我们老师提到,在当时MAC地址有的网卡是可以进行更改的)。
-
对于接收方的MAC地址,首先通过计网的学习了解到在传输过程中目标IP地址一直是服务器的IP地址,但是MAC地址则是为变化的。因为传输过程中我们需要知道下一条如何传输,也就是下一条的MAC地址是多少。因此在这里我们需要知道的是我们在填写IP头部的时候已经知道了下一条路由器的IP地址了,因此可以通过ARP技术来查询该IP地址对应的MAC是多少。(ARP这一部分在计网中涉及蛮清楚的就不过多解释了)
-
在计算机中,我们可以通过命令行的
arp -a
来显示ARP缓存。 -
IP模块的整体工作流程如下图
网卡
在完成IP模块的工作之后,下面就开始轮到网卡了。IP生成的网络包只是存放在内容中的一连串数字信息,我们需要将数字信息转换为电或光信号,才能在网线上传输。负责执行这一操作的是网卡,但网卡也无法独立工作,要控制网卡还需要网卡驱动程序。下图为网卡的概念图。
- 网卡并不是同上电之后就可以马上开始工作的,而是需要先进行初始化操作。也就是说,打开计算机启动操作系统的时候,网卡驱动程序会对硬件进行初始化操作,然后硬件才能进行使用的状态。
- 网卡首先通过驱动从IP模块获取包之后,会将其复制到网卡内的缓冲区中,然后向MAC模块发送发送包的命令。接下来就轮到MAC模块工作了。
- 首先MAC模块会将包从缓存区中取出,并在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。如下图
- 报头是一串1和0交替出现的比特序列,它的作用就是确定包的读取时机。这些序列被转换为信号之后,接收方在收到信号是,遇到这样的波形就可以判断出取数据的时机了。
- 加上报头、起始帧分界符和FCS之后,就可以将包通过网线发送出去了。发送信号的操作分为两种,一种是使用集线器的半双工模式(为了避免信号碰撞,在发送之前需要判断网线中是否存在其他设备发送的信号),另一种是使用交换机的全双工模式。
- 在发送信号时,MAC模块从报头开始将数字信号按每个比特转换成电/光信号,然后由PHY,或者叫MAU的信号收发模块发送出去。在这里,将数字信号转换为电信号的速率就是网络的传输速率。接下来,PHY(MAU)模块会将信号转换为可在网线上传输的格式,并通过网线发送出去。(MAC模块是将可转换为任意格式的通用信号发送给PHY(MAU)模块,然后由PHY(MAU)模块将其转换为可在网线上传输的格式)
网络设备 — 集线器、交换器和路由器
从计算机发送出来的网络包会通过集线器、路由器等设备被转发,最终会到达目的地。在传输过程中,所有的包都是独立的,相互之间没有任务关联。
在实现生活中,我们或者没有见过在计网中提到的集线器和交换器这些设备。实际上,我们家里用的路由器已经集成了集线器和交换机的功能了。
集线器
网卡中的PHY(MAU)模块负责将包转换为电信号,信号通过RJ-45接口进入双绞线。以太网的本质就是正负变化的电压,因此可以认为PHY(MAU)模块是一个从正负两个信号端子输出信号的电路。
- 信号通过网线到达集线器的接口。但是在这个过程中,能量会逐渐损失。网线越长,信号衰减越严重。
- 局域网使用的是双绞线。其中双绞的涉及目的就是为了抑制噪声的影响。影响分为外部影响,首先双绞线通过两根信号线的缠绕抵消外源性噪声;其次,通过改变节距抑制内源性噪声。双绞线的性能是以“类”来区分的,类的数值越大,性能就越好。
- 当信号到达集线器之后,会被广播到整个网络中。以太网的基本结构就是将包发送到所有的设备,然后由设备根据MAC地址来判断是否应该接收这个包,而集线器就是这歌设计的忠实体现了。
- 集线器在每个接口的后面都装有和网卡中的PHY(MAU)功能相同的模块,但是如果它们像网卡端一样采用直连式接线,那么是无法正常接收信号的。必要要讲“发送线路”和“接收线路”连接起来才行。而这正是集线器中PHY(MAU)模块与接口之间采用交叉接线的原因。如下图
- 集线器将信号发送给所有连接在它上面的线路。并且集线器只是原封不动地将信号广播出去,即使信号受到噪声的干扰发生了失真,也会原样发送到目的地。这时,接收信号的设备,也就是交换机、路由器、服务器等。
交换器
- 首先信号到达网线接口,并由PHY(MAU)模块进行接收,这一部分与集线器是相同的。接下来,PHY(MAU)模块会将网线中的信号转为为通用格式,然后传递给MAC模块。MAC模块将信号转换为数字信号,然后通过包末尾的FCS校验错误,如果没有错误则存放到缓冲区中。这部分操作和网卡基本相同,有时候可以认为交换机的每个网线接口后面都由一块网卡。网线接口和后面的电路部分加在一起称之为一个端口(相当于网卡)。
- 但是有一点不同的是。网卡本身具有MAC地址,但是交换机的端口不具有MAC地址。
- 将包存入缓冲区后,接下来需要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录了。MAC地址表主要有两个信息,一个是设备的MAC地址,另一个是该设备连接在交换机的哪个端口上。通过这张表就能够判断出收到的包应该转发到哪个端口上。
- 在接收包的时候,交换机还需要维护这张MAC表。同时交换机会自行更新或删除MAC表中的记录,不需要手动维护。当出现问题的时候,重启一下就可以重置MAC表。
- 在接收包的时候,可能会出现两种特殊情况,一个是交换机发现一个包要发回到原端口时,就会丢弃这个包;另一个是地址表找不到指定的MAC地址,那么就会将包转发到除了源端口之外的所有端口上。
- 同时交换机可以在半双工和全双工模式下进行切换。(只要不用集线器,就可以避免信号碰撞)。同时,在全双工模式下,会自动协商出最优的传输速率。
路由器
网络包经过集线器和交换机之后,到达路由器,并在此被转发到下一个路由器。这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。不过,不同的是,路由器是基于IP设计的,而交换机是基于以太网设计的。路由器基本结构如下
其中重要的是转发模块和端口模块。其中·转发模块负责判断包的转发目的地,端口模块负责包的收发操作。通过更换网卡,计算机就可以不仅支持以太网,也可以支持无线局域网,同理路由器也是一样的,如果端口模块中有无线局域网的相关硬件,就可以支持。(设计到无线网络了,计网中课程所讲的基本都是有线局域网)
- 首先会通过端口将发过来的包接收进来,这一步的工作过程取决于端口对应的通信技术。对于以太网端口来说,就是按照以太网规范来进行工作,而无线局域网端口则按照无线局域网的规范工作。
- 之后,转发模块会根据接收到的包的IP头部中记录的接收方IP地址(是目的地的IP地址)在路由表中进行查询。然后,转发模块将包转移到转发目标对应的端口上。
- 端口再按照硬件的规则将包发送出去。这意味着端口模块是以实际的发送方或者接收方的身份来收发网络包的(交换机只是将进来的包转发出去而已,自己并不会称为发送方或者接收方)。以以太网接口为例,路由器的端口具有MAC地址。除此之外,端口还具有IP地址。(与计算机上的网卡是一样)
- 这里如果遇到不知道转发到哪里的包,路由器采取的方式时直接丢弃(实际上是不会发生的,因为有一个默认路由,常称之为默认网关)。因为交换机的规模较小,而路由器对接的是互联网。
- 在传输过程中,IP并不是委托以太网将包直接传输到最终目的地,而是传输到下一个路由器。因此在创建新的MAC头部时,时下一个路由器的MAC地址。 因此,对于实际的机器来说,路由器是将包的传输工作委托给交换机来进行。(实际上,路由器有内置交换机功能)
路由器的附加功能一 :地址转换
也就是将私有地址转化为能在互联网中进行通信的公有地址。在家里,我们的路由器的WiFi给我们分配的IP其实就是一个私有IP,学校里边的校园网也是。
使用私有IP的局域网就是我们所谓的内网了。内网中的设备不能直接和互联网直接收发网络包,而是需要通过一种特别的机制进行连接,这个机制就是地址转换。(NAT机制)
- 地址转换的基本原理是在转发网络包是对IP头部中的原IP地址和端口号进行改写。将发送方IP地址从私有地址改写为公有地址。使用的公有地址是地址转换设备的互联网接入端口的地址;与此同时,端口号也需要进行改写,地址转换设备会随机选择一个空闲的端口。(改写的原因是,私有网络有很多的IP,但是公有网络只有这个接入的路由器一个,如果有很多设备同时方访问一个端口,那么要么只有一个访问成功,要么需要有与私有设备相同的公有IP,因此为了解决这个问题,就需要改写端口号使得其能够区分出来)
- 之后,**原本的私有地址、端口号会与改写之后的公有地址和端口号会建立起一个映射关系。**这个关系很重要,因为当接收响应回来的信号的时候,因为客户端仍然是私有地址与原本的端口号,因此需要依据这个映射关系才能发送到客户端中。同时这也解释了,为什么如果私有网络如果没有主动联系互联网的话,那么互联网是无法主动与私有网络中的设备进行连接的。
路由器的附加功能一 :包过滤功能
包过滤就是对包进行转发时,根据MAC头部、IP头部、TCP头部的内容,按照事先设置好的规则决定是转发这个包,还是丢弃这个包。我们通常说的防火墙设备或软件,大多数都是利用这一机制来防止非法入侵的。
互联网内部
上边提到的局域网与互联网联系的路由器一般称之为接入路由器。我们家庭和公司的内网都是通过接入网连接到网络运营商的。在接入网后面连接的是网络运营商的网络。网络运营商网络也是以路由器为核心组成的,可以看成家庭、公司网络的一个放大版。但是最主要的区别是距离的不同和路由的维护方式了。
接入网
- 互联网接入路由器的包转发操作与之前谈到的以太网路由器几乎是一样的。不过,互联网接入路由器发送网络包的操作和以太网路由器有一点不同,互联网接入路由器是按照接入网规则来发送包的。
- 所谓接入网,就是指连接互联网与家庭、公司网络的通行线路。一般家用的接入网方式包括ADSL、FTTH(光纤入户)等,对于公司可能还多一个专线。因为日常使用的是FTTH,因此下边重点谈谈这个技术
光纤接入网(FTTH)
- 光信号中,亮表示1,暗表示0.数字信号先转换为电信号,然后再将电信号转换为光信号。1用高电压表示,0相反。将这样的电信号输入LED、激光二极管等光源后。这样光信号就可以在光纤中转导,之后到达接收端。接收端有光敏元件可以根据光的亮度产生不同的电压。这就是光纤通信的原理。如下图
- 光纤通信的关键技术是能够传导光信号的光纤。其中,纤芯的直径对光的传导影响较大。进入光纤的光线有各种角度,但其中,只有少数按照特定角度入射以保持相位一致的光线才会继续传导下去。
- 单模光纤的纤芯很细,只有入射角很小的光线才能进入,因此在能过保证相位一致的角度中,只有角度最小的光线能进入光纤。多模光纤的纤芯比较粗,入射角比较大的光也可以进入,这样一来,在相位一致的角度中,不仅角度最小的光纤可以传导,其他角度更大一些的也可以。多模光纤可以传导多条光线,对光源和光敏元件的要求较低,因此价格相对较低;但是单模光纤的信号的失真会比较小。(因为在纤芯传导的光线只有一条,不会因为行进距离的差异产生时间差,所以即便光纤很长,也不会产生严重的失真)。因为单模光纤主要用于距离较远的建筑物之间的连接。(FTTH)
接入网使用的PPP
用户发送的网络包在接入路由器中,通过ADSL和FTTH等接入网到达运营商的BAS。
互联网本来就是由很多台路由器相互连接组成的,因此原则上应该是将接入网接连到路由器上。随着接入网的路由器也跟着演进,而这种进化型的路由器就叫做BAS。
- 首先是用户认证和配置下发功能。ADSL和FTTH接入网中,都需要先输入用户名和密码,登录之后才能访问互联网,而BAS就是登录操作的窗口。BAS是使用PPPoE(以太网的点对点协议)方式来实现这个功能的。
- ADSL和FTTH接入方式也需要为计算机分配公有地址才能上网。不过,两者中,用户和BAS之间是通过电缆或光纤固定连接在一起的,因此没有必要验证用户身份,所以实际上并不需要PPP的所有这些功能。然而,通过用户名和密码登录的步骤可以根据用户名来切换不同的运营商。
接入网的整体工作流程
- 接入网的工作从用户端的互联网接入路由器进行连接操作开始。首先,接入路由器中需要配置运营商分配的用户名和密码。然后,接入路由器会根据PPPoE大发现机制来寻找BAS。这一机制和ARP一样是基于广播实现的。也就是说互联网接入路由器通过PPPoE的发现机制查询BAS的MAC地址。
- 将用户名从互联网接入路由器发送给BAS有两种方式,一种是将密码进行加密的CHAP方式,另一种是不加密的PAR方式。
- 在校验完密码之后BAS会向用户下发TCP/IP配置信息。(包括分配给上网设备的IP地址(公有IP)、DNS服务器的IP地址以及默认网关的IP地址)。当使用路由器连接互联网时,路由器会根据这些信息配置自身的参数。这样一来,路由器的BAS端的端口就有了公有地址。(局域网端口一般是由用户分配的一个私有地址),路由表也配置好默认网关之后,接下来就可以将包转发到互联网中了。
- 接下来,客户端就会开始发送用来访问互联网的网络包。如果目标在互联网接入路由器的路由表里找到不到。这时,路由器就会选择默认路由,并将这个包转发给默认路由的网关地址,也就是BAS下发的默认路由。与以太网路由器类似,不同的是,包不是按照以太网规则转发,而是按照PPPoE规则转发的。
- 之后,网络包会到达BAS,最后在这里将包转发到运营商的路由器中。
- 互联网接入路由器在转发包时需要进行地址转换。BAS向用户端下发TCP/IP的配置信息,如果将这些信息配置在计算机上,就相当于计算机拥有了公有地址,这种情况下,不需要进行地址转换也可以访问互联网。如果使用路由器来上网,而且公有地址也是分配给路由器的,这样,计算机就没有公有地址了。这时,计算机会被分配一个私有地址。
网络运营商的内部
当网络包通过接入网,到达网络运营商的路由器。这里就是互联网的入口了。(终于到了),网络包会从这里进入互联网内部。
互联网实体并不是一个组织运营管理的单一网络,而是多个运营商网络相互连接组成的。ADSL、FTTH等接入网是与用户签约的运营商设备相连的,这些设备称为POP(接入点),互联网入口就位于这里。也就是说,网络包通过接入网之后,到达运营商POP的路由器。如下图
- POP中包括各种类型的路由器,路由器的基本工作方式时相同的,可以根据接入网的类型需要分别使用不同类型的路由器。如下图
- NOC是运营商的核心设备,从POP传来的网络包都会集中到这里,并从这里被转发到里目的地更近的POP,或者是转发到其他的运营商。
服务器端的局域网
接下来网络包会继续朝服务器前进,并通过服务器前面的防火墙、缓存服务器、负载均衡器等。如下图,为三种服务器放置位置,其中第二种和第三种较为常见。
负载均衡
当服务器的访问量上升时,增加服务器的线路的带宽是有效的,但并不是网络变快了就可以解决所有的问题。其中一种方式时使用多台服务器来分担负载,这种架构称为分布式架构。其中对于负载的分担有如下几种方法:
第一种方式是 采用多台Web服务器,减少每台服务器的访问量。要采用这样的方法,必须有一个机制将客户端发送的请求分配到每台服务器上。具体的做法有很多,
- 最简单的一种是通过DNS服务器来分配。当访问服务器时,客户端需要先向DNS服务器查询服务器的IP地址,如果在DNS服务器中填写多个名称相同的记录,则每次查询时DNS服务器都会按顺序返回不同的IP地址。(该方式可能会有两种较为明显的缺陷就是,如果服务器有一台停机了,但是DNS服务器时无法知道的,就还是会返回该服务器的IP地址;另一个是在通过CGI等动态生成网页的情况下,有些操作是要跨越多个页面的,如果这期间访问的服务器发生了变化,这个操作就无法进行了)
- 使用一种叫作 负载均衡器的设备。首先需要用负载均衡器的IP地址代替Web服务器的实际地址注册到DNS服务器上。之后由负载均衡器来判断将请求转发给哪台Web服务器上。那么关键点就变为了,如何判断将请求转发给哪台Web服务器。其中较为重要的是当操作跨越多个页面时,由于通过HTTP协议无法知道请求之间的相关性,之后的一个可行方式就是,跨越在发送表单数据时在里面加上表示关联的信息,或者是对HTTP规格进行扩展,在HTTP头部字段中加上用来判断相关性的信息(常称之为Cookie)
第二种方式是使用缓存服务器来分担负载。如下图为缓存服务器的3中部署方式
后记
到这里网络的整个流程就大致走了一篇了,同时恭喜你耐心得看完了这么长的一篇文章。由于发布时间是大年三十,那么祝看到这里的大伙新年快乐!
- 到了服务器之后,响应的信息返回的方式与客户端到服务器时类似的。
- 前面讲到的IP和以太网的分工,其中以太网的部分也可以替换成其他的东西,例如无线局域网、ADSL、FTTH等,它们都可以替代以太网的角色帮助IP协议来传输网络包。
书籍:《网络是怎样连接的》