计算机网络篇

162 阅读22分钟

计算机网络.png

一. HTTP协议

  1. GET和POST的请求的区别
  • 应用场景:GET请求是一个幂等的请求,一般GET请求用于对服务器资源不会产生影响的场景,比如请求一个网页的资源。而POST不是一个幂等的请求,一般用于对服务器资源产生影响的场景,比如注册用户。
  • 是否缓存:一般会对GET请求缓存,不会对POST请求缓存
  • 发送的报文格式:GET请求的报文中实体部分为空,POST请求的报文中实体部分一般为向服务器发送的数据
  • 安全性:GET请求将请求的参数放入url中向服务器发送,相对POST请求来说不太安全,因为请求的url会被保存到浏览器的历史记录中
  • 请求长度:浏览器由于对url长度的限制,所以会影响GET请求发送数据时的长度
  • 参数类型:POST的参数传递支持更多的数据类型,而GET请求仅支持ASCII码
  1. POST和PUT请求的区别
  • PUT请求是向服务器端发送数据,从而修改数据内容,但是不会增加数据的种类等,可以理解为更新数据
  • POST请求是向服务器端发送数据,但是会改变数据的种类等资源,它会创建新的内容,可以理解为创建数据
  1. 常见的HTTP请求头和响应头
  • HTTP Request Header常见的请求头:

    • Accept:浏览器能处理的内容类型
    • Accept-Charset:浏览器能显示的字符集
    • Accept-Encoding:浏览器能处理的压缩编码
    • Accept-Language:浏览器当前设置的语言
    • Connection:浏览器与服务器之间连接的类型
    • Cookie:当前页面设置的Cookie
    • Host:发出请求的页面所在的域
    • Referer:发出请求的页面的URL
    • User-Agent:浏览器的用户代理字符串
  • HTTP Responses Header常见的响应头:

    • Date:表示消息发送的时间
    • server:服务器名称
    • Connection:浏览器与服务器之间连接的类型
    • Cache-Control:控制HTTP缓存
    • content-type:表示后面的文档属于什么类型,常见的Content-Type属性值:
      • application/x-www-form-urlencoded:浏览器的原生form表单,提交数据放在body
      • multipart/form-data:表单上传文件时使用
      • application/json:服务器消息主体是序列化后的JSON字符串
      • text/html:提交XML格式的数据
  1. HTTP状态码304是多好还是少好 服务器为了提高网站访问速度,会对之前访问的部分页面指定缓存机制,当客户端在对这些页面进行请求,服务器会根据缓存内容判断页面与之前是否相同,若相同便直接返回304,此时客户端调用缓存,不会进行二次下载

产生较多304状态码的原因:

  • 页面更新周期长或不更新
  • 纯静态页面或强制生成静态html

304状态码过多会造成以下问题:

  • 网站快照停止
  • 收录减少
  • 权重下降
  1. 常见的HTTP请求方法
  • GET:向服务器获取数据
  • POST:将实体提交到指定的资源,会造成服务器资源的修改
  • PUT:上传文件,更新数据
  • DELETE:删除服务器上的对象
  • HEAD:获取报文首部,不返回报文主体部分
  • OPTIONS:询问支持的请求方法,用于跨域请求
  • CONNECT:要求与代理服务器之间建立通信隧道,使用隧道进行TCP通信
  1. OPTIONS请求方法及使用场景
  • 获取服务器支持的所有HTTP请求方法
  • 用来检查访问权限
  1. HTTP1.0和HTTP1.1之间有哪些区别?
  • 连接方面:http1.0默认使用非持久连接,而http1.1默认使用持久连接。http1.1通过使用持久连接来使多个http请求复用同一个TCP连接,避免使用非持久连接时每次需要的建立连接的时延
  • 资源请求方面:http1.0会将整个对象传到服务器,而http1.1在请求头中引入了range,允许只请求资源的某个部分
  • 缓存方面:在http1.0中使用header中的If-Modified-Since,expires来判断缓存;http1.1引入了更多缓存控制策略,例如etag,cache-control等缓存头
  • http1.1新增了host字段,用来指定服务器的域名
  • http1.1相对http1.0增加了许多请求方法,如put,head,options等
  1. HTTP1.1和HTTP2.0的区别
  • 二进制协议:HTTP1.1中,报文的头信息必须是文本,数据体可以是文本,也可以是二进制。HTTP2是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为帧。每个请求对应一个数据流,每个数据流有一个独一无二的编号。数据包发送时,都必须标记数据流ID,用来区分它属于哪个数据流
  • 多路复用:HTTP2实现了多路复用,避免了队头阻塞问题
  • 头信息压缩:一方面,头信息使用gzip或compress压缩;另一方面,客户端和服务器同时维护一张头信息表,所有字段会存入该表,生成一个索引号,后续无须发送数据,直接使用索引号就可以了
  • 服务器推送:HTTP2允许服务器未经请求,主动向客户端发送资源,这叫服务器推送。都是推送的静态资源,可以减少延迟时间

