欢迎光临!请记住我的域名:http://wish123.cnblogs.com
代码改变世界

常见问题问答

2023-04-09 18:53  wish123  阅读(71)  评论(0编辑  收藏  举报

1. Promise底层原理

promise是一种用于处理异步操作的javascript对象,底层原理基于回调函数、事件监听和状态机等技术。在promise对象创建时,会初始化一个状态,通常有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)。

当使用promise封装的异步操作成功完成时,promise状态将变为fulfilled;如果发生错误,则状态将变为rejected。在这两种情况下,promise都会触发相应的回调函数。

在promise代码中,通过使用then()方法来添加回调函数。如果promise对象状态为fulfilled,则执行第一个回调函数;如果状态为rejected,则执行第二个回调函数。catch()方法用于捕获异常,并执行对应的回调函数。

promise的优势在于可以解决回调**问题,避免嵌套的回调函数造成代码难以读取和维护的问题。同时,它还可以更好地控制异步操作的流程和结果,提高代码质量和可读性。

 

2. PHP中,为什么需要pack和unpack?网络传输中为什么要将二进制数据与字符串之间进行转换?

在PHP中,pack和unpack是用于将二进制数据与字符串之间进行转换的两个函数。

pack函数

pack函数可以将数据打包成二进制字符串。它需要两个参数:第一个参数是一个格式字符串,用于指定打包后数据的格式;第二个参数是一个数组,包含要打包的数据。

例如,如果要将一个整数和一个浮点数打包成二进制字符串,可以这样使用pack函数:

php复制代码
$data = pack("if", 123, 3.14);

在上面的代码中,"if"表示要打包一个整数(i)和一个浮点数(f),123和3.14分别是要打包的数据。打包完成后,$data变量将保存一个二进制字符串。

unpack函数

unpack函数可以将二进制数据解包成一个数组。它需要两个参数:第一个参数是一个格式字符串,用于指定解包后数据的格式;第二个参数是要解包的二进制数据。

例如,如果要将上面打包的二进制字符串解包成一个数组,可以这样使用unpack函数:

php复制代码
$array = unpack("iint/ffloat", $data);

在上面的代码中,"iint/ffloat"表示要解包两个整数(iint)和一个浮点数(ffloat)。data是要解包的二进制数据。解包完成后,data是要解包的二进制数据。解包完成后,array变量将保存一个关联数组,其中键名为解包指令字符串中的名称,值为对应的解包数据。

在网络传输中,数据的存储和传输必须以二进制形式进行,因为计算机处理和存储数据时使用的是二进制系统。而字符串则是一种人类可读的形式,用于表示文本或其他符号。因此,在网络传输中,需要将二进制数据转换成字符串格式,以便于人们查看和理解。

另一方面,当我们在网络上传输字符串数据时,为了确保数据的正确性和完整性,也需要将字符串数据转化为可以被计算机读取和处理的二进制格式。这是因为网络传输中的数据容易受到干扰和损坏,例如数据包丢失、延迟、重复等问题,因此需要采用各种技术来保证数据的准确性,如校验和、crc 等技术。

综上所述,网络传输中二进制数据与字符串之间的转换是为了充分利用计算机和人类的优势,使得数据能够在网络环境下流畅地传输和处理。

 

3. 如果局域网中的客户端计算机访问远程服务器,那么远程服务器只能获取到客户端局域网中的网关IP吗?

是的,如果局域网中的客户端计算机访问远程服务器,那么远程服务器只能获取到客户端局域网中的网关ip。这是因为在一个局域网中,所有的客户端计算机共享同一个公共 ip 地址,并且通过本地路由器或网关与外部网络通信。当客户端计算机访问远程服务器时,请求首先发送到路由器或网关,然后由路由器或网关转发到远程服务器。对于远程服务器来说,它只看到请求来自于局域网中的网关ip地址,而无法知道实际发起请求的客户端计算机的ip地址。

 

4. 网络传输中,由于使用了cdn等代理服务器,后端只能拿到代理服务器的IP,后端又怎么能获取到真正的客户端IP呢?

在服务器局域网中,后端服务器获取到的都是代理服务器的IP,但代理服务器把数据包在转发给内部计算机时,通常会带上x-forwarded-for等头信息,后端服务器通过获取这些字段可以获取到真正的IP。

 

5. 网段划分?子网掩码和IP,如何区分是否同一个网段?

网段是怎么划分的?通常把IP分为网络段和主机段,比如192.168.1.0/24,表示前3段(即字节)是网络位,后1段为主机位,这个24就代表子网掩码为255.255.255.0,因IP由32位组成的,所以前3段总计为24,所以24代表前3段。

那如果子网掩码255.255.254.0是如何标识网络位的呢?

255.255.254.0也可以用/23表示,在二进制中,子网掩码255.255.254.0为11111111 11111111 11111110 00000000,前面的23位是网络位,最后9位是主机位。

因此,该子网掩码可以支持2^9(或512)个主机,同时支持2^23(或8388608)个网络。

那么子网掩码255.255.252.0,多少位网络地址,多少位IP地址?

因为255.255.252.0可以用/22表示,“/22”表示了有22位是网络地址,剩下10位是主机地址。因此,这个子网掩码中有22位用于网络地址,剩下10位用于ip地址。

因此,这个子网掩码可以支持2^22个网络地址,也就是4194304个网络,每个网络中最多可以拥有2^10个ip地址,即1024个ip地址。

那么怎么区分是同一个网段呢?网络地址相同即为同一个网段,不同就不是同一个网段。

