美文网首页
interview question

interview question

作者: QYCD | 来源:发表于2021-12-14 15:28 被阅读0次
class方法与object_getClass方法有什么区别
  • 实例Class方法直接返回object_getClass(self)
  • 类Class方法直接返回self,而object_getClass(类对象),则返回的是元类
HTTP

HTTP(Hyper Text Transfer Protocol)协议构建于TCP/IP协议之上,是一个应用层协议,默认端口是80;

  • 允许传输任意类型的数据对象,正在传输的类型由Content-Type标记
  • 无连接 无连接的含义是限制每次连接只处理一个请求
  • 无状态 HTTP协议是无状态协议。指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传

HTTPS,Hyper Text Transfer Protocol Secure
HTTPS协议 = HTTP协议 + SSL/TLS协议
SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协议
TLS的全称是Transport Layer Security,即安全传输层协议
默认端口是443

三次握手

三次握手是指建立一个TCP连接时,需要客户端和服务器共发送3个数据包。

  1. 客户端向服务端发起请求链接,首先发送SYN报文,SYN=1,seq=x,并且客户端进入SYN_SENT状态
  2. 服务端收到请求链接,服务端向客户端进行回复,并发送响应报文,SYN=1,seq=y,ACK=1,ack=x+1,并且服务端进入到SYN_RCVD状态
  3. 客户端收到确认报文后,向服务端发送确认报文,ACK=1,ack=y+1,此时客户端进入到ESTABLISHED,服务端收到用户端发送过来的确认报文后,也进入到ESTABLISHED状态,此时链接创建成功

为什么需要三次握手?
为了防止已经失效的连接请求报文段突然又传送到了服务端,因而产生错误。
假设一种情况,有一个建立连接的第一次握手的报文段因为滞留到网络中过了较长时间才发送到服务端。这时服务器是要做ACK应答的,如果只有两次握手就代表连接建立,那服务器此时就要等待客户端发送建立连接之后的数据。而这只是一个因滞留而废弃的请求,就白白浪费了很多服务器资源。
另一个角度看,TCP是全双工的通信模式,需要保证两端都已经建立可靠有效的连接。
第一次握手: 服务器确认自己接收OK,服务端确认客户端发送OK
第二次握手: 客户端确认自己发送OK,客户端确认自己接收OK,客户端确认服务器发送OK,客户端确认服务器接收OK
第三次握手: 服务器确认自己发送OK,服务器确认客户端接收OK

只有握手三次才能达到全双工的目的: 确认自己和对方都能够接收和发送消息

四次挥手
  1. 客户端向服务端发起关闭链接,并停止发送数据
  2. 服务端收到关闭链接的请求,向客户端发送回应,表明自己接收到了客户端关闭连接的请求,但还没准备好关闭连接
  3. 服务器准备好关闭连接时,向客户端发送结束连接请求
  4. 客户端收到服务器的关闭请求,发送一个确认包
    服务器端接收到了确认包,关闭连接
    客户端等待了某个固定时间之后,没有收到服务器端的ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接

为什么挥手需要四次?
当服务器收到客户端的关闭请求时,很可能并不会立即关闭socket,所以只能先回复一个ack报文,告诉客户端【你发我fin我收到了】,只有等到服务端所有的报文都发送完了,才能发fin报文

HTTPS流程
  1. 客户端首次请求服务器,告诉服务器自己支持的协议版本,支持的加密算法及压缩算法,并生成一个随机数告知服务器
  2. 服务器确认双方使用的加密方法,并返回给客户端证书以及一个服务器生成的随机数
  3. 客户端收到证书后,首先验证证书的有效性,然后生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,发送给服务器
  4. 服务器接收到加密后的随机数后,使用私钥进行解密,获取这个随机数
  5. 服务器和客户端根据约定的加密方法,使用前面的三个随机数,生成对话秘钥,用来加密接下来的这个对话过程(对称加密)

为什么握手过程需要三个随机数,而且安全性取决于第三个随机数?
前两个随机数是明文传输,存在被拦截的风险,第三个随机数是通过证书公钥加密的,只有它是经过加密的,所以它保证了整个流程的安全性。前两个随机数的目的是为了保证最终对话密码的更加随机性。

冒泡排序
NSArray *arr = @[@1, @3, @5, @7, @2, @4, @6, @8];
    NSMutableArray *resArr = [NSMutableArray arrayWithArray:arr];
    NSNumber *num;
    for (int i = 0; i < resArr.count; i++) {
        for (int j = 0; j < resArr.count - 1 - i; j++) {
            if ([resArr[j] intValue] > [resArr[j+1] intValue]) {
                num = resArr[j];
                resArr[j] = resArr[j + 1];
                resArr[j + 1] = num;
            }
        }
    }
    NSLog(@"==%@", resArr);
打印:
==(
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8
)
为什么main函数能够保持一直存在且不退出?

在main函数内部会调用UIApplicationMain这样一个函数,而在UIApplicationMain内部会启动主线程的runloop,可以做到有消息处理时能够迅速从内核态到用户态的切换,立刻唤醒处理,而没有消息处理时通过用户态到内核态的切换进入等待状态,避免资源占用。因此main函数能够一直存在且不退出。

相关文章

网友评论

      本文标题:interview question

      本文链接:https://www.haomeiwen.com/subject/jscnxrtx.html