队头阻塞:HTTP是基于请求-应答的模式,队列里的请求没有优先级,只有入队的先后顺序,排在最前面的请求会被优先处理,如果因为队首的请求处理太慢耽误了时间,会造成队头阻塞的现象。

  1. HTTP和HTTPS协议的区别
  • HTTPS协议需要CA证书,费用较高;而HTTP协议不需要
  • HTTP协议是超文本传输协议,信息是明文传输的,HTTPS则是具有安全性的SSL加密传输协议
  • 端口号不同,HTTP协议端口是80,HTTPS协议端口是443
  • HTTP协议连接很简单,是无状态的;HTTPS协议是具有SSL和HTTP协议构建的可进行加密传输,身份认证的网络协议,比HTTP更加安全
  1. 当浏览器中输入url到页面渲染发生了什么?

    1. 解析url:先判断是否合法,如果不合法,则进行搜索引擎

    2. 缓存判断:浏览器会判断请求的资源是否在缓存里,如果请求的资源在缓存中并且没有失效,那么直接使用,否则向服务器发起新的请求

    3. DNS解析:

      • 首先判断本地是否有该域名的IP地址的缓存,如果有则使用,如果没有则向本地DNS服务器发起请求
      • 本地DNS服务器也会检查是否存在缓存,如果没有则先向根域名服务器发起请求,获得顶级域名服务器的地址
      • 再向顶级域名服务器查询,获得权威域名服务器的地址
      • 再向权威域名服务器查询,最终获得域名的IP地址后,本地DNS服务器将这个IP地址返回给请求用户,同时将其缓存起来
    4. TCP三次握手:

      • 客户端向服务器发送一个SYN连接请求报文段和一个随机序号
      • 服务器收到请求后,向客户端发送一个SYN ACK报文段,确认连接请求,并且向客户端发送一个随机序号
      • 客户端收到确认应答后,进入连接建立的状态,同时向服务器发送一个ACK确认报文段,服务器收到确认后,也进入连接建立状态,此时双方的连接就建立起来了
    5. HTTPS握手:还要存在一个TLS的四次握手过程

      • 客户端向服务器发送使用的协议版本号,一个随机数和可以使用的加密方法。
      • 服务器收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。
      • 客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用数字证书中的公钥对随机数加密,发送给服务器,并且还会提供一个前面所有内容的hash值供服务器检验。
      • 服务器接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的hash值供客户端检验。
      • 这个时候双方都有三个随机数,按照之前约定的加密方法,使用这三个随机数生成一把密钥,以后双方通信都使用这个密钥进行加密后传输。
    6. 返回数据:服务器会返回一个html文件作为响应,浏览器收到响应后,开始对html文件进行解析,开始页面的渲染过程

    7. 页面渲染:

      • DOM树构建,对html进行解析,对字符进行词法分析生成token,对token进行语法分析转成dom节点对象,dom解析会维护一个解析栈,栈底为document,也就是树的根节点
      • CSSOM规则数构建,首先将CSS格式化成StyleSheets,然后对计算好的样式进行标准化操作,样式计算规则主要有层叠和继承。
      • layout布局,首先创建布局树,遍历DOM中的节点,将可见节点添加到布局树中,根据DOM结构和元素样式对布局树中的几何位置信息进行计算
      • 分层,因为脱离文档流的对象会形成一个层叠上下文,也就是分层的概念,主线程会为每个图层进行计算样式,把一个图层拆分成许多绘制指令
      • 栅格化,针对分层后的图层进行栅格化处理,放到gpu中处理
      • 合成与显示
    8. TCP四次挥手

      • 客户端向服务器发送连接释放的请求
      • 服务器收到后,会告诉应用层释放TCP连接,然后发送ACK包,进入CLOSE_WAIT状态,客户端到服务器的连接已经释放,但是服务器可以发送数据给客户端,当服务器没有数据发送时会向客户端发送连接释放请求
      • 客户端收到释放请求后,向服务器发送确认应答,此时客户端进入TIME_WAIT状态。这个状态会持续2MSL时间,若该时间段内没有服务器的重发请求的话,就会进入CLOSED状态
      • 服务器收到确认应答后,进入CLOSED状态
  2. keep-alive的理解

  • http1.0中默认是短连接,也就是每次请求应答后,客户端和服务器都要重新建立一个连接,完成之后立即断开连接。
  • http1.1默认使用长连接,允许请求和应答的HTTP管道化
  1. 页面有多张图,HTTP是怎样的加载表现?
  • 在http1下,浏览器对一个域名下最大TCP连接数为6,所以会请求多次
  • 在hhtp2下,可以一瞬间加载出来很多资源,因为http2支持多路复用,可以在一个TCP连接中发送多个HTTP请求
  1. HTTP2的头部压缩算法是怎样的?
  • 采用HPACK算法,在客户端和服务端两端建立字典,用索引号来表示字符,采用哈夫曼编码来压缩整数和字符串,可以达到50-90的压缩效率
  1. HTTP请求报文是什么样的?

