0%

计算机网络

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

  1. DNS解析。首先将域名发到DNS服务器,解析获取IP地址。
  2. TCP连接。与服务器进行三次TCP握手,获取连接。
  3. 向目标服务器发起HTTP请求。
  4. 目标服务器处理HTTP请求,返回响应内容。
  5. 拿到响应内容后,浏览器解析响应内容渲染到网页上。
  6. TCP四次回收,结束连接。

2. 说说DNS解析的过程?

假如要查询www.baidu.com的IP地址:

  1. 首先主机向本地DNS服务器发起查询,假如本地DNS服务器有缓存,则之间返回,否则进行下一步。
  2. 主机向根服务器发起请求,根服务器返回所有带com顶级域名服务器的IP地址列表
  3. 本地DNS服务器再向一个负责com的顶级域名服务器发送请求,返回负责baidu.com权限域名服务器的IP地址列表
  4. 本地DNS服务器再向一个负责 baidu.com 的权限域名服务器发送请求,返回 www.baidu.com 对应的IP地址。

3. WebSocket和Socket的区别?

  • Socket相当于IP+端口+协议,屏蔽了网络的细节,是一个接口。
  • 而WebSocket则是解决HTTP不能持久化连接的问题,用于通信层,是一个通信协议。

4. Get和Post请求的区别?

Get能被CDN缓存,Post不会。

Get具有幂等性,更安全。

Get有长度限制,Post没有。

5. URL和URI的区别?

  • URI:统一资源定位符。URI的重点是在于标识资源,它其实是一个抽象定义,无论用什么方式来实现,只要可以唯一标识一个资源,都可以叫做URI。
  • URL:它是 URI 的一种子集,主要作用是提供资源的路径。

它们的主要区别在于,URL 除了提供了资源的标识,还提供了资源访问的方式。这么比喻,URI 像是身份证,可以唯一标识一个人,而 URL 更像一个住址,可以通过 URL 找到这个人——人类住址协议://地球/中国/北京市/海淀区/xx 职业技术学院/14 号宿舍楼/525 号寝/张三.男。

6. 说下 HTTP/1.0,1.1,2.0 以及HTTP3的区别?

关键需要记住 HTTP/1.0 默认是短连接,可以强制开启,HTTP/1.1 默认长连接,HTTP/2.0 采用多路复用

  • HTTP/1.0:
  • 默认短连接,可以开启长连接。
  • HTTP 1.1:
  • 引入了持久化连接,即 TCP 连接默认不关闭,可以被多个请求复用。
  • 分块传输编码,即服务端每产生一块数据,就发送一块,用” 流模式” 取代” 缓存模式”。
  • 管道机制,即在同一个 TCP 连接里面,客户端可以同时发送多个请求。
  • HTTP 2.0:
  • 报头压缩,每次请求都必须附上所有信息。HTTP/2.0 引入了头信息压缩机制,使用 gzip 或 compress 压缩后再发送
  • 完全多路复用,客户端和服务端都可以同时发送多个请求,而且不用按照顺序一一对应
  • 服务端推送,运行服务端不经请求,主动向客户端发送消息
  • HTTP 3:
    • 使用UDP传输,并且使用QUIC协议保证安全性,在传输的过程中就完成了 TLS 加密握手
    • HTTPS 要建立⼀个连接,要花费 6 次交互,先是建立三次握手,然后是 TLS/1.3 的三次握手。QUIC 直接把以往的 TCP 和 TLS/1.3 的 6 次交互合并成了 3 次,减少了交互次数。
    • QUIC 有自己的⼀套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响。
HTTP 协议变迁

7. HTTPS 工作流程是怎样的?

  1. 客户端向服务端发起HTTPS请求,连接到服务端的443端口
  2. 服务端收到请求后,将证书发送给客户端(公钥在证书中,私钥服务端持有)
  3. 客户端收到后,会验证证书的合法性。验证通过后,生成一个随机对称密匙,使用证书中的公钥进行加密,加密后发送给服务端
  4. 服务端收到后,使用自己的私钥进行非对称解密,解密后得到客户端的密匙,这样用客户端密匙对称加密传输数据,传输的数据就是密文
  5. 服务端收到客户端用密文加密过的数据后,再使用自己的密匙解密就得到了数据

8. 客户端怎么去校验证书的合法性?

CA证书的形成过程如下:

  • 在CA证书的签发过程中给,客户端会将密匙、有效时间、用途、颁发者等信息打成一个包,然后将这些信息进行Hash计算,得到一个Hash值。
  • 然后使用自己的私匙对这些信息加密,加密后生成 Certificate Signature,也就是对证书做了签名,
  • 然后将其添加在证书上,形成了数字证书。

