计算机基础

一、编译原理

1.代码到底是什么,计算机如何将代码转换为可以运行的目标程序?

代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。

计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。

解释性语言的定义:

解释性语言不需要编译,在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就需要逐行翻译一次,效率比较低。 现代解释性语言通常把源程序编译成中间代码,然后用解释器把中间代码一条条翻译成目标机器代码,一条条执行。

编译性语言的定义:

编译性语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。

2.正则表达式的匹配原理和性能优化

这里不理解https://www.jianshu.com/p/3cd3d9648dbb

3.如何将JavaScript代码解析成抽象语法树(AST)?描述一下 V8 执行一段JS代码的过程?

因为机器读不懂 JS 代码,只能理解特定的机器码,所以必须将 JS 的代码翻译成机器码,然后让机器识别。JS属于解释型语言,对于解释型的语言说,解释器会对源代码做两步分析:

1.首先通过词法分析和语法分析生成 AST(抽象语法树)
2.将 AST 转换为字节码

首先,词法分析即分词,目的是把一行行代码分割成一个个token;语法分析即把生成的token数据转化成AST。生成AST后,之后解释器/编译器的工作即依赖于AST,而不是源代码。之后,通过解释器把AST转换成字节码,字节码是介于AST和机器码之间的一种代码,因为直接把AST转换成机器码会占用大量的内存,所以先把AST转成字节码,然后由解释器逐行执行,这样就能减少内存的压力。最后,在执行字节码的过程中,如果发现重复的代码,V8会把这部分代码标为热点代码,然后将这部分代码编译成机器码保存起来,所以在这样的机制下,代码执行的时间越长,执行效率越高,因为会有更多的字节码被标记为热点代码,当再次遇到这些代码的时候,可以直接执行保存起来的机器码,而不用再次转换成机器码。

这就是 V8 中执行一段JS代码的整个过程,分三步:

1.首先通过词法分析和语法分析生成 AST
2.将 AST 转换为字节码
3.由解释器逐行执行字节码,遇到热点代码启动编译器进行编译,生成对应的机器码, 以优化执行效率

4.Base64的编码原理?

在参数传输的过程中经常遇到的一种情况:使用全英文时没问题,但一旦涉及到中文就会出现乱码情况。与此类似,网络上传输的字符并不全是可打印的字符,比如二进制文件、图片等。Base64的出现就是为了解决此问题,它是基于64个可打印的字符来表示二进制的数据的一种方法。

Base64编码是网络上常见的用于传输8bit字节数据的一种编码方式之一,大多数编码都是由字符串转化成二进制,而Base64的编码则是从二进制转换为字符串。

Base64就是用6位(2的6次幂就是64)表示字符,因此称为Base64。

Base64的原理比较简单,每当我们使用Base64时都会先定义一个类似这样的数组:

