乐趣区

关于面试:计算机网络面试知识点

1. 计算机网络体系模型

  • 物理层:建设、保护、断开物理连贯。
  • 数据链路层:建设逻辑连贯、进行硬件地址寻址、过错校验等性能。
  • 网络层:进行逻辑地址寻址,实现不同网络之间的门路抉择。
  • 传输层:定义传输数据的协定端口号,以及流控和过错校验。
  • 会话层:建设、治理、终止会话,(在五层模型外面曾经合并到了应用层)
    会话的一端是本地主机,另一端是近程主机。
  • 表示层:数据的示意、平安、压缩。(在五层模型外面曾经合并到了应用层)
    格局有,JPEG、ASCll、EBCDIC、加密格局等。
  • 应用层:网络服务与最终用户的一个接口。

网络协议其实就是端到端的一个 通信规定,有了这些规定,单方的沟通才有意义。

2. TCP/IP 的头部格局

其中,有几点比拟重要:

  • 序列号(seq):数据包的序号,通过序号来确认包的连续性,解决包的乱序问题。
  • 响应号(ack):针对下面字段的确认序号,比方服务器接管到客户端的申请,外面蕴含了 seq 序号,此时服务器响应回去时,会进行 ack = seq + 1 的字段设置,示意已接管到的累积数据。
  • Window:滑动窗口应用,用来反馈接管方接下来能解决的包大小,避免单方对数据包的解决能力不对等,次要解决了流控问题。
  • TCP Flag:TCP 包的类型,用来辅助 TCP 的阶段解决,比方 SYN 示意建设连贯,FIN 示意敞开连贯。

3. TCP 的状态流转

4. TCP 的三次握手、四次挥手是怎么样的?为什么这么设计?

如果咱们只进行 2 次握手就建设连贯,那么对于 Server 端来讲太容易建设起连贯了,根本是有客户端过去,那么 Server 就要建设起连贯了。这种状况就会导致连贯老本太低,Server 端很容超负载。

四次挥手是因为 TCP 是 全双工 的,存在了数据发送与接管两个行为,在这两个方向的数据流入流出都须要进行敞开。

5. 什么是半连贯?跟它相干的 SYN 攻打是怎么样的?

当服务接管到客户端申请连贯 SYN,而后向客户端响应 ACK 和 SYN 后,就会将连贯保护到半连贯队列。当客户端再次回复 ACk 后,以后的连贯就会被保护到全连贯队列里。

SYN 攻打是 DOS 攻打的一种,通过伪造大量的申请建设连贯,使得半连贯队列超出最大容量,其余失常的申请无奈解决。

6. 四次挥手里的发起方为什么须要等到 TIME_WAIT 工夫才敞开连贯?

TIME_WAIT 是一个定时设置,在 2*MSL(MSL 示意一个包在网络环境中的生存工夫,个别为 2 分钟,Linux 里为 30s)工夫过后就会真正的 CLOSED。

之所以不立刻敞开,次要为了让被动敞开方能有足够的工夫接管到最初的 Ack 包,如果没有接管到,被动方就会从新发送 Fin 包,从新触发被动方发送最初的 Ack 包。这样的话,就能尽量保障被动敞开方尽快敞开连贯了,毕竟被动敞开方须要承当起次要责任,所以会有 TIME_WAIT 的期待了。

另外一个起因也是怕以后连贯立马开释,有肯定概率会重用到以后连贯标识(五元组),而旧的网络包因为提早此时才接管到,就有可能产生包的凌乱问题了。

7. TCP 的重传机制是怎么样的?

TCP 发送的包都须要接管方进行一个 Ack 包的响应,如果在肯定工夫内没有响应的话,那么发送方就会认为包未能正确达到,须要进行重传动作。这就是 TCP 的重传机制。

TCP 里的重传机制会有一个超时的判断,这个超时工夫并不是很精确,或者说并不是很规范,毕竟不同的网络环境,包的达到状况都会是不一样的。

所以 TCP 会应用一个采样工夫,先记录了失常状况下一个数据包从发送到响应确认这么一来一回的工夫,即所谓的 RTT(Round Trip Time)工夫,依据这个工夫进行一些公式计算,失去了超时工夫的值:RTO(Retransmission TimeOut)

