Showing Posts From

面试

iOS面试总结(2020年6月)

都说今年互联网行情很差,作为被大家喊了好几年“iOS开发没人要了”的iOS行情更差。那真实情况是什么样的呢,以我的经历给大家分析下。应某个朋友建议,去掉这一句啊,目前iOS岗位还是挺多的,你可以这么想只要苹果爸爸不倒,iOS开发就不会没人要。但另一方面,招聘方对iOS开发的要求是在不断提高的,我们不能固步自封,满足现状,只有不断学习,不断进步,才能保持自身竞争力。 我的面试的阶段基本都在6月份,准备的阶段则要再往前推个半个月吧。期间约到了不少一二线互联网公司面试机会,前期由于准备不足也错失了一些机会,在之后的面试中不断总结经验,越来越有信心了,最终选择了爱奇艺。整体来看求职情况还算可以,不是很好但也不是很差,其中会带有一定运气成分,所以要换工作的话一定不要裸辞。 这里总结下这段时间的面试经历和一些心得,后面会附上期间遇到的面试题,大家可以尝试作答一下。求职准备 如果确定了想要换工作就应该为求职做准备了。 知识准备 在确定了换工作的想法之后,我们就应该为面试做准备了。在回顾知识点的时候我建议分类去梳理:OC语法,Runtime,Runloop,多线程,性能优化等,这些是优先级高的内容,其次是网络知识,数据结构与算法等计算机通识知识。 有一本书非常推荐:《Objective-C高级编程》,建议精读。 开源库的话看Runtime(最新为可编译799.1版本)吧,把类的定义,Runloop,weak,Autoreleasepool相关的代码都看下。 网络的知识点可以参考我的那篇:iOS面试备战-网络篇。数据结构与算法,按照类别刷个几十题应该能应付大多数情况了,iOS面试一般不会有太难的算法题。 简历 简历是求职的第一步,也是你能否获得面试机会的敲门砖,我们一定要好好打磨下。下面是我在脉脉上看到的HR在筛选简历时主要关注的点:我在今年3月份的时候尝试投过几次简历,并没有太好的结果,后来进行了一些调整优化。6月份再投的时候相对好了些,陆续收到了些回应。本人之前并没有大厂经历,不是一流本科,但也能收到不少大厂的面试机会,所以我感觉自己的简历内容还是起到了一定的作用的。如果想参考我简历的话,可以关注公众号:「iOS成长之路」,回复:简历,进行下载。 上面有提到“高光时刻”,可以理解成亮点。怎么让自己的简历跟同能力水平的求职者不同,那就是找到属于我们的亮点。有一个建议,我们在写简历时,可以刻意夸大自己的能力,或者写我们想成为的样子,再之后我们就对着简历让这些内容一一实现,让它们变成自己的亮点。一定要注意不能只吹牛,不落实,因为被发现“造假”可是很严重的。 简历投递 以我的经历来说,相对靠谱的简历投递方式有:Boss直聘、脉脉、内推。 需要注意的是,Boss直聘和脉脉只有别人联系你,你再投递,反馈率才会高一些。如果是你主动联系的招聘方,那大概率是不会收到回应的。推测很多企业并没有很多的招聘岗位也会把招聘信息挂在上面,这种时候HR是不会关注投递的简历的。这也是为什么能看到很多人晒出投递上百个简历确一个回应的都没有的情况,不要气馁,这不一定代表你能力不行。 等招聘者联系是相对被动的,主动出击会更有效。那就是寻找内推,一般公司内推都有奖励的,所以公司内部人员都乐意去发布职位获取内推人选。脉脉,掘金,V2EX,一些知名公众号都能发现不少内推岗位,我们可以自己去挖掘。 面试流程 目前互联网公司大部分是2轮技术面+1轮HR,或三轮技术面+1轮HR。目前的面试形式多为视频面试,也有些是电话面试。视频面试的话,如果是通过Zoom,企业微信,钉钉等一般是不考察手写代码的。如果是通过牛客网,一般是会考察手写代码的。对于手写代码,仅有算法题会要求准确性,可运行,对于设计类题目,我们写出伪代码即可。 如果到了HR轮基本说明我们已经通过了面试,如果确定入职,接下来就是背调,薪资证明,学历证明,入职体检等一系列操作。 面试题 以下是我面试过程中遇到的面试题,其中网络和多线程问题已经分成两篇单独讲解了,这里就去除了这两部分。 Swift 因为我最近两年多一直在用Swift,面试开始的自我介绍环节,我也会着重提这一点。但是很不幸,我得到的答案基本都是:面试主要考察OC。这也说明了大部分公司对Swift态度还是非常保守的,所以除非招聘信息里写了要求Swift技能,否则我们是没有必要专门准备Swift相关面试的。 当然面试过程中也遇到了几个Swift问题: 1、Swift中struct和class有什么区别? 2、Swift中的方法调用有哪些形式? 3、Swift和OC有什么区别? 4、从OC向Swift迁移的时候遇到过什么问题? 5、怎么理解面向协议编程? OC语法 1、Block是如何实现的?Block对应的数据结构是什么样子的?__block的作用是什么?它对应的数据结构又是什么样子的? 2、GCD中的Block是在堆上还是栈上? 3、NSCoding协议是干什么用的? 4、KVO的实现原理 5、NSOperation有哪些特性比着GCD有哪些优点,它有哪些API? 6、NSNotificaiton是同步还是异步的,如果发通知时在子线程,接收在哪个线程? UI 1、事件响应链是如何传递的? 2、什么是异步渲染? 3、layoutsubviews是在什么时机调用的? 4、一张图片的展示经历了哪些步骤? 5、什么是离屏渲染,什么情况会导致离屏渲染? 6、CoreAnimation这个框架的作用什么,它跟UIKit的关系是什么? 引用计数 1、ARC方案的原理是什么?它是在什么时候做的隐式添加release操作? 2、循环引用有哪些场景,如何避免? 3、为什么当我们在使用block时外面是weak 声明一个weakSelf,还要在block内部使用strong再持有一下? 4、Autoreleasepool是实现机制是什么?它是什么时候释放内部的对象的?它内部的数据结构是什么样的?当我提到哨兵对象时,会继续问哨兵对象的作用是什么,为什么要设计它? 5、哪些对象会放入到Autoreleasepool中? 6、weak的实现原理是什么?当引用对象销毁是它是如何管理内部的Hash表的?(这里要参阅weak源码) Runtime 1、消息发送的流程是怎样的? 2、关联对象时什么情况下会导致内存泄露? 3、消息转发的流程是什么? 4、category能否添加属性,为什么?能否添加实例变量,为什么? 5、元类的作用是什么? 6、类方法是存储到什么地方的?类属性呢? 7、讲几个runtime的应用场景 Runloop 1、讲一下对Runloop的理解? 2、可以用Runloop实现什么功能? 性能优化 1、对TableView进行性能优化有哪些方式? 2、Xcode的Instruments都有哪些调试的工具? 3、讲一下你做过的性能优化的事情。 4、如何检测卡顿,都有哪些方法? 5、缩小包体积有哪些方案? 计算机相关 1、项目编译的流程是什么?手机上的应用程序自点击图标开始到首屏内容展示都经历了哪些步骤? 2、对于基本数据类型,一般是存储到栈中的,它有没有可能存在堆上,什么情况下会存储到堆上? 3、数据库中的事务是什么意思? 4、使用过什么数据库(我回答的Sqlite,Realm),Realm在使用时有哪些注意事项,如何实现批量操作? 5、LRU算法是否了解,如何实现一套LRU算法? 6、知道哪些设计模式,怎么理解设计模式的作用? 7、如果有1000万个Int类型的数字,如何对他们排序? 8、设计一套数据库方案,实现类似微信的搜索关键词能快速检索出包含该字符串的聊天信息,并展示对应数量(聊天记录的数据量较大)。 简历相关问题 1、Lottie实现动画效果的原理是什么? 2、OClint实现静态分析的原理是什么,它是如何做到的? 3、MVVM和MVC有什么区别? 4、静态库和动态库的区别是什么? 5、了解Flutter吗?它有没有使用UIKit?它是如何渲染UI的? 6、二进制重排的核心依据是什么? 7、如何设计一套切换主题的方案? 8、AVPlayer和IJKPlayer有什么区别?用IJKPlayer如何实现一个缓存视频列表每条视频前1s的内容? 9、类似微博的短视频列表,滑动停留播放,如何实现? 10、使用python做过哪些事?如何理解脚本语言? 数据结构与算法 1、什么是Hash表,什么是Hash碰撞,解决Hash碰撞有什么方法? 2、如何遍历二叉树? 3、简述下快速排序的过程,时间复杂度是多少? 4、有一个整数数组,如何只遍历一遍就实现让该数组奇数都在前面,偶数都在后面? 5、假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 6、给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。leetcode 7 7、有红、黄、蓝三种颜色的气球。在牛客王国,1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票。 2个红气球+1个黄气球可以兑换1个蓝气球。 2个黄气球+1个蓝气球可以兑换1个红气球。 2个蓝气球+1个红气球可以兑换1个黄气球。 现在牛牛有a个红气球,b个黄气球, c个蓝气球,牛牛想知道自己最多可以兑换多少张彩票。 软技能 1、做过哪些工作职责之外的事情? 2、经历过最难的一次业务开发是什么样的,最终怎么解决的? 3、最近有学习什么新技术吗?有何收获? 4、你最擅长iOS哪方面的知识?怎么体现出来的? 5、常用哪些开源库,有没有研究过他们的原理? 6、如何保持个人成长? 流程型问题 流程性问题基本都会包含下面四个,最好提前准备好 1、请做下自我介绍。 2、你有什么问题要问我的吗? 3、为什么离职? 4、对下份工作的期望是什么样的? 这些问题看似不起眼,但其实还挺重要的,很有可能面试官就是通过这几个问题决定了要不要你通过面试。 自我介绍就不说了,简明扼要介绍自己近几年的经历和成绩就行,控制在一分钟以内。 第二个,最好不要直接说没有问题了,提问面试官是我们整个面试过程中少有的掌握主动权的时刻,它可以体现我们自主思考的能力。最好提前了解下公司和招聘需求,准备几个问题,或者面试过程中提出我们产生的一些疑问。 离职原因,这个如实回答即可,只要不说是因为钱或者跟领导同事不和基本都没有问题。 下份工作的期望,这个就看各自的需求吧。 总结 通过这些面试题,我们可以看出一些端倪。 1、面试官更喜欢“刨根问底”,对着一个概念不断的往深处延展,不断深入的问。这类问题会有很大的区分度,第一问第二问第三问难度逐次提高,用于筛选不同的面试者。这也提醒我们某些知识点不光要知道原理,还要知道为什么这么设计,这么设计的好处是什么。 2、问题范围更全面化,特别是二面时,问题不再局限于iOS端,而是更通用的计算机方向问题,这个需要我们平常多积累;还有就是开始重视个人软技能,学习能力和上进心。 3、围绕简历,还记得上面说过写简历时要吹牛逼吗。在面试的时候一定要把他们成为自己真正掌握的知识。 4、注重软技能,这个比前面几条作用稍微小些,但是如果被问到了,而我们也有很好的贴合点,那绝对就是加分项。我的一次经历是,当我向面试官说自己有写博客的习惯,他问我是否知道medium,我说知道,还翻译过几篇里面的文章,接着说了些我理解的国内外博客平台的现状分析。这种情况就属于加分项了。 另外面试是一次考察自己知识掌握程度的考核,考的好能提升自己自信心,考的不好可以帮助我们定位自身问题,不管怎么说都是不亏的。面试还可以帮助我们了解市场行情,薪资待遇,自身竞争力,流行技术栈等一系列情况。所以真的建议即使不考虑换工作,每年固定时间也可以出去面试几次。

