每日八股文7.1
每日八股-7.1
- 网络
- 1.能说说 TCP 报文头部都包含哪些关键字段吗?
- 2.TCP 是如何确保数据传输的可靠性的?你能详细谈谈吗?
- 3.你能解释一下 TCP 滑动窗口是如何设计的?它主要解决了什么问题?
- 4.TCP 协议的拥塞控制是如何实现的?你能详细说说它的过程吗?
- 5.在 IP 地址 10.100.122.2/24 中,斜杠后面的数字 24 代表什么意思?
- 6.什么是 SQL 注入攻击?应该如何避免?
网络
1.能说说 TCP 报文头部都包含哪些关键字段吗?
TCP 头部包含了不少重要的字段。主要有源端口号和目的端口号,它们都是 16 位的,用来标识发送方和接收方的应用程序。然后是 32 位的序列号和 32 位的确认应答号,这两个字段对于保证数据的可靠性和顺序性非常关键。还有一些 控制位,比如 SYN 用于发起连接,ACK 用于确认,FIN 用于关闭连接,RST 用于重置连接等等。此外,头部还包括 4 位的首部长度,16 位的窗口大小用于流量控制,16 位的校验和用于数据完整性校验,以及一些可选字段。
2.TCP 是如何确保数据传输的可靠性的?你能详细谈谈吗?
TCP 为了保证数据传输的可靠性,采取了一系列关键措施。首先,在连接建立阶段,TCP 通过三次握手来确保双方都具备正常的发送和接收能力,并且能够防止旧的连接请求被误用。其次,在数据传输阶段,每个 TCP 报文都会被分配一个序列号,接收方可以根据序列号对乱序到达的数据包进行排序。同时,接收方会发送确认应答(ACK)来告知发送方已经成功接收到了哪些数据。
如果发送方在一定时间内没有收到某个数据包的确认应答,就会触发超时重传机制,重新发送丢失的数据包。另外,如果发送方连续收到三个相同的确认应答(冗余 ACK),发送方会立即进行快速重传,而无需等待超时。为了避免发送方发送过快导致接收方处理不过来,TCP 引入了流量控制机制,通过滑动窗口来限制发送方发送数据的速率。最后,为了避免网络出现拥塞,TCP 还实现了拥塞控制机制,通过慢启动、拥塞避免、拥塞发生和快速恢复等算法来动态调整发送速率,确保网络不会过载,从而保证数据的可靠传输。
3.你能解释一下 TCP 滑动窗口是如何设计的?它主要解决了什么问题?
TCP 的滑动窗口机制在发送方和接收方的内核中都维护着一个缓冲区,并且在这个缓冲区上定义了一个窗口。对于发送方来说,发送窗口的大小决定了在没有收到确认应答之前,可以连续发送的最大数据量。有了发送窗口,发送方就不需要每发送一个数据包就等待确认,可以批量发送,从而大大提高了发送效率。
对于接收方来说,接收窗口的大小表示了接收缓冲区当前可用的空间大小。接收方会将这个接收窗口的大小通过 ACK 报文告知发送方。这样,发送方就知道接收方的接收能力,从而可以根据接收方的窗口大小来调整自己的发送速率,避免发送过多的数据导致接收方处理不过来而丢包,这就是流量控制。总的来说,滑动窗口机制主要解决了串行发送-确认方式效率低下的问题,并实现了流量控制,保证了数据传输的可靠性。
4.TCP 协议的拥塞控制是如何实现的?你能详细说说它的过程吗?
TCP 的拥塞控制是通过一系列算法来实现的,主要包括慢启动、拥塞避免、拥塞发生时的处理(超时重传和快速重传)以及快速恢复。
-
慢启动: 连接建立初期,发送方以较低的速率发送数据,逐步探测网络的承载能力,指数级地增加发送窗口。
-
拥塞避免: 当发送窗口达到慢启动阈值后,发送窗口以线性方式缓慢增长,避免过快地填满网络。
-
当网络发生拥塞,可能会出现丢包。TCP 通过两种方式检测丢包:
- 一是超时重传,这种重传方式系统默认网络已经出现了严重阻塞,如果发送方在一定时间内没有收到 ACK,就会认为发生了拥塞,此时会将慢启动门限设置为当前拥塞窗口的一半,并将拥塞窗口重置为1,然后重新开始慢启动。
- 二是快速重传,这种方式系统默认网络出现了轻微阻塞,因为接收方还可以发送包,并且发送方还可以接收到;当发送方连续收到三个重复的 ACK 时,会认为发生了丢包,会立即重传丢失的报文,并进入快速恢复阶段。在快速恢复阶段,拥塞窗口会减半,然后每收到一个重复的 ACK,拥塞窗口会增加一个 MSS,当收到被重传的报文的 ACK 后,拥塞窗口会设置为当前的慢启动门限,然后进入拥塞避免阶段,继续线性增长。
这些机制使得 TCP 能够根据网络状况动态调整发送速率,避免网络过载。
5.在 IP 地址 10.100.122.2/24 中,斜杠后面的数字 24 代表什么意思?
在 IP 地址 10.100.122.2/24 中,斜杠后面的数字 24 表示的是子网掩码的位数。在 CIDR(Classless Inter-Domain Routing)表示法中,这个数字说明了子网掩码中前面有多少个连续的“1”。对于 /24 来说,它对应的子网掩码是 255.255.255.0,换算成二进制就是前 24 位是 1,后 8 位是 0。这个子网掩码的作用是用来划分 IP 地址中的网络部分和主机部分。前 24 位(10.100.122)是网络号,用于标识一个特定的网络,而后 8 位(2)是主机号,用于标识该网络中的一个特定设备。通过将 IP 地址和子网掩码进行与运算,就可以得到该 IP 地址所属的网络号。
6.什么是 SQL 注入攻击?应该如何避免?
SQL 注入攻击是指攻击者通过在 HTTP 请求中插入恶意的 SQL 代码,使得后端服务器在构建和执行 SQL 查询语句时,将这些恶意代码也当作正常的 SQL 命令来执行,从而达到窃取数据、修改数据甚至控制服务器的目的。
举个简单的例子,如果一个查询用户信息的接口通过拼接字符串的方式构建 SQL 语句,攻击者可以在传入的用户 ID 参数中加入恶意的 SQL 代码,比如 0 OR 1=1,这样就会导致查询返回所有用户的信息,造成数据泄露。更严重的,攻击者甚至可以注入 DROP TABLE 这样的语句来删除整个数据库。
为了预防 SQL 注入攻击,我认为可以采取以下几个关键措施:
最重要也是最有效的方法是 使用参数化查询或者预编译语句。这种方式会将 SQL 语句的结构和参数分开处理,用户输入的数据会作为参数传递给 SQL 语句,而不是直接拼接在 SQL 语句中。这样可以防止恶意代码被当作 SQL 命令来执行。
其次,需要对 用户输入的数据进行严格的验证和过滤。在后端接收到前端传递的参数后,要对其进行检查,确保输入的数据符合预期的格式和类型,并且移除任何可能包含恶意代码的部分。可以使用白名单机制来限制允许输入的内容。
最后,应该 遵循最小权限原则。在数据库中,应用程序使用的账户应该只被授予完成其工作所需的最小权限。这样即使发生了 SQL 注入攻击,攻击者能够进行的操作也会受到限制,从而减少损失。
总而言之,使用参数化查询或者预编译语句是防止 SQL 注入攻击最根本和最有效的方法。