BAT面试题复习
http协议
http协议是无状态无连接;
无状态:指的是http协议无法保存客户机的信息,比如客户机浏览了什么网页,判断用户是否由权限访问等,因此产生了两种保持状态的技术:cookie与session,cookie存在于浏览器中,session存在于服务器中。
无连接:指的是服务器处理完客户的的请求,收到客户机的应答之后,即断开连接。请求时建立连接,请求完释放连接,这样可以尽快释放资源出来供其他客户端使用。但是html页面变得复杂,比如有10个图片,10个css,10个js,浏览器每一次请求就要建立一次连接,那么就要建立30次tcp连接,这样就显得低效了,为了提高效率,http1.1新设置了keep-alive字段,在Keep-Alive规定的时间内,都是用同一个tcp连接。http1.1支持长连接,http1.0规定浏览器与服务器只保持短暂的连接。
http是应用层协议,是基于tcp协议连接的,tcp是面向连接,但是http协议是无连接的。有关“TCP是面向连接的,HTTP基于TCP却是无连接的?”的问题请参考文章
http与https的区别:
http使用80端口,基于tcp(udp)协议,http直接与tcp通信;
https使用443端口,http使用了ssl加密,http先与ssl通信,然后再由ssl与tcp通信。
为什么不一直使用https呢?
因为与纯文本通信相比,加密通信会消耗更多的CPU与内存资源。如果每次通信都加密,会消耗相当多的资源,所以非敏感信息用http通信,只有包含个人信息等敏感数据才使用https加密通信。
SSL原理:
当浏览器向服务器请求一个安全的网页,服务器会向浏览器发送它的证书和公钥,浏览器检查证书是不是由可以信赖的机构颁发的,确认证书有效和此证书是此网站的,然后客户端使用公钥加密一个随机对称密钥,发送给服务器,服务器用自己的私钥解密,得到这个随机对称密钥;然后客户端和服务器就可以在这个对称密钥加密的方式下通信了,也就是客户端用这个钥匙对请求的url进行加密,服务器用这个钥匙解密,并用这把钥匙对将要返回给客户端的网页进行加密,发送给客户端,客户端再解密。参考文章。
http协议中为什么post方法比get安全?
五层模型
应用层 #为应用程序提高网络服务
传输层 #建立和维护端到端的连接
网络层 #ip寻址与路由选择
数据链路层 #控制网络层与物理层之间的通信,数据帧
物理层 #比特流传输
TCP的六个标志位
URG:(Urgent)紧急指针字段有效值
FIN:(Finish)表示关闭连接
ACK:(Acknowledge)表示响应
SYN:(Synchronous)表示建立连接
PSH:(Push)表示传输数据
RST:(Reset)表示连接重置
ps:四次挥手不是断开连接的唯一方式,如果主机需要尽快断开连接,就会发送RST包。
TCP三次握手
客户端与服务端要建立连接首先要进行tcp的三次握手过程;
- 首先客户端发送syn包给服务端,序列号为a,告诉服务端打开某个端口,我想和你建立某个服务;
- 然后服务端发送syn和ack给客户端,序列号为b,ack=a+1,告诉客户端同一建立连接;
- 最后客户端发送ack确认,ack=b+1,此时双方建立连接,可以进行通信了。
TCP为什么不能两次握手?
1.syn
2.syn+ack
tcp是双向通信协议,想要建立一个可靠的单向通道至少需要发送一次syn和ack。如果是两次握手,考虑这样的情况,当A与B建立了连接之后,此时由于网络延迟的原因,A的syn包刚刚到达B,B以为A想与它建立新的连接,因此回应syn与ack,B就会一直等待A发送数据,造成B的资源浪费,却不知道这个syn包是因为网络原因迟迟未到达B,此时A与B早已建立了连接,这个syn包是无效的请求。如果有第三次的握手,A可以发送ack向B确认是否建立连接。
TCP四次挥手
客户端和服务器断开连接要进行TCP的四次挥手过程:
- 首先客户端发送FIN包给服务端,告诉服务端我要和你断开连接了;
- 然后服务端发送ACK确认断开连接;
- 接着发送FIN包给客户端,告诉客户端我也要和你断开连接;
- 最后客户端发送ACK给服务端确认断开连接,这样双方连接断开。
TCP为什么不能三次挥手呢?
1.FIN
2.FIN+ACK
3.ACK
因为双方通信是单向的,客户端想和服务器断开连接不代表服务器没有数据传输给客户端了,有这样的情况,客户端发送FIN包给服务端想要断开连接,但是此时服务端正在传输数据给客户端,三次挥手的话,服务器发送FIN+ACK,此时就中断了正在传输的数据,这是不合理的,应该等服务端传输完数据之后再发送FIN包断开连接,所以要四次挥手才合理。
四次挥手为什么有timewait
- timewait是出现再四次挥手最后一次客户端发送给服务端ACK之后客户端的状态,等于两倍的MSL(Maximum Segment Lifetime,报文最大生存时间)在Windows下默认为4分钟,即240秒;
- timewait的存在是为了确保服务器能接收到客户端发送的最后一个ACK确认报文,如果服务器没有接收到最后一个ack报文,会在两倍msl时间内重新发送一次FIN包请求断开连接,然后客户端再发一次ACK报文。
- 另外也是为了使旧的数据包在网络中因过期而消失,如果没有timewait的话,服务器发送完数据之后发送FIN,客户端发送ACK断开连接,如果此时有新的连接建立,使用同一个端口服务,那么之前服务器传输的数据包就会到达客户端,从而引起数据错乱。
TCP与UDP的区别
- tcp是面向连接,发送数据之前需要建立连接;udp是无连接,即发送数据之前不需要建立连接;
- tcp保证数据的正确性,提供可靠的服务,tcp发送的数据保证完整性,无差错不丢失,按序达到;udp使用尽最大努力交付,不保证可靠交付,可能丢包;
- tcp面向字节流,udp面向报文;
- tcp对系统资源要求多,udp对系统资源要求更少;
- 传输即时信息如视频,语音等使用udp,没有实时传输需求则可以考虑使用tcp。
TCP可靠传输机制
- 确认机制
- 不丢包情况:ACK(n+1) = Seq(n)+Len(n)
- 数据包丢失:ACK(n+1) < Seq(n)+Len(n)
- 重传机制
[超时重传]
当发送方没有接收到接收方的ACK确认时,则认为数据丢失,此时发送方依据RTO重传超时时间来对未确认的数据包进行重传。
1*RTO 重传第一次
2*RTO 重传第二次
4*RTO ...
8*RTO 重传第三次
RTT:(Round Trip Time)往返时间
RTO:(Retransmission Timeout)重传超时时间
RTO依据RTT推导而得(经典算法RFC793):
更新RTT=αR + (1-α)M #M为当前测量的往返间隔;R为以前测量的往返间隔;α是一个值为0.9的平滑因子
RTO=βRTT #β推荐是2
--> RTO = 2RTT
[经典重传]
从服务端发送的ack号开始重传,若服务器没收到客户端的序列号为1及以后的所有数据包,则发送ack=1给客户端,客户端将序列号为1及之后的所有数据打包,重新发送给服务器。需要重传从1开始之后的所有数据包,效率不高。
[快速选择性重传]
1.发现有数据包丢失时,接收方会返回3个重复的ACK(tcp dup-ack),告知发送方某个序列号的数据包需要重传。
2.发送方只需要发送丢失序列号的数据包,提高数据恢复的效率;通过tcp头部的SACK字段来告知接收方已经接受到了哪些序列号的数据包,请不要重传这些数据包。
TCP拥塞控制-慢启动、拥塞避免、快重传、快启动
参考文章
参考视频
拥塞:指的是过多的数据注入到网络中,路由器或者链路过载。当出现丢包情况,则可以认为是出现了拥塞。
拥塞窗口:cwnd
慢启动门限:ssthresh
慢启动算法:当cwnd < ssthresh时,cwnd=1,2,4,8指数增长。
拥塞避免:当cwnd = ssthresh时,cwnd+=1。
参考文章内容:
一般原理:发生拥塞控制的原因:资源(带宽、交换节点的缓存、处理机)的需求>可用资源。
作用:拥塞控制就是为了防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不至于过载。拥塞控制要做的都有一个前提:就是网络能够承受现有的网络负荷。
对比流量控制:拥塞控制是一个全局的过程,涉及到所有的主机、路由器、以及降低网络相关的所有因素。流量控制往往指点对点通信量的控制。是端对端的问题。
拥塞窗口:发送方为一个动态变化的窗口叫做拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度。发送方让自己的发送窗口=拥塞窗口,但是发送窗口不是一直等于拥塞窗口的,在网络情况好的时候,拥塞窗口不断的增加,发送方的窗口自然也随着增加,但是接受方的接受能力有限,在发送方的窗口达到某个大小时就不在发生变化了。
发送方如果知道网络拥塞了呢?发送方发送一些报文段时,如果发送方没有在时间间隔内收到接收方的确认报文段,则就可以人为网络出现了拥塞。
慢启动算法的思路:主机开发发送数据报时,如果立即将大量的数据注入到网络中,可能会出现网络的拥塞。慢启动算法就是在主机刚开始发送数据报的时候先探测一下网络的状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小。
例子:开始发送方先设置cwnd(拥塞窗口)=1,发送第一个报文段M1,接收方接收到M1后,发送方接收到接收方的确认后,把cwnd增加到2,接着发送方发送M2、M3,发送方接收到接收方发送的确认后cwnd增加到4,慢启动算法每经过一个传输轮次(认为发送方都成功接收接收方的确认),拥塞窗口cwnd就加倍。
拥塞避免:为了防止cwnd增加过快而导致网络拥塞,所以需要设置一个慢开始门限ssthresh状态变量(我也不知道这个到底是什么,就认为他是一个拥塞控制的标识),它的用法:
1. 当cwnd < ssthresh,使用慢启动算法,
2. 当cwnd > ssthresh,使用拥塞控制算法,停用慢启动算法。
3. 当cwnd = ssthresh,这两个算法都可以。
拥塞避免的思路:是让cwnd缓慢的增加而不是加倍的增长,每经历过一次往返时间就使cwnd增加1,而不是加倍,这样使cwnd缓慢的增长,比慢启动要慢的多。
无论是慢启动算法还是拥塞避免算法,只要判断网络出现拥塞,就要把慢启动开始门限(ssthresh)设置为设置为发送窗口的一半(>=2),cwnd(拥塞窗口)设置为1,然后在使用慢启动算法,这样做的目的能迅速的减少主机向网络中传输数据,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。拥塞窗口是按照线性的规律增长,比慢启动算法拥塞窗口增长块的多。
实例:1.TCP连接进行初始化的时候,cwnd=1,ssthresh=16。
2.在慢启动算法开始时,cwnd的初始值是1,每次发送方收到一个ACK拥塞窗口就增加1,当ssthresh =cwnd时,就启动拥塞控制算法,拥塞窗口按照规律增长,
3.当cwnd=24时,网络出现超时,发送方收不到确认ACK,此时设置ssthresh=12,(二分之一cwnd),设置cwnd=1,然后开始慢启动算法,当cwnd=ssthresh=12,慢启动算法变为拥塞控制算法,cwnd按照线性的速度进行增长。
AIMD(加法增大乘法减小)
1. 乘法减小:无论在慢启动阶段还是在拥塞控制阶段,只要网络出现超时,就是将cwnd置为1,ssthresh置为cwnd的一半,然后开始执行慢启动算法(cwnd<ssthresh)。
2. 加法增大:当网络频发出现超时情况时,ssthresh就下降的很快,为了减少注入到网络中的分组数,而加法增大是指执行拥塞避免算法后,是拥塞窗口缓慢的增大,以防止网络过早出现拥塞。
这两个结合起来就是AIMD算法,是使用最广泛的算法。拥塞避免算法不能够完全的避免网络拥塞,通过控制拥塞窗口的大小只能使网络不易出现拥塞。
快重传:
快重传算法要求首先接收方收到一个失序的报文段后就立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。接收方成功的接受了发送方发送来的M1、M2并且分别给发送了ACK,现在接收方没有收到M3,而接收到了M4,显然接收方不能确认M4,因为M4是失序的报文段。如果根据可靠性传输原理接收方什么都不做,但是按照快速重传算法,在收到M4、M5等报文段的时候,不断重复的向发送方发送M2的ACK,如果接收方一连收到三个重复的ACK,那么发送方不必等待重传计时器到期,由于发送方尽早重传未被确认的报文段。
快恢复:
1. 当发送发连续接收到三个确认时,就执行乘法减小算法,把慢启动开始门限(ssthresh)减半,但是接下来并不执行慢开始算法。
2. 此时不执行慢启动算法,而是令cwnd = ssthresh = 0.5*当前cwnd, 然后执行拥塞避免算法,使拥塞窗口缓慢增大。
路由器和交换机的区别
1.路由器是三层设备,通过路由表查询IP,实现路由,路由表里包含目的网段,子网掩码,下一跳接口;路由器是连接不同局域网的设备。
2.交换机是二层设备,里面存有MAC地址表,通过查询MAC地址,找到同一局域网的设备。交换机是同一局域网的设备。
tcp syn wait
TCP握手丢包咋办
服务器ACK和SYN包丢了,那重传时间怎么得来的
死锁
死锁指的是两个或多个进程在执行的过程中,因为争夺资源而相互等待的现象,此时系统处于死锁状态,相互等待的进程成为死锁进程。比如:线程A锁住记录1而等待记录2,线程B锁住记录2而等待记录1,那么AB线程将处于永远等待的状态,此时产生了死锁。所以一般要用:try-finally 语句无论是否发生异常都将执行最后的代码。
try{
/执行代码
}finally{
/把锁打开
}
操作系统原理
信息通信
进程通信
进程和线程的区别
- 进程是资源分配和调度的独立单元,线程是资源调度的基本单元;
- 同一个进程里可以包含多条线程,线程共享整个进程的资源;
- 进程结束后它所拥有的所有进程都将销毁,而线程结束不影响同一进程的其他线程;
- 线程是轻量级的进程,它的创建和销毁所需时间都比进程小很多。
例子:
打开QQ,开了一个进程;打开迅雷,开了一个进程;
使用QQ传输文字,开了一个线程;传输语音,开了一个线程。
所以打开一个软件相等开了一个进程,在软件运行过程里,多个任务支撑着软件的运行,多个任务指的就是多个线程。
Mysql语句
select columns from table; #查询数据
insert into table () values (); #插入数据
updata table set 列=?where 列=?; #修改某一行的某一列的值
delete from talbe where 列=?; #删除某一行
order by;
group_contat()
contat_ws()
数据库的索引
软连接和硬连接
链接是一种文件复用(共享)的方式:
- 硬链接:ln odlfile newfile (hard link)
1.概念:多个文件共用一个inode索引节点,此inode指向一个data block,删除其中一个文件不会对block的数据删除。
2.应用:对文件进行拷贝,防止误删文件;如果复制的文件太大,可以创建硬链接的方式,硬链接只需要创建entry即文件与inode的对应关系,而复制则需要申请新的inode和block,浪费磁盘资源;
- 软链接: ln -s oldfile newfile (符号链接)
1.概念:inode指向的block存放的是文件的路径,如果删除了源文件,则出现死链接。
2.应用:相当于windows的快捷方式,起一个方便的名字的文件来对源文件进行管理,删除新建的文件不会对源文件造成影响;
Linux的资源查看
useradd #创建用户
cat /proc/cpuinfo #查看cpu信息
cat /proc/meminfo #查看内存信息
如何查看所有用户的登录信息
last 命令:
功能说明:列出目前与过去登入系统的用户相关信息。使用root登陆可查看用户登陆历史
[root@DB-Server ~]# su root
[root@DB-Server ~]# last -10 #查看最近10次用户历史操作记录
root pts/1 :0.0 Wed Dec 18 09:54 still logged in
root pts/4 :0.0 Wed Dec 18 09:43 - 09:48 (00:04)
root pts/1 :0.0 Wed Dec 18 09:43 - 09:48 (00:05)
root pts/3 192.168.103.79 Wed Dec 18 09:41 - 12:40 (02:59)
root pts/4 :0.0 Wed Dec 18 09:28 - 09:30 (00:01)
root pts/3 :0.0 Wed Dec 18 09:27 - 09:30 (00:02)
root pts/2 192.168.103.29 Wed Dec 18 09:27 still logged in
root pts/1 :0.0 Wed Dec 18 09:27 - 09:42 (00:15)
root pts/2 :0.0 Wed Dec 18 09:23 - 09:25 (00:01)
root pts/1 :0.0 Wed Dec 18 09:22 - 09:25 (00:02)
top命令的负载均衡的值怎么算出来的
- top命令是系统性能监控工具,能实时显示系统中各个进程的资源占用情况。
- 系统负载显示的是最近1分钟,5分钟,15分钟的系统平均负载;load average是特定时间内运行队列中的平均进程数。
- 参考文章_1
- 参考文章_2
windows和linux的差别
- Linux是以开发者为中心的操作系统,windows是以消费者为中心的操作系统;
- Linux里面,一切皆文件,命令界面为主,图像界面为辅,而windows是以图形界面为主;
- Linux系统更安全,因为关注度低,流行性没有windows广,所以攻击者为了使自己的病毒能广泛传播,所以更多的是针对windows系统的病毒,倘若linux有一天也和windows一样广泛使用,那么linux自然也会变得没那么安全了;
- Linux免费,可以免费升级版本,而windows需要付费;
- linux升级到最新版本比旧版本更快,而windows相反,若xp都卡,装win10更卡;
- Linux可以多用户登陆
dns的配置文件是
python编译过程(预先编译还是?)
Python装饰器
写个快排
快速排序_O(nlogn)
原理:
随机的在数组中选一个数,小于等于它的数,统一地放在这个数的左边,大于它的数放在这个数的右边;接下来对左右两个部分,分别递归调用快速排序的过程,这样就使得整个数组都有序了。
In [26]: def qiucksort(A):
...: if A ==[]:
...: return A
...: else:
...: key=n[0]
...: left=qiucksort([i for i in A[1:] if i <key]) #使用列表推导式,生成的依然是一个list
...: right=qiucksort([i for i in A[1:] if i >=key])
...: return left+[key]+right
In [27]: A=[1, 2, 43, 54, 2, 23, 4, 2]
In [28]: qiucksort(A)
Out[28]: [1, 2, 2, 2, 4, 23, 43, 54]
Python如何复制一个数组
【场景题】
微信转账时数据库的处理过程
问TCP timewait太多是什么原因
现在ping百度失败了,然后怎么做?
【软问题】
自我介绍
岗位的理解
个人的优势
你是哪里的?(地区)
说一下你的实习情况,遇到什么问题,又是如何解决的
腾讯业务运维岗面经
网络
为什么会出现拥塞和拥塞避免方法(慢启动和乘法减小)
- 当网络中有太多数据,超过了网络中的路由器或者链路所能存储的资源大小,这时候就出现了拥塞,网络的传输性能就会下降。
- 拥塞避免方法包括慢启动和拥塞避免,快重传和快恢复。
重要:负载均衡题目,分层次去解决改进hash算法,五元组计算hash改为六元组计算,把链路状态考虑进去
五种arp和应用环境
ARP:(address resolution protocol)地址解析协议,用于实现从IP地址到MAC地址的映射
- 正向ARP:广播出去,单播回来,加入arp表中,之后才能通信。通信之前若arp表没有找到映射,则发送正向arp。ping命令:
success.!!!!
,第一个.就是arp请求 - 翻转ARP:MAC到IP的映射,只要应用于无盘工作站。
- 代理ARP:局域网内部主机发起跨网段的ARP请求的时候,出口路由器或者网关就会把自身的mac地址回复该请求,这个过程就叫代理ARP。
- 免费ARP:检测局域网内IP地址冲突。源目IP都是自己。IP地址修改或者 DHCP刚获取地址的时候,会发送免费ARP。
- 逆向ARP:存在于帧中继网络(无MAC地址),实现IP和DLCI地址的映射
ARP攻击:假设有主机B请求主机A的mac地址,攻击者截获这个请求,将自己的mac地址回复该请求,这样主机B发送给A的数据就会发送到攻击者。
TCP/UDP区别
- tcp是面向连接,发送数据之前需要建立连接;udp是无连接,即发送数据之前不需要建立连接;
- tcp保证数据的正确性,提供可靠的服务(确认机制和重传机制),tcp发送的数据保证完整性,无差错不丢失,按序达到;udp使用尽最大努力交付,不保证可靠交付,可能丢包;
- tcp面向字节流,udp面向报文;
- tcp对系统资源要求多,udp对系统资源要求更少;
- 传输即时信息如视频,语音等使用udp,没有实时传输需求则可以考虑使用tcp。
vlan作用
1.在交换机上划分vlan,同一vlan内的主机可以直接通信,vlan间的主机不能直接通信
2.隔离广播域,将广播域限制在一个vlan内,节省了带宽,提高网络处理能力。
dns域名解析流程:www.qq.com
1.先查看本地host文件是否由域名和ip的映射
2.若没有向本地dns服务器请求;
3.本地dns服务器向dns根服务器进行查询,根dns服务器告诉本地dns服务器可以到相应的域.com服务器上查询;
4.本地dns服务器向域.com服务器上查询,.com服务器告诉本地dns服务器可以到域qq.com服务器查询;
5.本地dns服务器向域qq.com服务器上查询,qq.com服务器告诉本地dns服务器www.qq.com主机的地址;
HTTP协议,访问www.qq.com,DNS的时候基于什么协议和端口号,TCP头部
1.DNS服务器间进行域传输的时候用TCP 53
2.客户端查询DNS服务器时用 UDP 53
抓包,Linux下用什么软件什么命令,如何抓包分析
tcpdump
数据包如何封装,路由器如何转发数据包
对https的了解
http+ssl
抓包分析里面的字段,画IP头部
数据库
数据库的引擎,MyISAM和InnoDB的区别,哪一个硬件使用率最高,分别是行锁还是表锁
sql命令(增删查改,授权)
1. insert into 表(列1,列2,列3) values (?,?,? ) #插入
2. delete from 表 where 列=?; #删除
3. updata 表 set 列=? where 列=?; #修改
4. select * from 表; #查询
5. grant #授权
Linux系统
挂载,卸载,加入新用户
访问根文件系统外的文件通过挂载来实现。
mount #挂载
umunt #卸载
useradd #加入新用户
对Linux发行版本了解
Debian,Fedora,Kali Linux,Centos,Ubuntu。
文件系统类型与区别
- NTFS:支持超大单个文件,更好的安全性和稳定性。
- FAT32:是分区格式的一种,分区内无法存放大于4GB的单个文件
查看系统资源占用情况
top
查看cpu负载情况
1. top命令的load average可以知道cpu的负载情况
2. uptime
针对cpu负载情况设计合适的算法来做监控
查看磁盘的IO负载
iostat
查看硬盘使用率的命令
- 外部存储器(断电里面的信息还在):磁盘=硬盘+软盘
- 内部存储器(断电里面的信息就没有了):内存
- 查看磁盘使用率:df -h
- 查看硬盘分区:fdick -l
查看文件夹大小的命令
du -sh file
查看线程的命令
1.ps
2.top
查看网络连接数状态的命令,netstat,写出netstat显示的每一列内容
Active Internet connections (w/o servers)
#协议 接收队列 发送队列 本地地址 目的地址 状态
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 2 210.34.6.89:telnet 210.34.6.96:2873 ESTABLISHED
tcp 296 0 210.34.6.89:1165 210.34.6.84:netbios-ssn ESTABLISHED
tcp 0 0 localhost.localdom:9001 localhost.localdom:1162 ESTABLISHED
tcp 0 0 localhost.localdom:1162 localhost.localdom:9001 ESTABLISHED
tcp 0 80 210.34.6.89:1161 210.34.6.10:netbios-ssn CLOSE
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 1 [ ] STREAM CONNECTED 16178 @000000dd
unix 1 [ ] STREAM CONNECTED 16176 @000000dc
unix 9 [ ] DGRAM 5292 /dev/log
unix 1 [ ] STREAM CONNECTED 16182 @000000df
Apache的日志里面的格式,写脚本抓取耗时长的那一行
安全
数字签名与数字证书
- 数字签名=私钥加密(hash(信件)),保证消息完整性,不可抵赖性,防篡改冒充伪造。
- 数字证书=CA私钥加密(客户公钥+其他信息)
对渗透了解
对称加密与非对称加密,各自优缺点,应用场景
编程
C语言数组和链表的区别
- 数组是一组具有相同类型变量的集合,里面存放的变量称为数组的元素。
1.每个元素在内存中是连续存放的,如果需要插入一个元素,则需要移动后面的大量元素。
2.每个元素都有一个编号,叫做下标,通过下标可以快速找到某个元素。 - 链表在内存中不是顺序存储的,链表由多个节点连接而成,每个节点由数据域和指针域,指针域存放指向下一个节点的地址。
1.增加或者删除元素只需要修改指针就可以了。
2.想要寻找某个元素,需要从第一个元素开始,遍历链表。
总结:需要快速访问数据,很少插入或删除数据,则使用数组;若经常插入或删除数据,则使用链表。