请求报文由4部分组成

  • 请求行(请求方法,URL字段,HTTP协议版本)
  • 请求头部(关键字/值)
  • 空行
  • 请求体(post/put等请求携带的数据)
  1. HTTP响应报文是什么样的?
  • 响应行
  • 响应头
  • 空行
  • 响应体
  1. HTTP协议的优点和缺点?

具有以下优点:

  • 支持客户端/服务器模式
  • 简单快速:只需要请求方法和路径,由于HTTP协议简单,使得HTTP通信速度很快
  • 无连接:每次连接只处理一个请求,服务器处理完客户端请求后,收到应答后会立即断开连接
  • 无状态:通信过程不保存上下文信息
  • 灵活:可以传输任意类型的数据对象

具有以下缺点:

  • 无状态:不会保存客户的任何信息
  • 明文传输:报文使用的是文本形式,不安全
  • 不安全
  1. 说一下HTTP3.0

HTTP3基于UDP实现了类似TCP的多路复用数据流,传输可靠性等功能

  • 流量控制,传输可靠性功能:在UDP上增加了一层来保证数据的可靠性,提供了数据包重传机制,拥塞控制
  • 集成TLS的加密功能
  • 多路复用,同一物理连接上可以有多个独立的逻辑数据流
  • 快速握手,基于UDP
  1. 队头阻塞的解决方案?
  • 并发连接,将一个域名分配多个长连接
  • 域名分片,将域名分出很多二级域名
  1. URL有哪些组成部分?
  • 协议:http,https
  • 域名:www.asas.com
  • 端口::9000
  • 虚拟目录:/aas/sadas
  • 文件名:/index.html
  • 锚部分:从#开始到最后
  • 参数:?开始到#结束
  1. 与缓存相关的HTTP请求头有哪些?

强缓存:

- Expires:存在于服务器响应头中,**服务器的时间和浏览器的时间可能并不一致**会导致过期时间不准确
- Cache-Control:采用了过期时长,对应的字段是max-age。no-cache会直接跳过强制缓存,走协商缓存

协商缓存:

- Last-Modified,If-Modified-Since:服务器在响应头中加入Last-Modified,表示最后修改时间,浏览器接收到后,如果再次请求,会在请求头中携带`If-Modified-Since`字段,这个字段的值也就是服务器传来的最后修改时间。如果请求头中的这个值小于最后修改时间,说明是时候更新了。返回新的资源,跟常规的HTTP请求响应的流程一样。否则返回304,告诉浏览器直接用缓存。
- Etag,If-None-Match:`ETag` 是服务器根据当前文件的内容,给文件生成的唯一标识,只要里面的内容有改动,这个值就会变。服务器通过`响应头`把这个值给浏览器。浏览器接收到`ETag`的值,会在下次请求时,将这个值作为**If-None-Match**这个字段的内容,并放到请求头中,然后发给服务器。服务器接收到**If-None-Match**后,会跟服务器上该资源的**ETag**进行比对:如果两者不一样,说明要更新了。返回新的资源,跟常规的HTTP请求响应的流程一样。否则返回304,告诉浏览器直接用缓存。

二. HTTPS协议

  1. 什么是HTTPS协议

超文本传输安全协议。HTTP+TLS的协议。HTTPS主要目的是对服务器的身份认证,保证数据的隐私性和完整性。

HTTP协议采用明文传输信息,存在信息窃听,信息篡改和信息劫持的风险,而协议TLS具有身份认证,信息加密和完整性校验的功能。

TLS层的主要作用是对发起HTTP请求的数据进行加密操作和对接收到的HTTP内容进行解密操作

  1. TLS/SSL的工作原理

