常见计算机网络基础问题

231 阅读25分钟

这是我参与8月更文挑战的第15天,活动详情查看: 8月更文挑战

HTTP协议

1. GET和POST的请求的区别

  1. 应用场景:一般 Get 请求用于对服务器资源不会产生影响的场景,比如说请求一个网页的资源。而Post请求往往会对服务器资源产生影响,比如注册用户等需要服务器处理响应的增加逻辑
  2. 是否缓存:浏览器一般会对 Get 请求缓存,但很少对 Post 请求缓存。
  3. 发送的报文格式:GET请求的报文中实体部分为空,Post请求的报文中实体部分一般向服务器发送数据。
  4. 安全性:GET可以将请求的参数放入url中向服务器发送,这样的做法相对于Post请求不安全,因为url会保存在浏览器的历史记录中
  5. 请求长度:浏览器会对url做出长度的限制,所以会影响 get 请求发送数据时的长度

2.常见的HTTP请求方法:

GET:向服务器获取数据

POST:将实体提交到指定的资源,通常会造成服务器资源的修改

PUT:上传文件,更新数据

DELETE:删除服务器上的对象

HEAD:获取报文首部,与GET相比,不返回报文主体部分

OPTIONS:询问支持的请求方法,用来跨域请求;

3. Option请求的使用场景

主要用途:

  1. 获取服务器支持的请求方式
  2. 用来检查访问权限。例如当我们服务器做了cors跨域时,对于复杂请求我们就要使用option方法发送请求用来判断是否支持某种请求

4. HTTP1.0 和HTTP1.1之间的区别

HTTP1.0 和HTTP1.1有以下区别:

  1. 连接方面:http1.0默认使用非持久连接,而http1.1默认使用了持久连接。http1.1通过使用持久连接来使多个http请求复用一个TCP连接,以此来避免使用非持久连接时每次需要建立一次连接
  2. http1.1 相对于 http1.0 还新增了很多请求方法,如 PUT、HEAD、OPTIONS 等
  3. 资源请求部分:在 http1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,http1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
  4. 缓存方面:在强缓存和协商缓存中经常要使用到http的header里的expires和if-Modified-since,http1.1 则引入了更多的缓存控制策略,例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略。
  5. http1.1 中新增了 host 字段,用来指定服务器的域名。

5. HTTP1.1和HTTP2.0的区别

  1. 二进制协议:HTTP/2 是一个二进制协议。在 HTTP/1.1 版中,报文的头信息必须是文本(ASCII 编码),数据体可以是文本,也可以是二进制。
  2. 多路复用:HTTP/2 实现了多路复用,HTTP/2 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应
  3. 头信息压缩:HTTP/2 实现了头信息压缩,由于 HTTP 1.1 协议不带状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP/2 对这一点做了优化,引入了头信息压缩机制
  4. 服务器推送:HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。

6. HTTP和HTTPS协议的区别

主要区别:

  1. HTTPS协议需要CA证书,费用较高;而HTTP协议不用
  2. HTTP是超文本传输协议,信息是明文传输的,HTTPS则是具有安全性的SSL加密传输协议
  3. 使用不同的连接方式,端口也不同,HTTP默认端口号是80;HTTPS协议端口号是443
  4. HTTP协议连接很简单,是无状态的;HTTPS协议是由SSL和HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP更加安全。

7.当在浏览器中输入 Google.com 并且按下回车之后发生了什么?(等其他完成再看)

  1. 解析URL:首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的URL中的协议或者主机名时不合法的,会将地址栏输入的内容传给搜索引擎。
  2. 缓存判断:浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求。
  3. DNS解析:得到IP,下一步首先需要获取的是输入的 URL 中的域名的 IP 地址,首先会判断本地是否有该域名的 IP 地址的缓存,如果有则使用,如果没有则向本地 DNS 服务器发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址后,再向顶级域名服务器请求,然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,最终获得域名的 IP 地址后,本地 DNS 服务器再将这个 IP 地址返回给请求的用户。用户向本地 DNS 服务器发起请求属于递归请求,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求。
  4. TCP三次握手:下面是 TCP 建立连接的三次握手的过程,首先客户端向服务器发送一个 SYN 连接请求报文段和一个随机序号,服务端接收到请求后向服务器端发送一个 SYN ACK报文段,确认连接请求,并且也向客户端发送一个随机序号。客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。
  5. 浏览器发出HTTP请求
  6. 返回数据:当页面请求发送到服务器端后,服务器端会返回一个 html 文件作为响应,浏览器接收到响应后,开始对 html 文件进行解析,开始页面的渲染过程。
  7. 页面渲染: 浏览器首先会根据 html 文件构建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,要不然 script 的加载和执行会造成页面的渲染的阻塞。当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制。这个时候整个页面就显示出来了。
  8. TCP四次挥手:最后一步是 TCP 断开连接的四次挥手过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。

