admin管理员组文章数量:1530517
1、ISO/OSI七层网络模型都有哪几层?每层分别是什么功能?每层有哪些协议或者设备?
-
应用层 (Application Layer)
-
功能:为计算机用户提供接口和服务。
-
-
协议:HTTP、FTP、SMTP、DNS
2.表示层 (Presentation Layer)
-
**功能:数据处理 负责图片视频编解码、加密和压缩 式的统一表示。
-
协议:ASCII、JPEG、MPEG等
3.会话层 (Session Layer)
-
功能:管理(建立,维护,重连)通信会话
-
协议:Sockets、RPC等。
4.传输层 (Transport Layer)
-
功能:管理端到端的通信连接
-
协议:TCP协议、UDP协议等。
5.网络层 (Network Layer)
-
功能:数据路由(决定数据在网络的路径)
-
协议:IP地址、路由器、IP协议、ICMP协议等
-
设备:路由器(Router)。
6.数据链路层 (Data Link Layer)
-
功能:管理相邻节点之间的数据通信
-
协议:Ethernet (IEEE 802.3), Token Ring (IEEE 802.5), PPP (点对点协议), HDLC (高级数据链路控制), ARP (地址解析协议) 等。
-
设备:网桥(Bridge)、交换机(Switch)等。
7.物理层 (Physical Layer)
-
功能:为数据端设备提供传送数据的通路。
-
协议/设备:无具体协议,但包括电缆、集线器、中继器等设备。
2、socket作为通信基石,其中包含通信必须的五种信息都是什么?
1.连接使用的协议
2.本地主机的IP地址
3.本地进程的协议端口
4.远地主机的IP地址
5.远地进程的协议端口
3、什么是CS模型?什么是BS模型?分别有什么特点?
CS即Client/Server(客户端/服务器)结构,(如电脑端下载的桌面应用 qq 微信等)
BS即Browser/Server(浏览器/服务器)结构,(如通过浏览器在线访问腾讯视频 访问qq微信)
特点:
CS:1.逻辑简单 2.多客户端支持3.响应速度快
BS:1.网络效率高2.可移植性强3.安全性高 4.可扩展性强5.维护和更新方便6.成本低
4、分别写出基于UDP和TCP协议的服务端和客户端收发数据的步骤
UDP
服务端:1.加载库2.创建套接字3.绑定ip 和端口号4.接收数据 5.发送数据 6.关闭套接字卸载库
客户端:1.加载库2.创建套接字3.绑定ip和端口号4.接收数据 5.发送数据 6.关闭套接字卸载库
TCP
服务端:1.加载库2.创建套接字3.绑定ip和端口号4.监听连接5.接受连接6.接受和发送数据7.关闭套接字卸载库
客户端:1.加载库2.创建套接字3.连接到服务端4.发送和接收数据 5.关闭套接字和卸载库
5、直接广播地址是多少?有限广播地址是多少?直接广播和有限广播的区别。
直接广播地址:主机号全为1,即有效的网络号和全为1的主机号
有限广播地址:32位全1的IP地址(255.255.255.255)
区别:
-
直接广播可以跨越路由器进行广播 有限广播不可以跨越路由器进行广播
-
直接广播可以向所有网络中的主机发送广播消息 有限广播智能在同一网络中向所有自助机发送广播消息
6、ARP协议的作用。在什么时候使用ARP协议?描述ARP协议的过程。
作用:将ip地址解析为mac物理地址,以便设备在同一 局域网内进行通信。
ARP协议的应用场景:
-
主机向本地网络中的其他主机发送数据包时
-
主机向本地网络中的路由器发送数据包时
-
路由器向本地网络中的主机发送数据包时
ARP协议的过程:
1.. 当一台设备需要与另一台设备通信时,设备会 在自己的ARP缓存中查找目标IP地址对应的 MAC地址。
-
如果缓存中有匹配项,设备直接使用MAC 地址进行通信。
-
如果缓存中没有找到匹配项,设备发送一个 ARP请求广播。
-
网络上的其他设备收到请求后,检查自己的 IP地址是否与目标IP地址匹配。
-
匹配的设备回应ARP应答,包含其MAC地 址。
-
请求设备收到ARP应答后,将IP地址和 MAC地址存入自己的ARP缓存中,以便下次使 用。
7、发送ARP广播时,如果目标主机在外网,怎么办?
当发送端广播ARP请求时,本地网络上不会有主机回应(因为ip地址是外网),此时路由器将会回应该请求,则发送源误认为路由器就是目的主机,会将报文全部转发给它,再由路由器转发报文到外网,则该路由器就被称为ARP代理。
8、什么是免费ARP?免费ARP有什么作用?
免费ARP(Gratuitous ARP) 是一种特殊的ARP(Address Resolution Protocol,地址解析协议)请求,由网络设备主动发出,用于告知网络中的其他设备某个IP地址与某个MAC地址之间的映射关系。
主机开机时,会发送一个目的IP为自己的Ip地址的请求报文
免费ARP的作用:
1.IP地址冲突检测
2.更新ARP缓存
3.快速收敛
4.通知其他设备IP地址可用
9、HTTP和HTTPS协议的区别。FTP是什么协议。DNS是什么协议。DHCP是什么协议。
HTTP与HTTPS的区别
1.端口号不同 http的端口号为80,https的端口号为443
2.安全性不同 http以明文的方式发送内容且没有提供任何形式 的数据加密功能,而https是在http的基础上引入了ssl协议,会更加的安全
3.连接 http连接是无状态的,https协议是由ssl+http协议构建的可进行加密传输,身份认证的网络协议
FTP是什么协议
FTP是一个用于文件传输的协议,允许用户从一台计算机上传和下载文件到另一台计算机。FTP使用两个并行的TCP连接:一个用于控制信息(通常使用21端口),另一个用于数据传输
DNS是什么协议
域名解析协议
端口号 53
原理 DNS服务器将记好的域名解析为ip地址
DHCP是什么协议
DHCP是一个网络管理协议,用于动态地分配IP地址和其他网络配置参数给网络上的设备。
使用UDP作为其传输层协议 端口号 67:服务器端 68:客户端
当设备(如计算机、打印机等)连接到网络时,DHCP服务器会自动为它们分配IP地址、子网掩码、默认网关、DNS服务器等参数。这样,设备就可以自动配置其网络设置,而无需手动配置每个设备
10、TCP和UDP分别是什么协议?有什么优缺点?分别适用于哪些场景?
TCP是一种面向连接的,可靠的,基于字节流的传输控制协议
UDP是一种无连接的用户数据报协议。
优缺点:
TCP:优点:1.数据可靠性高 2.数据传输有序 3.控制流量 缺点:1.开销大 2.实时性差 3.传输效率低
UDP: 优点:1.开销小 2.实时性好 3.传输效率高 缺点:1.不可靠 2.无流量控制
适用场景:
TCP:适用于要求可靠传输的应用,文件传输* *网页浏览** 电子邮件 数据库连接
UDP:适用于实时应用在线游戏 实时通信**实时音频和视频流**
11、分别描述什么是阻塞和非阻塞模式。Socket默认是什么模式?使用哪个函数设置改变socket的模式?
阻塞模式是指当程序执行一个任务时,会一直等待该任务完成后才能执行下一个任务。在这种模式下,如果某个操作需要等待(例如等待数据从网络到达),那么调用这个操作的线程将会被挂起,直到操作完成。在等待期间,线程不会执行其他任务,这可能导致CPU资源的浪费。
非阻塞模式与阻塞模式相反,它允许程序在执行一个任务时不必一直等待该任务完成,而是可以先去执行下一个任务。也就是说,如果某个操作需要等待,调用这个操作的线程不会被挂起,而是立即返回并继续执行后续代码。这样,程序可以在等待期间执行其他任务,从而提高了程序的并发性和效率。
Socket默认模式:
在大多数操作系统和编程环境中,Socket默认是阻塞模式**。这意味着当进行网络通信时,如果没有数据可读或可写,程序将会等待,直到有数据到达或可以发送数据。
设置改变Socket模式的函数:
在Linux系统中,可以使用fcntl()
函数或ioctl()
函数来改变Socket的模式。具体来说,可以使用fcntl()
函数结合F_SETFL
命令和O_NONBLOCK
标志来将Socket设置为非阻塞模式
12、分别描述一下发送函数的阻塞和非阻塞模式。
-
当
socket
处于阻塞模式时,继续调用send/recv
函数,程序会阻塞在send/recv
调用处 -
当
socket
处于非阻塞模式时,继续调用send/recv
函数,会返回错误
13、为什么说TCP协议是可靠稳定的?一共6点
-
三次握手建立连接:
-
TCP在传输数据之前,通过三次握手来建立连接。这确保了通信双方(客户端和服务器)都准备好且能够可靠地传输数据。
-
三次握手过程中,双方会交换序列号等信息,为后续的数据传输做好准备。
-
-
序列号与确认应答机制:
-
TCP为每个传输的字节分配一个唯一的序列号,这样接收端就能按照正确的顺序重新组装数据。
-
当接收端成功接收到数据后,会发送一个确认应答(ACK)给发送端,告知已接收到的最后一个字节的序列号。
-
这种机制确保了数据的完整性和顺序性。
-
-
超时重传机制:
-
如果发送端在一定时间内没有收到接收端的确认应答,它会认为数据可能已丢失或损坏,并会重新发送该数据段。
-
超时重传机制确保了数据的可靠性,即使在网络条件不佳的情况下也能保证数据的完整传输。
-
-
流量控制与滑动窗口机制:
-
TCP使用滑动窗口机制来实现流量控制,确保发送端不会发送过多的数据导致接收端缓冲区溢出。
-
接收端会告知发送端其当前可用的缓冲区大小(即窗口大小),发送端则根据这个窗口大小来发送数据。
-
这种机制有效避免了数据的丢失和拥塞。
-
-
拥塞控制机制:
-
TCP具有多种拥塞控制算法,如慢启动、拥塞避免、快重传和快恢复等。
-
这些算法旨在检测网络中的拥塞情况,并相应地调整发送速率,以避免网络拥塞导致的数据丢失和性能下降。
-
-
校验和机制:
-
TCP在传输数据之前会计算一个校验和,并在接收端进行验证。
-
如果接收端计算出的校验和与发送端的不一致,则说明数据在传输过程中可能已损坏,接收端会丢弃该数据段并要求重新发送。
-
校验和机制确保了数据的完整性和准确性。
-
14、某主机的网络地址(对外的ip地址) 怎么计算?
15、什么是MSS和MTU?RTT和RTO分别是什么意思?
MSS 是 TCP/IP 协议中的概念,指的是 TCP 协议在进行数据传输时,除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。MSS 并不是一成不变的,它通常根据对方机器返回的 TCP 选项中的 MSS 值来决定,也会受到链路层 MTU 的影响。当建立 TCP 连接时,双方会协商一个 MSS 值,这个值会被用于后续的 TCP 数据传输中。
TCP协议中数据段的最大尺寸
MTU 是数据链路层(如以太网)的概念,指的是链路层帧中数据字段的最大尺寸,也就是网络层数据报的最大长度。由于帧的头部信息长度是固定的,MTU 实际上限定了网络层数据报的最大长度。不同的网络类型可能有不同的 MTU 值。例如,以太网的最大传输单元是 1500 字节(包括 14 字节的以太网头部和 4 字节的 CRC 校验)。
RTT 往返延时 指数据包从发送到接收再到发送方接收确认的时间
RTT的组成:
1.链路的传播时间
2.末端系统的处理时间
3.路由器的缓存中的排队和处理时间
RTO 超时重传时间 指的是 TCP 协议在发送数据后等待确认(ACK)的超时时间。如果在这个时间内没有收到确认,那么 TCP 就会认为数据包可能丢失了,从而触发重传机制。一般取RTO = 2RTT
16、画出三次握手和四次挥手的交互流程,写清每个包是什么包,seq和ack的值分别是多少,每个状态。
三次握手
步骤
1.client端发送连接请求报文 序号为X
2.server 端接收连接后回复ACK报文,序号为Y ,确认号为X+1,并为这次连接分配资源
3.client 端接收到ACK报文后也向server端发送ACK报文,序号为X+1,确认号为Y+1,并分配资源,建立了TCP连接
四次挥手
步骤:
1.client发送一个FIN,用来关闭client到server的数据传送,client 进入FIN_WAIT状态 此时seq=u,ack=v+1
2.server收到FIN后,发送一个ACK给client,server进入CLOSE_WAIT状态 此时seq=v+1ack=u+1
3.server发送一个FIN,用来关闭server到client的数据传送,server进入LAST_ACK状态 seq=v+2 ack = u+1
4.client收到FIN后,client进入TIME_WAIT状态 发送ACK给server,server进入CLOSEED状态,完成四次挥手 seq=u+1 ack=v+3
四次挥手:
17、为什么是三次握手?不是两次也不是四次。
TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。
-
「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号,且容易收到攻击。 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。造成1.延迟和2.资源浪费**3.复杂性**
18、为什么被动断开方在接收到FIN报文后,没有立刻回复FIN报文?为什么要立刻回复ACK报文?
-
没有立刻回复FIN报文的原因:
-
TCP协议的四次挥手是一个有序的、双向的过程,用于确保双方都知道连接正在被关闭。在被动方收到FIN报文后,它知道主动方想要关闭连接,但这并不意味着被动方也立即想要关闭连接。被动方可能还需要处理一些未完成的事务或数据,因此不会立刻发送自己的FIN报文。
-
另外,从TCP状态迁移的角度来看,被动方在接收到FIN报文后,会进入CLOSE_WAIT状态,等待应用程序关闭连接。在应用程序关闭连接之前,被动方不会发送FIN报文。
-
2.立刻回复ACK报文的原因:
-
确认(ACK)报文是TCP协议中用于确认数据接收的重要机制。当被动方收到FIN报文时,它会立刻回复一个ACK报文,以确认收到了主动方的关闭连接请求。
-
这个ACK报文的确认号(Acknowledgment Number)会被设置为FIN报文中的序列号加1,表示被动方已经成功接收到了FIN报文之前所有的数据。
-
立刻回复ACK报文有助于加速连接的关闭过程,因为它可以让主动方知道被动方已经收到了关闭连接的请求,并开始进入TIME_WAIT状态,等待被动方的FIN报文。
被动断开方在接收到FIN报文后没有立刻回复FIN报文是因为它可能还需要处理一些未完成的事务或数据,并且它正在等待应用程序关闭连接。而立刻回复ACK报文是为了确认收到了主动方的关闭连接请求,并加速连接的关闭过程。
19、为什么主动断开方要等待2MSL再关闭?
-
确保旧连接的数据包完全消失:
-
当主动断开方发送了最后一个ACK报文并进入了TIME_WAIT状态时,等待2MSL的时间足以让网络中可能存在的、由于网络延迟等原因而滞后的旧连接数据包被丢弃。这样可以确保原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的,从而避免新旧数据包混淆造成的数据错乱问题。
-
-
保证被动关闭方能够正确关闭:
-
TCP协议通过ACK报文来确认数据的接收。等待2MSL可以确保主动断开方发送的最后一个ACK报文能够被被动关闭方接收,即使该ACK报文在网络中发生了延迟。如果被动关闭方没有收到这个ACK报文,它可能会重发FIN关闭连接报文。而主动断开方在TIME_WAIT状态下等待2MSL,就可以接收到这个重发的FIN报文并再次发送ACK,从而确保双方都能正确地关闭连接。
-
20、什么是心跳机制?什么场景下使用心跳机制?
1.什么是心跳机制:
每隔几分钟发送一个固定信息给服务器,服务端收到后回复一个固定信息。如果服务端几分钟内没有收到客户信c息则视为客户端断开
2.应用场景:
在长连接下,这个连接虽然一直保持连接的,但实际情况中,如果中间节点出现故障很难知晓 有的节点还会自动把一定时间之内没有数据交互的连接断掉 心跳包用于维持长连接,保证存活
21、为什么TCP协议会产生粘包问题?粘包问题有哪几种解决方法?每种解决方法分别有什么缺点?
粘包问题
TCP协议是一个面向流的协议,它不会区分应用程序发送的两次数据,而是将它们视为一个连续的数据流。当发送方连续发送多个数据包时,接收方可能会将这些数据包合并成一个大的数据包进行接收,这就是所谓的“粘包”问题。
解决办法
1.位置标识位(起始/结束标志位)
在每个包的开头设置标志位设置起始位
缺点:标注位是个特殊字符,如果数据中也包含了这个特殊字符,就会导致误判,另外如果发送方没有正确添加特殊字符,也会导致接收方无法正确区分数据包。
2.固定包大小
固定包大小的每个包都是固定的
缺点:包过大或过小 导致浪费空间或发送不了大数据
3.先发送数据长度,然后再发送数据包
如先发个int字节代表发送数据的大小,再发数据
缺点:比原来多了一个包 空间浪费和误判问题。
4.短链接
每次连接只发一个数据在断开连接,只有一个包就不会产生粘包现象
缺点:效率低
22、TCP的流量控制是怎么实现的?介绍一下原理。
如何实现:
通过接收方发回的确认报文(ACK)和动态调整的滑动窗口来实现,主要是接受方传递信息给发送方,使其不要发送数据太快,是一种端到端的控制。主要方法是返回的ACK中会包含自己的接收窗口的大小,它允许接收方根据其可用缓冲区大小来调整发送方的发送速率。
原理:
-
发送方向接收方发送数据段,并将其添加到发送缓冲区中。
-
接收方接收到数据段后,将其从接收缓冲区中取出,并发送ACK确认信号给发送方,同时返回当前窗口大小。
-
发送方收到ACK确认信号后,根据接收方返回的窗口大小和当前的拥塞窗口大小,决定下一次发送的数据段数量。
-
发送方重复以上步骤,不断调整发送速率,以适应网络的变化情况。
23、拥塞控制和流量控制有什么区别?收发双方第一次交换滑动窗口的大小在什么时候?
区别:拥塞控制是全局性,包含所有的主机和路由器 使用慢开始 拥塞窗口 快重传 快恢复
流量控制是端对端的,只控制发送端和接收端的窗口大小 使用滑动窗口
时候: TCP连接后的第一次数据传输时
拥塞控制:
目标:防止过多的数据注入网络,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
实现方式:
-
慢开始(Slow Start):发送方维持一个叫做拥塞窗口(cwnd)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。
-
拥塞避免(Congestion Avoidance):让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1。
-
快重传(Fast Retransmit)和快恢复(Fast Recovery):快重传要求接收方在收到一个失序的报文段后就立即发出重复确认,而不要等到自己发送数据时才进行捎带确认。快恢复算法与慢开始和拥塞避免算法配合使用,当网络拥塞出现时,使发送方的发送窗口由较大值直接下降到某个较小的值,并按照快恢复算法来执行。
流量控制:
目的:让发送方的发送速率不要太快,要让接收方来得及接收,防止发送方发送速率过快而导致接收方来不及接收数据从而造成数据丢失。流量控制是一个端到端的问题,仅与发送方和接收方的发送窗口和接收窗口的大小有关。
实现方式:
-
滑动窗口(Sliding Window):接收方在发送确认报文时,会将自己的接收窗口大小告诉发送方,发送方根据这个接收窗口的大小来控制自己的发送速率。
TCP连接建立后的第一次数据交换时,收发双方就会交换滑动窗口的大小信息。
24、TCP的拥塞控制算法有哪几种?说一下这几种算法在发送数据的时候怎么使用,什么场景下切换算法,可以画图表示。
1.慢开始:2.拥塞避免 3.快重传 4.快恢复
1.慢开始与拥塞避免
发送方维持一个叫做拥塞窗口cwnd的状态变量 拥塞窗口的大小取决于网络的拥塞程度,并且动态地变化.
发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接受能力,发送窗口可能小于拥塞窗口
慢开始算法思路
不要一开始就发送大量的数据,先探测一下网络的拥 塞程度,也就是说由小到大逐渐增加拥塞窗口的大 小。
为了防止cwnd增长过大引起网络拥塞,还需设置一个 慢开始门限ssthresh状态变量。ssthresh的用法如下: 当拥塞窗口<慢开始门限时,使用慢开始算法 当拥塞窗口>慢开始门限时,改用拥塞避免算法 当拥塞窗口=慢开始门限时,慢开始与拥塞避免算法任意。
拥塞避免算法让拥塞窗口缓慢增长 即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd+1而不是加倍 这样拥塞窗口按线性规律缓慢增长
慢开始加倍 拥塞避免加一
1.慢开始算法加倍 ,到达慢开始门限时, 开始拥塞避免一直加一 ,到大一定点会发生超时重传,如果发生了超时重传就将门限设置到超时拥塞窗口的一半 再将拥塞窗口的值减少为1 并重新开始执行慢开始算法
2.快重传:
发送方发送m2后 接收方确认收到m2 发送方发送m3 接收方未收到m3 则进行三次重复确认收到m2 发送方收到三个连续对m2的重复确认 立即重传m3
3.快恢复:
刚开始与慢开始一样经过慢开始和拥塞避免,遇到拥塞则触发快重传机制 将慢开始门限变为拥塞时的拥塞窗口的一半 拥塞窗口变为慢开始门限+3(ack=3)开始(cwnd = ssthresh +3)
25、介绍一下数据库的几种范式。
-
第一范式(1NF, First Normal Form)
-
每一列都是不可分割的原子项。
-
简单来说,就是数据库表的每一列都是不可再分的最小数据单元,即列中不能包含集合、数组等非原子数据项。
-
违反第一范式的数据库设计可能会导致数据冗余和更新异常。
-
-
第二范式(2NF, Second Normal Form)
-
满足第一范式(1NF)。
-
非主键列必须完全依赖于整个主键,而不能只依赖于主键的一部分。
-
如果存在复合主键(由多个列组成的主键),则非主键列必须依赖于整个复合主键,而不是只依赖于复合主键的某一部分。
-
第二范式旨在消除部分依赖带来的数据冗余和更新异常。
-
-
第三范式(3NF, Third Normal Form)
-
满足第二范式(2NF)。
-
非主键列之间不存在传递依赖关系。即,非主键列必须直接依赖于主键,而不是通过其他非主键列间接依赖于主键。
-
第三范式进一步消除了传递依赖带来的数据冗余和更新异常。
-
-
Boyce-Codd范式(BCNF, Boyce-Codd Normal Form)
-
BCNF是修正的第三范式,有时被认为是比3NF更严格的规范形式。
-
在BCNF中,所有非主属性对每一个候选键都是完全函数依赖的。
-
BCNF主要用于解决插入异常、删除异常和更新异常等问题。
-
-
第四范式(4NF, Fourth Normal Form)
-
4NF主要关注多值依赖(Multi-Valued Dependency, MVD)问题。
-
如果一个关系模式R(U,F)中,对于属性集X的任意子集Y,若Y非X决定,但Y对于R的每个超键都是独立的,则称关系模式R符合第四范式。
-
第四范式主要解决多值依赖带来的数据冗余和更新异常问题。
-
-
第五范式(5NF, Fifth Normal Form)
-
5NF也称为投影-连接范式(Project-Join Normal Form, PJNF)。
-
5NF是最高级别的范式,它要求关系模式中的每个连接依赖(Join Dependency, JD)都是不可约的。
-
第五范式主要用于解决连接依赖带来的数据冗余和更新异常问题。
-
26、聚合函数有哪几个
#查行数:count()
#select count(*) from student; select count(Ssex) from student;
#计算和:sum()
#计算01号同学的总成绩 select S,sum(score) 总成绩 from sc where S='01'; select S,sum(score) 总成绩 from sc where S='02';
#计算最大值:max()
#查询03课程的最大分数alter select C,max(score) from sc where C = '03';
#计算最小值:min()
#查询03课程的最小分数 select C,min(score) from sc where C ='03';
#计算平均值: avg()
#计算02同学的平均分
select C,avg(score) from sc where C = '02';
27、函数和存储过程的区别是什么?
区别: 1.函数有返回值:存储过程没有返回值 可以设置参数为out|inout类型返回数据 2.函数时操作数据的,不能有sql语句 存储过程可以有sql语句
28、什么是事务?事务的关键字是什么?事务有哪几种特性?每个特点解释一下
-
事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。
关键字:ACID
四大特性:
1.原子性(Atomicity):事务时作为最小工作单位,不可再分,要么全部成功,要么全部失败
2.一致性(Consistency):事务完成时,必须所有的数据都保持一致状态
3.隔离性(Isolation):多个并行执行的事务是隔离的,相互之间不影响
4.持久性(Durability):事务提交后,数据持久保持性能在本地
29、给aa文件创建一个符号连接文件xx和硬链接文件yy的命令分别是什么?符号连接和硬链接有什么区别?从原理、inode编号、链接计数器、删除源文件后的现象等几个方面进行描述。
符号连接
ln -s aa xx
硬链接
ln aa yy
区别:
-
原理:
-
符号链接:是一个独立的文件,其内容是另一个文件的路径名。当你访问一个符号链接时,系统会读取该链接文件的内容,然后按照指定的路径找到并访问原始文件。
-
硬链接:与原始文件在文件系统中是等价的。它们共享相同的inode和数据块。硬链接只是inode的一个额外引用,而不是一个独立的文件。
-
-
inode编号:
-
符号链接:有自己的inode编号,其内容是一个指向其他文件的路径字符串。
-
硬链接:与原始文件共享相同的inode编号。
-
-
链接计数器:
-
符号链接:不增加原始文件的链接计数(i_nlink)。
-
硬链接:每创建一个硬链接,原始文件的链接计数(i_nlink)就会增加1。
-
-
删除源文件后的现象:
-
符号链接:如果删除了原始文件
aa
,符号链接xx
仍然存在,但指向一个不存在的文件。尝试通过符号链接访问原始文件会导致错误。 -
硬链接:即使删除了原始文件
aa
的所有硬链接(除了yy
),只要还有一个硬链接(例如yy
)存在,文件的数据就不会被删除,仍然可以通过剩下的硬链接访问。只有当文件的链接计数减少到0时,文件的数据才会被删除。
-
-
跨文件系统:
-
符号链接:可以跨文件系统,因为它们只是包含路径的文本文件。
-
硬链接:不能跨文件系统,因为不同的文件系统有不同的inode表和数据块。
-
30、Makefile的优势是什么?makefile是怎么节省编译时间的?编译器是怎么判断哪个源文件被修改的?
优势:
1.重用性强,一次编译终身受益,可以反复使用在不同的项目中
2.便捷管理代码,不用每次都书写复杂的编译命令
3.节省编译时间(第一次编译的时候不能节省时间,空间换时间的方式节省编译时间)
如何节省编译时间:
-
多线程编译:
-
使用多线程编译是一种非常有效的提高编译速度的方法。
-
在Makefile中,可以通过设置
-j
选项来指定使用的线程数。例如,make -j4
将启用4个线程进行编译。 -
线程数的设置需要根据机器的CPU核心数、内存大小等硬件情况来进行调整,以达到最佳的编译效果。
-
多线程编译可以充分利用计算机资源,提高生产效率,并减少编译过程中的错误。
-
-
避免重复编译:
-
当修改了代码中的某些文件时,只有与这些文件相关联的目标文件需要重新编译。
-
Makefile中的依赖关系可以帮助避免重复编译。例如,如果目标文件
main.o
依赖于main.c
和header.h
,则只有当这两个文件有修改时,main.o
才会被重新编译。 -
在实际开发中,可以使用自动化构建工具(如CMake、Bazel等)来更好地管理依赖关系。
-
-
使用预编译头文件:
-
预编译头文件包含了大量的系统头文件和常用头文件,可以被缓存起来,以便在编译其他文件时直接使用。
-
使用预编译头文件可以减少编译时间,提高代码的编译速度。
-
在Makefile中,可以使用
-include
选项来指定预编译头文件。
-
-
优化代码结构:
-
将代码拆分成多个文件,每个文件只包含一个类或函数,可以使代码更加清晰、易于理解,并减少编译时间。
-
使用静态代码分析器和代码格式化器来检查代码是否符合编码规范,以保持代码的一致性和可读性。
-
-
指定编译器选项:
-
使用编译器优化选项(如
-O
)可以提高程序执行速度,并可能间接地减少编译时间(因为生成的代码可能更高效)。 -
在Makefile中,可以通过设置变量(如
CFLAGS
)来指定编译器选项。
-
-
分离头文件和源文件:
-
将头文件和源文件分离可以避免重复编译,因为只有当头文件更改时,相关的源文件才需要重新编译。
-
在Makefile中,可以通过指定不同的规则来处理头文件和源文件。
-
-
指定输出目录:
-
将目标文件存放在一个独立的目录中,可以避免编译产生的文件污染源代码目录,并提高编译的清洁度。
-
在Makefile中,可以使用变量来指定输出目录,并在编译规则中指定目标文件的输出路径。
-
如何识别出修改的源文件:
比较源文件的修改时间和.o文件的生成时间,源文件的修改时间更新,就说明生成之后又修改过了
31、发送函数阻塞和非阻塞有什么区别?分别写出在linux和windows下设置套接字阻塞和非阻塞的函数。
阻塞模式(Blocking Mode)
在阻塞模式下,如果发送函数无法立即发送数据(例如,因为目标主机不可达或网络缓冲区已满),它会暂停调用线程的执行,直到数据被成功发送或发生错误。这意味着调用线程在此期间不会被调度执行其他任务,直到发送函数返回。
非阻塞模式(Non-blocking Mode)
在非阻塞模式下,如果发送函数无法立即发送数据,它会立即返回一个错误码(如 EWOULDBLOCK
或 WSAEWOULDBLOCK
),而不会暂停调用线程的执行。这样,调用线程可以继续执行其他任务,并在稍后重试发送操作。
Linux
设置阻塞模式:
int flags = fcntl(sockfd, F_GETFL, 0); if (flags < 0) { perror("fcntl F_GETFL"); // 错误处理 } flags &= ~O_NONBLOCK; // 清除非阻塞标志 if (fcntl(sockfd, F_SETFL, flags) < 0) { perror("fcntl F_SETFL"); // 错误处理 }
设置非阻塞模式:
int flags = fcntl(sockfd, F_GETFL, 0); if (flags < 0) { perror("fcntl F_GETFL"); // 错误处理 } flags |= O_NONBLOCK; // 设置非阻塞标志 if (fcntl(sockfd, F_SETFL, flags) < 0) { perror("fcntl F_SETFL"); // 错误处理 }
windows
设置阻塞模式:
u_long mode = 0; // 0 表示阻塞模式 if (ioctlsocket(sockfd, FIONBIO, &mode) == SOCKET_ERROR) { int err = WSAGetLastError(); // 错误处理 }
设置非阻塞模式:
u_long mode = 1; // 1 表示非阻塞模式 if (ioctlsocket(sockfd, FIONBIO, &mode) == SOCKET_ERROR) { int err = WSAGetLastError(); // 错误处理 }
32、Linux文件IO函数有哪几个?哪些函数在什么场景下是阻塞函数?
1.open函数:
功能:打开文件,如果文件不存在则可以选择创建
int open(const char* pathname,int flags); int open(const char* pathname,int flags,mode_t mode);
2.close函数: 功能:关闭已打开的文件
int close(int fd);
3.read函数:
功能:从打开的设备或文件中读取数据
ssize_t read(int fd,const void* buf,size_t count);
4.write函数:
功能:把指定数目的数据写到文件
ssize_t write(int fd,const void *buf,size_t count);
5.lseek函数:
功能:移动文件读写指针的位置
off_t lseek(int fd,off_t offset,int whence);
阻塞函数场景:
-
当从阻塞IO设备或文件(如磁盘、串口)中读取数据时,如果设备或文件没有数据可读,read操作会阻塞,直到有数据可读或发生错误。
-
当向阻塞IO设备写入数据时,如果设备缓冲区已满,write操作可能会阻塞,直到有缓冲区空间可用或发生错误。
33、描述Linux文件系统读取文件的过程。Inode节点编号保存在什么地方?使用哪几个函数可以读取inode编号?
读取过程:
boot block 查看磁盘分区
GDT找inode table的起始位置
从inode table根据inode节点编号,通过偏移量(128*(n-1))找到想要的
读取文件属性,看是否有权限,通过数据块指针读取data block中的内容
-
Inode编号的保存位置:
-
Inode编号(或inode号)是文件系统中唯一标识inode的数字。这个编号通常保存在文件系统的元数据中,特别是inode结构本身。当文件被创建时,文件系统会为其分配一个inode,并生成一个inode号。
哪几个函数可以读取inode编号?
ls -i
命令:这个命令可以列出文件和目录的inode编号。stat()
和fstat()
系统调用:这些系统调用可以获取文件的详细属性,包括inode编号。 -
34、一个inode节点中有数据块指针60字节,一个地址是4字节,可以存15个地址指针,是怎么存储大文件的?
inode节点通过直接块、间接块、双间接块和三间接块的组合来存储大文件的地址指针。这种机制允许Linux文件系统支持非常大的文件,而不仅仅是受限于inode节点中直接存储的地址指针数量。
35、从Linux文件系统的原理分析,为什么永久删除的文件还能够复原?
1.索引节点与数据块:当一个文件被删除时,Linux系统并不立即删除文件的内容(即数据块),而是仅仅将Inode从文件系统的目录结构中移除,并将其标记为可重用状态。这意味着文件的数据块在磁盘上仍然存在,只是没有了与文件名的关联。
2.延迟删除机制:
-
Linux系统采用了一种称为“延迟删除”的机制。当用户删除一个文件时,系统并不立即释放该文件所占用的磁盘空间,而是将Inode和相关的数据块标记为空闲状态,等待后台进程(如垃圾回收进程)来清理这些空间。
3.文件恢复原理:
-
由于被删除文件的数据块仍然存在于磁盘上,只要这些数据块没有被新的文件覆盖,就可以使用专门的文件恢复工具来找回被删除的文件。这些工具通过扫描磁盘上的空闲数据块,并根据Inode和其他元数据信息来重建被删除文件的目录结构和内容。
主要是因为系统采用了索引节点与数据块分离的设计以及延迟删除的机制。
版权声明:本文标题:计算机网络+linux+数据库常见问题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1725925191a1049286.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论