计算机网络常见问题1

计算机网络常见问题

问题

7.1 浏览器中输入URL地址到显示主页的过程是什么?

  1. URL解析

    地址解析:

    首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。

    HSTS

    由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面。详见:你所不知道的 HSTS

    其他操作

    浏览器还会进行一些额外的操作,比如安全检查、访问限制(之前国产浏览器限制 996.icu)

    检查缓存304

  2. DNS解析

    1. 浏览器缓存

    浏览器会先检查是否在浏览器缓存中,没有则调用系统库函数进行查询。

    2. 操作系统缓存

    操作系统也有自己的 DNS缓存,但在这之前,会向检查域名是否存在本地的 Hosts 文件里,没有则向 DNS 服务器发送查询请求。

    3. 路由器缓存

    路由器也有自己的缓存。

    4. ISP DNS 缓存

    ISP DNS 就是在客户端电脑上设置的首选 DNS 服务器,它们在大多数情况下都会有缓存。

    根域名服务器查询

    在前面所有步骤没有缓存的情况下,本地 DNS 服务器会将请求转发到互联网上的根域,下面这个图很好的诠释了整个流程:

    根域名服务器:维基百科

    需要注意的点

    1. 递归方式:一路查下去中间不返回,得到最终结果才返回信息浏览器到本地DNS服务器的过程

    2. 迭代方式,就是本地DNS服务器到根域名服务器查询的方式。

    3. 什么是 DNS 劫持

      DNS劫持又叫域名劫持,指攻击者利用其他攻击手段,篡改了某个域名的解析结果,使得指向该域名的IP变成了另一个IP,导致对相应网址的访问被劫持到另一个不可达的或者假冒的网址,从而实现非法窃取用户信息或者破坏正常网络服务的目的

    4. 前端 dns-prefetch 优化

      DNS预获取,是前端优化的一部分。 一个是减少DNS的请求次数

  3. TCP连接

    根据IP建立TCP连接(三次握手)。

  4. 发送HTTP请求

  5. 服务器处理请求并返回HTTP报文

  6. 浏览器解析渲染页面

    渲染页面,构建DOM树

  7. 连接结束

    关闭TCP连接(四次挥手)。

7.2 ping命令的具体过程是什么?

简单来说,「ping」是用来探测本机与网络中另一主机之间是否可达的命令,如果两台主机之间ping不通,则表明这两台主机不能建立起连接。ping是定位网络通不通的一个重要手段。

ping 命令是基于 ICMP 协议来工作的,「 ICMP 」全称为 Internet 控制报文协议( Internet Control Message Protocol)。

ping 命令会发送一份ICMP回显请求报文给目标主机,并等待目标主机返回ICMP回显应答。因为ICMP协议会要求目标主机在收到消息之后,必须返回ICMP应答消息给源主机,如果源主机在一定时间内收到了目标主机的应答,则表明两台主机之间网络是可达的

假设现在有ABCD四台主机,一台路由,子网掩码为255.255.255.0,默认路由为192.168.0.1

在主机 A 上运行Ping 192.168.0.5后,

  1. Ping命令会构建一个ICMP协议的数据包,交到网络层的IP协议中。IP层协议将目的地址和源地址和一些其它的控制信息打包后,形成IP数据包
  2. 通过ARP映射表获取192.168.0.5的MAC地址
  3. 交到数据链路层,添加一些控制信息,构建数据帧
  4. 交到物理层,通过以太网访问

主机B收到后,

  1. 检查目的地址,不相符就丢弃
  2. 将IP数据包提取后送入网络层的IP层协议,IP层检查后将有用的信息提取后送入ICMP协议
  3. ICMP协议马上构建一个ICMP应答包以之前的相同方式发送给主机

根据条件:是否在同一网段内,流程可能有所不同,区别在于MAC的获取方式,具体参见ARP协议。

7.3 什么是负载均衡,负载均衡算法有哪些?

