Skip to content

计算机网络八股文

DNS 域名系统采用的是 TCP 协议还是 UDP 协议?为啥?

UDP 协议,因为对于用户来说,响应时间越快越好,而 TCP 连接建立时间比较慢,所以采用 UDP 协议来实现。

讲讲 DNS 解析过程?

DNS 解析,就是将域名解析成具体的 IP 地址的过程。会一步步向上解析,直到解析出结果。

  1. 浏览器缓存,浏览器缓存一般会有一个 TTL 有效期
  2. 系统 hosts 文件
  3. 本地 DNS 解析器缓存,每个完整的内网通常都会配置本地 DNS 服务器,例如用户是在学校或工作单位接入互联网,那么用户的本地 DNS 服务器肯定在学校或工作单位里面。
  4. 根 DNS 服务器,根 DNS 服务器返回给本地 DNS 域名服务器一个顶级 DNS 服务器地址
  5. 顶级 DNS 服务器,它是国际顶级域名服务器,如.com、.cn、.org 等,全球只有 13 台左右,ipv4 只要一个主根 DNS,ipv6 实现多边民主,中国有 4 台。
  6. 权威域名服务器,这个权威域名服务器就是我要访问的网站域名提供商的服务器,其实该域名的解析任务就是由域名提供商的服务器来完成。
  7. 返回真实 IP 并缓存结果

浏览器输入 URL 按下回车发生了什么?

  1. 进行 DNS 解析操作,根据 DNS 解析结果查找到服务器 IP 地址
  2. 通过 IP 寻址找到服务器,并利用三次握手建立 TCP 连接
  3. 浏览器生成 HTTP 报文,发送 HTTP 请求,等待服务器响应
  4. 服务器处理请求,返回客户端
  5. 根据 HTTP 是否开启长链接,进行 TCP 挥手
  6. 浏览器根据静态资源进行页面渲染

http 常见的错误码?

