1、Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。

2、Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

3、使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

4.网络通讯中的端口号是来干什么的?

想想这样一个场景,服务器中有A,B两个服务,这两个服务分别为A、B两个客户端提供登录验证功能。假设A客户端上某个用户输入用户名密码后向服务器发起请求,要求验证用户名密码是否正确,显然,他应该在服务器上找到A服务进行验证,如果找的是B服务,可能A输入的用户名密码是正确的也无济于事。那么,怎么让A客户端对应找到服务器上的A服务呢?这时候端口便应运而生,即,假设我们设定A服务端口号为8080,B服务端口号8081,那么A客户端只要对应找到8080端口就可以进行验证了。当然,A,B两个客户端也要有端口号,否则A服务不知道返回数据给谁

5.tcp是有序的协议吗?怎么保证?

是有序的,TCP连接中,数据流必须以正确的顺序传送给对方。TCP的可靠性是通过顺序编号确认(ACK)实现的。TCP在开始传送一个段时,为准备重传而首先将该段插入到发送队列中,同时启动时钟。然后,如果收到了接收端对该段的ACK信息,就将该段从队列中删去。如果在时钟规定的时间内,ACK未返回,那么就从发送队列中再次送出这个段。TCP在协议中就对数据可靠传输做了保障,握手与断开都需要通讯双方确认,数据传输也需要双方确认成功,在协议中还规定了:分包、重组、重传等规则;

tcp协议补充:

1、在传递数据之前,会有三次握手来建立连接。

2、应用数据被分割成TCP认为最适合发送的数据块(按字节编号,合理分片)。这和UDP完全不同,应用程序产生的数据报长度将保持不变。(将数据截断为合理的长度

3、当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。(超时重发

4、当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。(对于收到的请求,给出确认响应)(之所以推迟,可能是对包做完整校验)

5、TCP将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到段的校验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。(校验出包有错,丢弃报文段,不给出响应,TCP发送数据端,超时时会重发数据

6、既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。(对失序数据进行重新排序,然后才交给应用层

7、既然IP数据报会发生重复,TCP连接的接收端必须丢弃重复的数据。(对于重复数据,能够丢弃重复数据

8、TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能容纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。(TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出),TCP使用的流量控制协议是可变大小的滑动窗口协议。

9、TCP还能提供拥塞控制。当网络阻塞时,减少数据的发送。

6.滑动窗口是干什么的?

流量控制,滑动窗口的思想是:允许发送方不必等确认到来就可以继续发送下面的分组,但规定一个上限。若多个分组的确认未到时,则暂停发送。

7.数据库的事务是干什么用的?保持事务一致性

8.数据库索引介绍一下?

以上两个问题可以参考我上一篇博客:《golang北京小厂面试复盘》

9.B+ Tree和B Tree 的区别?

1.在B+书中,叶节点包含了全部关键字,即在非叶节点中出现的关键字也会出现在叶节点中,而在B树中,叶节点包含的关键字和其他节点包含的关键字是不重复的

2.B+树可以从任意叶子节点开始遍历叶子节点,即叶子节点是相互索引的

10.进程,线程,协程的区别

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。

 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,而拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程也由操作系统调度(标准线程是这样的)。

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。协程拥有自己的寄存器上下文和栈。

在go中 ,协程可以由程序员调度而不是由系统调度,同时,协程相较于线程切换速度更快

 11.mysql的索引有那些类型?

1) 普通索引

普通索引是 MySQL 中最基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度。

2) 唯一索引

唯一索引与普通索引类似,不同的是创建唯一性索引的目的不是为了提高访问速度,而是为了避免数据出现重复。

3) 主键索引

顾名思义,主键索引就是专门为主键字段创建的索引,也属于索引的一种。

主键索引是一种特殊的唯一索引,不允许值重复或者值为空。

4) 空间索引

空间索引是对空间数据类型的字段建立的索引,使用 SPATIAL 关键字进行扩展。

5) 全文索引

全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引。

12.什么是联合索引?

两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。