这一次, 我们聊一聊网络

前言

网络机制

要实现应用程序之间的交互。 我们需要一个能够在浏览器和web服务器之间传递请求和响应的机制。 由于请求和响应都是由0和1组成的数字信息, 所以, 我们需要的是一种能够将数字信息搬运到指定目的地的机制。

它的基本思路是 将数字信息分割成一个一个的小块 , 然后装入一些被称为 的容器中来运送。

包相当于信件或者包裹,而交换机和路由器则相当于邮 局或快递公司的分拣处理区。包的头部存有目的地等控制信息,通过许多 交换机和路由器的接力,就可以根据控制信息对这些包进行分拣,然后将 它们一步一步地搬运到目的地。

这个负责搬运数字信息的机制再加上浏览器和web服务器这些网络应用程序, 这两部分组成了网络。

分工

  • 浏览器 : 负责将请求消息委托给操作系统中的网络控制软件。
  • 协议栈 : 将请求消息进行打包并加上目的地址等控制信息。
  • 网卡 : 将包转换为电信号并通过网线发送出去, 这样, 包就进入到了网络。
  • 集线器,交换机,路由器 : 网卡发送的包会经过交换机等设备到达用来接入互联网的路由器。 网络运营商会负责将包送到目的地。
  • 接入网,网络运营商 : 互联网的入口线路称为接入网, 可以使用电话线, 有线电视, 光纤等多种通信线路来作为接入网。通过接入网进入骨干网, 在骨干网中存在很多运营商和大量的路由器,这些路由器相互连接, 组成一张巨大的网,而我们的网络包就在其中经过若干路由器的接力,最 终被发送到目标 Web 服务器上。
  • 防火墙 : 防火墙会对进入的包进行检查
  • 缓存服务器 : 网页数据中有一部分是可以重复利用的, 这些可以重复利用的数据被保存在缓存服务器中, 如果要访问的网页数据正好在缓存服务器中, 就不需要劳烦web服务器了。 此外, 在大型网站中, 可能还配备将消息发布到多台web服务器上的 负载均衡器 , 还有可能会使用通过分布在整个互联网中的缓存服务器来分发内容的服务。
  • web服务器 : 当网络包到达web服务器后, 数据会被解包并还原为原始的请求消息, 然后交给web服务器程序, 和客户端一样, 这个操作也是由操作系统中的协议栈来完成的。接下来, web服务器会分析请求消息来封装响应消息发回给客户端。

探索之旅

浏览器生成消息

  • 生成 HTTP 请求消息
  • DNS 服务器查询域名对应的 IP 地址
  • 委托协议栈发送消息

生成HTTP请求消息

当我们在浏览器输入网址(URL)后, 浏览器就要开始解析URL:

当访问Web服务器时应该使用HTTP协议, 访问FTP服务器时应该使用FTP协议。

解析完URL之后, 我们就知道应该要访问的目标了。这里我们以HTTP协议为例。

HTTP协议

HTTP协议定义了客户端和服务器之间交互的消息内容和步骤。

与HTTP关系密切的协议:

  • 负责传输的IP协议 :作用是把各种数据包传送给对方。其中两个重要条件就是 IP地址MAC地址 。IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。
  • 确保可靠性的TCP协议 :提供可靠的字节流服务。采用了 三次握手策略 握手过程中使用了TCP的标志-- SYN和ACK 发送端首先发送一个带SYN标志的数据包给对方,接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认消息,最后发送端在回传一个带ACK标志的数据包,代表握手结束。若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包
  • 负责域名解析的DNS服务 :提供域名到IP地址之间的解析服务

客户端向服务器发送请求消息, 请求消息中包含“对什么”和“进行怎样的操作”两个部分。 “对什么”部分称为 URI

服务端返回响应消息。

请求消息:

  • 请求行: 包含请求方法, HTTP版本, URI
  • 消息头: 每行包含一个头字段, 用于标识请求的附加信息(如日期, 客户端支持的数据类型, 语言, 压缩格式, 缓存控制等)
  • 消息体: 包含客户端向服务器发送的数据。

响应消息:

Content-Type 