8.对keep-alive的理解

在HTTP1.0中我们默认是在每次请求、应答,客户端和服务端都要建立一个连接,完成之后立即断开连接,这就是短连接。当使用Keep-alive模式时,Keep-alive模式时,keep-alive使客户端和服务端的连接持续有效,当出现对服务端的后继请求时,Keep-alive功能避免了建立或者重新建立连接。

keep-alive建立过程:

  1. 客户端向服务器在发送请求报文的同时在首部添加发送connection
  2. 服务器收到请求并且处理connection字段
  3. 服务端回送Connection:Keep-Alive字段给客户端
  4. 客户端收到Connection字段
  5. keep-alive连接建立成功

开启Keep-Alive的优点

  • 较少的CPU和内存的使⽤(由于同时打开的连接的减少了);
  • 允许请求和应答的HTTP管线化;
  • 降低拥塞控制 (TCP连接减少了);
  • 减少了后续请求的延迟(⽆需再进⾏握⼿);
  • 报告错误⽆需关闭TCP连;

开启Keep-alive的缺点:

  • 长时间的Tcp连接容易导致系统资源无效占用,浪费系统资源。

9. HTTP请求报文的是什么样的?

请求报文由四部分组成:

  • 请求行(请求方法字段、URL字段、HTTP协议版本字段等)
  • 请求头(由关键字/值对组成)
  • 空行
  • 请求体(post put等请求携带的数据)

image.png****

10. HTTP响应报文的是什么样的?

响应报文由四部分组成:

  • 响应行(网络协议版本,状态码,状态码的原因短语)
  • 响应头(响应部首组成)
  • 空行
  • 响应体(服务器响应的数据)

11. HTTP协议的优点和缺点

HTTP是超文本传输协议,定义了客户端与服务端之间交换报文的格式与方式,默认使用了80端口。它使用TCP作为传输协议,保证了数据传输的可靠性。

HTTP的优点:

  1. 支持客户端/服务器模式
  2. 简单快速
  3. 无连接
  4. 无状态
  5. 灵活

HTTP的缺点:

  1. 无状态
  2. 明文传输
  3. 不安全

12. URL有哪些组成部分

以下面的URL为例:www.aspxfans.com:8080/news/index.…

一个完成的URL包含以下几部分:

  1. 协议部分:http/https
  2. 域名部分:www.aspxfans.com:,也可以使用IP地址作为域名
  3. 端口部分:跟在域名后面:HTTP默认端口80,HTTPS默认443
  4. 虚拟目录:从域名的第一个/为止到最后一个/为止,是虚拟目录部分
  5. 文件名部分:从最后一个/到?部分为文件名
  6. 锚部分:从#开始到最后都是锚部分
  7. 参数部分:从?开始到#之间的都是参数部分

13. URL有哪些组成部分

强缓存:

  1. Expires
  2. cache-control

协商缓存:

  1. etag、if-none-match
  2. if-modified、if-modified-since

HTTP状态码

1. 2xx成功

  • 200 OK:表示从客户端发来的请求在服务器被正确处理
  • 204 No content:表示请求成功,但响应报文不含实体的主体部分
  • 205 Reset Content,表示请求成功,但是响应报文不包含实体的主题部分,但是与204响应不同在于要请求方重置内容
  • 206 Partial Content 范围请求

2. 3xx重定向

  • 301 moved permanently,永久性重定向,表示资源已经被分配了新的URL
  • 302 found,临时重定向,表示资源被临时分配了新的URL
  • 303 see other,表示资源存在另一个URL,应使用GET方法获取资源
  • 304 not modified,表示服务器允许访问资源,但是因为发生请求未满足条件的情况
  • 307 temporary redirect,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发起请求

3. 4xx客户端错误

  • 400 bad request ,请求报文存在语法错误
  • 401 unauthorized,表示发送的请求需要通过HTTP认证的认证信息
  • 403 forbidden ,表示对请求的资源的访问被服务器拒绝
  • 404 not found 表示在服务器上没有找到请求的资源
  • 405 Method Not Allowed 该状态码表示客户端请求的方法虽然能被服务器识别,但是服务器禁止使用该方法

4. 5xx服务器错误

  • 500 internal serve error,表示服务器端在执行请求时发生了错误
  • 503 service unavailable,表示服务器暂时处于超负荷或者正在停机维护,无法处理请求。

HTTPS协议

1.什么是HTTPS协议?

超文本传输安全协议(HTTPS)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,通过SSL/TLS来进行加密数据包。HTTPS主要的目的就是提供对网站服务器进行身份认证,保护交换数据的隐私与完整性。

img

HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具有身份验证信息加密和完整性校验的功能,可以避免此类问题的发生。

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

2. TLS/SSL的工作原理

TCL/SSL全称安全传输层协议,是介于HTTP和TCP之间的一层安全协议,不影响原有的TCP协议和HTTP协议,所以使用HTTPS基本上是不需要对HTTP页面进行太多的改造。

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

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

3. HTTPS通信(握手)的过程

  1. 客户端向服务端发起请求,请求中包含使用的协议版本号、生成的一个随机数以及客户端支持的加密方法
  2. 服务端接收到接收到的请求以后,确认双方使用的加密方法、并给出服务器的证书、以及一个服务器生成的随机数
  3. 客户端确认服务器证书有效后,生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,然后发送给服务器。并且还会提供一个前面所有内容的hash值,用来供服务器检验
  4. 服务器使用自己的私钥,来解密客户端发送过来的随机数,并提供前面所有内容的hash值来共客户端检验
  5. 客户端和服务端根据约定的加密方法使用前面的三个随机数,生成对话密钥,以后的对话密钥过程都是用这个密钥来加密信息

4. HTTPS的特点

HTTPS的优点:

  1. 使用HTTPS的协议可以认证用户和服务器,确保数据发送到正确的客户端和服务器
  2. 使用HTTPS协议可以进行加密传输、身份认证,通信更加安全,防止数据在传输过程中被窃取、修改,确保数据的安全性
  3. HTTPS是现行架构中最安全的解决方案,虽然不是绝对安全,但是大幅增加了中间人攻击的成本

缺点:

  1. HTTPS需要做服务器和客户端双方的加密解密处理,耗费更多的服务器资源,过程复杂
  2. HTTPS协议握手阶段比较费时
  3. SSL证书是收费的,功能越强的证书费用成本越高
  4. HTTPS连接服务器端资源占用高很多,支持访客稍多的网站需要投入更大的成本;
  5. SSL证书需要绑定IP,不能再同一个IP上绑定多个域名。

5. HTTPS是如何保证安全的?

采用对称加密和非对称加密两种方式结合,将对称加密的密钥使⽤⾮对称加密的公钥进⾏加密,然后发送出去,接收⽅使⽤私钥进⾏解密得到对称加密的密钥,然后双⽅可以使⽤对称加密来进⾏沟通。

DNS协议介绍

1. DNS协议是什么

DNS协议是用来将域名解析为IP地址,客户端向DNS服务器发送域名查询请求,DNS服务器告知客户端Web服务器的IP地址

注:除了解析域名域外DNS服务器还由负载均衡和请求转发的作用

2. DNS完整的查询过程

DNS服务器解析域名的过程:

  1. 首先将请求发给本地DNS服务器,在本地域名服务器缓存中查询,如果查找到,就直接将查找到的结果返回,若缓存中没有,下一步
  2. 根域名服务器:本地DNS向根域名服务器发送请求,根域名服务器会返回这个域名的顶级域名服务器地址。
  3. 顶级域名服务器:本地服务器向顶级域名服务器发送请求,顶级域名服务器返回权威域名服务器的地址
  4. 权威域名服务器:本地DNS服务器向权威域名服务器发送请求,最终IP返回结果
  5. 本地DNS服务器将返回的结果保存在缓存中,便于下次使用
  6. 本地DNS服务器将返回结果返回给浏览器

比如要查询 www.baidu.com 的 IP 地址,首先会在浏览器的缓存中查找是否有该域名的缓存,如果不存在就将请求发送到本地的 DNS 服务器中,本地DNS服务器会判断是否存在该域名的缓存,如果不存在,则向根域名服务器发送一个请求,根域名服务器返回负责 .com 的顶级域名服务器的 IP 地址的列表。然后本地 DNS 服务器再向其中一个负责 .com 的顶级域名服务器发送一个请求,负责 .com 的顶级域名服务器返回负责 .baidu 的权威域名服务器的 IP 地址列表。然后本地 DNS 服务器再向其中一个权威域名服务器发送一个请求,最后权威域名服务器返回一个对应的主机名的 IP 地址列表。

网络模型

1. OSI七层模型

img

应用层

最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTPHTTPSFTPPOP3SMTP等。

在客户端与服务器中经常会有数据的请求,这个时候就是会用到http(hyper text transfer protocol)(超文本传输协议)或者https.在后端设计数据接口时,我们常常使用到这个协议。

FTP是文件传输协议,在开发过程中,个人并没有涉及到,但是我想,在一些资源网站,比如百度网盘``迅雷应该是基于此协议的。

表示层

表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。

在项目开发中,为了方便数据传输,可以使用base64对数据进行编解码。如果按功能来划分,base64应该是工作在表示层。

会话层

会话层就是负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。

传输层

传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP UDP就是在这一层。端口号既是这里的“端”。

网络层

本层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP层。这一层就是我们经常说的IP协议层。IP协议是Internet的基础。我们可以这样理解,网络层规定了数据包的传输路线,而传输层则规定了数据包的传输方式。

数据链路层

将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。

物理层

实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。

2. TCP/IP五层协议

img****

应用层 (application layer):直接为应用进程提供服务。应用层协议定义的是应用进程间通讯和交互的规则,不同的应用有着不同的应用层协议,如 HTTP协议(万维网服务)、FTP协议(文件传输)、SMTP协议(电子邮件)、DNS(域名查询)等。

传输层 (transport layer):有时也译为运输层,它负责为两台主机中的进程提供通信服务。该层主要有以下两种协议:

  • 传输控制协议 (Transmission Control Protocol,TCP):提供面向连接的、可靠的数据传输服务,数据传输的基本单位是报文段(segment);
  • 用户数据报协议 (User Datagram Protocol,UDP):提供无连接的、尽最大努力的数据传输服务,但不保证数据传输的可靠性,数据传输的基本单位是用户数据报。

网络层 (internet layer):有时也译为网际层,它负责为两台主机提供通信服务,并通过选择合适的路由将数据传递到目标主机。

数据链路层 (data link layer):负责将网络层交下来的 IP 数据报封装成帧,并在链路的两个相邻节点间传送帧,每一帧都包含数据和必要的控制信息(如同步信息、地址信息、差错控制等)。

物理层 (physical Layer):确保数据可以在各种物理媒介上进行传输,为数据的传输提供可靠的环境。

TCP与UDP

1. TCP 和 UDP的概念及特点

TCP 和 UDP都是传输层协议,他们都属于TCP/IP协议族:

UDP

UDP的全程是用户数据报协议,在网络中他与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在传输层,处于IP协议的上一层。UDP具有以下特点:

  1. 面向无连接:首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。
  2. 有单播、多播、广播的功能:UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。
  3. 面向报文:发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文
  4. 不可靠性:首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠
  5. 头部开销小,传输数据报文时很高效

TCP

传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 是面向连接的、可靠的流协议(流就是指不间断的数据结构)。

TCP具有以下特定:

  1. 面向连接
  2. 仅支持单播传播
  3. 面向字节流
  4. 可靠传输
  5. 提供拥塞控制
  6. 提供全双工通信

2. TCP和UDP的区别

image-20210810172122565.png

3. TCP和UDP的使用场景

TCP的应用场景

效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。例如:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录

UDP应用场景

效率要求相对高、对准确性要求相对低的场景。例如:QQ聊天、在线视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问题,并且此处完全不可以使用重发机制)

4. TCP的三次握手和四次挥手

三次握手:

img

是指建立TCP连接的过程,客户端和服务器总共发送三个包。进行三次握手的主要作用就是为了确认双方的接受能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。

流程:客户端向服务器发送一个syn包和一个随即序号,服务端接收到请求后向服务器端发送一个SYN ACK包,确认连接请求,并且也向客户端发送一个随即序号。客户端接收服务器的确认应答后,进入连接建立状态,同时向服务器也发送一个ack包,服务端接收到后也进入连接状态,此时双方连接成功。

为什么不是两次握手?

  • 为了确认双方的接收能力和发送能力都正常
  • 如果是用两次握手,则会出现下面这种情况:

如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。

四次挥手

img

首先客户端认为数据发送完成,则它需要向服务器发送连接关闭请求。

  1. 这时客户端向服务端发送一份FIN包,表示要关闭连接,自己进入终止等待1状态,这是第一次等待;
  2. 服务端收到FIN包以后向客户端发送一份ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2状态,这是第二次挥手
  3. 服务器再向客户端发送FIN包进入最后确认状态,这是第三次挥手
  4. 客户端收到第三次挥手的FIN包以后发送ACK包给服务端,进入超时等待状态,经过超时时间后关闭连接,服务端收到ACK后立即关闭连接,这是第四次挥手

webSocket

1. 对 WebSocket 的理解

WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。

WebSocket 的出现就解决了半双工通信的弊端。它最大的特点是:服务器可以向客户端主动推动消息,客户端也可以主动向服务器推送消息。

WebSocket 特点的如下:

  • 支持双向通信,实时性更强
  • 可以发送文本,也可以发送二进制数据‘’
  • 建立在TCP协议之上,服务端的实现比较容易
  • 数据格式比较轻量,性能开销小,通信高效
  • 没有同源限制,客户端可以与任意服务器通信
  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL
  • 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。