在面试中,计算机网络是面试官最喜欢考察的内容之一
下面是我整理的一些高频计算机网络常问面试题,只要掌握了,分分钟拿捏面试官
1、说说 OSI 七层模型和 TCP/IP 四层模型的关系和区别
OSI 七层从下往上依次是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP 四层从下往上依次是:网络接口层、网络层、传输层、应用层
这两个网络模型的特点:
- 层与层之间相互独立又相互依靠
- 上层依赖于下层,下层为上层提供服务
与 OSI 七层模型的映射关系如下:
PS:TCP/IP 四层是 OSI 七层的简化版
2、说说 TCP 与 UDP 的区别
UDP(用户数据报协议) | TCP(传输控制协议) | |
---|---|---|
是否面向连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输(没有流量控制和拥塞控制) | 可靠传输(使用流量控制和拥塞控制) |
连接对象个数 | 支持一对一、一对多、多对一、多对多交互通信 | 只支持一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
header 开销 | 开销小,8个字节 | 最小20字节,最大60字节 |
适用场景 | 实时应用,可靠性需求不是很大的场景(视频会议、直播等) | 要求可靠传输的应用(文件传输) |
总结:
- TCP 是面向连接的协议,提供可靠服务;UDP 是无连接的,不可靠传输
- UDP 常用于实时性要求高的场景,TCP 常用于可靠性要求高的场景
3、TCP 是如何实现数据的可靠性?
TCP提供可靠交付的服务,传输过程中采用许多方法保证在连接上提供可靠的传输服务
- 校验和
这是 TCP 用来解决数据发生损坏的方案,检验数据是否损坏的方式就是数据校验
在数据传输过程中,将发送的数据段都当做一个16位的整数,将这些整数加起来,并且前面的进位不能丢弃,补在最后,然后取反,得到校验和
发送方:在发送数据之前计算校验和,并进行校验和的填充。接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方进行比较
若数据出错,则接收方会直接将数据丢弃,发送方在一段时间后,没有接收到ACK报文,就会在超时后,重传这个报文
- 序列号
由于网络的限制,TCP 必须将较大的数据拆分成一个个较小的报文段,并封装成 TCP 报文段,逐个传输
但又由于网络传输的不确定性(比如所通过的路径不同,某个报文段丢失然后重传等),这些报文段完全有可能不是按照顺序到达。所以,为了在接收方能够完整的接收数据,并能按序将这些报文组合起来
TCP 提供了一个解决方案——为每一个 TCP 报文段分配一个序号,每个报文段的序号依次增加
这样接收方就可以根据序号,来确定接收到的报文段是整个数据中的哪一部分,以及是否接收到了所有的部分
但是我们需要注意的是——TCP是对字节进行编号,而不是对报文段进行编号
TCP 对需要发送的数据的每一个字节都赋予了一个编号,比如第一个字节为 0 号,第二个为 1 号,以此类推
而每一个报文段一般都不止封装一个字节的数据,所以在 TCP 报文段中,封装的是这个报文段的数据中第一个字节的序列号
举个例子:
比如说发送方要发送250字节的数据,假设初始序号从0开始,则这250个字节的序号分别是0-249。
再假设每一个报文段最多允许封装100个字节的数据,所以第一个报文段将封装第1到100个字节,这些字节的序号为0-99,所以第一个报文段会将0放入它首部中的序号部分;
而第二个报文段封装100-199号字节,所以它的序号为100;
而第三个报文段封装200-249号字节,所以它的序号为200。
以上就是TCP发送方对序号的处理方法
总结:
- 为了解决数据接收的完整性,TCP 为每个报文段都赋予了一个序列号
- TCP 报文段的序列号是根据这个报文段中的第一个字节的数据的序列号来赋予的
- 确认应答
TCP 传输过程中,每次接收方接收到数据后,都会对发送方进行确认应答,也就是发送 ACK 报文
这个 ACK 报文中带有对应的确认序列号,告诉发送方,接收了哪些数据,下一次数据从哪里传
- 超时重传
这个方法用来解决 TCP 数据丢失的问题
TCP 会维护一个计时器,并设置一个超时时间,当发送一个 TCP 报文段后,没有在超时时间内收到 ACK 报文,则发送方认为数据丢失,于是会重传丢失的报文段,直到认为接收方已接收
由于 TCP 使用的是流水线传输,同一时间内可能会有多个已经发送但没有接收到 ACK 的报文段,所以按理来说,TCP 将维护多个计时器,为每一个报文段绑定一个,但是这样做需要花费很大的开销,而且管理计时器也很复杂
所以实际上 TCP 只维护一个计时器,绑定的是当前最早被发送,但是还没有收到 ACK 报文的报文段
如果这个报文段超时,发送方将重传该报文段,并重启计时器;如果收到了这个报文段的 ACK 报文,同样重启计时器,此时绑定的就是新的报文段
总结:
TCP 的超时重传机制能够很好地解决网络中发生数据丢包的问题
- 连接管理
指的是 TCP 三次握手、四次挥手的过程
4、 TCP 协议如何提高传输效率?
- 滑动窗口
如果每一个发送的报文段,都要收到 ACK 应答之后才发送下一个报文段,会导致效率很低,因为大部分时间都用在了等待 ACK 应答上了
既然一发一收的效率比较低,那么我们可以一次发送多条数据,这样就能使等待时间大大减少,从而提高性能
窗口大小指的是无需等待确认应答而可以继续发送数据的最大值,上图窗口大小就是 3000 个字节(三个段)
发送前三个段的时候不需要任何的 ACK 应答,直接发送,收到第一个 ACK 应答之后,窗口向后移动,发送后三个段的数据
操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录那些数据还没有应答;只有确认应答过的数据才能在缓冲区中删除
窗口越大,网络吞吐量就越高;在建立连接的时候已经确认了窗口的大小,确认了发送数据大小的上限
- 快重传
如果出现了数据丢失,就需要进行重传,一般分为两种情况:
- 数据包已经抵达,ACK被丢了。这种情况下,部分ACK丢了并不影响,因为可以通过后续的ACK进行确认
- 数据包直接丢了。发送端会连续收到多个相同的 ACK 确认,发送端立即将对应丢失的数据重传
- 延迟应答
如果接收数据的主机⽴刻返回ACK应答, 这时候返回的窗⼝可能⽐较⼩
假设接收端缓冲区为 1M,一次收到了 500K 的数据,如果立即 ACK 应答,返回的窗口就是 500K
但实际上可能接收端处理的速度很快,10 ms 之内就把 500 K 的数据从缓冲区消费掉了,在这种情况下,接收端处理还远没有达到自己的极限
如果接收端稍微等⼀会再应答, ⽐如等待200ms再应答, 那么这个时候返回的窗⼝⼤⼩就是1M
延迟应答的两个限制:
- 数量限制: 每个N个包就应答一次;
- 时间限制: 超过最大的延迟时间就应答一次
- 捎带应答
在延迟应答的基础上,很多情况下,客户端服务器在应用层也是一发一收的
这时候常常采用捎带应答的方式来提高效率,而ACK响应常常伴随着数据报文共同传输。如:三次握手
5、你知道 TCP 如何处理拥塞吗?
网络拥塞是指到达通信网络中某一部分的分组数量过多,使得该部分网络来不及处理,导致这部分甚至整个网络性能下降,严重时甚至导致网络通信业务陷入停顿
拥塞控制处理网络拥塞现象的一种机制,有以下四个阶段:
- 慢启动
- 拥塞避免
- 快速重传
- 快速恢复
6、为什么 TCP 链接需要三次握手,两次不可以么,为什么?
- 两次握手只能保证单向连接是畅通的
第一步:client 给 server 发送一条消息:你好,server
第二步:server 收到消息后 ACK 应答,并给 client 回复一条消息:你好,client
以上便是两次握手的过程,这个过程 client 给 server 发消息,server 收到了,说明 client 可以正常给 server 发送数据
但是 server 给 client 发消息却没有收到 client 的应答,也就不能保证 server 是否能正常给 client 发送消息
- 两次握手会导致网络资源浪费
第一步:client 给 server 发送一条消息:你好,server
由于网络传输是不可靠的,这条消息可能在网络上长时间滞留,等到 server 那里的时候已经是失效了的
第二步:server 收到消息后 ACK 应答,并给 client 回复一条消息:你好,client
这时候 server 应答这条失效的消息之后就会建立起一条连接通道等待 client 发送数据,可是这时候 client 是没有发送建立连接请求的,就会使得 server 一直在等待 client 发送数据,导致网络资源白白浪费
7、IP地址是怎样分类的,你知道吗?
- IP 地址由四段组成,每个字段是一个字节,8位,最大值是255。
- IP 地址由两部分组成,即网络地址和主机地址。网络地址表示其属于互联网的哪一个网络,主机地址表示其属于该网络中的哪一台主机
A类:(1.0.0.0-126.0.0.0)一般用于大型网络。
B类:(128.0.0.0-191.255.0.0)一般用于中等规模网络。
C类:(192.0.0.0-223.255.255.0)一般用于小型网络。
D类:是多播地址,地址的网络号取值于224~239之间,一般用于多路广播用户。
E类:是保留地址。地址的网络号取值于240~255之间
8、说说 HTTP 和HTTPS 的区别?
HTTP 是一种超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
HTTPS 的全称是 (Hypertext Transfer Protocol Secure),从名称我们可以看出 HTTPS 要比 HTTP 多了 secure 安全性这个概念,实际上, HTTPS 并不是一个新的应用层协议,它其实就是 HTTP + TLS/SSL 协议组合而成,而安全性的保证正是 TLS/SSL 所做的工作
总结:HTTPS 就是身披了一层 SSL 的 HTTP
区别:
- HTTP 在地址栏上的协议是以 http:// 开头,而 HTTPS 在地址栏上的协议是以 https:// 开头
- HTTP 的默认端口是 80,而 HTTPS 的默认端口是 443
- HTTP 是未经安全加密的协议,明文传输,它的传输过程容易被攻击者监听、数据容易被窃取、发送方和接收方容易被伪造;而 HTTPS 是安全的协议,它通过 密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法 能够解决上面这些问题
9、你知道对称加密和非对称加密的区别和原理吗?
对称加密:是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题——如何安全地将密钥发给对方
非对称加密:是指使用一对非对称密钥——公钥和私钥,公钥可以随意发布,但私钥只有自己直到。发送密文的一方使用对方的公钥进行加密处理,对方接收到密文后用自己的私钥进行解密
10、常见的 HTTP 状态码有哪些?
- 1xx:(请求处理中,请求已被接受,正在处理)
2xx:(请求成功)
- 200:请求被成功处理
3xx:(重定向,要完成请求必须进行进一步处理)
- 301:永久重定向
- 302:暂时重定向
- 304:请求被重定向到客户端本地缓存
4xx:(客户端错误)
- 400:客户端请求存在语法错误
- 401:客户端请求没有经过授权
- 403:客户端没有访问权限
- 404:请求的资源在服务器上不存在
5xx:(服务端错误)
- 500:服务端发送永久错误
- 502:错误网关
- 503:服务端发送临时错误
11、Get与POST的区别
- GET 一般用来从服务器上获取资源,POST 一般用来创建资源
- GET 是幂等的,即读取同一个资源,总是得到相同的数据,而 POST 不是幂等的。GET 不会改变服务器上的资源,而 POST 会对服务器资源进行改变
- 请求参数形式上看,GET 请求的数据会附在 URL 之后,以 ”?“分割 URL 和传输数据,参数之间以 ”&“ 连接;而 POST 请求会把提交的数据则放置在是HTTP请求报文的 body 中
- POST 的安全性要比 GET 的安全性高,因为 GET 请求提交的数据将明文出现在 URL 上,而 POST 请求参数则被包装到请求体中,相对更安全
- GET 请求的长度受限于浏览器或服务器对URL长度的限制,允许发送的数据量比较小,而POST请求则是没有大小限制的