状态码概要:

返回响应消息后, 浏览器会将数据提取出来并显示在屏幕上。

当网页中包含图片时, 会在网页中相应位置嵌入表示图片文件的标签的控制信息。 然后再次访问服务器获取图片并显示在预留的空间中。

由于每条请求消息只能写一个URI, 所以每次只能获取一个文件。如果网页包含三张图片, 则会向服务器发送四条请求。

通过DNS服务器查询服务器IP地址

我们一般在网站输入的都是域名, 但是在委托操作系统发送消息时,必须提供域名对应的IP地址。 因此, 在生成HTTP消息后, 接下来就是根据域名查询IP地址

TCP/IP网络协议是通过IP地址来确定通信对象的, 因此不知道IP地址就无法将消息发送给对方。

DNS如何查询域名对应IP地址

根据域名查询 IP 地址时,浏览器会使用 Socket 库中的解析器。

解析器会向DNS服务器发送查询消息(DNS服务器也有IP地址, 只不过这个 IP 地址是作为 TCP/IP 的一个设置项目 事先设置好的 ,不需要再去查询了)。

DNS 服务器会从域名与 IP 地址的对照表中查找相应的记录,并 返回 IP 地址。

当然, 一个DNS服务器的内存是有限的, 不可能存有所有域名对应的IP地址,当在本服务器上查不到时, 就会展开DNS服务器的大接力, 从而查找要查询的信息。

有时候, 并不需要从最上级的根域开始查找, 因为DNS服务器有一个缓存功能, 可以记住之前查询过的域名。 缓存可以减少查询所需的时间。

当HTTP请求消息和DNS查询IP地址准备就绪, 接下来就要委托操作系统来发送消息。

协议栈和网卡

  • 创建套接字: 当协议栈收到委托后的第一步就是创建套接字
  • 连接服务器
  • 收发数据
  • 从服务器断开连接并删除套接字
  • IP与以太网的包收发操作
  • 用UDP协议收发数据的操作

协议栈分为上下两部分:

- 上: 分为了两块, 分别负责TCP和UDP协议的收发数据

- 下: 用IP协议控制网络包收发操作的部分。

在互联网上传送数据时, 数据会被切分成一个一个的网络包, 而将网络包发送给通信对象的操作就是由IP来负责的。 IP中还包括ICMP协议(告知网络包传送过程中的错误和各种控制消息), ARP协议(根据IP地址查询对应的以太网MAC地址)。

浏览器、邮件等一般应用程序收发数据时用 TCP; DNS 查询等收发较短的控制数据时用 UDP。

创建套接字

套接字的实体就是通信控制信息

协议栈是根据套接字中记录的控制信息来工作的。

创建套接字时,首先分配一个套接字所需的内存空间,然后向其 中写入初始状态。

由于套接字中记录了通信双方的信息以及通信处于怎样的 状态,所以只要通过描述符确定了相应的套接字,协议栈就能够获取所有 的相关信息,这样一来,应用程序就不需要每次都告诉协议栈应该和谁进 行通信了。

连接服务器

连接实际上是通信双方交换控制信息。所谓控制信息,就是用来 控制数据收发操作 所需的一些信息,例如IP 地址 和端口号。

三次握手 :

  • 正在连接: 客户端发送网络包(设置SYN为1)到服务器
  • 连接完毕: 服务器找到对应的套接字, 并返回响应, 设置SYN(接受连接)和ACK(网络包可能丢失出错, ACK用设置1来确认是否收到网络包)。网络包返回客户端, 通过响应的SYN判断是否连接成功
  • 确认连接: 客户端将ACK设置为1发回服务器, 告诉服务器刚才的响应包已收到。

收发数据

MTU:一个网络包的最大长度,以太网中一般为 1500字节

MSS:除去头部之后,一个网络包所能容纳的 TCP 数据的最大 长度

HTTP请求消息一般不会太长, 一个网络包就能装下, 但如果要提交表单数据, 可能会超出一个网络包的容量, 此时就需要对数据进行拆分。

TCP具备确认对方是否成功收到网络包, 以及当对方没收到时进行重发的功能, 因此在发送网络包之后, 接下来还要进行确认操作。