好了,举个实际例子

一个公司有530台电脑,组成一个对等局域网,子网掩码和IP设多少最合适?

我们知道一个C类IP段最多254(2^8-2)台主机,那么只能使用B类地址,那B类地址拿出几位作为主机地址呢,假设用后9位,那么2^9是512位,显示不够,再借1位,10位呢?显然2^10=1024够了。所以主机位应该是10位,那么网络位就是32-10=22位,那么网络掩码就是/22,即255.255.252.0。

那么我们知道,根据规定B类网络位只有21位可用,需要再向B类主机位借1位当做网络位,那么IP地址的范围是10101100.00010000.00000000.0000001 ~ 10101100.00010000.01111111.11111111即172.16.0.1 ~ 172.16.127.254之间共计1022个IP地址,当然用172.16.0.1 ~ 172.16.3.254之间也行(共530个),但最好预留一部分IP地址,推荐172.16.0.1 ~ 172.16.127.254之间。

当然,如果不借用B类IP地址主机位,直接使用B类地址也行,只不过这样B类地址一共有65534个IP,会造成一定的IP地址浪费罢了。

所以,本题的答案就是172.16.0.1-172.16.127.254之间的IP,子网掩码是255.255.252.0,通常写作172.16.0.1/22-172.16.127.254/22。

再举个例子

一个C类地址 192.168.2.0/26,该网络可以划分几个子网?每个子网可容纳多少台主机?

/26说明一共使用26位作为网络段,由于c类前3字节是网络段,共有24位,这里26位网络段,说明c类的主机位有2位被借用了(即划分了2个子网),所以主机位还剩余6位,那么6位有多少个主机位呢?显然是2^6-2=62位,所以答案是该网络可以划分2子网,每个子网可容纳62台主机。

参考:

ip地址分为5类:A类、B类、C类、D类、E类。

 

类别
最大可用网络数
可用IP地址范围
单个网段最大可用主机数
私有IP地址范围
A
126(2^7-2)
1.0.0.1-127.255.255.254
16777214
10.0.0.0-10.255.255.255
B
16384(2^14)
128.0.0.1-191.255.255.254
65534
172.16.0.0-172.31.255.255
C
2097152(2^21)
192.0.0.1-223.255.255.254
254
192.168.0.0-192.168.255.255

私有ip为什么以10,172.16,192.168开头呢?这就是规定,哈哈。这些数字都是由IETF分配的,以确保它们在全球范围内是唯一的,并且它们只能用于本地网络中。

ip范围为什么是0-127,128-191,192-223开头呢?

这是因为A类必须以0开头,所以前8位还剩7位即0-127,它的网络位只有1字节,又由于全0是本机,全1是广播,所以可用的网络个数有126位。

同理B类必须以10开头,所以前8位只能从128开头,191结尾,但它由于用2字节表示网络位,所以可用网络个数有16384个。

C类以110开头,所以前8位只能是192开头,223结尾,但它由于用3字节表示网络位,所以可用网络个数有2097152个。

 

以下是ChatGPT的回答:

网络划分的作用:

划分网段的作用是为了更好地管理和组织网络中的ip地址,并提高网络的性能和安全。以下是一些划分网段的作用:

  1. 提高网络性能:划分网段可以减少广播域的大小,从而减少网络流量和冲突,提高网络的性能和可靠性。

  2. 改善网络管理:划分网段允许管理员更好地组织、管理和监视网络资源,例如服务器、路由器、交换机等。

  3. 增加网络安全性:通过划分网段来隔离应用程序和服务,可以降低攻击者的攻击面,增强网络安全性。

  4. 方便移动设备管理:划分网段可以为不同类型的设备或用户提供不同的网络配置,使移动设备能够更轻松地加入和离开网络。

  5. 节约ip地址:通过精心设计网络拓扑结构,可以最大限度地利用有限的ip地址。

总之,划分网段是为了更好地管理和组织网络资源,提高网络性能和安全性,以及节省ip地址。

子网掩码是用于将一个ip地址划分为网络地址和主机地址的掩码。它的作用是:

  1. 确定ip地址中哪些部分表示网络地址,哪些部分表示主机地址。

  2. 对同一子网内的主机进行区分,将其归入相应的子网中。

  3. 确定两个主机是否在同一子网内,以便进行数据的传输。

  4. 控制ip地址的分配,使得网络地址和主机地址能够合理地利用。

例如,假设一个局域网使用ip地址192.168.1.0/24,其中“/24”表示子网掩码为255.255.255.0。这意味着前三个数字192.168.1是网络地址,最后一个数字可以用来表示该子网内的不同主机。如果有两个主机的ip地址分别是192.168.1.10和192.168.1.20,那么它们就在同一个子网内,可以直接通信。而如果一个主机的ip地址是192.168.1.10,另一个主机的ip地址是192.168.2.20,则它们就属于不同的子网,需要通过路由器进行通信。

要确定两个ip地址是否在同一个网络段中,请使用以下步骤:

  1. 检查它们的网络地址(也称为“网络号”)。网络地址是指通过应用子网掩码从一个ip地址中提取出来的共同部分。例如,如果ip地址是192.168.0.100,子网掩码是255.255.255.0,则网络地址是192.168.0.0。

  2. 比较两个ip地址的网络地址。如果它们相同,则这两个ip地址在同一个网络段中。

  3. 如果网络地址不同,那么这两个ip地址不在同一个网络段中。在这种情况下,您需要进一步检查它们的路由器或交换机之间的连接方式和配置,以确定它们之间的通信方式。