太难了
网页中输入url,到渲染整个界面的整个过程,以及中间用了什么协议?
1)过程分析:主要分为三步
- DNS解析。用户输入url后,需要通过DNS解析找到域名对应的ip地址,有了ip地址才能找到服务器端。首先会查找浏览器缓存,是否有对应的dns记录。再继续按照操作系统缓存—路由缓存—isp的dns服务器—根服务器的顺序进行DNS解析,直到找到对应的ip地址。
- 客户端(浏览器)和服务器交互。浏览器根据解析到的ip地址和端口号发起HTTP请求,请求到达传输层,这里也就是TCP层,开始三次握手建立连接。服务器收到请求后,发送相应报文给客户端(浏览器),客户端收到相应报文并进行解析,得到html页面数据,包括html,js,css等。
- 客户端(浏览器)解析html数据,构建DOM树,再构造呈现树(render树),最终绘制到浏览器页面上。
2)其中涉及到TCP/IP协议簇,包括DNS,TCP,IP,HTTP协议等等。
具体介绍下TCP/IP
TCP/IP一般指的是TCP/IP协议簇,主要包括了多个不同网络间实现信息传输涉及到的各种协议
主要包括以下几层:
- 应用层:主要提供数据和服务。比如HTTP,FTP,DNS等
- 传输层:负责数据的组装,分块。比如TCP,UDP等
- 网络层:负责告诉通信的目的地,比如IP等
- 数据链路层:负责连接网络的硬件部分,比如以太网,WIFI等
TCP的三次握手和四次挥手,为什么不是两次握手?为什么挥手多一次呢?
客户端简称A,服务器端简称B
1)TCP建立连接需要三次握手
- A向B表示想跟B进行连接(A发送syn包,A进入SYN_SENT状态)
- B收到消息,表示我也准备好和你连接了(B收到syn包,需要确认syn包,并且自己也发送一个syn包,即发送了syn+ack包,B进入SYN_RECV状态)
- A收到消息,并告诉B表示我收到你也准备连接的信号了(A收到syn+ack包,向服务器发送确认包ack,AB进入established状态)开始连接。
2)TCP断开连接需要四次挥手
- A向B表示想跟B断开连接(A发送fin,进入FIN_WAIT_1状态)
- B收到消息,但是B消息没发送完,只能告诉A我收到你的断开连接消息(B收到fin,发送ack,进入CLOSE_WAIT状态,A进入FIN-WAIT-2状态)
- 过一会,B数据发送完毕,告诉A,我可以跟你断开了(B发送fin,进入LAST_ACK状态,A进入TIME-* WAIT状态)
- A收到消息,告诉B,可以他断开(A收到fin,发送ack,B进入closed状态)
3)为什么挥手多一次
其实正常的断开和连接都是需要四次:
- A发消息给B
- B反馈给A表示正确收到消息
- B发送消息给A
- A反馈给B表示正确收到消息。
但是连接中,第二步和第三步是可以合并的,因为连接之前A和B是无联系的,所以没有其他情况需要处理。而断开的话,因为之前两端是正常连接状态,所以第二步的时候不能保证B之前的消息已经发送完毕,所以不能马上告诉A要断开的消息。这就是连接为什么可以少一步的原因。
4)为什么连接需要三次,而不是两次。
正常来说,我给你发消息,你告诉我能收到,不就代表我们之前通信是正常的吗?
- 简单回答就是,TCP是双向通信协议,如果两次握手,不能保证B发给A的消息正确到达。
TCP 协议为了实现可靠传输, 通信双方需要判断自己已经发送的数据包是否都被接收方收到, 如果没收到, 就需要重发。
TCP是怎么保证可靠传输的?
- 序列号和确认号。比如连接的一方发送一段80byte数据,会带上一个序列号,比如101。接收方收到数据,回复确认号181(180+1),这样下一次发送消息就会从181开始发送了。
所以握手过程中,比如A发送syn信号给B,初始序列号为120,那么B收到消息,回复ack消息,序列号为120+1。同时B发送syn信号给A,初始序列号为256,如果收不到A的回复消息,就会重发,否则丢失这个序列号,就无法正常完成后面的通信了。
这就是三次握手的原因。
还好努力没有白费,复习了3个月+面试1个多月总算拿下了字节offer,年薪52K人生巅峰有没有!
开门红
你好,非常高兴地通知你,通过了面试评估和讨论,我们诚挚地邀请你加入字节跳动…
不管你是小白还是工作已经有三五年的铁铁们,不管你是刚经历了金九银十还是即将要预备2021年的金三银四,都应该好好的看一下这份资料,它非常的全面,几乎涵盖了所有的技术伐~
话不多说,这份资料分成4大部分,包括(技术PDF+面试真题+视频解析+面试技术指导):
Android架构师成长笔记:
其中包括了有基础知识、Java集合、JVM、多线程并发、 Handler、Activity相关、Fragment、service、布局优化、AsyncTask相关、设计模式、Android 事件分发机制、 Binder、Android 高级必备 :AMS,WMS,PMS、Glide、 Android 组件化与插件化等面试题和技术栈!已经帮很多人拿下互联网一线公司的offer。共有31个知识点。
由于pdf文档里的细节内容实在过多所以只编辑了部分知识点的章节粗略的介绍下,每个章节小节点里面都有更细化的内容!以下就是部分章节目录,由于头条的篇幅限制目录上的详细讲解也无法一一列出,关注+点赞后,私信【面试】即可获取以下章节的所有详细知识讲解。
JAVA基础
首先肯定是Java基础复习,学习和工作上都用得上,Java基础学得好,就像盖房子一样打地基,基础不牢,地动山摇。
Android 知识点汇总
很多人在工作中不断的遇到瓶颈,想研究新的技术,却发现自己的基础不扎实,无法深入理解某一项技能的原理问题。这就需要大家能在工作之余稳固一下自己的基础知识了。有了比较完善的基础积淀才能事半功倍。
Android 高级必备-知识点
AIDL、 Binder、多进程、View的绘制流程、事件分发、消息队列等。这类知识对于定位自己为高级 Android工程师的人来说是必须掌握的,同时他也是能鉴别高级和初中级工程师的一块试金石,其中 binderAndroid是系统进程间通信最重要的手段之一,现阶段app的发展离不开多进程的运用,经常会启动例如定位、推送等需要在后台开启动的进程来来保证主进程的内存运行;所以合理的使用多进程也是十分必要的;view的绘制是我们自定义控件的理论基础,只有掌握了view是如何绘制的才能个性化的自定义控件;事件分发一直是 Android开发的难点之一,也是必须掌握的.
Android高级工程师必备技能- 开源库源码分析
得意于众多项目和第三方库的开源,开发中使用几行代码即可实现复杂的功能,但使用只是源码库的搬运工 ,源码中真正牛逼的技术并不属于我们, 所以对源码和开源库的学习成了Android开发者提升技能的必经之路, 笔者也曾经认真学习了常用开源框架的原理和实现,足以在开发和面试中的问题,就此以为掌握了源码(有没有同道?)
直到有一天自己去编写库,当面对框架设计、任务调度、任务并发、线程切换、缓存、文件等系列问题时,才发现自己的不足 , 也在反思自己的学习深度; 其实框架中很多知识和代码都是经过时间的验证和优化过的,如:Glide的缓存、okhttp拦截实现、Retrofit的注解等,其细节完全可以帮助解决开发中的类似问题,源码的思想固然重要,但细节优秀的实现同样不容忽视,这里给出笔者总结的开源框架的学习方法:
设计模式
优化代码的第一步、开闭原则、里氏替换原则、依倒置原则、接口隔离原则、迪米特原则、单例模式、 Builder模式、原型模式、工厂方法模式、象工厂模式策略模式、状态模式、责任链模式、解释器模式、命模式、观察者模式、备忘录模式、代器模式模板方法模式、访问者模式、中介者模式,代理模式、组合模式、适配器模式、装饰模式、享元模式、外观模式、桥接模式,以及MC的介绍与实战和MVP应用架构模式。
每个章节都对某个模式做入分析,并且会对模式相关的技术点进行深入拓展,让大家在掌模式的同时学习到 Android中的些重要知识,通过实战助大家达到学以致用的目的,且能够将模式运用于中,开发出高质后的程序。
计算机网络部分
网络一直是项目里比较重要的一个模块,Android 开源项目上出现过很多优秀的 网络框架。从一开始只是一些对 HttpClient 和 HttpUrlConnection 简易封装使 用的工具类,到后来 Google 开源的比较完善丰富的 Volley,再到如今比较流行的 Okhttp、Retrofit。他们之间存在异同,这个系列主要想通过对网络基础知识、 Android 网络框架的解析来理清他们的关系以及原理。
算法与数据结构部分
程序员应该知道:程序 = 数据结构 + 算法(Program = Data Structure + Algorithm )。 作为一个程序员,如果不了解数据结构和算法,应该会不太好意思出门跟人家打 招呼。 在这个课程里,我会带大家以循序渐进、轻松幽默的形式从入门到精通数据结构 和算法,相信我们会度过一段非常愉快的时光。 你会发现,入门数据结构和算法,其实一点都不难。
未来趋势-Flutter
Flutter 依赖一个 Skia 2D 图形化引擎。Skia 也是 Android 平 台和 Chrome 的底层渲染引擎,所以性能方面完全不用担心。因为使用 Dart 做 AOT 编译成原生,自然也比使用解释性的 JS 在 V8 引擎中执行性能更快,并且 因为去掉 Bridge,没有了繁琐的数据通信和交互,性能就更前进了一步。
面试真题
原来面试官问题的时候,他认为自己答得对,面试官却反复让确认,到最后自己也疑惑了:到底哪里不对呢?
相信跟他一样,到面试问题就出来了的朋友不在少数,归根究底还是对java基础、计算机基础、数据结构与算法、第三方源码、并发编程等内容不够了解。我们都知其然而不知其所以然,所以会有很多面试失败的原因也就在这,无论工作还是面试,问题只多不少,多刷题无疑是无害的。这部分重点面试分析讲解,内容如下:
视频解析
看视频的核心是理解常用的,那些不常用的不要去纠结,因为你们目前的知识储备过少,还不足以你去深刻理解,理解不透就容易忘,直接快速跳过,有个概念就行了,到了后面做大型综合项目才是最重要的,做项目的时候自然而然就懂了,因为每天都是看着别人手敲代码,自己不懂也懂了。
面试指导
篇幅有限,无法一个问题一个答案的展示(这些资料均已整理在了这套面试通关必备的文件里),觉得有需要的码友们,麻烦各位帮忙点个赞(可以帮助更多的人看到哟!),即可获得免费下载的方式!!
最后
我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。
其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。
不断奔跑,你就知道学习的意义所在!