负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性

多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位能互相分担负载

  • 轮询法将请求按照顺序轮流的分配到服务器上。大锅饭,不能发挥某些高性能服务器的优势
  • 随机法随机获取一台,和轮询类似
  • 哈希法通过ip地址哈希化来确定要选择的服务器编号。好处是,每次客户端访问的服务器都是同一个服务器,能很好地利用session或者cookie
  • 加权轮询:根据服务器性能不同加权
  • 一致性哈希

不同的负载均衡算法适用的业务场景也不同的。

轮询这类的策略只能适用与每个节点的数据都是相同的场景,访问任意节点都能请求到数据。但是不适用分布式系统,因为分布式系统意味着数据水平切分到了不同的节点上,访问数据的时候,一定要寻址存储该数据的节点。

哈希算法虽然能建立数据和节点的映射关系,但是每次在节点数量发生变化的时候,最坏情况下所有数据都需要迁移,这样太麻烦了,所以不适用节点数量变化的场景。

为了减少迁移的数据量,就出现了一致性哈希算法。

一致性哈希是指将「存储节点」和「数据」都映射到一个首尾相连的哈希环上,如果增加或者移除一个节点,仅影响该节点在哈希环上顺时针相邻的后继节点,其它数据也不会受到影响

但是一致性哈希算法不能够均匀的分布节点,会出现大量请求都集中在一个节点的情况,在这种情况下进行容灾与扩容时,容易出现雪崩的连锁反应。

为了解决一致性哈希算法不能够均匀的分布节点的问题,就需要引入虚拟节点,对一个真实节点做多个副本。不再将真实节点映射到哈希环上,而是将虚拟节点映射到哈希环上,并将虚拟节点映射到实际节点,所以这里有「两层」映射关系。

引入虚拟节点后,可以会提高节点的均衡度,还会提高系统的稳定性。所以,带虚拟节点的一致性哈希方法不仅适合硬件配置不同的节点的场景,而且适合节点规模会发生变化的场景。

7.4 SSL的工作原理

SSL与TLS SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。

SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。

TLS:(Transport Layer Security,传输层安全协议),TLS(传输层安全)是更为安全的升级版 SSL,用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的,在将 TLS 证书部署服务端时,证书文件中包含一对公私钥,其中公钥会在 TLS 握手阶段传递给客户端,私钥则一直留在服务端,一定要确保私钥不能被窃取。在 RSA 密钥协商算法中,客户端会生成随机密钥,并使用服务端的公钥加密后再传给服务端.

SSL/TLS历史 1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。

1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。

1996年,SSL 3.0版问世,得到大规模应用。 1999年,**互联网标准化组织ISOC接替NetScape公司,**发布了SSL的升级版TLS 1.0版。

2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2的修订版,在2018年也发布了TLS1.3版本。 TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。

目前应用的最广泛的 TLS 是 1.2,而之前的协议(TLS1.1/1.0、SSLv3/v2)都已经被认为是不安全的了。

SSL/TLS协议的基本过程

(1) 客户端向服务器端索要并验证公钥

(2) 双方协商生成“对话密钥”

(3) 双方采用“对话密钥”进行加密通信。 上面过程的前两步,又称为**“握手阶段”(handshake)**

TLS/SSL的功能实现主要依赖于三类基本算法:

散列函数 Hash、对称加密DES、3DES、IDEA、AES和非对称加密RSA、DSA、ECC、Diffie-Hellman,

其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。

  • CA证书

现实中,通过CA(Certificate Authority)来保证public key的真实性。CA也是基于非对称加密算法来工作。

有了CA,B会先把自己的public key(和一些其他信息)交给CA。CA用自己的private key加密这些数据,加密完的数据称为B的数字证书

现在B要向A传递public key,B传递的是CA加密之后的数字证书。A收到以后,会通过CA发布的CA证书(包含了CA的public key),来解密B的数字证书,从而获得B的public key。

