计算机网络总结(一)

什么是网络协议,为什么要对网络协议分层

网络协议是计算机在通信过程中要遵循的一些约定好的规则。
网络分层的原因:
○ 易于实现和维护,因为各层之间是独立的,层与层之间不会受到影响。
○ 有利于标准化的制定

GET和POST的请求的区别

请求方式GETPOST
数据包产生一个TCP数据包可能产生两个TCP数据包
编码方式只能进行url编码支持多种编码方式
请求参数把参数包含在URL中,用&连接起来通过 request body 传递参数
请求缓存会主动Cache不会缓存,除非手动设置
收藏为书签支持收藏为书签不支持
历史记录参数会被完整保留在浏览历史记录里不会保留
参数数据类型ASCII的字符没有限制数据类型

HTTP常用的请求方式,区别和用途

请求方式用途
GET对服务器资源获取的简单请求
POST用于发送包含用户提交数据的请求
PUT向服务器提交数据,以修改数据
DELETE删除服务器上的某些资源
HEAD请求页面的首部,获取资源的元信息
CONNECT用于ssl隧道的基于代理的请求
OPTIONS返回所有可用的方法,常用于跨域
TRACE追踪请求,响应的传输路径

HTTP 1.0 和 HTTP 1.1 之间的区别

  • 连接方面,http1.0 默认使用非持久连接,http1.1 默认使用持久连接。http1.1 通过使用持久连接来使多个 http 请求复用同一个 TCP 连接,以此来避免使用非持久连接时每次需要建立连接的时延。
  • 资源请求方面,在 http1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,http1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206,这样就方便了开发者自由的选择以便于充分利用带宽和连接。
  • 缓存方面,,在 http1.0 中主要使用 header 里的 If-Modified-Since、Expires 来做为缓存判断的标准,http1.1 则引入了更多的缓存控制策略,例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略。
  • http1.1 中,新增了 host 字段 ,用来指定服务器的域名。http1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此有了 host 字段,这样就可以将请求发往到同一台服务器上的不同网站。
  • http1.1 相对于 http1.0 还新增了很多请求方法,,如 PUT、HEAD、OPTIONS 等。

HTTP 1.1 和 HTTP 2.0 的区别

  • 二进制协议: HTTP 2.0 是一个二进制协议。在 HTTP 1.1 版中,报文的头信息必须是文本(ASCII 编码),数据体可以是文本,也可以是二进制。HTTP 2.0 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧",可以分为头信息帧和数据帧。 帧的概念是它实现多路复用的基础。
  • 多路复用: HTTP 2.0 实现了多路复用,HTTP 2.0 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,这样就避免了"队头堵塞"。
  • 数据流: HTTP 2.0 使用了数据流的概念,因为 HTTP 2.0 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的请求。因此,必须要对数据包做标记,指出它属于哪个请求。HTTP 2.0 将每个请求或回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号。数据包发送时,都必须标记数据流 ID ,用来区分它属于哪个数据流。
  • 头信息压缩: HTTP 2.0 实现了头信息压缩,由于 HTTP 1.1 协议不带状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP 2.0 对这一点做了优化,引入了头信息压缩机制。一方面,头信息使用 gzip 或 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就能提高速度了。
  • 服务器推送: HTTP 2.0 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。使用服务器推送提前给客户端推送必要的资源,这样就可以相对减少一些延迟时间。这里需要注意的是 http2 下服务器主动推送的是静态资源,和 WebSocket 以及使用 SSE 等方式向客户端发送即时数据的推送是不同的。

从浏览器地址栏输入 url 到显示主页的过程

1、URL解析
2、DNS解析,查找域名对应的IP地址
3、与服务器通过三次握手,建立TCP连接
4、向服务器发送HTTP请求(cookies会随着请求发送给服务器)
5、服务器处理请求,返回网页内容(处理请求&它的参数、cookies、生成一个HTML响应)
6、浏览器解析并渲染页面
7、TCP四次挥手,连接结束
详细版:
1、解析URL: 首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。请添加图片描述
2、缓存判断: 浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求。
3、DNS解析: 下一步首先需要获取的是输入的 URL 中的域名的 IP 地址,首先会判断本地是否有该域名的 IP 地址的缓存,如果有则使用,如果没有则向本地 DNS 服务器发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址后,再向顶级域名服务器请求,然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,最终获得域名的 IP 地址后,本地 DNS 服务器再将这个 IP 地址返回给请求的用户。用户向本地 DNS 服务器发起请求属于递归请求,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求。
请添加图片描述

4、获取MAC地址: 当浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址,因为应用层下发数据给传输层,TCP 协议会指定源端口号和目的端口号,然后下发给网络层。网络层会将本机地址作为源地址,获取的 IP 地址作为目的地址。然后将下发给数据链路层,数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相与,可以判断是否与请求主机在同一个子网里,如果在同一个子网里,可以使用 APR 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。
5、TCP三次握手: 下面是 TCP 建立连接的三次握手的过程,首先客户端向服务器发送一个 SYN 连接请求报文段和一个随机序号,服务端接收到请求后向客户端发送一个 SYN ACK报文段,确认连接请求,并且也向客户端发送一个随机序号。客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。
请添加图片描述
6、HTTPS握手: 如果使用的是 HTTPS 协议,在通信前还存在 TLS 的一个四次握手的过程。首先由客户端向服务器端发送使用的协议的版本号、一个随机数和可以使用的加密方法。服务器端收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用证书中的公钥对随机数加密,然后发送给服务器端,并且还会提供一个前面所有内容的 hash 值供服务器端检验。服务器端接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的 hash 值供客户端检验。这个时候双方都有了三个随机数,按照之前所约定的加密方法,使用这三个随机数生成一把秘钥,以后双方通信前,就使用这个秘钥对数据进行加密后再传输。

7、返回数据: 当页面请求发送到服务器端后,服务器端会返回一个 html 文件作为响应,浏览器接收到响应后,开始对 html 文件进行解析,开始页面的渲染过程。
请添加图片描述

8、页面渲染:
浏览器首先会根据 html 文件构建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,要不然 script 的加载和执行会造成页面的渲染的阻塞。当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制。这个时候整个页面就显示出来了。
具体过程:
解析过程:
(1) 构建 DOM 树
由于浏览器无法直接理解 HTML 字符串,因此将这一系列的字节流转换为一种有意义并且方便操作的数据结构,这种数据结构就是 DOM 树。DOM 树本质上是一个以 document 为根节点的多叉树
(2) 样式计算
首先,浏览器是无法直接识别 CSS 样式文本的,因此渲染引擎接收到 CSS 文本之后第一件事情就是将其转化为一个结构化的对象,即 styleSheets。 这个格式化的过程过于复杂,而且对于不同的浏览器会有不同的优化策略,这里就不展开了。 在浏览器控制台能够通过 document.styleSheets 来查看这个最终的结构。当然,这个结构包含了以上三种 CSS 来源,为后面的样式操作提供了基础。
(3) 生成布局树
现在已经生成了 DOM 树和 DOM 样式,接下来要做的就是通过浏览器的布局系统确定元素的位置,也就是要生成一棵布局树(Layout Tree)。 布局树生成的大致工作如下:

  • 遍历生成的 DOM 树节点,并把他们添加到布局树中;
  • 计算布局树节点的坐标位置。
    值得注意的是,布局树只包含可见元素,对于 head 标签和设置了 display: none 的元素,将不会被放入其中。

渲染:
(1) 构建 DOM 树
浏览器将 HTML 解析成树形结构的 DOM 树,一般来说,这个过程发生在页面初次加载,或页面 JavaScript 修改了节点结构的时候
(2)构建渲染树
浏览器将 CSS 解析成树形结构的 CSSOM 树,再和 DOM 树合并成渲染树
(3)布局(Layout)
浏览器根据渲染树所体现的节点、各个节点的 CSS 定义以及它们的从属关系,计算出每个节点在屏幕中的位置。Web 页面中元素的布局是相对的,在页面元素位置、大小发生变化,往往会导致其他节点联动,需要重新计算布局,这时候的布局过程一般被称为回流(Reflow)。
(4)绘制(Paint)
遍历渲染树,调用渲染器的 paint() 方法在屏幕上绘制出节点内容,本质上是一个像素填充的过程。这个过程也出现于回流或一些不影响布局的 CSS 修改引起的屏幕局部重画,这时候它被称为重绘(Repaint)。实际上,绘制过程是在多个层上完成的,这些层我们称为 渲染层(RenderLayer)
(5)渲染层合成(Composite)
多个绘制后的渲染层按照恰当的重叠顺序进行合并,而后生成位图,最终通过显卡展示到屏幕上。
那什么是渲染层合成呢?
在 DOM 树中每个节点都会对应一个渲染对象(RenderObject),当它们的渲染对象处于相同的坐标空间(z 轴空间)时,就会形成一个 RenderLayers,也就是渲染层。渲染层将保证页面元素以正确的顺序堆叠,这时候就会出现层合成(composite),从而正确处理透明元素和重叠元素的显示。 这个模型类似于 Photoshop 的图层模型,在 Photoshop 中,每个设计元素都是一个独立的图层,多个图层以恰当的顺序在 z 轴空间上叠加,最终构成一个完整的设计图。 对于有位置重叠的元素的页面,这个过程尤其重要,因为一旦图层的合并顺序出错,将会导致元素显示异常。
(6)显示器显示内容
栅格化操作完成后,合成线程会生成一个绘制命令,即"DrawQuad",并发送给浏览器进程。 浏览器进程中的 viz 组件接收到这个命令,根据这个命令把页面内容绘制到内存,也就是生成了页面,然后把这部分内存发送给显卡,从而展示在屏幕上。

从浏览器的渲染过程中我们知道,页面 HTML 会被解析成 DOM 树,每个 HTML 元素对应了树结构上的一个 node 节点。而从 DOM 树转化到一个个的渲染层,并最终执行合并、绘制的过程,中间其实还存在一些过渡的数据结构,它们记录了 DOM 树到屏幕图形的转化原理,其本质也就是树结构到层结构的演化。
请添加图片描述

9、TCP四次挥手: 最后一步是 TCP 断开连接的四次挥手过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态。

HTTP 如何实现长连接?在什么时候会超时什么是HTTP的长连接?

什么是HTTP的长连接?
1、HTTP 分为长连接和短连接,本质上说的是TCP的长短连接。TCP连接是一个双向的通道,它可以保持一段时间不关闭的,因此TCP连接才具有真正的长连接和短连接。
2、TCP长连接可以复用一个TCP连接,来发起多次的HTTP请求,这样就可以就减少资源的消耗,比如一次请求HTML,如果是短连接,可能还需要请求后续的JS/CSS。
如何 设置长连接?
通过在头部(请求和响应头)设置Connection字段指定为 keep-alive,HTTP/1.0协议支持,但是默认是关闭的,从HTTP/1.1以后,连接默认是长连接。
在什么时候会超时呢?

HTTP 一般会有 httpd 守护进程,里面可以设置keep-alive timeout,当 tcp 连接闲置超过这个时间就会关闭,也可以在 HTTP 的 header 里面设置超时时间
TCP 的keep-alive包含三个参数,支持在系统内核的 net.ipv4 里面设置;当 TCP 连接之后,闲置了tcp_keepalive_time,则会发生侦测包,如果没有收到对方的 ACK,那么会每隔 tcp_keepalive_intvl 再发一次,直到发送了tcp_keepalive_probes,就会丢弃该连接。

HTTP常用的状态码及其含义

状态码类别
1XX信息性状态码
2XX成功状态码
3XX重定向状态码
4XX客户端错误状态码
5XX服务端状态码
状态码含义
101切换请求协议
200请求成功
204200基本相同,但响应头后无body数据
301永久性重定向,会缓存
302临时重定向,不会缓存
400客户端请求的语法错误
403服务器精致访问,权限有关
404服务器无法根据客户端的请求找到资源
500服务端错误
501客户端请求功能还不支持

如何理解 HTTP 协议是无状态的

HTTP的无状态,指协议对于事务处理没有记忆能力,不对通信状态进行保存,服务器无法判断用户身份。即打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。服务器不会去记住你是谁,所以是无状态协议。

HTTP请求报文

请求的内容包括:

  • 请求⾏包括:请求⽅法字段、URL字段、HTTP协议版本字段。它们⽤空格分隔。例如,GET /index.html HTTP/1.1。
  • 请求头部:请求头部由关键字/值对组成,每⾏⼀对,关键字和值⽤英⽂冒号“:”分隔
  • 请求体: post put等请求携带的数据
    请添加图片描述

HTTP响应报文

状态行

  • 响应行:由网络协议版本,状态码和状态码的原因短语组成,例如 HTTP/1.1 200 OK 。
  • 响应头:响应部⾸组成
  • 响应体:服务器响应的数据
    请添加图片描述

HTTP和HTTPS协议的区别

从安全性、数据是否加密、默认端口等这几个方面思考。
HTTP,即超文本传输协议,是一个基于TCP/IP通信协议来传递明文数据的协议。HTTP会存在这几个问题:

  • 请求信息是明文传输,容易被窃听截取。
  • 没有验证对方身份,存在被冒充的风险
  • 数据的完整性没有校验,容易被中间人篡改。
    为了解决HTTP存在的问题,HTTPS出现啦。
    HTTPS = HTTP + SSL/TLS,可以理解 HTTPs是身披SSL(安全套接层)的HTTP。
HttpHttps
安全性不安全安全
默认端口80433
资源消耗较少消耗资源较多
是否需要证书不需要需要
报文是否加密明文密文

HTTPS协议

超文本传输安全协议(Hypertext Transfer Protocol Secure,简称:HTTPS)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,利用SSL/TLS来加密数据包。HTTPS的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
请添加图片描述
HTTP协议采用明文传输信息,存在信息窃听信息篡改信息劫持的风险,而协议TLS/SSL具有身份验证信息加密完整性校验的功能,可以避免此类问题发生。

安全层的主要职责就是对发起的HTTP请求的数据进行加密操作对接收到的HTTP的内容进行解密操作

TLS/SSL的工作原理

HTTPS是如何保证安全的?

对称加密
对称加密指的是加密和解密使用的秘钥都是同一个,是对称的。只要保证了密钥的安全,那整个通信过程就可以说具有了机密性
请添加图片描述

非对称加密
非对称加密,存在两个秘钥,一个叫公钥,一个叫私钥。两个秘钥是不同的,公钥可以公开给任何人使用,私钥则需要保密
公钥和私钥都可以用来加密解密,但公钥加密后只能用私钥解 密,反过来,私钥加密后也只能用公钥解密
请添加图片描述
⾮对称加密虽然安全性更⾼,但是带来的问题就是速度很慢,影响性能。

混合加密
在HTTPS通信过程中,采用的是对称加密+非对称加密,也就是混合加密
在对称加密中讲到,如果能够保证了密钥的安全,那整个通信过程就可以说具有了机密性;
而HTTPS采用非对称加密解决秘钥交换的问题
具体做法是发送密文的一方使用对方的公钥进行加密处理“对称的密钥”,然后对方用自己的私钥解密拿到“对称的密钥”
请添加图片描述
中间⼈问题:
如果此时在客户端和服务器之间存在⼀个中间⼈,这个中间⼈只需要把原本双⽅通信互发的公钥,换成⾃⼰的公钥,这样中间⼈就可以轻松解密通信双⽅所发送的所有数据。
所以这个时候需要⼀个安全的第三⽅颁发证书(CA),证明身份的身份,防⽌被中间⼈攻击。 证书中包括:签发者、证书⽤途、使⽤者公钥、使⽤者私钥、使⽤者的HASH算法、证书到期时间等。

如果中间⼈篡改了证书,那么身份证明就⽆效了
数字签名就是⽤CA⾃带的HASH算法对证书的内容进⾏HASH得到⼀个摘要,再⽤CA的私钥加密,最终组成数字签名。当别⼈把他的证书发过来的时候,我再⽤同样的Hash算法,再次⽣成消息摘要,然后⽤CA的公钥对数字签名解密,得到CA创建的消息摘要,两者⼀⽐,就知道中间有没有被⼈篡改了。这个时候就能最⼤程度保证通信的安全了。

在交互过程中如果数据传送完了,还不想断开连接怎么办,怎么维持?

使用keep-alive来实现,在HTTP中响应体的Connection字段指定为keep-alive

对称加密与非对称加密有什么区别

对称加密:值加密和解密使用同一密钥,要点是运算速度较快,缺点是如何安全将密钥传输给另一方,常见的对称加密算法有:DES、AES等。
非对称加密:指的是加密和解密使用不同的密钥(即公钥和私钥)。公钥和私钥是成对存在的,如果用公钥对数据加密,只有对应的私钥才能解密,常见的非对称加密算法有RSA。

Session、LocalStorage 和 Cookie 的区别

概念:

  • Cookie 是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个Cookie,客户端就把Cookie保存起来。在客户端下次向同一服务器再发起请求时,Cookie被携带发送到服务器。服务器就是根据这个Cookie来确认身份的。
  • Session 指的就是服务器和客户端一次会话的过程。Session 利用 Cookie 进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个 Cookie,当这个 Session 结束时,其实就是意味着这个 Cookie 就过期了。Session 对象存储着特定用户会话所需的属性及配置信息。
  • LocalStorage 存储的信息在同一域中是共享的。当本页操作(新增、修改、删除)了localStorage的时候,本页面不会触发storage事件,但是别的页面会触发storage事件。localStorage本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡。localStorage受同源策略的限制。持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
    请添加图片描述
    区别:
  1. cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递,而sessionStorage和localStorage不会自动把数据发送给服务器,仅在本地保存。cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下
  2. 存储大小限制也不同,cookie数据不能超过4K,同时因为每次http请求都会携带cookie、所以cookie只适合保存很小的数据,如会话标识。sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大
  3. 数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭之前有效;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie:只在设置的cookie过期时间之前有效,即使窗口关闭或浏览器关闭
  4. 作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localstorage在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值