这一次, 咱们聊一聊网络

前言

网络机制

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

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

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

这个负责搬运数字信息的机制再加上浏览器和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
  • 消息头: 每行包含一个头字段, 用于标识请求的附加信息(如日期, 客户端支持的数据类型, 语言, 压缩格式, 缓存控制等)
  • 消息体: 包含客户端向服务器发送的数据。

响应消息

  • 状态行: 包含HTTP版本, 状态码, 响应短语(用来解释状态码)
  • 消息头
  • 消息体: 包含服务器向客户端发送的数据, 消息体的格式会经过消息头中的 Content-Type 字段来定义 (MIME 类型)

状态码概要:

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

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

因为每条请求消息只能写一个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 号。而后,协议栈将数据块暂存到接收缓冲区中,并将数据块按顺序链接起来还原出原始的数据,最后将数据交给应用程序

断开链接

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

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

四次挥手👋:

  • 户端进程发出链接释放报文,而且中止发送数据。释放数据报文首部,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 通常都会分开发送。

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

答:

一、正向代理实际上是客户端的代理,帮助客户端访问其没法访问的服务器资源。反向代理则是服务器的代理,帮助服务器作负载均衡,安全防御等。

二、正向代理通常是客户端架设的,好比在本身的机器上安装一个代理软件。而反向代理通常是服务器架设的,好比在本身的机器集群中部署一个反向代理服务器。

三、正向代理中,服务器不知道真正的客户端究竟是谁,觉得访问本身的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,觉得本身访问的就是真实的服务器。

四、正向代理和反向代理的做用和目的不一样。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡安全防御等做用。两者均能提升访问速度。

问题: 一次完整的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的信息,会保持此链接状态,在有其它数据发送时,能够节省创建链接的时间。

相关文章
相关标签/搜索