TLS的功能实现主要依赖三类基本算法:散列函数hash,对称加密,非对称加密,这三类算法的主要作用如下:

  • 基于散列函数验证信息的完整性
  • 对称加密算法采用协商的密钥对数据加密
  • 非对称加密实现身份验证和密钥协商
  1. 数字证书是什么?
  • 因为没有办法确认得到的公钥一定是安全的公钥,所以有了数字证书这个概念
  • 数字证书的过程
    • 首先使用一种hash算法来对公钥和其他信息进行加密,生成一个信息摘要
    • 让有公信力的认证中心用它的私钥对信息摘要进行加密,形成签名。
    • 将原始信息和签名合在一起,称为数字证书。
    • 接收方收到数字证书后,先根据原始信息使用相同的hash算法生成一个摘要,然后使用认证中心的公钥来对数字证书中的摘要进行解密,最后将解密的摘要和生成的摘要进行对比,就可以知道得到的信息是否被更改了
  1. HTTPS通信过程

    • 客户端向服务端发送请求,请求中携带协议版本号,生成的一个随机数,客户端支持的加密方法
    • 服务端收到请求后,确认双方使用的加密方法,并给出CA证书,以及一个服务器生成的随机数
    • 客户端收到CA后,先验证其有效性,然后生成一个新的随机数,并使用CA中的公钥加密这个随机数,然后发给服务器。
    • 服务器使用私钥解密客户端发送过来的随机数
    • 客户端和服务端使用约定好的加密方法对三个随机数进行加密,生成对话密钥,以后对话都通过这个密钥进行加密信息
  2. HTTPS的特点

HTTPS的优点如下:

- 使用HTTPS协议可以认证用户和服务器,确认数据发送到正确的客户端和服务端
- 使用HTTPS协议可以进行加密传输,身份认证,通信更加安全,确保数据的安全性
- HTTPS是目前最安全的解决方案

HTTPS协议的缺点如下:

- HTTPS需要客户端和服务端双方进行加密解密处理,耗费更多的服务器资源,过程复杂
- HTTPS协议握手阶段比较费时,增加页面的加载时间
- SSL证书费用比较高
- HTTPS连接服务器端资源占用较高
- SSL证书需要绑定IP

三. HTTP状态码

状态码的类别

类别原因描述
1xx信息状态码接受的请求正在处理
2xx成功状态码请求正常处理完毕
3xx重定向状态码需要进行附加操作完成请求
4xx客户端错误状态码服务器无法处理请求
5xx服务器错误状态码服务器处理请求出错
  1. 2xx(成功状态码)

    • 200 OK.
    • 204 No Content. 正常处理请求,但是没有返回的内容
    • 206 Partial Content. 范围请求
  2. 3xx(重定向状态码)

    • 301 Moved Permanetly. 永久重定向,请求资源被分配了新的URI,以后应使用资源指定的URI
    • 302 Found. 临时重定向,希望用户本次使用新的URI访问资源。
    • 304 Not Modified. 浏览器缓存相关,告诉客户端有缓存,直接使用缓存中的数据。
    • 307 Temporary Redirect. 临时重定向,不会从POST变成GET
  3. 4xx(Client Error客户端错误状态码)

    • 400 Bad Request. 请求报文中存在语法错误
    • 401 Unauthorized. 表示需要通过HTTP认证的认证信息
    • 403 Forbidden. 请求资源的访问被服务器拒绝
    • 404 Not Found. 服务器上无法找到请求的资源
  4. 5xx(Server Error 服务器错误状态码)

    • 500 Internal Server Error. 服务端在执行请求时发生了错误
    • 502 Bad Gateway. 从上游服务器接收到的响应是无效的
    • 503 Service Unavaliable. 表明服务器处于超载
    • 504 Gateway Timeout. 运行超时错误
  5. 同样是重定向,307,303,302的区别?

    • 302是http1.0协议状态码
    • 303和307是http1.1协议状态码,307不会将请求从post更改为get,303明确客户端采用get请求方法,302会将请求方法从post改成get