但是等等,A怎么确保CA证书不被劫持。C完全可以把一个假的CA证书发给A,进而欺骗A。

CA的大杀器就是,CA把自己的CA证书集成在了浏览器和操作系统里面。A拿到浏览器或者操作系统的时候,已经有了CA证书,没有必要通过网络获取,那自然也不存在劫持的问题。

TLS 握手

TLS第一次握手

客户端首先会发一个「Client Hello」消息

消息里面有客户端使用的 TLS 版本号支持的密码套件列表,以及生成的随机数(Client Random

这个随机数会被服务端保留,它是生成对称加密密钥的材料之一

TLS 第二次握手

当服务端收到客户端的「Client Hello」消息后,会确认 TLS 版本号是否支持,和从密码套件列表中选择一个密码套件,以及生成随机数(Server Random

接着,返回「Server Hello」消息,消息里面有服务器确认的 TLS 版本号,也给出了随机数(Server Random),然后从客户端的密码套件列表选择了一个合适的密码套件。

这个密码套件看起来真让人头晕,好一大串,但是其实它是有固定格式和规范的。基本的形式是「密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法

Diffie-Hellman密钥交换算法:

-

Diffie-Hellman密钥交换算法是一种用于在不安全的通信信道上安全地交换密钥的算法。它允许两个通信方在没有事先共享密钥的情况下协商出一个共享的对称密钥,该密钥可以用于后续的加密通信。

Diffie-Hellman算法的基本思想是利用数论中的离散对数问题。具体步骤如下:

1. **参数选择**:选择两个大素数p和g,其中p是一个素数,g是一个原根(即对于任意小于p的正整数a,都存在一个整数k使得$g^k ≡ a \mod p$)。
2. **密钥生成**:
    - 选择私密参数:每个通信方选择一个私密参数(私钥)。假设Alice选择私钥a,Bob选择私钥b。
    - 计算公开参数:计算公开参数(公钥)。Alice计算$A = g^a \mod p$,Bob计算$B = g^b \mod p$。
    - 交换公开参数:Alice将A发送给Bob,Bob将B发送给Alice。
3. **密钥协商**:
    - 计算共享密钥:Alice使用Bob发送的B和自己的私钥a计算共享密钥$K = B^a \mod p$,Bob使用Alice发送的A和自己的私钥b计算共享密钥$K = A^b \mod p$。

由于离散对数问题的困难性,即使攻击者能够截获Alice和Bob之间的通信,也很难从A、B和p中推导出共享密钥K,因此Diffie-Hellman算法能够安全地协商出一个共享密钥,用于后续的加密通信。

TLS 第三次握手

  • 公钥;
  • 持有者信息;
  • 证书认证机构(CA)的信息;
  • CA 对这份文件的数字签名及使用的算法;
  • 证书有效期;
  • 还有一些其他额外信息;
  • 数字证书的作用,是用来认证公钥持有者的身份,以防止第三方进行冒充。说简单些,证书就是用来告诉客户端,该服务端是否是合法的,因为只有证书合法,才代表服务端身份是可信的。

客户端验证完证书后,认为可信则继续往下走。接着,客户端就会生成一个新的随机数 (pre-master),用服务器的 RSA 公钥加密该随机数,通过**「Change Cipher Key Exchange」消息传给服务端。**

那这个随机数有啥用呢?其实这两个随机数是后续作为生成「会话密钥」的条件

所谓的会话密钥就是数据传输时,所使用的对称加密密钥。

于是,双方根据已经得到的三个随机数,生成会话密钥(Master Secret),它是对称密钥,用于对后续的 HTTP 请求/响应的数据加解密。

TLS 第四次握手

服务器也是同样的操作,发「Change Cipher Spec」和「Encrypted Handshake Message」消息,如果双方都验证加密和解密没问题,那么握手正式完成。

HTTPS ECDHE 握手解析

分别是 RSA 和 ECDHE 算法。


RSA 和 ECDHE 握手过程的区别:

  • RSA 密钥协商算法「不支持」前向保密,ECDHE 密钥协商算法「支持」前向保密,非对称密钥
  • 使用了 RSA 密钥协商算法,TLS 完成四次握手后,才能进行应用数据传输
  • 而对于 ECDHE 算法,**客户端可以不用等服务端的最后一次 TLS 握手,就可以提前发出加密的 HTTP 数据,**节省了一个消息的往返时间;
  • 使用 ECDHE, 在 TLS 第 2 次握手中,会出现服务器端发出的「Server Key Exchange」消息,而 RSA 握手过程没有该消息;

7.5 路由器是如何选择最佳路径的

路由器是一种用于网络互连的专用计算机设备,在网路建设中有着重要的地位.

路由器工作在OSI参考模型的第三层(网络层),主要的作用是为收到的报文寻找正确的路径,并把他们转发出去.

在这个过程中,路由器被认为执行了两个最重要的基本功能:路由功能和交换功能.

对于一个特定的路由协议,可以发现到达目的网络的所有路径, 根据选路算法赋予每一条路径metric值,比较metric值,选择metric值最小的路径为最佳路径;

在路由器的交换过程中查找路由时可能会发现能匹配上多条路由条目.

此时路由器将根据掩码长度最长匹配原则进行数据的转发.路由器会进行匹配最深的,也就是说可以匹配的掩码长度最长的一条路由进行转发

第一,最长掩码匹配原则;例如,查找去往192.168.1.1的路径时,发现路由表有如下两个表项 192.168.1.0 mask 255.255.255.0 next hop 10.1.1.1

192.168.1.0 mask 255.255.0.0 next hop 172.16.1.1

路由器会选择第一条路由转发,因为第一条的IP地址范围更小

第二,如果路由表中目的网段的范围相同路由优先级高者优先优先级数值越小,优先级越高

第三,如果路由表中目的网段的范围相同,并且路由优先级也相同,开销(metric)小的优先(metric值越小,开销越小)

路由选择算法可分为:

  • 全局式路由选择算法:所有路由器掌握完整的网络拓扑和链路费用信息,例如链路状态(LS)路由算法,链路状态路由选择算法可以用Dijksua算法实现。
  • 分散式路由选择算法;路由器只掌握物理相连的邻居以及链路费用,例如距离向量(DV)路由算法,距离向量路由选择算法可以用Bellman-Ford方程dx(y) = min {c(x,v) + dv(y)}实现。

7.6 子网掩码的作用

1、一是用于屏蔽IP地址的一部分区别网络标识和主机标识并说明该IP地址是在局域网上,还是在远程网上。

2、二是用于将一个大的IP网络划分为若干小的子网络。

使用子网是为了减少IP的浪费。因为随着互联网的发展,越来越多的网络产生,有的网络多则几百台,有的只有区区几台,这样就浪费了很多IP地址,所以要划分子网。使用子网可以提高网络应用的效率。

7.7 HTTP请求报文和响应报文分别由哪些部分组成?

HTTP请求报文

由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

img

1.请求头

请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。

2.请求头部

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

User-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。

Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

3.空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

4.请求数据

请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

1
2
3
4
5
6
7
8
9
GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: <a href="http://www.google.cn">www.google.cn</a>
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
POST /search HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: <a href="http://www.google.cn">www.google.cn</a>
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r

hl=zh-CN&source=hp&q=domety

HTTP报文

HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文

正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。

状态行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。

状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

  • 1xx:指示信息–表示请求已接收,继续处理。
  • 2xx:成功–表示请求已被成功接收、理解、接受。
  • 3xx:重定向–要完成请求必须进行更进一步的操作。
  • 4xx:客户端错误–请求有语法错误或请求无法实现。
  • 5xx:服务器端错误–服务器未能实现合法的请求。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>

7.8 代理服务器的工作原理是怎样的?代理和网关有什么区别?

代理服务器和网关都会把网络内部的数据的数据发送到因特网上

如果把网关比作一扇通向因特网的门,代理服务器就是一堵墙,能够避免暴露网络内部的一些重要信息。

代理服务器会过滤一些网络连接,只允许那些可以访问的通过。而网关却不做任何的过滤。

网关:

如果两个网络要进行通讯,那么每个网络都需要一个网关。网关区分了一个网络的内部和外部。如果一台电脑需要访问网络外的其他电脑,那么就需要配置网关来获得访问网络外部的权限。如果没有网关,电脑就无法访问局域网之外的网络部分,就像是被锁在家里一样。

代理服务器:

对于网络外部来说,代理服务器代表了整个内部网络。任何用户想访问带有代理服务器的网络,都只能看到代理服务器的IP。当把电脑的Internet选项配置成通过代理服务器访问因特网,代理服务器就能隐藏你的网络信息。它使网络内部的电脑变成匿名的。

功能区别:

如果代理服务器不做任何信息过滤,那么它就和网关一样,传递从电脑到因特网的请求。

然后代理服务器是一个比网关更强大的网络组建,除了有网关的功能之外,还能保护网络免受外部的威胁网关却有暴露网络内部信息的危险,因为它没有任何过滤机制。它仅仅把网络内的信息发送到网络外。

屏蔽网站:

网关不能屏蔽网站。只要网关配置正确,电脑就能从网络内部访问因特网上的任何网站

代理服务器能把网络请求重定向到网络内部的网站上,从而屏蔽网站

管理员可以设置在某个时段或者全天时间屏蔽一些网站。访问这些被屏蔽的网站会重定向到特定的网站上,表示你试图访问一个被屏蔽的网站。

其他代理服务器的功能:

代理服务器也能缓存一些电脑经常访问的网站。它能跟踪网站点击量并使用这些信息储存每天访问的网站信息。当你第二次访问你之前访问过的网站时,代理服务器会返回缓存中的网站信息,而不会访问因特网。这个功能可以有效的减少访问外部网络的流量,节省带宽资源。可以设置每天几次获取因特网的新内容来刷新代理服务器的缓存信息。

在HTTP通信链上,客户端和目标服务器之间通常存在某些**中转代理服务器,**它们提供对目标资源的中转访问。’

一个HTTP请求可能被多个代理服务器转发,后面的服务器称为前面服务器的上游服务器

代理服务器按照其使用方式和作用,分为正向代理服务器,反向代理服务器和透明代理服务器

正向代理要求客户端自己设置代理服务器的地址。客户的每次请求都将直接发送到该代理服务器,并由代理服务器来请求目标资源。比如处于防火墙内的局域网机器要访问Internet,或者要访问一些被屏蔽掉的国外网站,就需要使用正向代理服务器

反向代理则被设置在服务器端,因而客户端无需进行任何设置。反向代理是指用代理服务器来接收Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部服务器上得到的结果返回给客户端。

这种情况下,代理服务器对外就表现为一个真实的服务器

各大网站通常分区域设置了多个代理服务器,所以在不同的地方ping同一个域名可能得到不同的IP地址,因为这些IP地址实际上是代理服务器的IP地址。

如图所示,正向代理服务器和客户端主机处于同一个逻辑网络中。该逻辑网络可以是一个本地LAN,也可以是一个更大的网络

反向代理服务器和真正的Web服务器也位于同一个逻辑网络中**,这通常由提供网站的公司来配置和管理。**

透明代理只能设置在网关上。用户访问Internet的数据报必然都经过网关,如果在网关上设置代理,则该代理对用户来说显然是透明的。透明代理可以看作正向代理的一种特殊情况。

代理服务器通常还提供缓存目标资源的功能,这样用户下次访问同一资源时速度将很快。优秀的开源软件squid,varnish都是提供了缓存能力的代理服务器软件,其中squid支持所有代理方式,而varnish仅能用作反向代理。

7.9 浏览器输入百度地址,中间具体访问过程是怎么样的?

1.客户端浏览器获取用户在地址栏输入的域名,URL解析

2.客户端浏览器将域名发送给DNS域名系统,请求解析,DNS解析

3.DNS解析域名得到相应的IP,返回给客户端浏览器

4.客户端浏览器根据IP向服务器发起TCP三次握手,建立TCP连接

5.客户端浏览器向服务器发送HTTP请求,请求百度首页。

6.服务器通过HTTP响应向客户端浏览器返回百度首页文件。

7.释放TCP连接

8.客户端浏览器解析HTML文件,根据文件内容获取CSS、JS等资源文件,将页面渲染展示给用户。

7.10 网卡 网桥,网关,路由器,交换机

路由器可以根据IP地址寻找下一个设备,可以处理TCPIP协议

交换机是根据MAC地址寻址的。

路由器是用于在不同网段之间转发数据 (网络层)

二层交换机是用于在同网段转发数据 (数据链路层

三层交换机是可以在不同网段转发数据但在同网段转发数据能力特别强的交换机 即可理解为路由器➕交换机(网络层)

一个网关可以是路由器 可以是三层交换机

交换机是分配网络数据,路由器可以给网络分配IP地址,分配给你地址而且可以随时通过地址过来找到你。

路由器可以在不同时间内把一个IP分配给多台主机使用。

交换机是通过MAC地址和识别各个不同的主机。工作在OSI第二层(数据链路层)

一、中继器

中继器(Repeater)工作于OSI的第一层(物理层),中继器是最简单的网络互联设备,连接同一个网络的两个或多个网段,主要完成物理层的功能,负责在两个网络节点的物理层上按位传递信息,完成信号的复制、调整和放大功能,以此从而增加信号传输的距离,延长网络的长度和覆盖区域,支持远距离的通信。

一般来说,中继器两端的网络部分是网段,而不是子网。中继器只将任何电缆段上的数据发送到另一段电缆上,并不管数据中是否有错误数据或不适于网段的数据。大家最常接触的是网络中继器,在通讯上还有微波中继器、激光中继器、红外中继器等等,机理类似,触类旁通。

二、集线器

集线器也称HUB,工作在OSI七层结构的第一层物理层,属于共享型设备,接收数据广播发出,在局域网内一般都是星型连接拓扑结构,每台工作站都连接到集线器上。由于集线器的带宽共享特性导致网络利用效率极低,一般在大中型的网络中不会使用到集线器。现在的集线器基本都是全双工模式,市面上常见的集线器传输速率普遍都为100Mbps。

三、网桥

网桥和交换机一样都是工作在OSI模型的第二层(数据链路层),可以看成是一个二层路由器(真正的路由器是工作在网络层,根据IP地址进行信包转发)。

网桥可有效的将两个局域网(LAN)连起来,根据MAC地址(物理地址)来转发帧,使本地通信限制在本网段内,并转发相应的信号至另一网段,网桥通常用于联接数量不多的、同一类型的网段。

四、交换机

交换机顾名思义以交换为主要功能,工作在OSI第二层(数据链路层),根据MAC地址进行数据转发。交换机的每一个端口都属于一个冲突域,而集线器所有端口属于一个冲突域

交换机通过分析Ethernet包的包头信息(其中包含了源MAC地址、目标MAC地址、信息长度等),取得目标MAC地址后,查找交换机中存储的地址对照表(MAC地址对应的端口),确认具有此MAC地址的网卡连接在哪个端口上,然后将信包送到对应端口,有效的抑制IP广播风暴。并且信息包处于并行状态,效率较高。

数据包通过交换机转发抵达了路由器,准备要离开土生土长的子网了。此时,数据包和交换机离别时说道:“感谢交换机兄弟,帮我转发到出境的大门,我要出远门啦!”

交换机的转发延迟非常小,主要的得益于其硬件设计机理非常高效,为了支持各端口的最大数据传输速率,交换机内部转发信包的背板带宽都必须远大于端口带宽,具有强大的整体吞吐率,才能为每台工作站提供更高的带宽和更高的网络利用率,可以满足大型网络环境大量数据并行处理的要求。

五、路由器

路由器跟集线器和交换机不同,是工作在OSI的第三层(网络层),根据IP进行寻址转发数据包

路由器是一种可以连接多个网络或网段的网络设备,能将不同网络或网段之间(比如局域网——大网)的数据信息进行转换,并为信包传输分配最合适的路径,使它们之间能够进行数据传输,从而构成一个更大的网络。

路由器具有最主要的两个功能,即数据通道功能和控制功能

数据通道功能包括转发决定、背板转发以及输出链路调度等,一般由特定的硬件来完成;

控制功能一般用软件来实现,包括与相邻路由器之间的信息交换、系统配置、系统管理等。实在找不到匹配路由时,就会选择默认路由,路由表中子网掩码为 0.0.0.0 的记录表示「默认路由」。

六、网关

网关(Gateway)又叫协议转换器,网关是一种复杂的网络连接设备,可以支持不同协议之间的转换,实现不同协议网络之间的互连

  1. 在网络中,路由器为第三层网络层设备,其主要功能是根据最佳路由把数据包转发到下一站,实现从源IP到目标IP的端到端数据传输服务;
  2. 关早期的时候就是路由器的别名,但是在现在的网络模型中把它归为应用层设备。主要功能是过滤数据包信息以实现相应的功能网关的概念实际上跟上面的设备型不是一类问题,但是为了方便参考还是放到这里一并介绍。

网关具有对不兼容的高层协议进行转换的能力,为了实现异构设备之间的通信,网关需要对不同的链路层、专用会话层、表示层和应用层协议进行翻译和转换。所以网关兼有路由器、网桥、中继器的特性。

若要使两个完全不同的网络(异构网)连接在一起,一般使用网关,在Internet中两个网络也要通过一台称为网关的计算机实现互联。这台计算机能根据用户通信目标计算机的IP地址,决定是否将用户发出的信息送出本地网络,同时,它还将外界发送给属于本地网络计算机的信息接收过来,它是一个网络与另一个网络相联的通道。为了使TCP/IP协议能够寻址,该通道被赋予一个IP地址,这个IP地址称为网关地址。

所以,网关的作用就是将两个使用不同协议的网络段连接在一起的设备,对两个网络段中的使用不同传输协议的数据进行互相的翻译转换。在互连设备中,由于协议转换的复杂性,一般只能进行一对一的转换,或是少数几种特定应用协议的转换。

网卡:

网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方

因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序

网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列

最后网卡会将包转为电信号,通过网线发送出去。

网关和路由器区别:

1、本质区别

网关这种设备它主要是用来连接两种不同的网络,同时,网关它还能够同时与两边的主机之间进行通信。但是两边的主机是不能够直接进行通信,是必须要经过网关才能进行通信。网关的工作是在应用层当中。

路由器它是属于网络层设备,通常是以包为单位进行数据的发送。

在路由器的子接口,是有分割广播域的作用,所以当我们用交换机做VLAN以后,都是要在路由器上做一个三层的路由。

2、使用方式的区别

网关它可以是路由器,交换机或者是PC。在同一网段之内进行通信,是不需要将网关介入其中,只有当主机个非本网段设备进行通信的时候,才需要将数据包全部发给网关设备,再经由网关设备进行转发或者是有路由处理等。

路由器它是一个网络层系统,路由器在现在市场上一般是被分成了两大类,一类是单协议路由器,另一类是多协议路由器。路由器它可以进行数据格式的转换,成为不同于协议之间的网络互连的必要设备。

3、功能上的区别

网关可以分为传输型网关和应用型网关,它的功能是充当转换重任,实质上就是一个网络通向其他网络的IP地址。

路由器的功能主要有:连通不同的网络和信息传输作用。按照使用可分为:接入、企业级、骨干级、太比特、多WAN以及3G无线等。

7.11 HTTP缓存技术

HTTP 缓存有两种实现方式,分别是强制缓存和协商缓存

强制缓存

强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。

如下图中,返回的是 200 状态码,但在 size 项中标识的是 from disk cache,就是使用了强制缓存。

强缓存是利用下面这两个 HTTP 响应头部(Response Header)字段实现的,它们都用来表示资源在客户端缓存的有效期:

  • Cache-Control, 是一个相对时间;
  • Expires,是一个绝对时间;

如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control的优先级高于 Expires

Cache-control 选项更多一些,设置更加精细,所以建议使用 Cache-Control 来实现强缓存。具体的实现流程如下:

  • 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 Cache-Control,Cache-Control 中设置了过期时间大小;
  • 浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;
  • 服务器再次收到请求后,会再次更新 Response 头部的 Cache-Control。

协商缓存

当我们在浏览器使用开发者工具的时候,你可能会看到过某些请求的响应码是 304,这个是告诉浏览器可以使用本地缓存的资源,通常这种通过服务端告知客户端是否可以使用缓存的方式被称为协商缓存。

上图就是一个协商缓存的过程,所以协商缓存就是与服务端协商之后,通过协商结果来判断是否使用本地缓存

协商缓存可以基于两种头部来实现。

第一种:请求头部中的 If-Modified-Since 字段响应头部中的 Last-Modified 字段实现,这两个字段的意思是:

  • 响应头部中的 Last-Modified标示这个响应资源的最后修改时间
  • 请求头部中的 If-Modified-Since:当资源过期了,发现响应头中具有 Last-Modified 声明,则再次发起请求的时候带上 Last-Modified 的时间,服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行对比(Last-Modified),如果最后修改时间较新(大),说明资源又被改过,则返回最新资源,**HTTP 200 OK;**如果最后修改时间较旧(小),说明资源无新修改,响应 HTTP 304 走缓存。

第二种:请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段,这两个字段的意思是:

  • 响应头部中 Etag:唯一标识响应资源;
  • 请求头部中的 If-None-Match:当资源过期时,浏览器发现响应头里有 Etag,则再次向服务器发起请求时,会将请求头If-None-Match 值设置为 Etag 的值。服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200。

第一种实现方式是基于时间实现的,第二种实现方式是基于一个唯一标识实现的,相对来说后者可以更加准确地判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题。

如果 HTTP 响应头部同时有 Etag 和 Last-Modified 字段的时候, Etag 的优先级更高,也就是先会判断 Etag 是否变化了,如果 Etag 没有变化,然后再看 Last-Modified。

注意,协商缓存这两个字段都需要配合强制缓存中 Cache-control 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。

使用 ETag 字段实现的协商缓存的过程如下;

  • 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 ETag 唯一标识,这个唯一标识的值是根据当前请求的资源生成的;

  • 当浏览器再次请求访问服务器中的该资源时,首先会先检查强制缓存是否过期,如果没有过期,则直接使用本地缓存;如果缓存过期了,会在 Request 头部加上 If-None-Match 字段,该字段的值就是 ETag 唯一标识;

  • 服务器再次收到请求后,

    会根据请求中的 If-None-Match 值与当前请求的资源生成的唯一标识进行比较

    • 如果值相等,则返回 304 Not Modified,不会返回资源
    • 如果不相等,则返回 200 状态码和返回资源,并在 Response 头部加上新的 ETag 唯一标识;
  • 如果浏览器收到 304 的请求响应状态码,则会从本地缓存中加载资源,否则更新资源

Untitled

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy