网络

EmiyaCC 于 2021-06-24 发布

HTTP 响应码有哪些?分别代表什么含义?

https://www.runoob.com/http/http-status-codes.html

forward 和 redirect 的区别?

Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。

直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。

间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

GET 和 POST 请求有哪些区别?

  1. 用途:
    • get 请求用来从服务器获取资源
    • post 请求用来向服务器提交数据
  2. 表单的提交方式:
    • get 请求直接将表单数据以 name1=value1&name2=value2 的形式拼接到 URL 上,多个参数参数值需要用 & 连接起来并且用 ? 拼接到 action 后面;
    • post 请求将表单数据放到请求头或者请求的消息体中。
  3. 传输数据的大小限制:
    • get 请求传输的数据受到 URL 长度的限制,而 URL 长度是由浏览器决定的;
    • post 请求传输数据的大小理论上来说是没有限制的。
  4. 参数的编码:
    • get 请求的参数会在地址栏明文显示,使用 URL 编码的文本格式传递参数;
    • post 请求使用二进制数据多重编码传递参数。
  5. 缓存:
    • get 请求可以被浏览器缓存被收藏为标签;
    • post 请求不会被缓存也不能被收藏为标签。
  6. 安全性:
    • get 请求,浏览器回退无危害
    • post 请求,浏览器回退会再次请求;比 get 安全

简述 TCP 和 UDP 的区别?

TCP-UDP区别

tcp 为什么要三次握手,两次不行吗?为什么?

为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤。

如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。

TCP 三次握手四次挥手中间状态time_wait,close_wait过多的危害,过多时如何处理,为什么要等待2MSL?

危害:

  1. close_wait过多:建立连接会占用文件描述符;而在liunx系统中,一个进程最大可以同时打开的文件描述符是有限的,当达到上限时,服务端进程无法再创建socket来响应新的请求,导致服务不可用。
  2. time_wait过多:导致定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用,导致端口号不足,服务器无法响应。

如何解决:

  1. time_wait:
    1. 客户端设置keep-alive,主动释放请求;
    2. 服务端开启socket重用;
    3. 扩大端口号;
    4. 缩短time_wait时间,设置为1MSL
  2. close_wait:
    1. 被动释放的一方没有主动调用 close socket,可以在代码上解决

为什么要等 2MSL:

  1. 保证连接可靠的释放
  2. 使旧的数据包的网络中过期消失,防止下一次使用同一四元组收到上一次的数据

TCP 三次握手四次挥手中间状态time_wait,close_wait过多的危害

TCP 三次握手和四次挥手异常处理

说一下 tcp 粘包是怎么产生的?

发送方产生粘包:

采用TCP协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据;但当发送的数据包过于的小时,那么TCP协议默认的会启用Nagle算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。

粘包1

接收方产生粘包:

接收方采用TCP协议接收数据时的过程是这样的:数据到达接收方,从网络模型的下方传递至传输层,传输层的TCP协议处理是将其放置接收缓冲区,然后由应用层来主动获取(C语言用recv、read等函数);这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(放数据的速度 > 应用层拿数据速度)

粘包2

造成粘包和拆包现象的原因:

粘包拆包的解决方法:

TCP 如何保证可靠性

TCP 协议如何提高传输效率

TCP流量控制、拥塞控制

流量控制:

  1. 什么是流量控制?流量控制的目的?

    如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面。

  2. 如何实现流量控制?

    由滑动窗口协议(连续ARQ协议)实现。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。主要的方式就是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。

  3. 流量控制引发的死锁?怎么避免死锁的发生?

    当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。 为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。

拥塞控制和流量控制的区别:

拥塞控制的算法:

我们在开始假定:1、数据是单方向传递,另一个窗口只发送确认;2、接收方的缓存足够大,因此发送方的大小的大小由网络的拥塞程度来决定。

  1. 慢开始算法
  2. 拥塞避免算法
  3. 快重传算法
  4. 快恢复算法

https://zhuanlan.zhihu.com/p/37379780

OSI 的七层模型都有哪些?

  1. 应用层:网络服务与最终用户的一个接口。
  2. 表示层:对接收的数据进行解释、加密与解密、压缩与解压缩
  3. 会话层:建立、管理、终止数据传输的通路会话。
  4. 传输层:定义传输数据的协议和端口号,以及流控和差错校验。
  5. 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。
  6. 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。
  7. 物理层:建立、维护、断开物理连接。

OSI七层协议

负载均衡算法

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性

负载均衡算法:

  1. 轮循均衡

    每一次来自网络的请求轮流分配给内部中的服务器,从 1 至N然后重新开始。此种均衡算法适合 于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。

  2. 权重轮循均衡

  3. 随机均衡

  4. 最少连接数均衡

  5. 哈希算法

浏览器中输入:“www.woaijava.com”之后都发生了什么? 请详细阐述

完整HTTP请求

  1. 由域名→IP地址 寻找IP地址的过程依次经过了浏览器缓存、系统缓存、hosts文件、路由器缓存、递归搜索根域名服务器。
  2. 建立TCP/IP连接(三次握手具体过程)
  3. 由浏览器发送一个HTTP请求
  4. 经过路由器的转发,通过服务器的防火墙,该HTTP请求到达了服务器
  5. 服务器处理该HTTP请求,返回一个HTML文件
  6. 浏览器解析该HTML文件,并且显示在浏览器端
  7. 断开连接(四次挥手)

这里需要注意:

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

HTTP1.0 HTTP 1.1主要区别

HTTP1.1 HTTP 2.0主要区别

https://developer.aliyun.com/article/549604

HTTP 和 HTTPS 的区别

HTTPS 的工作原理:

HTTPS工作原理

1、客户端发起 HTTPS 请求

这个没什么好说的,就是用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。

2、服务端的配置

采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl 就是个不错的选择,有 1 年的免费服务)。

这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

3、传送证书

这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

4、客户端解析证书

这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。

如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

5、传送加密信息

这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

6、服务端解密信息

服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

7、传输加密后的信息

这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

8、客户端解密信息

客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。

SSL握手

  • https://www.runoob.com/w3cnote/http-vs-https.html
  • https://segmentfault.com/a/1190000021559557

对称加密和非对称加密的区别和原理

对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;

而非对称加密是指使用一对非对称密钥,即公钥私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。

由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它比较,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

说说HTTP协议与TCP/IP协议的关系

HTTP的长连接和短连接本质上是TCP长连接和短连接。

HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。

IP协议主要解决网络路由和寻址问题,

TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。

常见协议对应端口

常用协议对应的端口号

说一下 session 的工作原理?

其实session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的map吧,里面的键存储的是用户的sessionid,用户向服务器发送请求的时候会带上这个sessionid。这时就可以从中取出对应的值了。

Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。

怎么前后端交互

web 技术中的前端和后端是如何交互的

前后端交互

Reference:

  • https://mp.weixin.qq.com/s/F201iO7TQNkZz8yAh3PILg
  • [HTTP消息- HTTP MDN](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Messages)