计算机网络相关

175 阅读17分钟

计算机网络

1.什么是HTTP? HTTP 和 HTTPS 的区别?

HTTP为一种浏览器web端和服务器server端之间传输内容的传输协议,以明文方式发送内容,不对传输内容进行加密。

HTTPS就是为了解决上述的安全性问题出现的,为了能够加密传输,让HTTP协议运行在SSL/TLS协议上,通过SSL证书来验证服务器的身份,实现浏览器和服务器之间的传输加密。

区别:

  • HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理,相对更安全
  • HTTP 和 HTTPS 使用连接方式不同,默认端口也不一样,HTTP是80,HTTPS是443
  • HTTPS 由于需要设计加密以及多次握手,性能方面不如 HTTP
  • HTTPS需要SSL,SSL 证书需要钱,功能越强大的证书费用越高

2.为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?

HTTPS通过SSL/TSL协议对通信的过程进行加密处理,具体的操作有:

  • 信息加密
  • 完整性校验
  • 身份验证

信息加密即采用对称加密和非对称加密的混合加密方式,通过非对称加密的公钥对称加密的密钥进行加密,再通过非对称加密的私钥对称加密的密钥解密。

image-20220313162426143

即两层结构。

实现完整性检验用的是摘要算法,也就是常说的散列函数、哈希函数。

对任意的数据进行'压缩'成固定长度的一串字符串,该字符串是独一无二的,像身份证一样。

这样在传输数据时,在传输明文的基础上再加上摘要,通过信息加密后传给对方,对方拿到数据进行摘要的对比,若一致则说明数据是完整的。

image-20220313162926441

实现身份验证是通过数字签名来实现的,在传输摘要的时候加一个签名,该签名采用的是私钥加密,公钥解密。

且中间要加一个CA验证机构以确保服务端在收到消息时,对方使用的公钥是自己的那个公开密钥,过程就是服务器向中间CA机构发送申请,把公开密钥给他们,CA机构根据这个公钥做一个数字签名,然后以证书方式公布这个有数字签名公钥;

接到这个证书的客户端、浏览器会验证该数字签名的真实性,通过验证后说明该公开密钥是可信的。这样有人想做一个假的公钥没有数字签名是不行的。

3.UDP 和 TCP?

UDP(用户数据包协议),

是面向报文的无连接数据通信协议;

只保证尽可能地传递数据,不保证对方有没有收到,可靠性很差,但是传输效率高

支持一对一、一对多、多对一、多对多通信;

TCP(传输控制协议),是面向字节流的有连接通信协议,建立连接时需要三次握手,断开连接时需要四次握手;

提供可靠地服务,传输过程采用流量控制、编号与确认、计时器等手段确保数据无差错、不丢失,但传输效率低

点对点的全双工通信;

应用场景:

image-20220313171846432

4.OSI七层模型?TCP/IP?

image-20220313171955242

OSI为计算机网络标准模型主要分为七层,每一层实现各自的功能和协议,并完成与相邻层的接口通信。

应用层

提供各种应用程序的协议标准,如支持域名系统的DNS协议,支持万维网应用的HTTP协议,支持电子邮件系统的SMTP协议。

应用程序之间的交互数据单元为报文

表示层:

对数据进行解释、压缩、解压、加密和解密等格式转化操作。

会话层:

负责建立、管理和维护不同机器上的用户之间的会话。

传输层:

为会话层的机器提供透明、可靠的数据传输服务,保证端到端数据传输的完整性。

主要的传输层协议为TCPUDP

TCP/IP指能在多个网络间实现信息传输的协议族,其四层结构如下:

应用层:

包括OSI模型的上三层,负责实现所有和应用程序相关的功能,

其中有FTP(文件传输协议)、HTTP(超文本传输协议)、DNS(域名服务器协议)、SMTP(简单邮件传输协议)、NFS(网络文件系统协议)

传输层: 单位:报文段

对应OSI模型的第四层传输层,负责提供可靠的传输服务,

其中有TCP(控制传输协议)、UDP(用户数据报协议)