客户端校验服务端的数字证书的过程如下:

客户端首先会根据相同的Hash算法获取该证书的Hash值H1

浏览器使用自身集成的CA证书的公钥信息,解密证书,得到H2

比较H1和H2就可以知道证书是否合法

证书签名和客户端校验-来源参考

8. 对称加密和非对称加密?

密匙不同:对称加密加密和解密用的都是一个密匙,非对称加密加密和解密的密匙不一样

安全性不同:对称加密加密解密密匙都是同一个,安全性不够。而非对称加密有公匙和私匙,公匙是可以给别人看的,私匙是对方持有用来解密的。

数字签名不同:对称加密不可以用于数字签名和数字鉴别,非对称加密可以用于数字签名和数字鉴别

9. MD5属于那种加密算法?

MD5加密既不是对称加密,也不是非对称加密。

MD5具有计算速度快,加密速度快,不需要密匙等优点。可以检查文件的完整性,一旦文件被更改,MD5值会发生改变。

但是MD5也有缺点,比如很多公司数据库存放的密码都是MD5加密后的,假如密码较为简单,攻击者会将一些常见的密码进行MD5计算,然后与数据库中的MD5比较,相同便获取了密码。

***10. TCP的三次握手?

最开始,客户端和服务端都处于close状态,服务端监听客户端请求,服务端进入 LISTEN 状态

首先,客户端向服务端发送一个请求,包含随机生成初始序号(称为seq = client_isn)和SYN = 1,客户端进入SYN_SENT状态

服务端接收到后,向客户端答复SYN=1,服务端随机初始序号(称为seq = server_isn)和 ack = client_isn + 1,服务端进入SYN_RCV 状态

客户端收到服务端答复后,再向服务端发送 SYN = 0,ack = server_isn +1 和 seq = client_isn + 1 ,两边都进入ESTABLISHED 状态

11. TCP 握手为什么是三次,为什么不能是两次?不能是四次?

  • 为了防止服务端产生不必要的连接开销:假如客户端向服务端发送请求,服务端返回的一端信息丢失,客户端收不到自然也没有响应不会继续发送消息,这样服务端会一直保持连接,浪费开销
  • 同步初始化序列化:在连接中有一个seq序号是为了保证连接的稳定性,他能告诉服务端和客户端他们发的消息是否收到了,如果是两次连接,将不能保证。

TCP三次连接已经够了,四次只会产生不必要的开销。

12. 三次握手中各次没收到报文会发生什么情况?

  • 第一次服务端没收到客户端消息:服务端将不会有任何动作;客户端会重新发送SYN报文,如果超出次数限制,将会返回建立连接失败。
  • 第二次客户端没收到服务端消息:客户端将重新发送消息,直到超出次数限制;服务端将阻塞在 accept()处,等待客户端的消息。
  • 第三次服务端没收到客户端消息:服务端会重传消息,直到超出次数限制,超出后accept()将返回-1;而客户端会误以为建立了连接,会向服务端发送消息,但是服务端收到数据时会返回RST 报文给客户端,消除客户端单方面建立连接的状态

13. 第二次握手传回了 ACK,为什么还要传回 SYN?

第二次握手是服务器端收到SYN报文后,回复一个ACK报文,表示服务器端已经收到了客户端的请求。但是这时服务器端还需要向客户端发送一个SYN报文,用来表示服务器端也想要与客户端建立连接。

14. 第 3 次握手可以携带数据吗?

可以携带。此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,它已经建立连接成功,并且确认服务端的接收和发送能力是正常的。

第一次握手不能携带数据是出于安全的考虑,因为如果允许携带数据,攻击者每次在 SYN 报文中携带大量数据,就会导致服务端消耗更多的时间和空间去处理这些报文,会造成 CPU 和内存的消耗。

15. 什么是半连接队列?

服务端会从 CLOSED 状态变为 LISTEN 状态,同时在内部创建了两个队列:半连接队列(SYN 队列)和全连接队列(ACCEPT 队列)。

顾名思义,半连接队列存放的是三次握手未完成的连接,全连接队列存放的是完成三次握手的连接。

***16. TCP的四次挥手?

数据传输结束后,客户端和服务端都可以主动发起断开请求,假如客户端先发起:

  • 第一次挥手客户端发送FIN=1,seq=u,发送后客户端进入FIN_WAIT_1状态
  • 第二次挥手服务端发送ack=u+1,seq=v,发送后服务端进入CLOSE_WAIT状态,客户端进入FIN_EAIT_2状态
  • 第三次挥手,服务端发送ack=u+1,seq=w,发送后服务端进入LAST_ACK状态
  • 第四次挥手,客户端发送ack=w+1,seq=u+1,发送后进入客户端TIME_WAIT状态,等待固定的一段时间(2MSL2 Maximum Segment Lifetime)后没有收到服务端的ACK后,认为服务器已经关闭,进入CLOSE状态,服务端收到后也进入CLOSE状态