java
+ 200(成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
+ 201(已创建)请求成功并且服务器创建了新的资源。
+ 202(已接受)服务器已接受请求,但尚未处理。
+ 203(非授权信息)服务器已成功处理了请求,但返回的信息可能来自另一来源。
+ 204(无内容)服务器成功处理了请求,但没有返回任何内容。
+ 205(重置内容)服务器成功处理了请求,但没有返回任何内容。
+ 206(部分内容)服务器成功处理了部分GT请求。

+ 301永久重定向
+ 302临时重定向
+ 304资源没修改,用之前缓存就行

+ 400客户端请求的报文有错误
+ 401(未授权)请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。
+ 403(禁止)服务器拒绝请求,权限控制
+ 404表示请求的资源在服务器上不存在或未找到

+ 500(服务器内部错误)服务器遇到错误,无法完成请求。
+ 501(尚未实施)服务器不具备完成请求的功能。
例如,服务器无法识别清求方法时可能会返回此代码。
+ 502(错误网关)服务器作为网关或代理,从上游服务器收到无效响应。
+ 503(服务不可用)服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
+ 504(网关超时)服务器作为网关或代理,但是没有及时从上游服务器收到请求。

tcp 和 udp 的差别?

TCP 与 UDP 区别

TCPUDP
是否连接面向连接面向非连接
传输可靠性可靠不可靠
应用场景传输大量的数据少量数据
速度

UDP 如何实现可靠传输

由于 UDP 是不可靠传输,要实现可靠传输,可在应用层模仿 TCP 的可靠传输机制。

  1. 增加 seq/ack 机制
  2. 在发送方和接收方设置缓冲区
  3. 增加超时重传机制

TCP 滑动窗口?

TCP 会将较大数据拆分成一个个小的数据包再进行发送。发送完一个包,等待 ACK,这种模式是最简单的。但是问题也很明显,慢,吞叶量低。所以我们在等待 ACK 的同时,可以继续发送接下来的包。也就是说,滑动窗口就是在发送完一个数据包后,不需要等待 ACK 消息返回,可以发送后面的数据包,解决吞吐量问题。

TCP滑动窗口

TCP 超时重传?

超时重传就是设置一个定时器,当发送的数据包没有在规定的时间内到达的时候就会发生超时重传,其定时器的时间选译应该大于 RTT,对于多次重传,其定时器的时间会比上一次多一倍。

TCP 流量控制

流量控制就是让发送方能根据接受方的接受能力可以控制发送方的发送能力。其中窗口中存都的数据都是放置在操作系统的缓存区中的,缓冲区的大小操作系统会根据情况自己调节。

TCP 拥塞控制

拥塞控制是为了防止发送方把数据填满整个网络。

  1. 慢启动
  2. 快速失败就降一半滑动窗口长度
  3. 超时重传就降滑动窗口为 1
  4. 每次 ack 翻倍滑动窗口长度

为啥三次握手四次挥手

TCP 进行可靠传输的关键就在于维护一个序列号,本质上需要四次交互,双方请求对方并发送序列号,加上双方的应答。但是握手阶段,可以将应答和请求合并。

而挥手不能合并,服务端有可能有没完成的传输任务,所以会先回应,然后任务完成后再去主动请求释放。

TCP 连接释放中 time wait 状态的作用?

首先根据两军悖论,双方至少有一个需要持有连接,等待对方的释放,所以只好有一方用定时器的方式,来进行被动关闭。

  1. 为了被动关闭连接能够正常的关闭。
  2. 连接关闭了,才能防上历史连接中的数据被后面相同四元组错误的接收。

SYN 洪泛攻击,如何解决

用三次握手建立TCP连接的各状态

首先 SYN 洪泛是怎么形成的?服务端在收到客户端的连接请求后,会发送 SYN/ACK 并进入 SYN-RCVD 半开状态。这时候大量客户端客户端如果只请求连接不给 ACK 就会一直处于半开状态,占满连接池。

解决的办法,不需要半开的连接池。

  1. 服务器在 ack 的时候,服务器生成一个初始 TCP 序列号,该序列号是 SYN 报文段的源 IP 地址和目的 IP 地址,源端口号和目的端口号以及仅有服务器知道的秘密数的复杂函数(散列函数)。这种精心制作的初始序列号称为"cookie”,然后服务器不需要进入半开状态。
  2. 如果该客户是合法的,则它将返回一个 ACK 报文段。本来需要验证 ACK 报文和之前的半开连接比对,但是由于没有半开连接。所以服务器通过使用 SYNACK 报文段中的源和目的 IP 地址与端口号以及秘密数运行相同的散列函数。如果成功比对,直接进入全开模式。
  3. 另一方面,如果客户没有返回一个 ACK 报文段,说明之前的 SN 报文段是洪泛攻击的一部分,但是它并没有对服务器产生危害,因为服务器没有为它分配任何资源。

TCP 沾包

对于 TCP 沾包主要是因为 TCP 是流式协议,这样的话当多次发送数据包的时候,容易接受到的数据包会沾在一起解决方法可以是自己定义一个包头,其中记录数据的大小,这样的话,当接受到这个包头数据的时候,就可以通过其记录数据的大小再接收这个大小的数据包。

发生 TCP 粘包的原因:

  1. 发送的数据小于 TCP 缓冲区大小,TCP 将缓冲区中的数据一次发送出去可能就会发生粘包。
  2. 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

发生 TCP 拆包的原因:

  1. 待发送数据大于最大报文长度,TCP 在传输前将进行拆包。
  2. 发送的数据大于 TCP 发送缓冲区剩余空间大小,将会发生拆包。

解决方案:

  1. 发送端给每个数据包添加包首部,首部中包含数据包的长度,这样接收端在接收到数据后,通过该字段就可以知道每个数据包的实际长度了。
  2. 发送端将每个数据包设置固定长度,这样接收端每次从读取固定长度的数据把每个数据包拆分开。
  3. 可以在数据包之间设置边界,如添加特殊符号,接收端可以通过这个特殊符号来拆分包。