iOS面试备战-网络

计算机网络是计算机科学与技术专业的必修课,也是移动端,前端,后端都会涉及到的知识点,同时它也是iOS面试中大概率会出现的问题。所以准备面试的话,网络相关的知识点一定不能错过。这里总结了一些我认为有用的和最近面试遇到的网络相关知识点。 去年写过一篇《图解TCP/IP》总结的文章,也可以对着看下。 计算机网络是如何分层的 网络有两种分层模型,一种是ISO(国际标准化组织)制定的OSI(Open System Interconnect)模型,它将网络分为七层。一种是TCP/IP的四层网络模型。OSI是一种学术上的国际标准,理想概念,TCP/IP是事实上的国际标准,被广泛应用于现实生活中。两者的关系可以看这个图:注:也有说五层模型的,它跟四层模型的区别就是,在OSI模型中的数据链路层和物理层,前者将其作为两层,后者将其合并为一层称为网络接口层。一般作为面试题的话都是需要讲出OSI七层模型的。 各个层的含义以及它们之间的关系可以看这张图:Http协议 http协议特性HTTP 协议构建于 TCP/IP 协议之上,是一个应用层协议,默认端口号是 80 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 无状态:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传。请求方法GET:请求获取Request-URI标识的资源,请求参数附加在url上,明文展示。POST:在Request-URI所标识的资源后附加新的数据,常用于修改服务器资源或者提交资源到服务器。POST请求体是放到body中的,可以指定编码方式,更加安全。HEAD:请求获取由Request-URI所标识的资源的响应消息报头。PUT:请求服务器存储一个资源,并用Request-URI作为其标识。DELETE:请求服务器删除Request-URI所标识的资源。TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断。OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求。请求和响应报文 以该链接为例:https://zhangferry.com/2019/08/31/diagram_tcpip_concepts/ 在Chrome查看其请求的Headers信息。 General这里标记了请求的URL,请求方法为GET。状态码为304,代表文件未修改,可以直接使用缓存的文件。远程地址为185.199.111.153:443,此IP为Github 服务器地址,是因为我的博客是部署在GitHub上的。 除了304还有别的状态码,分别是:200 OK 客户端请求成功 301 Moved Permanently 请求永久重定向 302 Moved Temporarily 请求临时重定向 304 Not Modified 文件未修改,可以直接使用缓存的文件。 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。 401 Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因 404 Not Found 请求的资源不存在,例如,输入了错误的URL 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。Response Headers:content-encoding:用于指定压缩算法 content-length:资源的大小,以十进制字节数表示。 content-type:指示资源的媒体类型。图中所示内容类型为html的文本类型,文字编码方式为utf-8 last-modified:上次内容修改的日期,为6月8号 status:304 文件未修改状态码 注:其中content-type在响应头中代表,需要解析的格式。在请求头中代表上传到服务器的内容格式。 Request Headers::method:GET请求 :path:url路径 :scheme:https请求 accept:通知服务器可以返回的数据类型。 accept-encoding:编码算法,通常是压缩算法,可用于发送回的资源 accept-language:通知服务器预期发送回的语言类型。这是一个提示,并不一定由用户完全控制:服务器应该始终注意不要覆盖用户的显式选择(比如从下拉列表中选择语言)。 cookie:浏览器cookie user-agent:用户代理,标记系统和浏览器内核 更多请求头的字段含义可以参考这里:HTTP headers TCP三次握手和四次挥手的过程以及为什么要有三次和四次 在了解TCP握手之前我们先看下TCP的报文样式:其中控制位(Control Flag)标记着握手阶段的各个状态。TCP三次握手 示意图如下:三次握手是指建立一个TCP连接时,需要客户端和服务器总共发送3个数据包。 1、第一次握手(SYN=1, seq=x) 客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。 发送完毕后,客户端进入 SYN_SEND 状态。 2、第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1) 服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。 3、第三次握手(ACK=1, ACKnum=y+1) 客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1 发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。 问题一:为什么需要三次握手呢? 在谢希仁著的《计算机网络》里说,『为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误』。怎么理解呢,我们假设一种情况,有一个建立连接的第一次握手的报文段因为滞留到网络中过了较长时间才发送到服务端。这时服务器是要做ACK应答的,如果只有两次握手就代表连接建立,那服务器此时就要等待客户端发送建立连接之后的数据。而这只是一个因滞留而废弃的请求,是不是白白浪费了很多服务器资源。 从另一个角度看这个问题,TCP是全双工的通信模式,需要保证两端都已经建立可靠有效的连接。在三次握手过程中,我们可以确认的状态是: 第一次握手:服务器确认自己接收OK,服务端确认客户端发送OK。 第二次握手:客户端确认自己发送OK,客户端确认自己接收OK,客户端确认服务器发送OK,客户端确认服务器接收OK。 第三次握手:服务器确认自己发送OK,服务器确认客户端接收OK。 只有握手三次才能达到全双工的目的:确认自己和对方都能够接收和发送消息。 TCP四次挥手 示意图如下:四次挥手表示要发送四个包,挥手的目的是断开连接。 1、第一次挥手(FIN=1, seq=x) 假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。 发送完毕后,客户端进入 FIN_WAIT_1 状态。 2、第二次挥手(ACK=1,ACKnum=x+1) 服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。 发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。 3、第三次挥手(FIN=1,seq=y) 服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。 发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。 4、第四次挥手(ACK=1,ACKnum=y+1) 客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。 服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。 客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。 问题一:为什么挥手需要四次呢?为什么不能将ACK和FIN报文一起发送? 当服务器收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端『你发的FIN我收到了』。只有等到服务端所有的报文都发送完了,才能发FIN报文,所以要将ACK和FIN分开发送,这就导致需要四次挥手。 问题二:为什么TIMED_WAIT之后要等2MSL才进入CLOSED状态? MSL是TCP报文的最大生命周期,因为TIME_WAIT持续在2MSL就可以保证在两个传输方向上的尚未接收到或者迟到的报文段已经消失,同时也是在理论上保证最后一个报文可靠到达。假设最后一个ACK丢失,那么服务器会再重发一个FIN,这是虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK。 ###HTTPS的流程 HTTPS = HTTP + TLS/SSL,它的建立可以用以下示意图表示:1、客户端首次请求服务器,告诉服务器自己支持的协议版本,支持的加密算法及压缩算法,并生成一个随机数(client random)告知服务器。 2、服务器确认双方使用的加密方法,并返回给客户端证书以及一个服务器生成的随机数(server random) 3、客户端收到证书后,首先验证证书的有效性,然后生成一个新的随机数(premaster secret),并使用数字证书中的公钥,加密这个随机数,发送给服务器。 4、服务器接收到加密后的随机数后,使用私钥进行解密,获取这个随机数(premaster secret 5、服务器和客户端根据约定的加密方法,使用前面的三个随机数(client random, server random, premaster secret),生成『对话密钥』(session key),用来加密接下来的整个对话过程(对称加密)。 有一篇由浅入深介绍HTTPS的文章可以阅读一下:看图学HTTPS 问题一:为什么握手过程需要三个随机数,而且安全性只取决于第三个随机数? 前两个随机数是明文传输,存在被拦截的风险,第三个随机数是通过证书公钥加密的,只有它是经过加密的,所以它保证了整个流程的安全性。前两个随机数的目的是为了保证最终对话密钥的『更加随机性』。 问题二:Charles如何实现HTTPS的拦截? Charles要实现对https的拦截,需要在客户端安装Charles的证书并信任它,然后Charles扮演中间人,在客户端面前充当服务器,在服务器面前充当客户端。 问题三:为什么有些HTTPS请求(例如微信)抓包结果仍是加密的,如何实现的?我在聊天过程中并没有抓到会话的请求,在小程序启动的时候到是抓到了一个加密内容。我手动触发该链接会下载一个加密文件,我猜测这种加密是内容层面的加密,它的解密是由客户端完成的,而不是在HTTPS建立过程完成的。 另外在研究这个问题的过程中,又发现了一些有趣的问题:1、图中所示的三个https请求分别对应三个不同类型的图标,它们分别代表什么意思呢? 感谢iOS憨憨的回答。 第一个图标含义是HTTP/2.0,第二个图标含义是HTTP/1.1,第三个图标加锁是因为我用charles只抓取了443端口的请求,该请求端口为5228,所以不可访问。 2、第三个请求https://mtalk.google.com:5228图标和请求内容都加了锁,这个加锁是在https之上又加了一层锁吗? 这些问题暂时没有确切的答案,希望了解的小伙伴告知一下哈。 DNS解析流程 DNS(Domain name system)域名系统。DNS是因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户通过域名访问到对应的服务器(IP地址)。具体的解析流程是这样的: 1、浏览器中输入想要访问的网站域名,操作系统会检查本地hosts文件是否有这个网址的映射关系,如果有就调用这个IP地址映射,完成域名解析。没有的话就走第二步。 2、客户端回向本地DNS服务器发起查询,如果本地DNS服务器收到请求,并可以在本地配置区域资源中查到该域名,就将对应结果返回为给客户端。如果没有就走第三步。 3、根据本地DNS服务器的设置,采用递归或者迭代查询,直至解析完成。其中递归查询和迭代查询可以用如下两图表示。 递归查询 如图所示,递归查询是由DNS服务器一级一级查询传递的。迭代查询 如果所示,迭代查询是找到指定DNS服务器,由客户端发起查询。DNS劫持 DNS劫持发生在DNS服务器上,当客户端请求解析域名时将其导向错误的服务器(IP)地址。 常见的解决办法是使用自己的解析服务器或者是将域名以IP地址的方式发出去以绕过DNS解析。 Cookie和Session的区别 HTTP 是无状态协议,说明它不能以状态来区分和管理请求和响应。也就是说,服务器单从网络连接上无从知道客户身份。 可是怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。Cookie:Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,实际上Cookie是服务器在本地机器上存储的一小段文本,并随着每次请求发送到服务器。Cookie技术通过请求和响应报文中写入Cookie信息来控制客户端的状态。Session:Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。当有用户请求创建一个session时,服务器会先检查这个客户端里是否已经包含了一个Session标识(session id),如果有就通过session id把session检索出来。如果没有就创建一个对应此Session的session id。这个session id会在本次响应中返回给客户端。两者有以下区别: 1、存储位置:Cookie存放在客户端上,Session数据存放在服务器上。 2、Session 的运行依赖 session id,而 session id 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie ,同时 Session 也会失效 3、安全性:Cookie存在浏览器中,可能会被一些程序复制,篡改;而Session存在服务器相对安全很多。 4、性能:Session会在一定时间内保存在服务器上,当访问增多,会对服务器造成一定的压力。考虑到减轻服务器压力,应当使用Cookie CDN CDN(Content Delivery Network),根本作用是将网站的内容发布到最接近用户的网络『边缘』,以提高用户访问速度。概括的来说:CDN = 镜像(Mirror) + 缓存(Cache) + 整体负载均衡(GSLB)。 目前CDN都以缓存网站中的静态数据为主,如CSS、JS、图片和静态网页等数据。用户在从主站服务器请求到动态内容后再从CDN上下载这些静态数据,从而加速网页数据内容的下载速度,如淘宝有90%以上的数据都是由CDN来提供的。 CDN工作流程 一个用户访问某个静态文件(如CSS),这个静态文件的域名假如是www.baidu.com,而这个域名最终会被指向CDN全局中CDN负载均衡服务器,再由这个负载均衡服务器来最终分配是哪个地方的访问用户,返回给离这个访问用户最近的CDN节点。之后用户就直接去这个CDN节点访问这个静态文件了,如果这个节点中请求的文件不存在,就会再回到源站去获取这个文件,然后再返回给用户。参考:深入理解Http请求、DNS劫持与解析 Socket socket位于应用层和传输层之间:它的作用是为了应用层能够更方便的将数据经由传输层来传输。所以它的本质就是对TCP/IP的封装,然后应用程序直接调用socket API即可进行通信。上文中说的三次握手和四次挥手即是通过socket完成的。 我们可以从iOS中网络库分层找到BSD Sockets,它是位于CFNetwork之下。在CFNetwork中还有一个CFSocket,推测是对BSD Sockets的封装。WebRTC WebRTC是一个可以用在视频聊天,音频聊天或P2P文件分享等Web App中的 API。借助WebRTC,你可以在基于开放标准的应用程序中添加实时通信功能。它支持在同级之间发送视频,语音和通用数据,从而使开发人员能够构建功能强大的语音和视频通信解决方案。该技术可在所有现代浏览器以及所有主要平台的本机客户端上使用。WebRTC项目是开源的,并得到Apple,Google,Microsoft和Mozilla等的支持。 如果某一请求只在某一地特定时刻失败率较高,会有哪些原因 这个是某公司二面时的问题,是一个开放性问题,我总结了以下几点可能: 1、该时刻请求量过大 2、该地的网络节点较不稳定 3、用户行为习惯,比如该时刻为上班高峰期,或者某个群体的特定习惯 如果有对网络方面比较熟悉的小伙伴也可以补充。