对于重传机制,还有另外一种触发机制。下面的状况属于发送方去探知发送状况,有另一种状况是接管方能探知的。比方发送方发送了 1, 2, 3 的包,但实际上接管方只接管到 1 和 3,始终没能收到 2 这个包,那此时接管方就会间断响应三个 对于 2 的 ack 包。

当发送方收到这么一个间断的 3 个 ack 包后,就晓得须要重传 2 了,此时就不须要等到 2 的超时未确认触发,能够提前的重传 2 这个包了。

8. 介绍下 TCP 的流量管制,滑动窗口是怎么样的?

TCP 采纳 滑动窗口 进行了流量的管制,所谓的滑动窗口即在发送方和接管方各自保护了一个窗口,在这个窗口里将会保护对应的数据包,以感知以后的数据处理状况。

在接管方这边的窗口称之为 接管窗口,它具体示意以后所能接管的数据包大小,计算公式为:以后最大可接收缓冲区大小 – 以后已接管的大小,在连贯建好的开始个别为 65535 字节。

在计算出可接管大小后,接管方就会将此值设置在 TCP 头部里的 Window 字段,而后响应回发送方,发送方也就晓得了以后所能容许发送的数据包大小了。

在发送方这边的窗口称之为 发送窗口,按失常逻辑来讲,发送窗口保护的是行将要发送的数据,即依据刚刚反馈回来的接管窗口大小计算出的发送数据。

但因为一个数据包的发送须要有一个 ACK 响应才算残缺流程,所以对于这些“已发送未响应”的数据也应该纳入到发送窗口的治理,并且只有真的 ACK 响应回来,能力持续下个数据包的筹备发送。

须要留神的是,如果发送方接管到的 Window 大小为 0,则示意以后的接管方曾经无能力解决新的包了,此时发送方就不会再下发数据了,直到接管方发送一个 窗口通告,才持续数据的发送。

但此时须要思考一种状况,就是接管方因为网络问题没能将窗口通告送达发送方,那此时发送方就会始终干等着了. 所以对于发送方来讲,会启动 窗口探知 动作,要求接管方 ACK 它以后的接管窗口大小,如果超过 3 次的探知动作,则间接断开连接了。

9. TCP 对于网络环境的拥塞是怎么感知管制?

TCP 协定形象出了 拥塞窗口 (cwnd)的概念,它会依据以后的网络拥塞水平进行动静的调整。因为退出了拥塞状况的思考,下面咱们提到过的发送窗口则不能仅仅只思考接管窗口这个因素了,须要进行 min(拥塞窗口,接管窗口) 的抉择发送了。

10. MTU 和 MSS 是指什么?

MSS 示意 网络传输 数据 的最大值,如果 MSS 加上包头大小,则示意网络传输最大 报文:MTU。

在 Internet 这种互联网中,个别 MTU 定义为 576 字节,减去 TCP、IP 的包头 40 字节,则能够失去 MSS = 536 字节的值;而在以太网这种局域网里,个别 MTU 会大点:1500 字节,MSS 为 1460 字节。

11. TCP 的慢启动是怎么样的?有哪些环节?

当连贯建设结束,开始传输数据时,TCP 协定规定不能一开始就发送大尺寸的数据包,这样防止了网络环境有问题时,新退出的连贯加剧了拥塞情况。所以,对于新退出的连贯而言,须要一点一点的增大数据量,这就是所谓的 慢启动

其中,慢启动波及的拥塞窗口计算过程如下:

  • 刚开始建设好连贯时,拥塞窗口 = 1
  • 每当接管到一个 ACK 包时,拥塞窗口 = 拥塞窗口 + 1,此时呈线性减少。
  • 每当通过一个 RTT,拥塞窗口 = 拥塞窗口 * 2,此时呈指数回升趋势。

12. 什么是拥塞防止?

从慢启动的算法来看,每通过一个 RTT 后,拥塞窗口的增长速度将会变得很厉害,如果没有进行限度的话,那么很快就会占满带宽了。因而,TCP 协定应用了一个叫慢启动门限 (ssthresh) 的变量(个别取 65535 字节)。当 cwnd(拥塞窗口) 超过该限度后,就会进入所谓的 拥塞防止 阶段了。

在拥塞防止阶段,拥塞窗口的计算过程如下:

  • 每接管到一个 ACK 包时,拥塞窗口 = 拥塞窗口 + 1/ 拥塞窗口
  • 每当通过一个 RTT,拥塞窗口 = 拥塞窗口 + 1