17. TCP 挥手为什么需要四次呢?

  • 在关闭连接时,客户端向服务端发送 FIN 时,表示客户端不再向服务端发送消息,但是还可以接收消息
  • 当服务端收到后,发送 ACK 表示收到消息了,而此时服务端可能还有消息需要处理,等到处理完成后再发送 FIN 表示也不再发送消息了

因此,主要是因为在服务端收到消息后,可能还有消息需要处理,因此先答复收到了,等处理完成再答复可以关闭连接。

18. TCP 四次挥手过程中,为什么需要等待 2MSL, 才进入 CLOSED 关闭状态?

为什么要等待:为了保证客户端发送的最后一个 ACK 报文段能够到达服务端。

因为在发送之后,可能因为网络等原因服务端收不到客户端的最后一次确认。而服务端则会超时重传,这样就需要客户等待后,再进入CLOSE状态。如果在这里时间内收到了服务端的消息,则需要重新发送消息给服务端通知其进入CLOSE状态。

为什么是2MSL: MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

为什么时2MSL比较靠谱的说法是客户端发送最后一次消息时,如果出现丢包等情况,服务端会超时重试,超时重试的消息也要发送给客户端,这样一来一回就是2MSL最多(而超时重传的时间则和客户端发送最后一次消息时间重合)。

***19. TCP 是如何保证可靠性的?

TCP通过拥塞控制、超时重传、确认应答、序列号、流量控制、校验和、连接管理、最大消息长度 保证可靠性

  • 连接管理:即TCP三次握手和四次挥手
  • 拥塞控制:在通信过程中,会先发送一部分消息出去“探路”,根据当前网络状况决定以多大速率发送数据,这也被称为慢启动机制
  • 超时重传:当接收方长时间无应答时,发送方会启动超时重传
  • 序列号/确认应答:当接收方收到消息后,会给发送方发送确认消息,一般是根据序列号应答
  • 流量控制:在接收方和发送方首部都有一块缓冲区,如果数据传输速率过大,接收方将提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。
  • 校验和:TCP传输过程中,如果数据又变化,校验和将改变,接收方将丢弃或拒收该消息
  • 最大消息长度:在建立 TCP 连接的时候,双方约定一个最大的长度(MSS)作为发送的单位,重传的时候也是以这个单位来进行重传。理想的情况下是该长度的数据刚好不被网络层分块。

20. 说说 TCP 的粘包和拆包?

TCP传输过程中包大小会根据缓冲区实际情况进行包的划分:

  • 要发送的数据大于TCP发送缓冲区剩余大小,将拆包
  • 要发送的数据小于TCP缓冲区大小,多条数据将一起发送,发生粘包
  • 要发送的数据大于 最大报文长度,将发生拆包
  • 接收端的应用层,没有及时读取接收缓冲区中的数据,将发生粘包

21. TCP和UDP的区别?

类型 TCP UDP
是否面向连接
传输形式 字节流 数据段报文
应用场景 文件传输、邮件传输 即时通讯、语音通话
首部字节 20-60 8
可靠性 可靠 不可靠
所需资源
传输速率

22. UDP 协议为什么不可靠?

UDP 在传输数据之前不需要先建立连接,远地主机的运输层在接收到 UDP 报文后,不需要确认,提供不可靠交付。总结就以下四点:

  • 不保证消息交付
  • 不保证交付顺序
  • 不提供拥塞控制
  • 不跟踪连接状态

23. DNS使用的是什么协议?

DNS使用的既有TCP协议,也有UDP协议。

当进行区域传输(主域名服务器到辅助域名服务器)时,采用TCP保证可靠性。

当客户端使用DNS服务器查询域名时,使用的是UDP。

24. IP协议有哪些作用?

寻址和路由:在IP数据报中包含了源地址和目标地址。IP数据报在传输的过程中,如果中间节点碰到路由器,则会会根据路由器中的路由表进行数据转发,会提供最合适的路径。

分段和重组:IP数据报在传输过程中,可能经过不同的网络,不同的网络对传输的数据报最大长度大小限制是不一样的,IP协议会给每段被拆分的数据报分配一个标识符用于后续组装,等传送到目的地址,在根据这些标识符对IP数据报进行重组,得到完整的数据报。

欢迎关注我的其它发布渠道