计算机网络常见面试题(Java Guide)
OSI 七层模型是什么?每一层的作用是什么?
- 物理层:透明地传输比特流
- 数据链路层: 封装成帧,差错检测
- 网络层:路由和寻址
- 传输层:为两台主机进程提供数据传输服务
- 会话层:管理应用程序之间的会话
- 表示层:数据处理
- 应用层:为计算机用户提供服务
TCP/IP 四层模型是什么?每一层的作用是什么?
- 应用层:提供两个应用程序的数据传输服务,应用层协议(Http)
- 传输层:两台终端设备进程通讯提供通用的数据传输服务(TCP/UDP)
- 网络层:为分组交换网上的不同主机提供通信服务,选择合适的路由,运输传输层的分组到目的主机(IP、ARP)
- 网络接口层:数据链路层的作用(封装成帧,差错检测)和物理层的作用(透明地传输比特流)
为什么网络要分层?
- 每一层都专注做一件事情,提升效率
- 各层之间相互独立
- 提高整体灵活性,符合高内聚,低耦合的设计标准
- 大问题化小,将复杂的问题分解为更容易理解的小问题,使得问题变得简单易解决
应用层常见协议总结
- HTTP :超文本传输协议
- SMTP:简单邮件传输(发送)协议
- POP3/IMAP:邮件接收的协议
- FTP:文件传输协议
- Telent:远程登录协议 (但是所有数据以明文传输,安全性较低,如今很少用)
- SSH:安全的网络传输协议
TCP 与 UDP 的区别
- 是否面向连接:UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。
- 是否是可靠传输:UDP不可靠,TCP可靠(数据不出错,不丢失,按序到达)
- 是否有状态:TCP有传输状态,UDP没有传输状态
- 传输效率:由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多。
- 传输形式:TCP面向字节路,UDP是面向报文的
- 首部开销:TCP首部开销要大很多
- 是否提供广播或多播服务 :TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多;
TCP | UDP | |
---|---|---|
面向连接 | 是 | 否 |
是否可靠传输 | 是 | 否 |
是否有状态 | 是 | 否 |
传输效率 | 慢 | 快 |
传输形式 | 面向字节流 | 面向报文 |
首部开销 | 大(20 ~ 60 bytes) | 小(8 bytes) |
是否提供广播服务 | 否 | 是 |
什么时候选择 TCP,什么时候选 UDP?
- UDP一般用于即时通信,要的速度快,允许有差错
- TCP一般用于对传输准确性要求很高的场合:文件传输,发送和接受邮件等
HTTP 基于 TCP 还是 UDP?
是基于TCP面向连接的
使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
运行于 TCP 协议之上的协议 :
- HTTP 超文本传输协议
- HTTPS 更加安全的超文本传输协议
- SMTP 邮件发送协议
- POP3 邮件接受协议
- FTP 文件传输协议
- Telent 远程控制协议
- SSH 安全的远程控制协议
运行于 UDP 协议之上的协议 :
- DHCP 动态主机配置协议
- DNS 域名系统(将域名转换为ip地址)
TCP三次握手和四次握手
建立连接 三次握手
为什么要三次握手?
三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第2次握手传回了ACK,为什么还要传回SYN?
服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。回传 SYN 则是为了建立并确认从服务端到客户端的通信。
TCP可靠传输的精髓就是SYN码的确立,两方都知道对方的SYN码就能知道对方传来的信息是否有效
断开连接-TCP 四次挥手
只要四次挥手没有结束,客户端和服务端就可以继续传输数据!
为什么要四次挥手?
TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。
举个例子:A 和 B 打电话,通话即将结束后。
- 第一次挥手 : A 说“我没啥要说的了”
- 第二次挥手 :B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话
- 第三次挥手 :于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”
- 第四次挥手 :A 回答“知道了”,这样通话才算结束
为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
客户端没有收到ACK确认,会重复发FIN请求
为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?
更能接受服务器端的重传的FIN
第四次挥手时,客户端发送给服务器的 ACK 有可能丢失,如果服务端没有因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。
TCP 如何保证传输的可靠性?
- 基于数据快传输:应用数据切块,再传输给网络层,数据块称为报文
- 对失序数据包重新排序以及去重:每个包有一个序号,可以排序并去重
- 校验和:检测传输变化,有差错会选择丢弃该报文
- 超时重传:启当发送方发送数据之后,它启动一个定时器,等待目的端确认收到这个报文段。接收端实体对已成功收到的包发回一个相应的确认信息(ACK)。如果发送端实体在合理的往返时延(RTT)内未收到确认消息,那么对应的数据包就被假设为已丢失并进行重传。
- 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议(TCP 利用滑动窗口实现流量控制)。
- 拥塞控制:当网络拥塞时,减少数据的发送
TCP如何实现流量控制?
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
为什么需要流量控制? 这是因为双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来。如果接收方处理不过来的话,就只能把处理不过来的数据存在 接收缓冲区(Receiving Buffers) 里(失序的数据包也会被存放在缓存区里)。
TCP 的拥塞控制是怎么实现的?
TCP 的拥塞控制采用了四种算法,即 慢开始 、 拥塞避免 、快重传 和 快恢复。
ARQ协议
自动重传请求(Automatic Repeat-reQuest,ARQ)是 OSI 模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认信息(Acknoledgements,就是我们常说的 ACK),它通常会重新发送,直到收到确认或者重试超过一定的次数。
ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。
停止等待ARQ协议
停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复 ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组;在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。
连续 ARQ 协议
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
从输入URL 到页面展示到底发生了什么?
类似的问题:打开一个网页,整个过程会使用哪些协议?
- DNS域名解析
- 建立TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
HTTP 状态码有哪些?
HTTP状态码用于描述HTTP请求的结果
HTTP 和 HTTPS 有什么区别?
- 端口号不同:HTTP默认端口号是80,HTTPS默认端口号是443
- URL前缀页不同:http://,另一个是https://
- 安全性和资源消耗:HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。
HTTP 是不保存状态的协议, 如何保存用户状态?
利用Session保存用户状态
在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库 redis 保存)。既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪。
如今用jwt技术实现(分布式更合适,session只保存在服务器端)
URI 和 URL 的区别是什么?
- URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
- URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径。
URI 的作用像身份证号一样,URL 的作用更像家庭住址一样。URL 是一种具体的 URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。
ARP
什么是MAC地址?
MAC 地址的全称是 媒体访问控制地址(Media Access Control Address)。如果说,互联网中每一个资源都由 IP 地址唯一标识(IP 协议内容),那么一切网络设备都由 MAC 地址唯一标识。
MAC 地址具有可携带性、永久性,身份证号永久地标识一个人的身份,不论他到哪里都不会改变。而 IP 地址不具有这些性质,当一台设备更换了网络,它的 IP 地址也就可能发生改变,也就是它在互联网中的定位发生了变化。
最后,记住,MAC 地址有一个特殊地址:FF-FF-FF-FF-FF-FF(全 1 地址),该地址表示广播地址。
ARP 协议解决了什么问题地位如何?
ARP 协议,全称 地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
IP地址到物理地址的映射
ARP 协议的工作原理?
ARP 协议工作时有一个大前提,那就是 ARP 表。
利用ARP表,找到目的ip地址
在一个局域网内,每个网络设备都自己维护了一个 ARP 表,ARP 表记录了某些其他网络设备的 IP 地址-MAC 地址映射关系,该映射关系以 <IP, MAC, TTL>
三元组的形式存储。其中,TTL 为该映射关系的生存周期,典型值为 20 分钟,超过该时间,该条目将被丢弃。
说下Http1.0、Http1.1、Http2.0的区别
- Http1.0默认是短链接(每次请求都需要建立一个TCP连接)可以强制开启,通过加入Connection: keep - alive
- Http1.1默认为长连接,引入管道的概念,同一个TCP连接可以发送多个请求,提高效率
- Http2.0 使用多路复用在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,而且做了Header压缩,服务推送等优化
什么是HTTPS
- HTTPS 是以安全为目标的HTTP 通道,它在HTTP 中加入SSL 层以提高数据传输的安全性。
- 为了数据传输的安全, HTTPS 在HTTP 的基础上加入了SSL 协议,保障数据传输的安全性,其端口一般是443 。
HTTPS的加密流程是怎么样的
- 发起请求: 客户端在通过TCP 和服务器建立连接之后( 443 端口),发出一个请求证书的消息给服务器
- 证书返回:服务器端在收到消息后回应客户端并返回证书和公钥
- 证书验证: 客户端在收到证书后,判断证书签发机构是否正确,并使用该签发机构的公钥确认签名是否有效, 客户端还会确保在证书中列出的域名就是它正在连接的域名。如果客户端确认证书有效,则生成对称密钥,并使用公钥将对称密钥加密。
- 密钥交换: 客户端将加密后的对称密钥发送给服务器,服务器在接收到对称密钥后使用私钥解密
- 数据传输: 经过上述步骤,客户端和服务器就完成了密钥对的交换, 在之后的数据传输过程中, 客户端和服务端就可以基于对称加密
TCP的粘包和拆包
- 一个完整的数据包会因为tcp的缓冲区,可能被拆分成多个包进行发送,也有可能把多个小包封装成一个大数据包发送
如何解决?
- 发送端将每个数据包封装为固定长度
- 在数据尾部增加特殊字符进行分割
- 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小
TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗?
- TCP Keepalive 是TCP层(内核态)实现的,是TCP的保活机制
- Http Keepalive 是HTTP层(用户态)实现的,是HTTP长连接
HTTPS解决了HTTP的什么问题HTTP 由于是明文传输,所以安全上存在以下三个风险:
- 窃听风险,比如通信链路上可以获取通信内容,用户号容易没。
- 篡改风险,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。
- 冒充风险,比如冒充淘宝网站,用户钱容易没。
HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议,可以很好的解决了上述的风险:
- 信息加密:交互信息无法被窃取,但你的号会因为「自身忘记」账号而没。
- 校验机制:无法篡改通信内容,篡改了就不能正常显示,但百度「竞价排名」依然可以搜索垃圾广告。
- 身份证书:证明淘宝是真的淘宝网,但你的钱还是会因为「剁手」而没。
TCP 和UDP可以同时绑定相同的端口吗
- 可以的
- 传输层的「端口号」的作用,是为了区分同一个主机上不同应用程序的数据包
- 当主机收到数据包后,可以在 IP 包头的「协议号」字段知道该数据包是 TCP/UDP,所以可以根据这个信息确定送给哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理。