通过“序号”和“ACK 号”可以确认接收方是否收到了网络包。实际上网络的错误检测和补偿机制非常 复杂。

协议栈会检查收到的数据块和 TCP 头部的内容,判断是否有数据丢失,如果没有问题则返回 ACK 号。然后,协议栈将数据块暂存到接收缓冲区中,并将数据块按顺序连接起来还原出原始的数据,最后将数据交给应用程序

断开连接

数据发送完毕后断开连接。

服务器会先发起断开连接。

四次挥手:wave::

  • 户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u
  • 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1
  • 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1。
  • 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1

UDP协议

UDP只负责单纯地发送包而已,并不像 TCP 一样会对包的送达状态进行监控,所以协议栈也不知道有没有发生错误。以下情况可以考虑使用UDP协议:

  1. 数据很短, 用UDP发送更高效

TCP很复杂是为了 保证将数据高效且可靠地发送给对方 。但是如果 数据很短, 一个包就能装下 , 我们就不用考虑哪个包送达, 哪个包没有送达了, 这样, 我们发送数据, 根据对方的回复来确定是否需要重发即可。

  1. 音频和视频数据

音频和视频数据中缺少了某些包并不会产生严重的问题, 只是会产生一些失真或卡顿。

集线器, 交换机和路由器

HTTP 请求的方法,TCP 的确认响应和序号,客户端和服务器之间的关系,这一 切都与包的传输无关。因此,所有的包在传输到目的地的过程中都是独立 的,相互之间没有任何关联。

  • 集线器将信号发往所有线路
  • 交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相 应的端口。

    交换机的全双工模式可以同时发送和接收信号

    • 路由器根据“IP 地址”判断转发目标。

路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包, 遇到不匹配的包则直接丢弃。

完成包接收操作之后,路由器就会丢弃包开头的 MAC 头部。MAC 头 部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口 的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了, 于是 MAC 头部就会被丢弃。

接入网和网络运营商

这一部分与我们关系不大, 就不做赘述了。

服务端

  • 防火墙的结构和原理
  • 负载均衡
  • 缓存服务器
  • 内容分发服务

防火墙

防火墙的基本思路就是只允许发往特定服务器中的特定应用程序的包通过, 然后屏蔽其他的包。

设置包过滤规则

通过端口号限定应用程序

通过控制位判断连接方向

包过滤方式的防火墙可根据接收方 IP 地址、发送方 IP 地址、接 收方端口号、发送方端口号、控制位等信息来判断是否允许某个 包通过。

#### 防火墙无法抵御的攻击

防火墙只关心包的起点和终点, 但对包中的特定数据是无法检测的。

应对包内容导致的服务器问题应对措施:

  • 这个问题的根源在于 Web 服务器程序的 Bug,可以通过修复 Bug 防止宕机
  • 另一种方法就是在防火墙之外部署用来检查包的内容并阻止有害包的设备或软件

负载均衡

当服务器的访问量上升时, 增加服务器线路的带宽是有效的, 但是网络速度是有限的, 并不能解决所有问题。

在这种情况下, 使用多台服务器来分担负载的方法更有效, 这种架构统称为 分布式架构

使用负载均衡器, 首先要用负载均衡器的IP地址代替Web服务器的实际地址并注册到DNS服务器上。 这样当要访问我们的Web服务器实际上要经过负载均衡器进行一次转发。 这样我们只要通过在负载均衡器上来判断我们服务器的负载从而决定该请求由哪个服务器来处理。

缓存服务器

除了使用多台功能相同的Web服务器来分担负载外, 还可以通过将整个系统按功能分成不同的服务器, 如Web服务器, 数据库服务器。 缓存服务器就是一种按功能来分担负载的方法。

缓存服务器是一台通过代理机制对数据进行缓存的服务器。代理介于 Web 服务器和客户端之间,具有对 Web 服务器访问进行中转的功能。当进 行中转时,它可以将 Web 服务器返回的数据保存在磁盘中,并可以代替 Web 服务器将磁盘中的数据返回给客户端。这种保存的数据称为缓存,缓 存服务器指的也就是这样的功能。