从下面的算法能够看出,进入拥塞防止阶段后,数据包的发送大小将呈线性减少了。通过这样的形式,使得 TCP 的传输在后期很快,而后再缓缓降下来,达到网络最佳值。

13. 当拥塞产生时,TCP 会怎么解决?

在拥塞产生时,对于拥塞窗口的计算在不同的 TCP 版本里将会不一样,次要有以下 3 种版本:

Tahoe 版本

Tahoe 版本是 TCP 的最早版本,当它发现须要进行重传动作,即触发了 RTO 超时或发送方收到三个反复 ACK 包时,此时会进行的动作为:

  • sshthresh(慢启动门限) = cwnd(拥塞窗口) / 2
  • cwnd 重置为 1
  • 重回慢启动阶段

Reno 版本

Reno 版本进行的动作为:

  • sshthresh(慢启动门限) = cwnd(拥塞窗口) / 2
  • cwnd(拥塞窗口) = sshthresh(慢启动门限) + 3 * MSS(将 3 个反复 ACK 思考进去)
  • 进入疾速复原阶段

其中,疾速复原阶段的计算又如下:

  • 当重传的包收回去后,收到了重传包的 ACK 后,cwnd(拥塞窗口) = cwnd(拥塞窗口) + 1
  • 当收到新的数据包的 ACK 后,此时疾速复原过程已完结,则 cwnd = sshthresh,而后重回拥塞防止阶段

NewReno 版本

NewReno 是对 Reno 的改良,次要是优化了疾速复原阶段,在 Reno 版本中,所思考的都是一个包的失落状况。然而,在理论状况中,一次数据窗口的发送,是有可能呈现很多数据包失落状况的。

这样的话,就会触发屡次的 cwnd 和 ssthresh 减半动作,一旦 cwnd 降到小于 3 时,即发送窗口会呈现小于 3 的情景,此时将再也触发不了 3 次疾速重传动作了,只能依赖 RTO 超时,而个别 RTO 的值是比拟大(太小会常常触发重传)的,此时整个传输速度将会大大降低。

所以 NewReno 会在收到所有数据包的确认后才完结疾速复原阶段,这样 cwnd 和 sshthresh 就不会轻易被升高了。

NewReno 次要是应用了一个 recover 变量,作为以后数据窗口中,可能丢包的最大序号。即如果有丢包状况产生,并且大于以后的 recover 值,则会更新该值。

当收到接管方的 ack 后,会进行 ack_seq 的判断,如果 ack_seq > recover,此时就能够完结疾速复原阶段了;如果 ack_seq < recover,则意味着多包失落,还不能完结疾速复原阶段。通过这样的管制,来进步了整个的吞吐量。

14. TCP 里有哪些提高效率的算法或机制?

Nagle 算法

Nagle 算法把多个小数据包合并到一个片段,并且期待满足肯定条件后,再一起发送过来。具体的触发条件如下:

  • 如果包长度达到 MSS,则容许发送
  • 如果蕴含 FIN,则容许发送
  • 如果设置了 TCP_NODELAY,则容许发送
  • 未设置 TCP_CORK 选项时,若所有收回去的小数据包(包长度小于 MSS)均被确认,则容许发送

当上述条件都未满足,但产生了超时(个别为 200ms),则立刻发送。

对于 TCP 协定来讲,默认会启用 Nagle 算法,升高网络负载,缩小网络拥塞,进步网络吞吐。

Delay Ack(提早确认)

在 TCP 的确认机制里,能够在通信过程中不对每一个 TCP 数据包进行独自的 ACK 包响应,而是在传输数据时,顺便把 ACK 信息随数据包一起发送,这样能够进步网络流量利用率。

如果在肯定工夫内(个别 40 ms)没有数据包要发送,此时就会独自的进行 ACK 包响应。这个过程也被称为 Delay Ack。

15. TCP 里的粘包与拆包是怎么样的?

TCP 是面向字节流的传输,它会依据接管方的包解决能力以及以后网络的拥塞状况来一部分一部分的加载数据发送,再加上有 Nagle 这种整合小数据包的算法存在。所以对于接管方来讲,接管到的数据有可能是粘合在一起的,也有可能是被拆离开的,即所谓的粘包和拆包。

