面试总结-字节跳动抖音部门

tcp udp区别

        1:tcp面向连接(三次握手),udp面向无连接

        2:tcp只支持单播,即点对点的双端传输;udp还支持多播和广播

        3:tcp面向字节流传输(不保留报文边界),udp以一个个单独的报文进行传输

        4:tcp可靠传输(按包序号按序接收并逐个发ACK确认,发送端在往返延时(RTT)未收到确认就进行重发)

        5:tcp会进行拥塞控制,当网络出现拥塞时,降低速率,缓解拥塞

        6:tcp全双工通信


http和https区别

        1:https需要到ca申请证书

        2:http明文传输,https加密传输     

        3:http端口80,https端口443


https加密过程

        1:客户端对服务器发出请求,服务器返回证书(公钥)

        2:客户端收到证书后对证书进行验证(SSL/TLS)

        3:验证通过后生成一个随机值,然后用公钥进行加密生成密钥,发送给服务器

        4:服务器收到密钥后用私钥进行解密获得随机值

        5:服务器将需要发送的信息和随机值混在一起进行对称加密,发送给客户端

        6:客户端用密钥解密后获得信息       


http缓存机制

        http缓存分为两种:强制缓存和协商缓存。首先浏览器发送请求之前会根据Expired和Cache-Control判断是否命中强制缓存,命中的话直接读取本地缓存,否则向服务器发送请求,然后根据Last-Modified和ETag判断是否命中协商缓存,如果命中,从缓存获取资源,否则从服务器获取资源。

1:强制缓存

        强制缓存是一种无需服务器验证的缓存策略,用响应头中的Expired/Cache-Control来表明规则。

        Expired表示过期时间,从服务器获取到资源后Expired时间(单位秒)后失效。

        Cache-Control可以有多个字段组合而成(max-age/s-maxage/public/private/no-cache/no-store)

2:协商缓存

        浏览器的缓存到期之后,可能服务器的资源并没有发生改变,这个时候需要与服务器进行缓存验证来确认是否需要继续使用本地缓存。

        浏览器在第一次获取资源后会把数据和响应头部的缓存表示存起来,下次请求数据时带上If-Modified-Since(即上次的时间)发送给服务器,服务器如果返回304即代表资源未发生改变,继续使用缓存即可,否则返回200代表资源已发生改变,需要使用新资源。

        判断资源是否发生改变是基于ETag进行判断的,服务器会为资源生成一个hash值,每次资源发生改变时会改变这个值。


linux系统进程间通信方式

        管道、共享内存、socket、信号、消息队列、信号量


什么是管道通信

shell中,经常需要将一个程序的输出给到另一个程序,因此而产生了管道的概念,管道本质上是文件,前一个程序将内容写入文件,后一个程序再去读取。实现上并不占用磁盘和存储空间,用的是内存空间。所以管道就是一个操作方式为文件的内存缓冲区。管道分为匿名管道(PIPE)和命名管道(FIFO)。


binder和上述linux进程间通信优势在哪里

上述进程间通信方式都需要进行两次的内存拷贝,即进程1用户空间->系统内核空间, 系统内核空间->进程2用户空间,在android中,为了提升性能,节省宝贵的系统资源,便诞生了新的通信方式binder,binder本意为胶水,粘合剂,而binder做的事情也正如其名。binder中,首先将数据从进程1的用户空间拷贝到系统内核空间,然后将此内核空间和进程2进行内存映射,进程2直接访问内核空间中的同一块内存。


进程与线程的区别

进程是资源分配的最小单位,线程是CPU调度的最小单位;进程有自己的内存,线程共享内存;一个进程挂掉不影响其它进程,一个线程挂掉会导致整个进程挂掉;进程间数据共享比较复杂,线程间比较方便。


为什么用protobuf,与xml和json相比有什么优势

        1:序列化之后体积更小

        2:向后兼容性更强,可以灵活的升级定义的内容

        3:序列化和反序列化速度更快

        4:编译器自动生成class,不必专门设计解析器


EventBus原理和缺点

3.0版本以前根据方法名进行匹配,3.0版本开始使用注解。


下载大文件,分三个线程下载,下载完合并,你会用什么方式做


volatile原理以及如何做到的防止指令重排


什么是可重入锁


JNI静态注册和动态注册


事件传递的过程,从手指触摸屏幕开始说起

Handler的postDelay()如何保证精准度


算法:二叉树的层序遍历,输出为List<List<Integer>>

        Leetcode-二叉树的层序遍历

禁止转载,如需转载请通过简信或评论联系作者。