正向代理

正向,代理的是客户端; 反向,代理的是服务端。

上面的是在 Web 服务器一端部署一个代理,然后利用其缓存功能来 改善服务器的性能,还有一种方法是在客户端一侧部署缓存服务器。

正向代理刚刚出现的时候, 其目的之一就是缓存, 另一个目的是设置防火墙。

在使用正向代理时,一般需要在浏览器的设置窗口中的“代理服务器” 一栏中填写正向代理的IP地址,浏览器会忽略网址栏的内容,直接将所有请求发送给正向代理。

正向代理改良版————反向代理

使用正向代理需要在浏览器中进行设置,这可以说 是识别正向代理的一个特征。但是,设置浏览器非常麻烦,如果设置错误 还可能导致浏览器无法正常工作。

于是我们可以使用代理服务器来接受网路上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给请求连接的客户端。

负载均衡就是一种反向代理的应用。

透明代理

缓存服务器判断转发目标的方法还有一种,那就是查看请求消息的包头 部。因为包的 IP 头部中包含接收方 IP 地址,只要知道了这个地址,就知道用户要访问哪台服务器, 这种方法称为透明代理。

透明代理集合了正向代理和反向代理的优点。正常情况下, 请求消息是从浏览器直接发送到Web服务器, 并不会到达透明代理。

我们将透明代理放在请求消息从浏览器传输到Web服务器的路径中, 当消息经过时进行拦截。 连接互联网的接入网就是一个关口, 我们可以在这里设置反向代理, 用户察觉不到代理的存在, 也不会注意到HTTP消息是如何被转发的, 因此大家更倾向于将透明代理说成是缓存。

内容分发服务

内容分发服务就是我们常说的CDN缓存。

提供CDN缓存的厂商, 会和网络运营商还有Web服务器运营者签订协议,创建一些最接近用户网络的边缘服务器,然后将文件缓存在这些边缘服务器(节点)。 只要Web服务器和CDN缓存服务器建立连接, 那么当客户端访问web服务器时, 实际上就是在访问CDN缓存服务器。

查找最近的缓存服务器

它与DNS相结合,使用户能够以最小的延迟访问节点。

通过重定向服务器分配访问目标

重定向可以以较高的精度匹配到目标服务器, 问题是会带来更多的请求

缓存服务器的内容更新

当web服务器更新以后, 缓存服务器的内容可能就不再适用, 此时需要一套更新机制来更新缓存。

请求到达服务器, 响应返回浏览器

总结

TCP协议: 传输控制协议。是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。

IP协议: 用于将多个包交换网络连接起来的,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。

UDP协议: 简单版的TCP协议, 只负责单纯地发送包, 不负责监控。 适用于包很小的请求和音视频传输。

问题: 为什么不直接使用域名来查询而要使用IP地址?

答:

  1. IP地址是只有4字节的数字, 而域名则是几十到几百字节的字符, 这增加了路由器的负担。
  2. 域名更加好记, 而IP地址是一串数字不易记忆。

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

答: 三次握手时,服务器同时把ACK和SYN放在一起发送到了客户端那里

四次挥手时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。

问题: 正向代理和反向代理的区别

答:

1、正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源。反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等。

2、正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器。

3、正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。

4、正向代理和反向代理的作用和目的不同。正向代理主要是用来解决 访问限制 问题。而反向代理则是提供 负载均衡安全防护 等作用。二者均能提高访问速度。

问题: 一次完整的HTTP请求

答:

  1. 建立TCP连接

在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。

  1. 浏览器向Web服务器发送请求命令
  2. 浏览器发送请求头信息

浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

  1. Web服务器应答

客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。

  1. Web服务器发送应答头信息

正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

  1. Web服务器向浏览器发送数据

Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

  1. Web服务器关闭TCP连接

在完成此次数据通信后,服务器会通过TCP四次挥手主动断开连接。但若此次连接为长连接,那么浏览器或服务器的头信息会加入keep-alive的信息,会保持此连接状态,在有其它数据发送时,可以节省建立连接的时间。

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章