大家好,我是Lampard~~
经过一番艰苦奋战之后,我终于是进入了心仪的公司。
今天给大家分享一下我在之前精心准备的一套面试知识。
今天和大家分享的是计算机网络相关的面试题
额其实这篇博客在项目开发的过程中,用到的情况并不多(也可能因为我还是新人,接触不多)。然鹅各种游戏大厂都会很注重面试者的基础,在博主所见识过的大厂面试中,它们主要是着重面试者以下几种技能:1.语言:c++,c#,lua,js,python等,2.引擎:内存管理,渲染机制,事件分发机制,计时器调度机制,设计模式等,3.基础:虽然客户端和服务端会有不同的侧重,但是只要你是科班出身,它们就要考察你的基础,比如说计算机网络,操作系统,数据库,计算机组成原理等,4.算法:前三者如果说大家可以靠过目不忘的本领把知识点都背下来,那么算法的测试就是见真章的时候了,做出来不是终点,它们会一直深挖一直深挖,让你一直优化(头皮发麻)。5.项目经验:若各位是校招的话,前面4点会占了80,90%的面试比重,但是若是社招的同学,项目经验就是最重要的,起码占50%的比重,面试官会考察你做过什么系统,看你的能力到哪里。对于客户端来说如果你有计算机图形学,接过战斗系统,接过sdk,负责过打包patch业务,有为项目写过脚本完善工具链,那么就会有加分点。所以多准备准备是没有错滴。最后祝大家疯狂收割offer,通过自己的努力摆脱生活的苟且,走向诗和远方~
OSI七层模型
开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。
它把整个网络通讯过程拆分成7层:分别是物理层,链路层,网络层,传输层,会话层,表示层以及应用层,每一层独立完成自己的东西,每一层之间通过协议来进行交流。
TCP/IP五层模型
再往后发展,出现了因特网协议栈,它把osi中的会话层,表示层以及应用层抽象成一层,所以就变成了;物理,链路,网络,传输,应用五层结构。
下面简要介绍以下各层负责的内容,用到的协议:
物理层(单位比特):
主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0,然后把电信号转换位0101的比特流信号。
链路层(单位帧):
单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思(从哪里来,到哪里去,数据内容是什么)。分组方式后来形成了统一的标准,即以太网协议ethernet。
ethernet规定:
- 一组电信号构成一个数据包,叫做“帧”
- 每一数据帧分成:报头head和数据data两部分
- 报头head包含发送者的mac地址,接受者的mac地址,以及数据类型。数据data包含发送的内容
什么是mac地址?mac地址其实就是网卡地址,每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制。有了mac地址,同一网络内的两台主机就可以通信了,它们是通过广播的方式进行联系,每个pc都会收到广播的信息,然后根据接受者来判断自己是否接收该信息。
网络层(单位包):
如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到,这就不仅仅是效率低的问题了,数据赤裸裸的被偷窥,这会是一种灾难。必须找出一种方法来区分哪些计算机属于同一广播域(局域网,信任的网站),哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式。
网络层功能:
引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址。
规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示。
ip地址分两个部分:分别标识网络和主机
那么怎么确定哪些地址来自同一网络呢?此时就要引入一个掩码的概念,
子网掩码:
所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。
如:IP地址为192.168.11.12,前24位是网络部分,后8位是主机部分,那么子网掩码就是11111111.11111111.11111111.00000000,转换成十进制就是255.255.255.0
利用子网掩码,我们可以判断任意两个IP地址是否处在同一个子网络:将两个ip地址与子网掩码分别进行AND(与)运算(两个位数都为1,运算结果就为1,否则为0)然后比较结果是否相同,是的话就是在同一个子网,否则就不是。
打包:IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制--这被认为是上层协议--TCP或UDP要做的事情。
分包:以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。
传输层(单位报文):
传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,再通过端口来标识主机上的应用程序。端口即应用程序与网卡关联的编号。
传输层功能:
建立端口到端口的通信。
传输层有两种协议,TCP和UDP,至于它们的具体内容我们拆开来讲。我们只需要记得,tcp是连接可靠的传输方式,udp是无需建立链接的不可靠的传输方式。TCP协议虽然安全性很高,但是网络开销大,而UDP协议虽然没有提供安全机制,但是网络开销小,在现在这个网络安全已经相对较高的情况下,为了保证传输的速率,我们一般还是会优先考虑UDP协议!
应用层:
应用层功能:
规定应用程序的数据格式。
设备与层的对应关系:
通过上文我们得知tcp是一种面向连接的、可靠的、基于字节流的传输层通信协议。这里我们需要讨论的就分为了两点,一种是如何实现面向连接,第二是如何保证可靠性。
TCP是因特网中的传输层协议,使用三次握手协议建立连接。TCP三次握手的过程如下:
客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
举个现实的栗子:
小乌龟去买番茄:老板在吗(向往服务器发送syn请求连接)?
老板:在啊,买东西吗(先回复之前的问题ack,然后再进行确认syn)?
小乌龟:是的啊(对服务端的syn进行再次确认)
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
当连接终止时,需要进行四次挥手
客户端发送FIN(FIN = X传输结束)报文给服务器端。
服务器端收到FIN报文,回应一个ACK(ACK=x+1)报文,然后继续传输数据
服务端传输完数据紧接着发送FIN报文给客户端,告知自己也传完了
客户端收到后回复ACK,表示正式结束连接
当我们了解到三次握手和四次挥手的实现机制时,就会情不自禁的冒出两个问题:
1.为什么要进行三次握手
2.为什么三次握手连接,而断开连接的时候却要四次呢?
首先我们解释为什么需要三次握手,就不能够我跟你说我要连接,你返回收收到了之后就进行传输吗?如果说理想状态下确实问什么问题,但是如果因为网络等原因,我向你请求连接的包延迟到达,我等不到你的回信,以为丢包了,过段时间后又重发了一个。这时相当于发了两个,如果不进行第三次确认的话,服务端收到我们迟到的包的时候,将会以为你想要和它通信,这就出现错误了,所以三次握手防止重复连接。
至于为什么连接只需要三步,而取消连接需要四步。其实我们观察图片就会知道,差异在于服务端在收到连接信号的时候,它可以同时发送两个信号:我已经了解请求,是否确认连接?但是结束的时候,虽然收到了客户端的结束请求,但是你传完了,我还没回复完啊,如果你请求一大堆信息我是不是该分报文传给你?所以就有了异步等到传完所有信息后再回复我也传完了,请求结束连接的FIN
我们知道tcp是可靠的,那么它可靠的地方怎么体现呢?
建立连接:通过三次握手建立连接本身就是一个保证数据传输可靠的措施
自纠错:tcp会通过校验和的方式进行自纠错
超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
拥塞控制:为了避免过多的数据注入网络,导致链路过载,会通过慢开始,拥塞避免,快重传和快恢复方式进行拥塞避免
(1)慢启动
每当建立一个TCP连接时或一个TCP连接发生超时重传后,该连接便进入慢启动阶段。进入慢启动后,TCP实体将拥塞窗口的大小初始化为一个报文段,即:cwnd=1。此后,每收到一个报文段的确认(ACK),cwnd值加倍,即拥塞窗口按指数增加。当cwnd值超过慢启动阐值(ssthresh)或发生报文段丢失重传时,慢启动阶段结束。前者进入拥塞避免阶段,后者重新进入慢启动阶段。
(2)拥塞避免
在慢启阶段,当cwnd值超过慢启动阐值(ssthresh)后,慢启动过程结束,TCP连接进入拥塞避免阶段。在拥塞避免阶段,每一次发送的cwnd个报文段被完全确认后,才将cwnd值加1。在此阶段,cwnd值线性增加。
(3)快速重传
快速重传是对超时重传的改进。当源端收到对同一个报文的三个重复确认时,就确定一个报文段已经丢失,因此立刻重传丢失的报文段,而不必等到重传定时器(RTO)超时。以此减少不必要的等待时间。
(4)快速恢复
快速恢复是对丢失恢复机制的改进。在快速重传之后,不经过慢启动过程而直接进入拥塞避免阶段。每当快速重传后,置ssthresh=cwnd/2、ewnd=ssthresh+3。此后,每收到一个重复确认,将cwnd值加1,直至收到对丢失报文段和其后若干报文段的累积确认后,置cwnd=ssthresh,进入拥塞避免阶段。
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议(我可以丢数据,但是你一定要快要实时)。
为了在给定的主机上能识别多个目的地址,同时允许多个应用程序在同一台主机上工作并能独立地进行数据包的发送和接收,设计用户数据报协议UDP。
UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序、及流量控制等功能。
UDP Helper可以实现对指定UDP端口广播报文的中继转发,即将指定UDP端口的广播报文转换为单播报文发送给指定的服务器,起到中继的作用。
UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据包的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。
TCP 是面向连接的传输控制协议,而UDP 提供了无连接的数据报服务;TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP 在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;UDP 具有较好的实时性,工作效率较 TCP 协议高;UDP 段结构比 TCP 的段结构简单,因此网络开销也小。TCP 协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用 TCP 传输数据。
一句话就是要快要实时性选UDP,要可靠安全选择TCP。
HTTP:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。它可以使浏览器更加高效。HTTP 协议是以明文方式发送信息的,如果黑客截取了 Web 浏览器和服务器之间的传输报文,就可以直接获得其中的信息。
HTTPS:是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。SSL 协议可分为两层:SSL 记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL 握手协议(SSL Handshake Protocol),它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
一句话回答则是http较快,且不安全。https会通过ssl协议的方式进行加密,更安全但时延高,成本高。
mac地址是链路层的概念,是网卡的地址,目的在于找到具体哪一台主机。IP是网络层的地址,在链路层的基础上用来定位局域网。用于判断是以广播方式还是以路由方式进行信息传播。
IP地址可以通过ARP协议找出MAC地址,mac地址也可以通过RARP来找到IP地址。
博客参考:
TCP/IP五层模型详解