对于粘包和拆包景象,罕用的解决方案有:

  • 在包的首部增加以后要传输的数据包的长度,让接管方依据长度去切割。
  • 将数据包封装为固定长度,不够的补 0,让接管方按固定长度解析。
  • 人为的给数据包增加边界,比方在数据包结尾增加特殊字符,当解析到特殊字符时,接管方就认为读取到了一个残缺有意义的数据段了。

16. TCP 为什么是牢靠的?

TCP 的连贯和断开都是单方相互沟通进行的(三次握手、四次挥手)。在数据的传输过程中会进行应答确认、超时重传、流量管制、拥塞管制、拥塞防止等伎俩去保障传输的准确性。

17. TCP 和 UDP 的区别

TCP 是面向字节流的牢靠连贯,而 UDP 是面向数据报文的连贯,不保障牢靠连贯,但传输比拟快。TCP 罕用于邮件、文件传输这种要求准确性高的场景,而 UDP 罕用于视频直播这种实时传输的场景。

18. TCP 和 UDP 常见的应用层协定

  • TCP 应用层:HTTP(超文本传输协定)、FTP(文件传输协定)、SMTP(邮件传输)
  • UDP 应用层:DNS、TFTP(简略文件传输协定)、NTP(网络工夫协定)

19. HTTP 为何是无状态的?

HTTP 是基于 TCP 协定的短连贯,按申请 - 响应来通信。每一次的申请都是独立的,和上次的没有关联。只管 TCP 是有状态的,但它的状态是为了传输应用,比方报文序号、发送窗口大小等辅助信息,这些和 HTTP 的申请没有关系。

Http 尽管有 keep-alive 字段管制,但那是为了进步传输效率,让此次的申请连贯尽量生命周期长些,不至于频繁的建设连贯 - 销毁连贯。另外,cookie 会话只是 HTTP 的补充,它是容许敞开或伪造的,并不是协定的通信依赖。

20. 从浏览器输出 url 到显示网页的整个过程

首先,会依据域名进行 DNS 的解析,以获取到服务器的 IP 地址。拿到 IP 地址后将会和服务端进行三次握手,建设 TCP 连贯。接着将会依照 HTTP 协定的申请 - 响应来传输网页内容。最初,TCP 通过四次挥手完结连贯。

21. HTTP 1.0/1.1/2.0 以及 https 的区别

HTTP 1.0

每次申请 - 响应都会建设一次 TCP 连贯,服务器解决完后就会断开 TCP 连贯。前面加了 Connection: keep-alive 来提早 TCP 连贯时长,尽量让申请 - 响应应用同一个连贯

HTTP 1.1

  • 默认 TCP 长久连贯,不须要申明 Connection 字段,但同一个域名维持的 TCP 长久连贯不会太多,个别 6 个;
  • 引入管道机制,客户端可通过同一个 TCP 连贯同时发送多个申请,服务器再按接管到的申请程序响应;不过这是伪管道模式,因为在同时发送多个后,客户端还是须要阻塞期待服务器的所有响应能力持续后续申请。
  • 新增了 PUT、DELETE、OPTIONS 等申请形式

HTTP 2.0

  • 采纳二进制格局而非文本格式
  • 真正的管道模式,非阻塞期待所有响应,相当于全双工的
  • 报文头会压缩后再发送

HTTPS

HTTPS 解决了 HTTP 的平安传输问题,在 HTTP 这一层协定下退出了 SSL 层。即进行了端到端的加密 / 身份验证,以保证数据的不被窃取篡改。

HTTPS 的流程如下:

22. ping 的原理?

ping 采纳了 ICMP 协定,ICMP 协定用于在 IP 主机、路由器之间传递管制音讯。管制音讯是指网络通不通、主机是否可达、路由是否可用等网络自身的音讯。这些管制音讯尽管并不传输用户数据,然而对于用户数据的传递起着重要的作用。

23. 什么是 DOS 攻打?

DOS:即拒绝服务,其目标是使计算机或网络无奈提供失常的服务。最常见的 DoS 攻打有计算机网络带宽攻打和连通性攻打,像 SYN 洪水攻打也是一种,它利用 TCP 协定发送大量的半连贯申请,消耗服务器的 CPU 和内存资源。


感兴趣的敌人能够搜一搜公众号「阅新技术」,关注更多的推送文章。
能够的话,就顺便点个赞、留个言、分享下,感激各位反对!
阅新技术,浏览更多的新常识。

退出移动版