网络层: 单位:数据报

对应OSI模型的第三层网络层,负责网络间的寻址数据传输,

其中包括IP(网际协议)、ICMP(网际控制消息协议)、ARP(地址解析协议)、RARP(反向地址解析协议)

网络接口层: 单位:帧

对应OSI模型的最下面两层,负责实际数据的传输,

其中包括HDLC(高级链路控制协议)、PPP(点对点协议)、SLIP(串行线路接口协议)

image-20220314153705947

5.DNS协议?

DNS(Domain Names System),域名系统,是互联网的一个服务,用来将域名与之对应的IP地址进行转换的服务器。

也就是将域名翻译为IP地址。www.xxx.com ==>xxx.xxx.x.x

域名是一个有层次的结构:

image-20220314155805950

www.baidu.com依次为三级域名www、二级域名baidu、顶级域名com、根域名.(一般省略不写

每一层域名都有对应的域名服务器

image-20220314160019818

除了这三种服务器还有电脑默认的本地域名服务器

  • DNS查询方式:

    • 递归查询:一直问到底
    • 迭代查询:挨个去问,从根域名服务器获取信息依次到下层去问,一直到权限域名服务器
  • 域名缓存方式(保存域名和IP地址的映射):

    • 浏览器缓存:浏览器在获取网站域名的实际ip地址后会对其缓存,以减少网络请求的损耗
    • 操作系统缓存:用户自己配置的hosts文件

DNS查询过程(解析域名过程):

image-20220314160644937

  • 首先在浏览器缓存中查找DNS缓存,缓存中维护着一个域名与ip地址对应的表格。

  • 若没有找到,则继续搜索操作系统缓存的DNS缓存。

  • 若还没找到,则操作系统将域名发送到本地域名服务器,本地域名服务器采用递归查询的方式查询自己的DNS缓存,

  • 若本地域名服务器的DNS缓存中没有,则本地域名服务器继续向上级域名服务器中迭代查询:

    • 首先本地域名服务器向根域名服务器发起请求,获取顶级域名服务器的地址
    • 本地域名服务器向顶级域名服务器发起请求,获取权限域名服务器的地址
    • 本地域名服务器向权限域名服务器的地址发起请求,获取最后的IP地址
  • 本地域名服务器将获取的IP地址返回给操作系统,操作系统将此映射缓存下来

  • 操作系统将IP地址返回给浏览器,浏览器将此映射缓存下来

  • 至此,浏览器得到了域名对应的IP地址,并将之缓存下来

6.CDN?原理?

CDN (全称 Content Delivery Network),即内容分发网络

构建在现有网络基础上的智能虚拟网络,依靠部署在本地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能,使用户就近获取数据,降低网络阻塞,提高用户访问响应速度和命中率。

CDN的关键技术包括内容存储和分发技术。

简单来说,CDN技术就是根据用户位置就近分配资源。用户在访问资源时,不是直接访问源站,而是访问离他最近的一个CDN节点,也就是边缘节点,该边缘节点就是缓存了源站对应数据内容的代理服务器。

原理分析:

没有应用CDN时,使用域名访问一个站点时通过DNS返回的是IP地址,应用CDN后,返回一个CNAME别名记录中间人,指向CDN的全局负载均衡。

image-20220314162935108

  • 当用户点击了url或者输入了网址访问域名时,经过本地DNS服务器解析,DNS服务器会将域名的解析权交给CNAME指向的CDN专用DNS服务器。

  • CDN专业DNS服务器将CDN的全局负载均衡设备IP地址返回用户。

  • 用户根据此全局负载均衡设备IP地址向CDN服务器再次发送请求,进入该服务器后

    • 看用户的IP地址,查表得到地理位置,找最近的边缘节点
    • 看用户所在的运营商网络,找相同网络的边缘节点
    • 检查边缘节点负载情况,找负载最轻的节点
    • 根据节点服务能力、带宽、响应时间等因素找到最合适的节点
  • 把找到的最合适的节点返回给用户,用户就能访问CDN的缓存代理

缓存代理:CDN服务器有选择缓存一些常用的资源,通过命中率和回源率评估CDN服务质量。

7.HTTP1.0/1.1/2.0 的区别?

HTTP1.0:

  • 浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接

HTTP1.1:

  • 引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用
  • 在同一个TCP连接里面,客户端可以同时发送多个请求
  • 虽然允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的,服务器只有处理完一个请求,才会接着处理下一个请求。如果前面的处理特别慢,后面就会有许多请求排队等着
  • 新增了一些请求方法
  • 新增了一些请求头和响应头

HTTP2.0:

  • 采用二进制格式而非文本格式,解析更高效
  • 完全多路复用,而非有序并阻塞的、只需一个连接即可实现并行
  • 使用报头压缩,降低开销
  • 服务器推送

8.HTTP常见的状态码?适用场景?

http状态码的作用是服务器告诉客户端当前请求响应的状态,通过状态码就能判断和分析服务器的运行状态。

状态码一般有三位。

状态码第一位数字决定了不同的响应状态,有如下:

  • 1 表示消息
  • 2 表示成功
  • 3 表示重定向
  • 4 表示请求错误
  • 5 表示服务器错误

下面给出一些状态码的适用场景:

  • 100:客户端在发送POST数据给服务器前,征询服务器情况,看服务器是否处理POST的数据,如果不处理,客户端则不上传POST数据,如果处理,则POST上传数据。常用于POST大数据传输
  • 206:一般用来做断点续传,或者是视频文件等大文件的加载
  • 301:永久重定向会缓存。新域名替换旧域名,旧的域名不再使用时,用户访问旧域名时用301就重定向到新的域名
  • 302:临时重定向不会缓存,常用 于未登陆的用户访问用户中心重定向到登录页面
  • 304:协商缓存,告诉客户端有缓存,直接使用缓存中的数据,返回页面的只有头部信息,是没有内容部分
  • 400:参数有误,请求无法被服务器识别
  • 403:告诉客户端进制访问该站点或者资源,如在外网环境下,然后访问只有内网IP才能访问的时候则返回
  • 404:服务器找不到资源时,或者服务器拒绝请求又不想说明理由时
  • 503:服务器停机维护时,主动用503响应请求或 nginx 设置限速,超过限速,会返回503
  • 504:网关超时

9.get和post请求的区别?

两者都是http协议中两种发送请求的方法,而http是基于TCP/IP的数据在网络中通信的协议标准。

  • get是从服务器上获取数据,post是从服务器传送数据。
  • get提交的数据会放在URL之后,以?分割URL和传输数据,数据的参数之间用&分割;post方法是把要传送的数据放在HTTP包的body里。
  • get提交的数据会有大小限制,一般在2k字节以内,而post没有限制,但一般也不会超过80 100kb.
  • get提交数据时,存在的安全隐患较大,用户数据会显示在URL上
  • get是通过地址栏来取值,post是通过提交表单来传值。
  • get智能进行url编码,而post支持多种编码方式。
  • get请求会被浏览器主动cache,而post不会,需要手动设置
  • 对于参数的数据类型,get只接受ASCII字符,而POST没有限制

10.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么

  1. 域名解析(DNS查询
  2. 发起TCP的三次握手
  3. 建立TCP连接后发起http请求
  4. 服务器端响应http请求
  5. 浏览器接收到请求的资源,解析资源。
  6. 对页面进行渲染
  • URL解析

image-20220314202610562

  • DNS 查询---获取域名对应的目标服务器IP地址

  • 建立TCP 连接---发起TCP的三次握手来建立TCP连接

  • 发起HTTP 请求---请求的内容包括:请求行、请求头、请求主体

  • 响应请求---处理完请求后返回一个http响应消息,包括:状态行、响应头、响应正文

  • 页面渲染---浏览器拿到资源后,会对资源进行解析:

    • 查看响应头的信息,根据不同的指示做对应处理,比如重定向,存储cookie,解压gzip,缓存资源等等
    • 查看响应头的 Content-Type的值,根据不同的资源类型采用不同的解析方式

关于页面的渲染过程如下:

  • 解析HTML构建 DOM

    • 解析 CSS ,生成 CSSOM
  • 合并 DOM 树和 CSS 规则,生成render (渲染)树

  • 布局 render 树( Layout / reflow ),负责各元素尺寸、位置的计算

  • 绘制 render 树( paint ),绘制页面像素信息

  • 浏览器会将各层的信息发送给 GPU,GPU 会将各层合成( composite ),显示在屏幕上

  • 注意:js代码会阻塞解析的进程

11.TCP为什么需要三次握手和四次挥手?

建立一个TCP连接,需要客户端和服务器共发送三个包,以确保双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。

image-20220314203537118

解释:seq-序列号,ack-确认号,ACK-确认标志,SYN-同步标志,FIN-结束标志

过程:

第一次握手: 客户端给服务端发一个SYN报文,并指明一个初始化序列号seq,此时客户端为SYN_SENT状态。

第二次握手:服务端收到SYN报文后,以自己的SYN报文作为应答,将客户端传来的序列号加一作为ack确认号的值,同时也传一个序列号y,此时服务端为SYN_RCVD状态。

第三次握手:同理客户端收到报文后,将服务端传来的序列号y加一作为ack的值,自身序列号x也加一,此时客户端处于ESTABLISHED状态,服务端收到报文后,也处于ESTABLISHED状态,此时,双方建立了连接。

为什么不是两次握手呢?

如果没有第三次握手,接收方就不知道自己发的包对方能不能收到。

而且两次握手的话,客户端有可能因为网络阻塞等原因会发送多个请求报文,延时到达时又和服务端建立了连接,浪费了服务端的资源。(为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误)

image-20220314211813577

tcp终止一个连接,需要经过四次挥手。

过程如下:

第一次挥手:客户端发送一个FIN报文,报文同时指定一个序列号u。此时客户端处于FIN_WAIT1状态,停止发送数据,等待服务端的确认。

第二次挥手:服务端收到FIN报文,会发送ACK报文,且把客户端的序列号u加一作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态

第三次挥手:如果服务端也想断开连接了,也像第一次挥手一样发送FIN报文,且指定一个序列号w,此时服务端处于LAST_ACK状态。

第四次挥手:客户端收到FIN报文后,一样发送一个ACK报文作为应答,w+1作为其序列号值,此时客户端处于TIME_WAIT状态。需要过一会以确保服务端收到了自己的ACK报文之后才会进入CLOSED状态,而服务端收到ACK报文后,就进入CLOSED状态。

为什么要四次挥手?

服务端收到客户端断开连接FIN报文后,并不会立即关闭连接,而是发送一个ACK包先告诉客户端收到关闭连接的请求了,只有当服务端的所有报文发送完毕后,才发送FIN报文断开连接,这样就多了一次挥手。

服务端收到FIN报文仅仅表示客户端不再发送数据了,但是还能接受数据,也可能后续还会给客户端发送数据,因此确认收到FIN请求ACK和实际关闭FIN会分开发送,这样就多了一次。

12.WebSocket?应用场景?

WebSocket为一种网络传输协议,位于OSI模型的应用层,可以在单个TCP连接上进行全双工通信,能更好的节省服务器资源和带宽并达到实时通信。

客户端和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

没有他之前都是通过不断地发送http请求问对方有没有数据,近似实现实时通信,这样会消耗大量带宽和CPU资源。

优点

  • 使客户端和服务器之间的数据交换更加简单,允许服务端主动向客户端发送数据。
  • 只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
  • 没有同源限制,客户端可以和任意服务器通信
  • 可以发送文本,也可以发送二进制数据
  • 数据格式比较轻量化,性能开销小,通信高效
  • 建立在TCP协议的基础上,和http协议具有较好的兼容性,都同属于应用层

应用场景

基于websocket的事实通信的特点,其存在的应用场景大概有:

  • 弹幕
  • 媒体聊天
  • 协同编辑
  • 基于位置的应用
  • 体育实况更新
  • 股票基金报价实时更新

\