四. DNS协议介绍

  1. DNS协议是什么

    • 概念:dns域名系统,提供一种主机名到ip地址的转换服务。
    • 作用:将域名解析为ip地址
  2. DNS同时使用UDP和TCP协议?

    • 区域传输使用TCP
    • 域名解析使用UDP
  3. DNS完整的查询过程

    • 首先会在浏览器本地缓存中查找对应的IP地址,如果找到直接返回,找不到继续下一步
    • 将请求发送给本地DNS服务器,在本地域名服务器缓存中查询,如果查询到,就直接将结果返回,若找不到继续下一步
    • 本地DNS服务器向根域名服务器发起请求,根域名服务器会返回一个查询到的顶级域名服务器地址
    • 本地DNS服务器向顶级域名服务器发起请求,顶级域名服务器会返回一个查询到的权威域名服务器地址
    • 本地DNS服务器向权威域名服务器发送请求,返回对应的IP地址
    • 本地DNS服务器将返回的结果保存在缓存中
    • 本地DNS服务器将IP地址返回给浏览器
  4. 迭代查询与递归查询

    一般我们向本地DNS服务器发送请求的方式就是递归查询,因此我们只需要发出一次请求,而本地DNS服务器向其他域名服务器请求的过程是迭代查询的过程

五. 网络模型

  1. OSI七层模型
    1. 应用层:为应用程序提供服务(http,https,smtp,pop3,ftp)
    2. 表示层:数据格式转化,数据加密
    3. 会话层:建立,管理和维护会话
    4. 传输层:建立,管理和维护端到端的连接(udp,tcp)
    5. 网络层:IP地址及路由选择
    6. 数据链路层:提供介质访问和链路管理
    7. 物理层:物理层
  2. TCP/IP五层协议
    1. 应用层:http,ftp,dns,smtp
    2. 传输层:tcp(面向连接的,可靠的数据传输服务,报文),udp(面向无连接的,尽最大努力的,不可靠的数据传输服务,数据报)
    3. 网络层
    4. 数据链路层
    5. 物理层

六. TCP与UDP

  1. TCP和UDP的概念及特点

UDP的特点:

  • 面向无连接的,想发送数据就可以直接发送数据
  • 有单播,多播和广播的形式
  • 面向报文,发送来自应用程序的报文
  • 不可靠性,第一点是由于它是无连接,想发就发;第二点是UDP不存在拥塞控制,所以会在网络不好时,丢失数据包
  • 头部开销小,只需要8字节,相对比TCP的20字节要少的多

TCP的特点:

  • 面向连接的,三次握手,建立可靠的连接
  • 仅支持单播传输,点对点传输
  • 面向字节流
  • 可靠传输,给每个包一个序号,同时序号也保证传到接收端实体的包的按序接收;接收成功会回一个相应的确认
  • 拥塞控制,面对网路出现拥塞时,会减小速率和数量,缓解拥塞
  • 提供全双工通信
  1. TCP与UDP的区别
  • 是否连接:TCP面向连接,UDP面向无连接
  • 是否可靠:TCP是可靠传输(数据顺序和正确性),使用流量控制和拥塞控制;UDP是不可靠传输,不使用流量控制和拥塞控制
  • 连接对象个数:TCP只能是一对一通信,UDP支持一对一,一对多,多对一,多对多通信
  • 传输方式:TCP面向字节流;UDP面向报文
  • 首部开销:TCP首部最小20字节;UDP首部开销小,仅8字节
  • 使用场景:TCP用于文件传输,UDP用于实时应用,比如视频会议,直播等
  1. TCP的重传机制
  • 基于时间
  • 基于确认信号
  1. TCP的拥塞控制机制
  • 慢启动:开始时不要发送大量数据,而是先测试一下网络的拥塞程度,由小到大增加拥塞窗口的大小
  • 拥塞避免:在拥塞阶段控制拥塞窗口为线性增长,使网络不易出现阻塞
  • 快速重传:在收到一个失序的报文段后立即发出重复确认
  • 快速恢复:发送方连续收到三个重复确认时,就执行乘法减小算法,把拥塞门限减半
  1. TCP的流量控制机制
  • 采用大小可变的滑动窗口进行流量控制,窗口的大小是字节,这里就是每次传输的数据大小
  1. TCP为什么需要三次握手,两次握手不行吗?
  • 为了确认双方的接收能力和发送能力都正常
  • 如果是两次握手,那么服务器就没有办法知道自己的序号是否已经被确认了,导致资源一直被浪费

七. websocket

  1. 对WebSocket的理解
  • 全双工通讯
  • 服务器可以向客户端主动推送消息,客户端也可以主动向服务端推送消息
  1. 即时通讯的实现:短轮询,长轮询,SSE和WebSocket的区别?
  • 短轮询:每隔一段时间向服务器发送http请求
  • 长轮询:服务器会讲这个请求挂起,然后判断是否数据有更新,如果有更新,则进行响应,如果一直没有数据更新,则到达一定时间后才返回
  • SSE:服务器主动使用流信息向服务器推送信息,单向的,只能是服务器发送消息给客户端
  • WebSocket:允许服务器主动向客户端推送消息,全双工协议