用来转化html
计算机学习指南
计算机是考的非常多的一门知识,计算机基础主要靠计算机网络和操作系统,但是计算机网络考的多,并且考的杂,所以计算机的内容,需要背诵 + 理解,如果要面互联网中大厂,需要花的时间也会多挺多。
需要掌握的知识概括:
应用层需要掌握的知识点(按照出现频率排序)
1、http:
- http和https的区别,
- http 常见请求方法(get和post的区别) + http 报文包含的一些属性 + http 常见状态码的含义(3xx额外关注下)
- http 长连接,开启/关闭
- http 存在哪些问题
- 1.0,1.1,2.0,3.0版本区别
2、https:
- Https 的加密过程(对称/非对称加密 + 摘要 + 数字证书)
- 理解数字证书的用处
- https的缺点
3、掌握 DNS 的解析过程 + 用到的协议
4、浏览器输入一个 url 的解析过程
5、理解 arp以及大致的原理 + 存在的安全隐患
6、ping协议的原理 也看下(ping协议不算应用层)
传输层需要掌握的知识点(按照出现频率排序)
1、三次握手
- 握手流程(包括状态码的变化)以及为啥需要三次
-
三次握手过程是否可以携带数据
-
seq可以从0开始吗?
2、四次挥手(可以问的问题比三次挥手多的多)
- 握手流程(包括状态码的变化)以及为啥需要四次
-
Time-wait 和 close-wait 状态码
-
Time-wait 过多应该如何处理
-
为什么需要等到 2ML
3、TCP与UDP
- 理解为啥 TCP 是可靠的,采用了什么方法
- 掌握流量控制和拥塞控制的原理和区别
- TCP和UDP的区别以及应用场景
- 如何实现一个可靠的 UDP
- TCP拆包粘包问题
- qq登陆/视频会议这些用到了哪些协议
- 套接字socket
其他
1、对称加密和非对称加密,以及常见的加密算法
2、理解什么是sql注入攻击 + xss攻击 + cors 攻击
3、理解以太网协议
4、计算机网络四层模型,五层模型和七层模型都了解下
参考学习文章以及资料
我会在对应的面试题那里,补充对应的文章,专栏,视频和书籍,是一个持续补充的过程,大家有看到好的文章也可以发我,然后我也会给大家推荐对应的书籍 + 咱们训练营的专栏,作为一个进阶补充,有时间你就都看。
系统资料推荐:计算机网络,只能说学无止境,看的越多越好吧,主要看2~3本书,分别是:《图解HTTP》=》《网络是怎么样连接起来的》=》《计算机网络紫丁香下》,最后一本一般需要阅读两遍。视频的话,入门可以看计算机网络课程说明
之后就是配合文章来学习了,我这里也会提供那些写的比较好的文章。
正文
【计算机网络专题】三次握手相关问题(必看题)🌟🌟🌟🌟🌟
PS:这个问的太多了,重点得理解吧,有时候具体细节忘了也没事的
1、说一下三次握手的大致过程?
2、为什么需要三次握手?2 次不可以吗?
3、第三次握手,可以携带数据吗?第二次呢?
4、三次握手连接阶段,最后一次ACK包丢失,会发生什么?
参考学习资料:
有时间的,可以看看,讲的比较深入
硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
深入源码级别:能将三次握手理解到这个深度,面试官拍案叫绝!
参考回答:
1、说一下三次握手的大致过程?
客户端在与服务器建立 TCP 连接时首先会进行三次握手。下面分别介绍一下:
第一次握手:客户端给服务端发送一个 SYN 报文,并指明客户端的初始化序列号 ISN,此时客户端处于 SYN_SEND 状态。
第二次握手:服务器收到客户端的 SYN 报文后,会以自己的 SYN 报文作为应答,同时也指定了自己的 ISN,并把客户端发来的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 状态。
第三次握手,客户端收到 SYN 报文后,会将服务器发来的 ISN + 1 作为 ACK 报文发出,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。
最后服务器收到 ACK 报文之后,也会处于 ESTABLISHED 状态,到这里,双方的连接就建立好了。
2、为什么需要三次握手?2 次不可以吗?
RFC 文档中提到的有,三次握手的首要原因是防止旧的重复连接初始化造成混乱。可以考虑这样一个场景,客户端第一次握手时对服务端发送的 SYN 报文由于网络原因阻塞了,导致服务端没有接收到。接着客户端重启后,又重新向服务端发送一个新的 SYN 报文来请求建立链接。但是,有可能客户端第一次发送的旧 SYN 比新发的先到达,那么服务端根据这个旧 SYN 值 + 1 返回的 ACK 值就不是现在客户端期望接受到的,因为当前客户端重新发送了 SYN,希望收到的是新 SYN + 1 这个 ACK 的值,这样就避免了“旧 SYN 报文”初始化了连接,本质上是利用第二次握手时,服务端返回的 ACK 值作为一种中间状态来阻止历史连接。
如果只握手两次的话,第二次握手之后服务端就进入了 ESTABLISHED 状态,此时服务端返回给客户端的信息是带有数据的,尽管等客户端收到 ACK 报文时,能够识别到这个是历史连接后会摒弃这个连接,也就是发送 RST 报文来断开连接,但服务端已经建立了这个历史连接,还白白发送了数据,浪费掉了服务端的资源。
3、第三次握手,可以携带数据吗?第二次呢?
这个问题 RFC 文档中提到过,第三次握手时,客户端向服务端返回的报文中可以携带数据,即使此时服务端是 SYN_REVEIVED 状态,但由于数据报中也带有 ACK 的值,服务端接受之后会先确认这个 ACK,然后建立连接,进入 ESTABLISHED 状态,之后就能正常接受这个数据包了。
但需要多注意的是,一般情况下第三次握手的报文中是不会携带数据的,大多数情况都是客户端在发生第三次握手的报文之后,不等服务端先接受,就接着发送正常通信的数据包。服务端先接受到第三次握手包之后建立连接,接着正常接受数据包。但假如由于网络原因,客户端发送的第三次握手包丢失了,但接着发送的数据包正常被服务端接收,由于这个数据包中也带有 ACK 的值,服务端就会把这个数据包当作第三次握手包,先建立连接再正常读取数据。至于真正的第三次握手包,如果是丢失了的话就丢失吧,没影响。如果由于网络原因而比数据包后到达,服务端会直接忽略。
TCP 的第一二次握手,都是不可以携带数据的。第一次握手不能的原因是防止恶意的握手请求。第二次不能是因为此时服务端只确认了客户端的“发送能力”正常,却不知道接受能力是否正常,所以还不能携带数据。
4、三次握手连接阶段,最后一次ACK包丢失,会发生什么?
这个需要分情况看,第三次握手的 ACK 包丢失后,客户端有没有继续发送带有 ACK 的数据包,如果有,还是可以建立连接的。如果没有,也就是服务端此时迟迟接收不到来自客户端的 ACK,那么站在服务端的视角,有可能是第二次握手时给客户端的 SYN + ACK 丢失,也有可能是客户端第三次握手的 ACK 丢失。不管哪种情况,服务端此时只需重新进行第二次握手,也就是发送给客户端一份新的 SYN + ACK 即可,客户端收到后也会重新发送一份 ACK 报文,建立连接。
【计算机网络专题】四次挥手相关问题(必看题)🌟🌟🌟🌟🌟
PS:这个问的太多了,重点得理解吧,有时候具体细节忘了也没事的
1、说一下四次挥手的过程?
2、什么需要四次呢?
3、time-wait干嘛的,close-wait干嘛的,在哪一个阶段?
4、状态CLOSE_WAIT在什么时候转换成下一个状态呢?
5、为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢?
6、服务端主动发起关闭还是客户端主动发起关闭TCP?
参考学习资料:
有时间的,可以看看,讲的比较深入
硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
参考回答:
1、说一下四次挥手的过程?
首先要说明,通信双方都可以主动断开连接,下面以客户端主动断开连接为例:
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT_1 状态。
第二次挥手:服务端收到 FIN 之后,会把客户端的序列号值 + 1 作为 ACK 并发送,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。
之后客户端接收到服务端发送的 ACK,进入 FIN_WAIT_2 状态
第三次挥手:等服务端处理完数据后,想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
第四次挥手:客户端收到 FIN 之后,一样会将服务端的序列号值 + 1 作为自己 ACK 报文的序列号值回应,此时客户端处于 TIME_WAIT 状态,并在等待 2MSL 时间后,会自动进入 CLOSE 状态,至此客户端完成连接的关闭。
之后服务端收到客户端的 ACK 之后,就进入了 CLOSE 状态,至此服务器端完成连接的关闭。
2、什么需要四次呢?
需要四次的原因在于,四次挥手中的第二三次挥手是将三次握手中的第二次握手给分开了。第二次握手中是服务端将 SYN 和 ACK 合并到一个包中发送,第二三次挥手是服务端先发送 ACK,处于 CLOST_WAIT 状态,等处理完数据后,再发送 FIN,继续断开连接的过程。
至于为什么需要等待服务端处理完数据这个过程,原因在于 TCP 是全双工通信,在客户端希望断开连接时,服务端可能还有数据处理或者发送,也就是此时还不能立马关闭服务端到客户端的数据通道,所以就不能在第二次挥手时将 FIN 和 ACK 一起发出。必须是先回应一个 ACK,等处理完数据后,再发送 FIN 包。
3、TIME-WAIT 干嘛的,CLOSE_WAIT干嘛的,在哪一个阶段?
需要 TIME_WAIT 状态简单说就两个原因:一个是优雅的关闭 TCP 连接,也就是尽量保证被动关闭的一端能够收到它自己发出去 FIN 报文的 ACK 确认报文。另一个是处理延迟的重复报文,避免连续两个使用相同四元组的连接,前一个的报文干扰后一个连接。以上两个目的都是由主动断开的的一方在 TIME_WAIT 状态等待 2MSL 时间来保证的。
第一个目的比较好理解,理论上 1MSL 的时间就足够确定被动关闭端已经接收到了 ACK 值。第二个目的的话,先等第一个 MSL 确保主动关闭端发出的最后一个 ACK 值从网络中消失,再等第二个 MSL 是为了防止对端在收到这个 ACK 前的一刹那时间可能触发重传机制,等这个重传的 FIN 报文消失的时间也需要 1MSL,总共就是 2MSL。
CLOSE_WAIT 状态需要的原因就是 TCP 为什么需要四次握手而不是三次握手的原因,主要就是在一二次挥手后,服务端可能还有遗留的数据需要处理,也就是需要确保数据的完整性。在处理完之后会主动向客户端发送 FIN 报文,进入 LAST_ACK 状态。
4、服务端主动发起关闭还是客户端主动发起关闭TCP?
都可以,主动关闭的一端会有 TIME_WAIT 状态,被动关闭的一端有 CLOSE_WAIT 状态。
【计算机网络专题】五层网络模型相关问题🌟🌟🌟
1、介绍一下网络五层模型?
2、为什么要分出四层五层这样的模型呢?
参考学习资料:
必看两篇文章:
参考回答:
1、介绍一下网络五层模型?
帅地注:这道题考的太多了,很多人估计都是直接背的模型,我觉得这样是无法加分的,对于这道题,大家直接看我写的这篇文章,看完你面试完全可以按照我文章说的回答,看完下面的文章,你可以掌握如下面试题:计算机网络五层模型 + IP 地址与 MAC地址的区别 + 子网掩码的用处。
下面是正文(懒的看的可以看下面的简洁版本,反正强烈推荐看),哎呀我不贴全文了,不然字太多了,直接给出文章链接吧:计算机网络五层模型入门
当然,我这里也给你简洁版吧,你也不需要说的特别全,简单说一下+举例子就行了,举例子就是最好的证明:
物理层:负责把两台计算机连起来,然后在计算机之间通过高低电频来传送0,1这样的电信号,比如通过一些电缆线传输比特流。
链路层:链路层涉及到的协议比较多,比如 Mac 地址啊,ARP 等,这一层主要就是负责数据的通信,使个节点之前可以通信,比如通过 MAC 地址唯一识别不同的节点,通过以太网协议定义数据包等。
网络层:网络层负责把一个数据从一个网络传递到另外一个网络,最大的功能就是进行路由决策,比如通过 IP,子网等概念,使数据更好着在不同的局域网中传递。
传输层:传输层的功能就是建立端口到端口的通信,刚才说的网络层的功能则是建立主机到主机的通信,比如通过网络层我们可以把信息从 A 主机传递到 B 主机,但是 B 主机有多个程序,我们具体要发给哪个程序,则是靠传输层的协议来识别,常见协议有 UDP 和 TCP。
应用层:虽然我们收到了传输层传来的数据,可是这些传过来的数据五花八门,有html格式的,有mp4格式的,各种各样,我们用户也看不懂,
因此我们需要指定这些数据的格式规则,收到后才好解读渲染。例如我们最常见的 Http 数据包中,就会指定该数据包是 什么格式的文件了。
当然,你可以说的更详细,只是想我这样差不多了,之后就等着面试官是否要继续提问吧。
2、为什么要分出四层五层这样的模型呢?
这个其实是有争议的,将网络协议进行分层,好处是这种形式具有概念化和结构化的优点,提供了一种结构化的方式来讨论整个网络协议。在实现某一层的服务时,只需确保其对上层提供相同的服务,并且可以使用下层提供的完整服务,当某层的实现需要变化时,整个模型的其他层保持不变。
但这种分层的形式也有缺点,首先就是可能冗余较低层的功能,比如许多协议栈在基于每段链路和基于端到端两种情况下,都提供了差错恢复功能。还有就是某层的功能实现需要依赖于其他层中的数据,比如时间戳,违反了层次分离的目标。
【计算机网络专题】TCP相关问题(必看题)🌟🌟🌟🌟🌟
PS:TCP也是重灾区,理解越深越好,一般部分面试官才会问的比较深
1、什么是 TCP ?举几个应用了 TCP 协议的例子
2、TCP协议如何保证可靠性?
3、tcp如何保证不会接受重复的报文?
4、Tcp粘包拆包问题了解吗?介绍一下,如何解决?🌟🌟
5、TCP拥塞控制与流量控制区别?
6、现在我们视频面试用到哪些协议?
参考学习资料:
参考回答:
1、什么是 TCP ?举几个应用了 TCP 协议的例子
TCP 是面向连接的,可靠的,基于字节流的传输层通信协议。其中面向连接一定是一对一的连接。可靠性是指无论网络链路中出现了什么状况,TCP 都可以保证一个报文能够无损坏,无冗余,按序到达。基于字节流是指用户消息通过 TCP 协议传输时,会被操作系统分组成多个 TCP 报文,并且这些报文之间是有序的。
像我们平时用到的最多的网页中的 HTTP 协议,传输层协议就是 TCP。类似用到 TCP 的应用层还有 FTP 文件传输协议,SMTP 简单邮件传输协议和 SSH,它们的传输层都需要 TCP 来做可靠性保证。
2、TCP协议如何保证可靠性?
首先 TCP 每次建立连接都需要三次握手,释放连接需要四次挥手来确保建立的传输通道是可靠的。
其次,TCP 采用了连续 ARQ 协议来保证数据传输的正确性,同时还使用了滑动窗口机制来控制发送方的发送速率,保证接收方一定能接受到发送的数据,也就是流量控制机制。
还有,TCP 利用序列号和校验和,来分别确保数据传输的有序性和完整性。
最后在整个网络层面上,TCP 还使用慢开始,拥塞避免,快速重传和快速回复来进行拥塞控制,避免网络阻塞带来的数据接收问题。
3、tcp如何保证不会接受重复的报文?
这个是由 TCP 报文中的“序列号”字段保证的,TCP 在建立连接时,客户端和服务端都会将一个内核生成的随机数作为自己的初始序列号。在建立连接完成后,开始发送数据时,发送的一端会将“上次发送的序列号”加上“上次发送的数据长度”作为“本次报文的序列号”发送给对端。对端在收到数据包时,会根据序列号来确定接收到数据的顺序和是否重复,如果重复收到某个序列号的报文,则只会接收一次,其他的都丢弃。
需要注意的是,在三次握手和四次挥手阶段,发送端序列号的值就不是“上次发送的序列号”加上“上次发送的数据长度”的值,而是“上次发送的序列号”加上 “1”。
还有,序列号除了确保数据接收的“有序性”,还有用于 TCP 的流量控制中。具体的,TCP 连接的两端都会维护一个发送窗口和接受窗口。发送方根据 TCP 报文的序列号和发送窗口的大小来确定可以发送的数据量。接收方使用序列号和接收窗口大小来确定可以接收的数据量,并通知发送方来控制发送速率,以此来确保双方数据都能够被顺利接收。
4、Tcp粘包拆包问题了解吗?介绍一下,如何解决?
首先 TCP 是处在传输层的面向流的协议的协议,它本身不会按照应用开发者的期望,保持每次发送时都带有一个数据的边界,这可能导致接收端一次收到了多个应用层报文,需要应用开发者自己分开,也就是需要自己去实现“流”到“数据报”的功能。具体的解决,可以用“特殊字符作为边界”,也就是我们对于应用层的每个信息后面都加上一些特殊字符用来代表信息结束。当读到了这些特殊字符,就意味着已经读完了一个完整的消息。比如 HTTP 通过设置回车符和一个换行符来作为 HTTP 报文协议的边界。但需要注意的是,如果信息内容中刚好出现了这些字符,可能会导致信息提前结束和数据错乱,这时我们可以对这些个字符进行转义,避免这种情况。
其实还有一种“粘包”的含义:就是 TCP 在实现的时候,为了解决大量小报文场景下,包头比数据还大,导致传输的性价比太低的情况,采用了一种叫 Nagle 的算法。这个算法的效果就是将开发者多次发送的小数据,粘在同一个 TCP 报文中发出。这样可能就会导致先被发送的数据可能需要等待一段时间,才能跟后面才被发送的数据一起组成报文发送出去。但在实际中这种算法带来的延迟几乎可以忽略不计,绝大多数情况都是无感知的。只有在频繁进行超短信息的交互,比如只有几个字节的场景,禁用 Nagle 算法才能显著降低延迟。
5、TCP拥塞控制与流量控制区别?
两者诞生的原因就不同:
需要流量控制的原因是,端到端在通信时,发送方的速率与接收方的速率不一致,如果发送方发的速率太快,会导致接收方处理不过来;而如果发送方发送的太慢,数据就会有一定的延迟。那么此时就需要通过一种方法来控制发送方的速率,这个方法就叫“流量控制”
而拥塞控制不同于流量控制,它主要强调的是网络的拥塞,导致发送方发的数据包被堵在了半路,而接收方迟迟没收到数据包并返回接收到的最后一个包的确认报文,会让发送方误以为这个包丢了并重新发送,这不仅会浪费信道资源,还会使原来拥塞的网络雪上加霜。
6、现在我们视频面试用到哪些协议?
考虑到视频时对于延迟很敏感,所以应该具有 UDP 传输速度快的特性,但又能允许一定程度的丢包。但又不能丢包率太高,还应具备 TCP 有关数据传输可靠性的保证,确保不会视频着视频着突然画面就没有了的情况。所以我觉得应该是同时结合了 TCP 可靠性和 UDP 速度快的优点,这类协议我了解的是谷歌提出的 QUIC 协议。
QUIC 协议全称是“快速 UDP 互联网”连接,相比与当前应用多的 http2 + tcp + tls,它的优势主要在减少了 TCP 三次握手以及 TLS 握手的时间,拥有改进后的拥塞控制,以及拥有避免队头阻塞的多路复用。
首先由于 UDP 本身没有连接的概念,不需要三次握手,QUIC 在此基础上实现了 0 RTT 的安全握手,并且在大部分情况下也只需 0 RTT 就能实现数据发送。
为了保证可靠性传输,QUIC 在 TCP 关于拥塞控制方面的四个算法,包括慢启动,拥塞避免,快速重传,快速回复都做了相应的改进。比较突出的特点就是,QUIC 使用 packet number 代替了 TCP 的 sequence number,且每个 packet number 都严格递增。加上同样是 QUIC 提出的 Stream Offset,确保数据的顺序性和可靠性。
除此之外,QUIC 还在 Connection 和 Stream 两个级别都提供了流量控制。Stream 可以理解为一条 http 请求,Connection 可以类比一条 TCP 连接。QUIC 的多路复用就是指在一条 Connection 上同时存在多条 Stream,且多条 Stream 之间没有顺序依赖,也就消除了 TCP 中队头阻塞的问题。
大致只了解这么多。
【计算机网络专题】UDP相关问题(必看题)🌟🌟🌟🌟🌟
PS:一般结合TCP一起出现,问的比较少
1、什么是 UDP?举几个应用了 UDP 协议的例子
2、UDP 与 TCP 有啥区别?(PS:介绍三四个就可以了,不用说太多)
3、具体 UDP 是不可靠的,那你觉得如何实现一个可靠的 UDP ?
参考学习资料:
参考回答:
1、什么是 UDP?举几个应用了 UDP 协议的例子
UDP 中文是用户数据包协议,它是一种无连接的传输层协议,它没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为 UDP 协议的控制字段较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的服务。如 DNS 出于性能和效率的考虑,使用 UDP 来提供快速的查询响应。还有比如说基于互联网的电话服务使用的 VOIP 语音,也是用的 UDP,可以接收偶尔的丢包,但延迟很低。
2、UDP 与 TCP 有啥区别?(PS:介绍三四个就可以了,不用说太多)
首先是 TCP 是面向连接的协议,两端传输之前需要先握手来建立连接。而 UDP 是一种无连接协议,即刻传输数据。
并且 TCP 只支持一对一,两个端点的服务,而 UDP 同时支持一对一,一对多和多对多的服务。
还有最重要的是 TCP 是可靠性的交付数据,数据可以无差错,不丢失,不重复,按需到达。而 UDP 是尽最大努力交付,但不保证可靠性交付。
那这样就导致了 TCP 由于需要保证数据的完整交付,引入了各种流量控制和拥塞控制机制,速度和效率上就不如 UDP。
3、具体 UDP 是不可靠的,那你觉得如何实现一个可靠的 UDP ?
往 QUIC 协议上引。
【计算机网络专题】DNS相关问题🌟🌟🌟
PS:这个问的比较少以及比较简单。
1、DNS协议是干嘛用的?
2、讲一下dns过程,给一个网址www.google.com,dns服务器如何逐级解析的?
3、DNS 用的是 TCP 还是 UDP ?
4、DNS解析请求的服务器单机并且响应速度慢怎么办?🌟🌟
参考学习资料:
参考回答:
1、DNS协议是干嘛用的?
我们通常用 IP 地址来唯一的标识一台上网的计算机,但由于 IP 地址不方便记忆,也不能显式的表名组织,地址等等属性,所以就诞生了域名,比如 http://www.baidu.com,容易记住,也能体现公司组织等等标识。DNS,也就是域名解析协议就是用来将域名和 IP 地址相互映射,使人们更加方便的访问互联网。
2、讲一下dns过程,给一个网址www.google.com,dns服务器如何逐级解析的?
首先域名是有层级结构的,从上到下依次为根域名,顶级域名,二级/三级域名等等。那么根据域名查对应 IP 地址的过程也需要从上到下,先向根域名服务器请求所查询域名的顶级域名服务器的地址,再通过这个地址向顶级域名服务器去查权威域名服务器的地址,最终返回想要的 IP 地址,结束。
需要多说的是,DNS 解析的过程是有两种方式的,递归查询和迭代查询。我刚只说了需要拿到某某地址,并没有说是上一级域名服务器去向下一级域名服务器请求,还是用户本身去请求下一级域名服务请,那么前者就对应着递归查询,后者就对应着迭代查询。不过一般 DNS 解析都是用的迭代查询,以免根服务器的压力过大。
除此之外,整个过程也有缓存的存在,除了那些根,顶级,权威域名服务器都有之前请求的缓存,我们的电脑本身,还有本地域名服务器都有缓存,只有缓存未命中时才会进行下一级的查询。那么加上本地缓存和本地域名服务器,整个 DNS 解析过程就变成了本地缓存,本地域名服务器,根域名服务器,顶级域名服务器,最后是权威域名服务器。
3、DNS 用的是 TCP 还是 UDP ?
由于 DNS 的数据包一般情况下非常小,并且需要快速,高效的完成域名解析,大多数情况都是用的 UDP。主要还是数据量很小,如果丢包了重发一次就好了,速度很快。并且 DNS 报文中允许填入序号字段,请求报文和应答报文的序号相同,多个 DNS 请求之间可以通过序号来一一对应。
但是某些特殊情况 DNS 的数据长度很大(512字节),为了保证数据完整性,此时也会用 TCP 来保证可靠性传输。
4、DNS 解析请求的服务器单机并且响应速度慢怎么办?
一般情况下 DNS 服务器本身是没有问题的,有可能是客户端到 DNS 服务器的网络延迟比较大。这个问题可以通过 ping DNS 服务器的地址来验证。比如我试过的,正常网络情况下,有时使用 Google 提供的 DNS 服务延迟就在 100ms 左右,地址为 8.8.8.8。这个时候就可以更换 DNS 服务器地址成电信的 114.114.114.114 来加快速度。除此之外,某些 Linux 系统本身是不会自动配置 DNS 缓存的,需要我们自己去开启这个功能。有了 DNS 缓存,后面的 DNS 解析请求就比第一次要快的多了。
【计算机网络专题】HTTP相关问题🌟🌟🌟🌟
PS:这个是重点,问的很多,并且涉及的内容也很多,但是主要需要理解,有一些具体的忘了也没事,比如状态码具体含义忘了,其实也问题不大,但是你需要知道,为啥需要状态码,状态码是用来干嘛的。
1、什么是 HTTP 协议?简单介绍一下
2、说说http请求报文包含什么?
3、Content-Length知道吗?如果Content-Length的长度 大于报文的实际长度,分析下会有什么问题?
4、长链接和短连接介绍一下?要不HTTP1.0,1.1,2.0,3.0 区别也介绍一下?
5、http方法了解哪些?
6、为什么要有这些不同的方法,post get 不就可以实现了吗
7、get post 区别是什么?
8、http状态码有哪些(1xx-5xx),那讲一下301与302的区别?
9、499和502了解吗?出现的原因是什么?
10、Http TCP 都有保活 keep-alive 机制 两者有什么区别🌟🌟
参考学习资料:
参考回答:
1、什么是 HTTP 协议?简单介绍一下
HTTP 协议全称为超文本传输协议,是一个应用层的协议,通常基于 TCP/IP 用于在网络的两点之间传输文字,视频等数据。他不是一个孤立的协议,需要下层很多其它协议的配合,最基本的就是 TCP/IP,实现可靠的数据传输,还有 DNS 协议实现域名到 IP 的查找。
2、说说http请求报文包含什么?
基本上有三大部分组成:起始行,头部字段集合和消息正文。
起始行描述了请求或响应的基本信息,例如请求报文中的请求方法 GET 请求目标 / 和 版本号 HTTP/1.1;响应报文中的版本号 HTTP/1.1,状态码 200 和状态码补充字段 OK。
头部字段集合使用 key-value 的形式更详细的说明报文,可以自定义。比如常见的 Host 字段,用来指明这个请求该由哪个主机来处理;还有 User-Agent 字段,用来描述发起 HTTP 请求的客户端。
消息正文就是实际传输的数据,比如IP文本或者图片,视频等二进制数据。
3、Content-Length知道吗?如果Content-Length的长度 大于报文的实际长度,分析下会有什么问题?
Content-Length 用于指定报文中 Body 数据的字节长度。特别的,如果对数据本身就行了 gzip 压缩的话,Content-Length 指的是压缩后的长度。
对于接收放来说,Content-Length 的长度影响着对数据的截取,如果 Content-Length 的长度比实际的小,那么只会截取指定的一小部分,损失一部分信息,但大部分情况下页面还会正常显示。如果 Content-Length 比实际大,接收端在读到消息后会继续等待下一个字节,期间一直处于无响应状态,直到响应超时。此时页面是不能正常显示的。
4、长链接和短连接介绍一下?
早期的 HTTP 0.9 和 1.0 就采用的短连接方式,每次发送 http 请求前都需要与服务器建立连接,收到响应报文后会立即关闭连接。因为客户端与服务器的整个连接过程很短暂,不会与服务器保持长时间的连接状态,所以就被称为短连接。
短连接的缺点很明显,对于客户端来说,每次请求都先需要三次握手建立连接,之后四次挥手关闭连接,当请求数增多的时候,效率就很低,严重的制约了服务器的服务能力,无法处理更多的请求。
之后根据短连接暴露出的缺点 HTTP 协议提出了长连接的通信方式,也叫连接保活 keep-alive。具体的工作方式是,对于相同客户端的多次请求,只需要在最开始时进行一次连接建立,和最后进行一次连接关闭,在这期间,客户端可以复用已经建立好的连接来发送其他请求,这样服务端的处理效率就高多了。
由于长连接对性能的改善效果十分显著,所以在 HTTP/1.1 中,默认就启用长连接。如果服务端支持长连接,会在响应报文中用 Connection : keep-alive 头部来表明。
不过长连接也有缺点,如果 TCP 连接长时间不关闭,服务器就必须在内存中保存它的状态,会占用大量的服务器资源。所以用了长连接,就需要考虑长连接在何时恰当的关闭。这有两种办法,在客户端中,可以在请求头中加上 Connection : close 字段,告诉服务器这次通信后就关闭连接。也可以在服务端的 Nginx 中通过 keepalive_time 来设置长连接的持续空闲时间。
4.5、要不HTTP1.0,1.1,2.0,3.0 区别也介绍一下?
HTTP 历史最早可以从 HTTP/0.9 说起,那时的 HTTP 非常简单,只能使用 GET 方法从服务器上获取 HTML 文档。之后由于多媒体等技术的发展,网络传输的数据不止局限于文本,还包括视频,音频等二进制流。HTTP/1.0 基于此,扩充了传输的数据范围,增加了 HEAD,POST 等新方法,引入了头部 Header 等等,形式上已经和我们现在的 HTTP 差别不大,但并没有广泛的运用。真正运用到实践中,并确立统治地位的是 HTTP/1.1,它相较于 1.0 又增加了 PUT,DELETE 等新方法,允许长连接,允许响应数据分块等等,一直沿用至今。
但由于互联网的发展速度太快,相比之下 HTTP/1.1 的连接速度越来越慢,Google 就在它的基础上推出了 SPDY 协议,并应用于 Chrome 中,倒逼 HTTP 进行改革。最终的 HTTP/2.0 就是以 SPDY 为基础,在性能方面做了比较大的提升,包括报文格式中用二进制取代 ASCII 码;使用专门的算法压缩头部,减少数据传输量;定义了虚拟的数据“流”的概念,并基于多路复用,避免了 HTTP 层面的队头阻塞问题。
再往后,由于 HTTP/2.0 只是解决了 HTTP 层面的队头阻塞,其下层的 TCP 还是会出现同样的队头阻塞问题,并且不论你 HTTP 层怎么变化,TCP 的这个问题一直存在。Google 于是决定抛弃 TCP,基于 UDP 优化出新的 QUIC 协议,并让 HTTP 跑在 QUIC 协议上,来彻底解决队头阻塞问题。HTTP/3.0 就是基于 QUIC 协议,应用了最新的 TLS 1.3,继承了 0-RTT 握手等特性,继续优化了性能。
5、http方法了解哪些?
目前 HTTP/1.1 规定了八种方法,包含常见的五种,比如用于获取资源的 GET 或 HEAD 方法,用于提交数据的 POST 或 PUT 方法,用于删除资源的 DELETE 方法。其他三种是用于建立特殊链接隧道的 CONNECT 方法,列出可对资源实行方法的 OPTIONS 方法,追踪请求到响应的传输路径的 TRACE 方法。
除了这些,我们还可以自定义方法类型,实际中用的多的有 LOCK 方法,用于暂时锁定某个资源不允许修改;还有 PATCH 方法用于给资源打个小布丁,更新部分数据等等。
6、为什么要有这些不同的方法,post get 不就可以实现了吗
这个其实是一个使用的习惯和约定,就是想红绿灯,比不是强制要求我们必须遵守,但大家都按照规定的做,沟通起来就很顺畅。
7、get post 区别是什么?
GET 方法是从服务器那里获取数据,而 POST 方法是做相反的操作,向 URI 指定的资源提交数据,而数据就放在报文的 Body 里。
除此之外,两者的安全性和幂等性也不同,GET 方法对于服务器的资源是“只读”操作,不会破坏和修改服务器的资源,所以是安全的。同时无论 GET 操作多少次,在服务器上的数据是不会变的,所以 GET 也是幂等的。
而 POST 方法需要修改服务器上的资源,所以是不安全的。同时多次执行 POST 方法也就意味着多次提交数据,就会创建多个资源,所以不是幂等的。
8、http状态码有哪些(1xx-5xx),那讲一下301与302的区别?
HTTP 的状态码从 100 到 500 被分成了五类,1xx 表示提示信息,表示目前是协议处理的中间状态。2xx 表示成功,常见的就是 200。3xx 表示重定向,资源位置发生变动,需要客户端重新发送请求。4xx 表示客户端错误,代表请求报文有无,服务器无法处理,常见的是 403 和 404。5xx 是服务器错误,常见的 500 就是后端错误,503 表示服务器当前忙。
9、499和502了解吗?出现的原因是什么?
499 是 Nginx 自定义的一个状态码 client has closed connection,表示客户端连接已关闭。通常是因为服务端处理的时间过长,超过了客户端设置的 timeout 值。解决的话需要看后端服务是不是压力太大,或者调高接口的 timeout 值。
502 是 Bad Gateway,通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,但访问后端服务器时发生了错误。
10、Http TCP 都有保活 keep-alive 机制 两者有什么区别
HTTP 的 Keep-Alive 是由应用层实现的,称为 HTTP 长连接。TCP 的 Keepalive 是传输层实现的,称为 TCP 的保活机制。前者用于复用同一个 TCP 连接来进行多次的 HTTP 请求和应答,来减少 HTTP 多次短连接带来的 TCP 连接建立和释放的开销。后者则是在 TCP 连接双方长时间没有通信时,会由操作系统内核发送一个探测报文,来检测服务端是否仍然存活。如果连续多次探测报文无回应,客户端就会主动关闭连接。
简单来说,一个用于 TCP 心跳包检测,是为了提高可靠性的。一个是用来复用 TCP 连接,是为了提高性能的。
【计算机网络专题】HTTPS相关问题🌟🌟🌟
PS:这个比较难,一般问的时候,会结合 HTTP 一起问,一般中大厂才会问吧,其他可能就简单问一下区别啥的,可能不会问你原理,但是中大厂估计问你原理。
1、介绍一下 HTTPS?
2、HTTPS 和 HTTP 有啥区别?有啥优劣势?
3、HTTPS 是如何保证安全的?
4、对称加密与非对称加密是什么?介绍一下
5、数字证书是什么?数字证书包含什么?
6、如果一个域名加了 HTTPS,我们在访问的时候,用了 HTTP 访问,会发生什么?🌟
参考学习资料:
什么是 HTTPS?(必看)
参考回答:
1、介绍一下 HTTPS ?
由于 HTTP 天生明文,缺少安全通信所需的机密性,完整性,身份认证和不可否认这四个大的特性。HTTPS 就基于 HTTP,在这四个方面上增加了新的特性。但整体在语法和语义上都和 HTTP 完全一样,两者最大的区别在于 HTTPS 将下层的 TCP/IP 换成了 SSL/TLS,让 HTTP 运行在了安全的传输协议上,收发报文不再使用 Socket API,而是调用专门的安全接口。
2、HTTPS 和 HTTP 有啥区别?有啥优劣势?
区别见 1、
HTTP 的优势在于协议本身很简单,相较于 HTTPS 传输数据时需要加解密运算来说,速度要快。缺点就在于不安全,不具备安全通信的四个特点。
HTTPS 的优势就在于安全,引入了各种加密方式与数字证书验证等等,提供了数据传输时更高的安全性。缺点就在于会有一定的性能开销,部署也相对复杂。
不过 HTTPS 中关于性能的问题,TLS 1.2 使用了混合加密同时兼顾安全与性能,TLS 1.3 中又把握手时间减少到了 1-RTT,某些情况甚至能做到 0-RTT。
3、HTTPS 是如何保证安全的?
主要是为 HTTP 增加了四个方面的特性:机密性,完整性,身份认证和不可否认。下面分别说一说:
首先机密性的实现,就是发送方使用密钥来加密报文信息,接收方再使用密钥来解密,以此来保证通信过程中报文是加密后的乱码,也就保证了私密性。具体根据密钥的使用方式,加密又可分为对称加密和非对称加密,以及现在普遍使用的混合加密。
完整性的话,就是要确保接受方在接收到信息后,能确定这些信息没有被篡改,也就是完整的。实现完整性的手段主要是摘要算法,也就是常说的散列函数。具体的,发送方在发送信息时,会附带这段信息经摘要算法计算后的字符串,接收方收到后,会再次给原文用摘要算法计算一遍,将结果与附带的那个字符串比对,就能确保信息的完整性。常见的算法有 MD5,SHA-1 等等。
身份认证和不可否认特性,是通过数字签名来实现的。它其实就是非对称加密里面的私钥再加上摘要算法。具体来说,以前是公钥加密私钥解密,现在是发送信息时,将信息的摘要用自己的私钥加密,接收方收到后只能用发送端的私钥对应的公钥来解密,这样接收端就能通过这把公钥来确定信息是不是某个实体发的,同时实现身份认证和不可否认的特性。
4、对称加密与非对称加密是什么?介绍一下
对称加密就是指发送方加密所使用的密钥,与接收方解密使用的密钥相同。但双方如何进行“密钥交换”是个问题。常见的对称加密算法有 AES 或者 ChaCha20 等等;
非对称加密是指发送方用于加密的密钥与接收方解密所用的密钥不同,前者用于加密的叫公钥,可以在网上任意分发,后者用于解密的密钥叫私钥,必须保密。非对称加密所用的算法就比对称加密的算法要难得多,也少的多,相应的计算时间也比较长,比如 RSA 等等。
混合加密同时结合了对称加密速度快,和非对称加密用于“密钥交换”的优点。具体来说,在通信刚开始时,先生成一个后续使用的对称密钥,也叫会话密钥。然后使用非对称算法来解决这个对称密钥的交换问题。等到接收方拿到密文,用私钥取出会话密钥,整个密钥交换的过程就结束了。虽然这个过程稍微有点慢,但后续双方在通信时,就直接使用这个会话密钥,全程使用对称加密,速度就快上来了。
5、数字证书是什么?数字证书包含什么?
数字证书是用来解决“公钥的信任”问题,因为谁都可以发布公钥,我们还缺少一个防止黑客伪造公钥的手段,也就是怎么确认这个公钥是你发出的?
这就需要证书认证机构 CA 来给各个公钥签名,由于 CA 就像网络世界的公安局,具有极高的可信度,它是用自身的信誉来保证公钥无法伪造,是可信的。具体的,就是将公钥与公钥的用途,序列号,有效时间等等,打成一个大的包,再签名,最终得到一个数字证书。数字证书可以分为三个等级,可信度从低到高是 DV,OV,EV 三种。EV 是可信度最高的证书。
6、如果一个域名加了 HTTPS,我们在访问的时候,用了 HTTP 访问,会发生什么?
HTTP 默认使用 80 端口,HTTPS 默认使用 443 端口,如果是第一次用 HTTP 访问这个 HTTPS 网站的话,需要看网站是否配置了 HTTP 到 HTTPS 的自动重定向,如果没有就会报连接请求错误。有就会自动跳转。
还注意到一个现象,即使网站没有配置 HTTP 到 HTTPS 的重定向,假如我们已经在浏览器中用 HTTPS 访问过一次这个网站,后续用 HTTP 的话,浏览器会自动帮我们跳转成 HTTPS,主要还是为了连接的安全。
【计算机网络专题】IP地址相关问题🌟🌟🌟
PS:这个主要就是理解了,大家可以看下(计算机网络五层模型入门),那简洁来说的话,就是:IP处于网络层,主要用来寻址,如同我们的快递地址,有个地址方便寻找大致的地点,而MAC地址,则用来唯一确认身份,就像我们的身份证。
1、ip 地址有啥用?
2、ip 地址和 mac 地址有啥区别?
3、为了 mac 地址为啥 还需要 ip 地址?
4、一定要有 mac 地址或者 ip 地址吗?两者保留其一是否可以?
参考学习资料:
参考回答:
1、ip 地址有啥用?
IP 处于 TCP/IP 模型中的第三层,也就是网络层,网络层主要的功能就是实现网络中点到点的通信。IP 地址的作用就是用来在网络中区分不同的联网设备,通过 IP 地址,可以精确地定位到对方的主机,进而实现通信。
2、ip 地址和 mac 地址有啥区别?
首先 IP 工作在 TCP/IP 模型的第三层网络层,代表的是网络通信的逻辑地址,而 MAC 地址处于 TCP/IP 模型的网络接口层,代表的是网卡的物理地址。
其中 IP 地址允许设备在全球范围内进行点到点的通信,而 MAC 地址主要用于局域网的内部通信,帮助路由器和交换机确定数据包到底该传输到哪台设备。
还有一个不同就是,IP 地址划分时是基于地理区域的,如果换了不同地方,即便是同一台硬件设备,IP 地址一定不一样,可以理解为和地理位置有关。而 MAC 地址不依赖于地理区域,换了不同地方,只要还是同一个网卡,MAC 地址就不会变,它只和网卡本身有关。
3、有了 mac 地址为啥 还需要 ip 地址?
当年设计出 IP 地址的原因就是,随着网络设备的逐渐增多,人们发现路由变得越来越困难,也就是寻找数据包从发送方到接收方的路径变得越来越困难。于是人们就划分出了子网这个概念,这样在路由的时候,路由器就可以把其他子网看成一个整体,对于目的地在其他子网的数据包,路由器只负责让它到底对应的子网即可,剩下的工作由子网内部解决。虽然这种方法只能让寻找到的路径接近最优而不保证最优,不过它大大减少了路由器的计算量,利大于弊,所以被采用了。
而如果我们只用 MAC 地址的话,路由器就必须记住每个 MAC 地址所在的子网是哪一个,不然每一次收到数据包的时候路由器都要重新满世界地去找这个MAC地址的位置。而世界上有大约 248248 个 MAC 地址,这就意味着,即使我们给每个 MAC 地址只留 1 字节的储存空间,每个路由器也需要 256TB 的存储空间!这显然是不可能实现的。这也是为什么我们需要 IP 地址的原因了。相同子网下的网络设备的前缀都是一样的,路由器过 IP 地址的前缀就能知道对应设备在哪个子网上了。所以现在路由器只需要记住每个子网的位置即可,大大减少了路由器所需要的存储空间。
4、一定要有 mac 地址或者 ip 地址吗?两者保留其一是否可以?
刚说明了为什么需要 IP 地址,但同时我们也不能没有 MAC 地址。因为 IP 地址是要设备上线以后,才能根据它进入了哪个子网来分配的,在设备还没有 IP 地址的时候,我们还需要用 MAC 地址来区分不同的设备。
【计算机网络专题】在浏览器中输入 URL 地址到显示主页的过程?(必看题)🌟🌟🌟🌟🌟
PS:本问题回答原则:越详细越好,但是前提是要能够保持流畅,否则不建议回答太多,等下自己绕死了
参考学习资料:
看这篇,跟着这篇文章思路回答即可:在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?
参考回答:
第一步是浏览器需要解析这个 URL,一般可以将其分解为访问协议,域名和资源路径。访问协议一般是 http 或 https,资源路径就是要访问的资源在服务器中的某个位置。
但只有域名我们还无法直接与服务器建立连接,所以第二步我们需要通过 DNS 解析这个域名,拿到服务器真正的 IP 地址。
有了 IP 地址之后,浏览器就可以通过 TCP 的三次握手与服务器建立连接。之后浏览器就可以正式响服务器发送 http 请求,请求中包含浏览器类型,编码方式等等头部信息。
服务器在收到请求报文后,会根据其中的资源路径,在磁盘中读取出来,再拼成 http 格式的报文向返回给浏览器。
浏览器收到响应报文后,会对报文进行解析,如果报文中是 HTML,JS 等文件,浏览器就需要调用排版引擎,JavaScript 引擎进行渲染。
接着浏览器重复这些步骤,向服务器发送 http 请求来获取网页资源。最终向用户呈现出一个完整的页面。
【计算机网络专题】其他问题🌟🌟
PS:问的不多,理解为主
1、URI和 URL有什么区别?
2、ICMP协议了解吗?介绍一下,有哪些应用场景呢?
3、ARP协议了解吗?介绍一下 ARP 过程
4、xss攻击、cors攻击原理介绍一下?
5、简单说下 SYN FLOOD 是什么
参考学习资料:
暂无
参考回答:
1、URI和 URL有什么区别?
URI 是统一资源标识符,它是一个非常广泛的概念,不仅用于标识互联网资源,还可以用来标识世界上的任何资源。
URL 是统一资源定位符,用来定位互联网上资源的具体位置。一个完整的 URL 包括协议,域名以及资源的路径信息。
2、ICMP 协议了解吗?介绍一下,有哪些应用场景呢?
ICMP 协议全称是“互联网控制报文协议”,主要的功能就是:确认 IP 包是否成功送达到目标地址,并且报告发送过程中 IP 包被废弃的原因和改善网络设置等等。也就是说,在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。具体的,会在 ICMP 包头的代码字段中显示导致是网络,还是协议还是端口等等不可达。
最常见的应用是 ping 命令,我们在使用 ping 的时候,实际上是向目标主机发送了一个 ICMP 请求数据包,里面包含有序号,发送时间等等。目标主机收到后,会返回一个 ICMP 响应数据包,等我们自己收到这个响应之后,ping 就会计算整个过程的 RTT 以及丢包率然后显示出来。
3、ARP协议了解吗?介绍一下 ARP 过程
ARP 协议主要用于通过 IP 地址,获取对方的 MAC 地址。这个过程一般发生在同一个子网中,主机会通过广播发送 ARP 请求,这个包中包含了一个 IP 地址。同一个子网中的所有设备收到 ARQ 请求时,会检查这个包中的 IP 地址是否与自己一致,是就把自己的 MAC 地址放入 ARP 响应包中,返回给主机。
4、xss攻击、cors攻击原理介绍一下?
xss 攻击是跨站脚本攻击,它的原理是:攻击者会在 web 页面中插入一些恶意的 script 代码,当用户浏览该页面时,嵌入到 web 页面的 script 代码就会执行,以此来获取用户设备上的信息等等。常见的就是 QQ 群中陌生人发的链接,不能随便点,点了之后就会被获取信息,然后被盗号。
cors 攻击就是跨域攻击,一般情况下攻击者是利用网站 CORS 配置的漏洞,比如指定允许的源设置为 *,就代表所有的域名都可以访问这个接口,十分危险。还有的就是利用浏览器的 CORS 实现漏洞,或者伪造 HTTP 头来攻击。
5、简单说下 SYN FLOOD 是什么
SYN Flood 顾名思义就是用洪水一样的 SYN 报文进行攻击,它是经典的 DDos 攻击。主要原理,就是利用 TCP 建立连接是的三次握手中的最后一次握手,客户端向服务器发送 ACK 报文,服务器接受之后就能完成建立连接。但假如此时客户端不发 ACK 报文,服务端就会一直等待,此时的连接处于半链接状态,会占用服务端的资源。当连接数被占满时,服务端就无法提供正常的服务了。
所以攻击者站在客户端的角度,只需要服务端发送大量的,经过伪造的 SYN 报文,只进行第一次握手,不进行第三次握手。服务端接受到这些 SYN 报文后,会产生大量的半链接,需要维持一张巨大的连接等待表,不停的重试发送 SYN-ACK 报文,且这些半连接资源无法释放,就会导致正常的用户无法建立 TCP 连接了。