['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
上面就是Base64的索引表,字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符,这是标准的Base64协议规定。在日常使用中我们还会看到“=”或“==”号出现在Base64的编码结果中,“=”在此是作为填充字符出现。 具体转换步骤:
第一步,将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
第二步,将上面的24个二进制位每6个一组,共分为4组。
第三步,在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。
第四步,根据Base64编码对照表获得对应的值。

二、网络协议

1.理解协议,了解TCP/IP网络协议族的构成,了解每层协议在应用程序中发挥的作用

互联网的实现,分成好几层。每一层都是为了完成一种功能。为了实现这些功能,就需要大家都遵守共同的规则。大家都遵守的规则,就叫做"协议"(protocol)。互联网的每一层,都定义了很多协议。这些协议的总称,就叫做"互联网协议"(Internet Protocol Suite)。它们是互联网的核心。


从下往上分析:

每层介绍:

链路层:用来处理连接网络的硬件部分。硬件上的范畴均在链路层的作用范围之内。
网络层:用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包传输给对方。
传输层:通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。
应用层:一般是我们编写的应用程序,决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信。

每层的作用:

物理层:也叫做"实体层",它就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。

链路层:单纯的0和1没有任何意义,必须规定电信号多少位一组,每组什么意思,这就是"链接层"的功能,它在"实体层"的上方,确定了0和1的分组方式。

网络层:以太网的广播方式只能在一个广播域内发送,跨广播域通信只能通过路由转发,因此,必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。遗憾的是,MAC地址本身无法做到这一点。它只与厂商有关,与所处网络无关。“网络层”的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络,最终建立"主机到主机"的通信。这套地址就叫做"网络地址",简称"网址"。

传输层:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,再通过端口来标识主机上的应用程序。"传输层"的功能,就是建立"端口到端口"的通信。(端口即应用程序与网卡关联的编号)相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。

应用层:应用程序收到"传输层"的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。"应用层"的作用,就是规定应用程序的数据格式。

每层的协议:

物理层:没有协议
链路层:以太网协议 地址解析协议(ARP,Address Resolution Protocol)
网络层:网络协议(IP,Internet Protocol)(IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输) 地址解析协议(ARP,Address Resolution Protocol) 网络控制报文协议(ICMP,Internet Control Message Protocol)
传输层:用户数据报协议(UDP,User Datagram Protocol) 传输控制协议(TCP,Transmission Control Protocol)
应用层:超文本传输协议(HTTP,Hypertext Transfer Protocol) DNS

网络通信就是交换数据包。电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信。数据包的结构,基本上是下面这样:

详细参考:

https://wenku.baidu.com/view/47f64cda0975f46527d3e19f.html
https://blog.csdn.net/songzi1228/article/details/84782675#三、链接层
https://blog.csdn.net/hqs2212586/article/details/86582279
https://blog.csdn.net/songzi1228/article/details/102530152?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1

2.三次握手和四次挥手详细原理,为什么要使用这种机制?

三次握手的原理:


第一次握手:客户端向服务端发送连接请求。SYN=1 表示一个想要连接对方的请求;ACK=0答复的时候才为1;TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x。

第二次握手:服务端对这一请求进行回复确认。SYN=1 表示一个想要连接对方的请求; ACK=1 是响应,服务端答复客户端我能和你连接;seq=y是这一次回复消耗的序号, ack=x+1 也是响应,告诉客户端我能收到你发的请求数据。

第三次握手:客户端收到服务端的回复后进行确认。此时已经互相表明想要和对方连接了,因此不需要SYN了;ACK=1 是响应,客户端答复服务端我能和你连接;seq=x+1, ack=y+1 也是响应,告诉服务端我能收到你发的请求数据。

使用三次握手而不用二次、四次握手的原因:

为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。如果是两次,客户端发了 SYN 报文想与服务端连接,但是这个包滞留在了当前的网络中迟迟没有到达,TCP以为丢了包,于是重传,两次握手建立好了连接。本来没有问题,但是连接关闭后,如果滞留在网路中的包到达了服务端,这时候由于是两次握手,服务端只要接收到然后发送相应的数据包,就默认建立连接,但是现在客户端已经断开了。这就带来了连接资源的浪费。三次握手的目的是确认双方发送和接收的能力,四次握手也就没有必要了。

四次挥手的原理:

3.有哪些协议是可靠传输协议,TCP有哪些手段保证可靠交付?

TCP对应的协议都是可靠传输协议,有:FTP Telnet SMTP POP3 HTTP

TCP是一个面向连接的、可靠的、基于字节流的传输层协议。TCP 有三大核心特性(也是和UDP的区别):

1.面向连接。

意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前需要三次握手建立TCP连接。在一个TCP连接中,仅有两方进行彼此通信。而 UDP 没有相应建立连接的过程。

2.可靠性。

TCP能保证连接的可靠,这个可靠性体现在两个方面:一个是有状态,另一个是可控制。

有状态:TCP会精准记录哪些数据发送了,哪些数据被对方接收了,哪些没有被接收到,而且保证数据包按序到达,不允许半点差错。

(1)确认应答

TCP传输的过程中,每次接收方收到数据后,都会对发送方进行确认应答,也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。

(2)序列号

TCP传输时将每个字节的数据都进行了编号,这就是序列号。 序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,将收到的数据以正确的顺序交给应用层。并且去掉重复序列号的数据。这也是TCP传输可靠性的保证之一 。

可控制:当丢包或者网络环境不佳,TCP会根据具体情况调整自己的行为,控制自己的发送速度或者重发

(1) 超时重发

发送方在发送完数据后启动一个定时器,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。

(2) 校验和

发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。

(3) 提供流量控制

TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许发送端发送接收端缓冲区所能接纳的数据。如果发送端的发送速度太快,导致接收端的结束缓冲区很快的填充满了。此时如果发送端仍旧发送数据,那么接下来发送的数据都会丢包。而TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。

相应的,UDP 就是无状态, 不可控的。

滑动窗口协议的理解

1、TCP窗口机制

TCP中窗口大小是指tcp协议一次传输多少个数据。因为TCP是一个面向连接的可靠的传输协议,既然是可靠的就需要传输的数据进行确认。TCP会对所有传输的数据进行编号,发送方在发送过程中始终保持着一个窗口,只有落在发送窗口内的数据帧才允许被发送;同时接收方也始终保持着一个接收窗口,只有落在窗口内的数据才会被接收。这样通过改变发送窗口和接收窗口的大小就可以实现流量控制。

2、TCP窗口大小

TCP的窗口滑动技术通过动态改变窗口的大小来调节两台主机之间数据传输。每个TCP/IP主机支持全双工数据传输,因此TCP有两个滑动窗口,一个用于接收数据,一个用于发送数据。接收方设备要求窗口大小为0时,表明接收方已经接收了全部数据,或者接收方应用程序没有时间读取数据,要求暂停发送。

TCP在传送数据时,第一次接受方窗口大小是由链路带宽决定的,但是接收方在接收到的数据后,返回ack确认报文,同时也告诉了发送方自己的窗口大小,此时发送方第二次发送数据时,会改变自己的窗口大小和接收方一致。

3.面向字节流。

UDP 的数据传输是基于数据报的,这是因为仅仅只是继承了 IP 层的特性,而 TCP 为了维护状态,将一个个 IP 包变成了字节流。字节流:两个应用程序通过TCP连接交换8bit字节构成的字节流。由TCP连接双方的应用层解释字节流。

4.DNS的作用、DNS解析的详细过程,DNS优化原理?

DNS(Domain Name System,域名系统),是因特网上将域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。简单来说,DNS的作用就是将域名解析为IP地址。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析。

DNS解析的详细过程:

浏览器自身缓存=>操作系统缓冲=>本地域名服务器=>根域名服务器=>.com域服务器=>163.com域名的解析服务器

1、网络客户端就是我们平常使用的电脑,打开浏览器,输入一个域名。比如输入www.163.com,这时,你使用的电脑会发出一个DNS请求到本地DNS服务器。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

2、查询www.163.com的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地DNS服务器需要向根服务器查询,但不是询问www.baidu.com对应的IP是多少,根服务器仅管理顶级域名,而且所有的顶级域名都属于根的管理范畴,所以此时本地DNS服务器向根查询结果是。

3、根DNS服务器没有记录具体的域名和IP地址的对应关系,而是将它管理的com域对应的IP提供给本地DNS服务器。

4、本地DNS服务器得到域服务器的IP后,会再向域服务器查询,在这个例子中,请求的对象是.com域服务器。然而com也没有最终的答案,com域服务器会将它所管理的域名的解析服务器即163域服务器对应的IP提供给本地DNS服务器

5、最后,本地DNS服务器向域名的解析服务器163域服务器发出请求,询问该域下主机名为www的计算机对应的IP地址,由于www主机确实直接属于163域的管理范畴,所以163域会将最终的正确答案返回给本地DNS服务器,最后本地DNS服务器将得到的结果返回给客户端,同时本地DNS服务器会将结果缓存起来,当下次再有相同的查询请求时,本地DNS服务器就可以直接从缓存中找到结果返回给客户端。

5.如何理解URI?URI和URL

URI, 全称为(Uniform Resource Identifier), 即统一资源标识符,它的作用是区分互联网上不同的资源。但是,它并不是网址, 网址指的是URL, 实际上URI包含了URN和URL两个部分,由于 URL 过于普及,就默认将 URI 视为 URL 了。
总的来说,URL是URI的一种,但不是所有的URI都是URL;URI和URL最大的差别是‘访问机制’,提供了访问机制的是URL,如http ftp等访问;URN是位移标识的一部分,是身份信息。
URL:https://www.bilibili.com URI:www.bilibili.com

6.HTTP报文结构分析?


HTTP请求报文是由请求行、请求头部、空行和请求数据四部分组成。
(1)请求行由请求方法、uri字段和HTTP协议版本三部分组成,它们之间用空格隔开
(2)请求头部由键值对组成,关键字和值之间用:隔开
(3)最后一个请求头之后是一个空行,通知服务器空行以下是请求数据
(4)请求数据不再GET方法中使用,而是在POST方法中使用

HTTP响应报文是由状态行、响应头部、空行和响应包体四部分组成。
(1)状态行由HTTP协议版本、状态码和状态描述三部分组成,它们之间用空格隔开
(2)响应头部由键值对组成,关键字和值之间用:隔开
(3)最后一个响应头之后是一个空行,通知服务器空行以下是响应包体
(4)响应包体是服务器返回给客户端的文本信息

7.如何理解 HTTP 的请求方法?

当客户端发送请求报文时,请求行中就包括了请求方法。HTTP/1.1规定了多种请求方法,都是大写表示:
GET:通常用来获取资源
HEAD:跟GET方法相同,只不过服务器响应时不会返回消息体。这种方法可以用来获取请求中隐含的元信息,而不用传输实体本身
POST:提交数据,如提交表单或上传文件
PUT:向指定资源位置上传其最新内容
DELETE:请求服务器删除指定的页面
CONNECT: 用于代理服务器
OPTIONS:客户端询问服务器支持的请求方法
TRACE:追踪请求-响应的传输路径,主要用于测试和诊断

GET和POST的区别

首先POST用于向服务器提交数据,比如表单数据的提交 上传文件,GET一般用于获取资源信息
具体来看:
(1)从数据的位置来看,GET请求数据放在uri后面,所以私密性和安全性较差,并且数据的类型必须是ASCII字符,并且长度受到限制;而POST请求数据放置在HTTP报文实体的主体里,所以适合传输敏感信息,并且安全性更高,数据类型和长度也没有限制。
(2)从缓存来看,GET请求会被浏览器缓存,留下历史记录,但是post则默认不会
(3)从幂等性来看,GET请求是幂等的,post不是。(幂等表示执行相同的操作,结果也是相同的)

8.如何理解 HTTP 状态码?

1xx:表示消息。代表服务端已经接收到客户端请求,需要继续处理;
2xx:表示成功。代表客户端的请求已成功被服务端接受并处理;
3xx:表示重定向。代表客户端需要进一步的操作才能完成请求;
4xx:表示请求错误。代表客户端请求有问题;
5xx:表示服务端错误。代表服务端在处理请求的过程中出现错误或者当前无法完成对请求的处理。
常见状态码描述文本有如下:
200 OK:请求成功;
400 Bad Request:客户端请求语法有问题,服务端无法理解;
401 Unauthorized:请求未经授权,要求用户的身份认证;
403 Forbidden:服务器收到请求但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因;
404 Not Found:请求的资源不存在,eg,输错了URL;
500 Internal Server Error:服务器发生错误,无法完成客户端请求;
503 Service Unavailable:表示服务器当前不能处理客户端请求,一段时间之后可能恢复正常;

9.简要概括一下 HTTP 的特点?HTTP 有哪些缺点?

10.对Cookie和Section了解多少?




11.如何理解HTTP缓存及缓存代理,缓存的内容是什么?

12.CDN的作用和原理是什么?

13.HTTPS

HTTPS为了解决中间人攻击

14.理解WebSocket协议的底层原理、与HTTP的区别?



15.HTTP/2 有哪些改进?








原文地址:https://www.cnblogs.com/yyrecord/p/13191946.html