Java_Android笔试、面试知识整理

本文档使用 Gitbook 制作,主要内容包括 Java/Android/ios 方向的同学在找工作时遇到的笔试面试题目,Github 仓库地址,欢迎 Fork 。所有引用内容版权归原作者所有。
展开查看详情

1. 目 录 致谢 简介 计算机基础 计算机网络 网络分层 底层网络协议 TCP IP HTTP 面试题 数据结构与算法 树 Hash 最小生成树算法 最短路径算法 KMP算法 查找算法 排序算法 常用算法 面试题 操作系统 计算机体系结构 操作系统基础 并发 内存管理 磁盘与文件 Linux系统 中断 设备管理 面试题 数据库系统 事务 索引 本文档使用 书栈(BookStack.CN) 构建 - 1 -

2. SQL语句 连接 面试题 Java基础 面向对象基础 运算符优先级 集合框架 Java分派机制 Java异常 Java泛型 Java线程 JVM架构 类加载器 JVM类加载三步走 JVM垃圾回收 Java对象生命周期 Volatile原理 Synchronized原理 ConcurrentHashmap Threadlocal原理 RxJava 面试题 Android开发 Android系统架构 Activity && Service生命周期 Activity四种启动模式 ListView原理及优化 Android中Handler机制 Android广播机制 View绘制过程 Canvas使用 事件分发机制 Binder 性能优化 本文档使用 书栈(BookStack.CN) 构建 - 2 -

3. 推送机制 进程保活 Activity、View及Window之间关系 EventBus OkHttp Intent 版本问题 面试题 本文档使用 书栈(BookStack.CN) 构建 - 3 -

4.致谢 致谢 当前文档 《Java / Android 笔试、面试 知识整理》 由 进击的皇虫 使用 书栈 (BookStack.CN) 进行构建,生成于 2018-03-11。 书栈(BookStack.CN) 仅提供文档编写、整理、归类等功能,以及对文档内容的生成和导出工 具。 文档内容由网友们编写和整理,书栈(BookStack.CN) 难以确认文档内容知识点是否错漏。如 果您在阅读文档获取知识的时候,发现文档内容有不恰当的地方,请向我们反馈,让我们共同携手, 将知识准确、高效且有效地传递给每一个人。 同时,如果您在日常生活、工作和学习中遇到有价值有营养的知识文档,欢迎分享到 书栈 (BookStack.CN) ,为知识的传承献上您的一份力量! 如果当前文档生成时间太久,请到 书栈(BookStack.CN) 获取最新的文档,以跟上知识更新换 代的步伐。 文档地址:http://www.bookstack.cn/books/interview 书栈官网:http://www.bookstack.cn 书栈开源:https://github.com/TruthHun 分享,让知识传承更久远! 感谢知识的创造者,感谢知识的分享者,也感谢每一位阅读到此处的 读者,因为我们都将成为知识的传承者。 本文档使用 书栈(BookStack.CN) 构建 - 4 -

5.简介 简介 简介 使用 目录 简介 本文档使用 Gitbook 制作,主要内容包括 Java/Android/ios 方向的同学在找工作时遇到的笔 试面试题目,Github 仓库地址,欢迎 Fork 。 所有引用内容版权归原作者所有。 使用 本文档使用 Gitbook 制作,相关 Gitbook 的配置和使用参考 这里 仓库说明。 如果需要转换成 pdf 文档,需要另外安装 Calibre用来将文档转换为 pdf 格式。 在 Windows 下安装完 Calibre 最好先重启一次,然后就可以进行转换了。 目录 计算机基础 计算机网络 网络分层 底层网络协议 TCP IP HTTP 面试题 数据结构与算法 树 Hash 最小生成树算法 最短路径算法 KMP算法 查找算法 排序算法 常用算法 本文档使用 书栈(BookStack.CN) 构建 - 5 -

6.简介 面试题 操作系统 计算机体系结构 操作系统基础 并发 内存管理 磁盘与文件 Linux系统 中断 设备管理 面试题 数据库系统 事务 索引 SQL语句 连接 面试题 Java基础 面向对象基础 运算符优先级 集合框架 Java分派机制 Java异常 Java泛型 Java线程 JVM架构 类加载器 JVM类加载三步走 JVM垃圾回收 Java对象生命周期 Volatile原理 Synchronized原理 ConcurrentHashmap Threadlocal原理 RxJava 面试题 Android开发 Android系统架构 Activity && Service生命周期 Activity四种启动模式 ListView原理及优化 Android中Handler机制 本文档使用 书栈(BookStack.CN) 构建 - 6 -

7.简介 Android广播机制 View绘制过程 Canvas使用 事件分发机制 Binder 性能优化 推送机制 进程保活 Activity、View及Window之间关系 EventBus OkHttp Intent 版本问题 面试题 本文档使用 书栈(BookStack.CN) 构建 - 7 -

8.计算机基础 计算机基础 计算机基础 计算机基础 本文档使用 书栈(BookStack.CN) 构建 - 8 -

9.计算机网络 计算机网络 Introduction Introduction 本文档使用 书栈(BookStack.CN) 构建 - 9 -

10.网络分层 网络分层 网络分层 OSI 网络分层 OSI 层 功能 网络进程到应用程序。针对特定应用规定各层协议、时序、表示等,进行封装 。在端 应用层 系统中用软件来实现,如HTTP等 数据表示形式,加密和解密,把机器相关的数据转换成独立于机器的数据。规定数据 表示层 的格式化表示 ,数据格式的转换等 主机间通讯,管理应用程序之间的会话。规定通信时序 ;数据交换的定界、同步,创 会话层 建检查点等 传输层 在网络的各个节点之间可靠地分发数据包。所有传输遗留问题;复用;流量;可靠 在网络的各个节点之间进行地址分配、路由和(不一定可靠的)分发报文。路由( 网络层 IP寻址);拥塞控制。 数据链 一个可靠的点对点数据直链。检错与纠错(CRC码);多路访问;寻址 路层 一个(不一定可靠的)点对点数据直链。定义机械特性;电气特性;功能特性;规程 物理层 特性 本文档使用 书栈(BookStack.CN) 构建 - 10 -

11.底层网络协议 底层网络协议 底层网络协议 ARP(地址解析协议) ICMP(互联网控制消息协议) 路由选择协议 OSPF(开放式最短路径优先) BGP(边界网关协议) DHCP(动态主机设置协议) NAT(地址转换协议) 底层网络协议 ARP(地址解析协议) 基本功能为透过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。在每台安装 有TCP/IP协议的电脑或路由器里都有一个ARP缓存表,表里的IP地址与MAC地址是一对应的。 当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到就知道目标MAC地址 为(00-BB-00-62-C2-02),直接把目标MAC地址写入帧里面发送就可;如果在ARP缓存表中没有找 到相对应的IP地址,主机A就会在网络上发送一个 广播(ARP request),目标MAC地址 是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.38.11的 MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这 样的回应(ARP response):“192.168.38.11的MAC地址是(00-BB-00-62-C2-02)”。这 样,主机A就知道主机B的MAC地址,它就可以向主机B发送信息。同时它还更新自己的ARP缓存表,下 次再向主机B发送信息时,直接从ARP缓存表里查找就可。ARP缓存表采用老化机制,在一段时间内如 果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。 当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直接通信,必须经过路由转发才可以。所以 此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的MAC地址。于是此后发送 主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为ARP代理(ARP Proxy)。 ICMP(互联网控制消息协议) 它 用于TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息, 令管理者可以对所发生的问题作出诊断,然后采取适当的措施解决。它与传输协议最大的不同:它一 般不用于在两点间传输数据,而常常 用于返回的错误信息或是分析路由。 ICMP控制的内容包括但不仅限于:echo响应(ping)、目标网络不可达、目标端口不可达、禁止访 问的网络、拥塞控制、重定向、TTL超时… 本文档使用 书栈(BookStack.CN) 构建 - 11 -

12.底层网络协议 路由选择协议 路由选择协议分为:静态的和动态的。Internet中使用的是动态路由选择协议,在Internet的概念 中,将整个互联网划分为许多个小的自治系统(AS)。AS的最主要的特征:一个AS对其他AS表现出 的是一个单一 和一致的路由选择策略。 由于AS的存在,路由选择协议又分为两种: 内部网关协议(IGP):即在一个AS内部使用的路由选择协议,而这与互联网中其他AS选用什么 路由协议无关。比如:OSPF 外部网关协议(EGP):若源主机和目的主机不再同一个AS中,就需要使用一种协议将路由选择 信息传递到另一个AS中,这就是EGP。比如:BGP。 OSPF(开放式最短路径优先) OSPF属于内部网关协议(IGP)的一种,使用Dijkstra提出的最短路径算法。 OSPF提出了“区域(Area)”的概念,一个网络可以由单一区域或者多个区域组成。其中,一个特别 的区域被称为骨干区域(Backbone Area),该区域是整个OSPF网络的核心区域,并且所有其他的 区域都与之直接连接。所有的内部路由都通过骨干区域传递到其他非骨干区域。所有的区域都必须直 接连接到骨干区域,如果不能创建直接连接,那么可以通过虚拟链路(Virtual-link)和骨干区域 创建虚拟连接。 划分区域的优点: 将洪泛法的范围限制在一个区域中。 减少每个区域内部路由信息交换的通信量。 OSPF使用的是分布式链路状态协议,使用 洪泛法向该路由器所有的相邻路由器发送信息。最终 整个区域的所有路由器都得到一个这个信息的副本。这个副本就是 链路状态数据库(LSDB)用 来保存当前网络拓扑结构,路由器上属于同一区域的链路状态数据库是相同的(属于多个区域的 路由器会为每个区域维护一份链路状态数据库)。 OSPF使用 “代价(Cost)”作为路由度量。 只有当链路发生变化时才会更新信息。 如果同一个目的网络有多条路径,OSPF协议可以进行 负载均衡。 BGP(边界网关协议) 由于BGP是工作在AS之间的协议,并且各个AS的情况复杂,所以 BGP只是力求找到一个可以到达目的 网络且比较好的路由,而并不是寻找一条最佳路由。每一个AS都应该有一个“BGP发言人“,一般来 说,两个BGP发言人是通过一个共享网络连接在一起的,BGP发言人往往是BGP边界路由,但也可以不 本文档使用 书栈(BookStack.CN) 构建 - 12 -

13.底层网络协议 是。 一个BGP发言人与其他AS的BGP发言人要交换路由信息,首先要建立TCP连接,然后在此连接上交换 BGP报文以建立BGP会话。当BGP发言人交换了路由信息后,就构造自治系统连通图,最后通过该图来 进行路由选择。 DHCP(动态主机设置协议) DHCP是一个局域网的网络协议,使用UDP协议工作,主要有两个用途: 用于内部网络或网络服务供应商自动分配IP地址给用户 用于内部网络管理员作为对所有电脑作中央管理的手段 动态主机设置协议(DHCP)是一种使网络管理员能够集中管理和自动分配IP网络地址的通信协议。在 IP网络中,每个连接Internet的设备都需要分配唯一的IP地址。DHCP使网络管理员能从中心结点监 控和分配IP地址。当某台计算机移到网络中的其它位置时,能自动收到新的IP地址。 DHCP使用了 租约 的概念,或称为计算机IP地址的有效期。租用时间是不定的,主要取决于用户在 某地连接Internet需要多久,这对于教育行业和其它用户频繁改变的环境是很实用的。通过较短的 租期,DHCP能够在一个计算机比可用IP地址多的环境中动态地重新配置网络。DHCP支持为计算机分 配静态地址,如需要永久性IP地址的Web服务器。 NAT(地址转换协议) NAT是一种 在IP封包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术。这种技术被普遍 使用在有多台主机但只通过一个公有IP地址访问因特网的私有网络中。 本文档使用 书栈(BookStack.CN) 构建 - 13 -

14.TCP TCP TCP TCP概述 TCP的特点 TCP与UDP的区别。 基本概念: TCP报文结构。 三次握手 四次挥手 ARQ协议 停止等待ARQ 连续ARQ协议(累积确认) 回退N重传 选择重传(SACK) TCP流量控制 TCP拥塞控制。 慢开始和拥塞避免 快重传和快恢复 TCP TCP概述 TCP的特点 TCP是面向连接的传输层协议。 TCP连接是点对点的(套接字—IP:Port到套接字)。 TCP提供可靠交付的服务。 TCP提供全双工通信。 面向字节流。 TCP与UDP的区别。 TCP UDP 是否连接 面向连接 面向非连接 传输可靠性 可靠 不可靠 应用场合 传输大量数据 少量数据 本文档使用 书栈(BookStack.CN) 构建 - 14 -

15.TCP 速度 慢 快 基本概念: 发送缓存和接受缓存 :用来临时保存双向通信的数据。在发送时,应用程序将数据传送给TCP发送 缓存后,就可以做自己的事情,TCP在合适的时候发送数据;在接受数据时,TCP把发送的数据放 入缓存,上层应用在合适的时候读取缓存即可。 滑动窗口 :TCP的滑动窗口以字节为单位,用3个指针进行表示。当窗口内连续报文段被确认收 到后,可以将窗口向前滑动。窗口大小应小于等于缓存区的大小。 滑动窗口协议 :只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前 滑动。收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。 当发送窗口和接收窗口的大小都等于 1时,就是停止等待协议。 当发送窗口大于1,接收窗口等于1时,就是回退N步协议。 当发送窗口和接收窗口的大小均大于1时,就是选择重发协议。 TCP报文结构。 源端口、目的端口:16位长。标识出远端和本地的端口号。 序列号:32位长。表明了发送的数据报的顺序,不一定从0开始。 本文档使用 书栈(BookStack.CN) 构建 - 15 -

16.TCP 确认号:32位长。希望收到的下一个数据报的序列号,表明到序列号 N-1 为止的所有数据已经正 确收到。 TCP协议数据报头长:4位长。表明TCP头中包含多少个32位字。 接下来的6位未用。 ACK:ACK位置1表明确认号是合法的。如果ACK为0,那么数据报不包含确认信息,确认字段被省 略。 PSH:表示是带有PUSH标志的数据。接收方因此请求数据报一到便可送往应用程序而不必等到缓 冲区装满时才传送。 RST:用于复位由于主机崩溃或其它原因而出现的错误的连接。还可以用于拒绝非法的数据报或 拒绝连接请求。 SYN:用于建立连接。 FIN:用于释放连接。 窗口大小:16位长。窗口大小字段表示在确认了字节之后还可以发送多少个字节。 校验和:16位长。是为了确保高可靠性而设置的。它校验头部、数据和伪TCP头部之和。 紧急指针: URG=1 时才有意义。 可选项:长度可变,最长40个字节。 MMS SACK:选择确认。 时间戳:计算往返时间;用于处理TCP序号超过 2^32 的情况,又称为防止序号回绕 (PAWS)。 TCP最小长度为20个字节。 三次握手 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入 SYN_SENT 状态,等待 服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包 (syn=k),即SYN+ACK包,此时服务器进入 SYN_RECV 状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发 送完毕,客户端和服务器进入 ESTABLISHED (TCP连接成功)状态,完成三次握手。 四次挥手 本文档使用 书栈(BookStack.CN) 构建 - 16 -

17.TCP 在Time_Wait阶段,主动端等待2*MSL时间,MSL建议为2分钟。 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样, 一个FIN将占用一个序号。 服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7) TCP采用四次挥手关闭连接如图所示为什么建立连接协议是三次握手,而关闭连接却是四次握手呢? 这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作 用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数 据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方 来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。 ARQ协议 ARQ协议(自动重传请求)是OSI模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和 超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。 停止等待ARQ 本文档使用 书栈(BookStack.CN) 构建 - 17 -

18.TCP 发送点对接收点发送数据包,然后等待接收点回复ACK并且开始计时。 在等待过程中,发送点停止发送新的数据包。 当数据包没有成功被接收点接收时候,接收点不会发送ACK.这样发送点在等待一定时间后,重新 发送数据包。 反复以上步骤直到收到从接收点发送的ACK。 这个协议的缺点是较长的等待时间导致低的数据传输速度。在低速传输时,对连接频道的利用率比较好,但是在高速传输时,频道的 利用率会显著下降。 连续ARQ协议(累积确认) 为了克服停止并等待ARQ协议长时间等待ACK的缺点。这个协议会连续发送一组数据包,然后再等待这 些数据包的ACK。 在连续ARQ协议中涉及到滑动窗口协议,这是TCP协议的精髓所在。 回退N重传 接收点丢弃从第一个没有收到的数据包开始的所有数据包。 发送点收到NACK后,从NACK中指明的数据包开始重新发送。 本文档使用 书栈(BookStack.CN) 构建 - 18 -

19.TCP 选择重传(SACK) 发送点连续发送数据包但对每个数据包都设有个一个计时器。 当在一定时间内没有收到某个数据包的ACK时,发送点只重新发送那个没有ACK的数据包。 相对于回退N重传来说,选择重传可以减少重传的数据。 TCP流量控制 流量控制指点对点通信量的控制,是端到端正的问题。流量控制所要做的就是抑制发送端发送数据的 速率,以便使接收端来得及接收。这里是通过滑动窗口机制来实现的。发送方的发送窗口不能超过接 收方的接收窗口。TCP的窗口单位是字节,不是报文段。 这上图中B一共进行了三次流量控制:第一次将窗口减小到 300 ,第二次减小到 100 ,最后减小 到 0 ,这时发送方暂停发送知道B发送一个新的窗口值为止。 如果B发送了一个新的窗口值到A,但是A并没有收到,就会造成死锁。为解决这个问题,TCP为每个链接设置有一个持续计时器。只要 TCP收到一个0窗口,就启动计时器。若计时器设置的时间到了,就发送一个探测报文,而接收方在确认的时候会给出一个现在的窗口 值。 TCP拥塞控制。 防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有 一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由 器,以及与降低网络传输性能有关的所有因素。 本文档使用 书栈(BookStack.CN) 构建 - 19 -

20.TCP 慢开始和拥塞避免 发送方维持一个拥塞窗口 cwnd 的状态变量。发送方让自己的发送窗口小于等于拥塞窗口。 慢开始 :由小到大的逐渐增大拥塞窗口。首先将cwnd设置为一个最大报文段MMS,在收到一个 对新的报文段的确认后,把拥塞窗口增加一个MMS。——指数增长 拥塞避免 :当慢开始到门限值(ssthresh)后,使用拥塞避免算法(cwnd每次加1)。当发现 网络拥塞后,将cwnd置为1,ssthresh减半,再次执行慢开始。 快重传和快恢复 快重传 :当接收方收到一个失序报文段后就立即发送重复确认而不要等到自己发送数据时捎带 确认。当发送方连续收到三个重复确认时,应立即重传接收方尚未收到的报文段。 快恢复 :与快重传结合使用。 在连续收到三个重复确认时,将慢开始的ssthresh减半,这是为了防止网络拥塞( 接下来 并不执行慢开始 )。 由于发送方现在认为 网络很可能没有拥塞,于是接下来不执行慢开始,而是将cwnd值设置 为ssthresh减半后的值,然后执行拥塞避免。 本文档使用 书栈(BookStack.CN) 构建 - 20 -

21.IP IP IP 地址分类 私有地址 特殊的IP地址 IP 地址分类 A类:8位网络号, 0_ _ _ _ _ _ _ ,1.0.0.0 ~ 126.0.0.0 B类:16位网络号, 10 _ _ ... ,128.0.0.0 ~ 191.255.255.255 C类:24位网络号, 110_ _ _... ,192.0.0.0 ~ 223.255.255.255 D类:多播地址, 1110_ _ _... E类:保留地址, 1111_ _ _ ... 私有地址 A类: 10.0.0.0 ~ 10.255.255.255 (长度相当于1个A类IP地址) B类: 172.16.0.0 ~ 172.31.255.255 (长度相当于16个连续的B类IP地址) C类: 192.168.0.0 ~ 192.168.255.255 (长度相当于256个连续的C类IP地址) 特殊的IP地址 0.0.0.0 :已经不是一个真正意义上的IP地址。它表示的是这样一个集合:所有不清楚的主机 和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。如果在网络设 置中设置了缺省网关,那么系统会自动产生一个目的地址为0.0.0.0的缺省路由.对本机来说,它 就是一个“收容所”,所有不认识的“三无”人员,一 律送进去。 255.255.255.255 : 限制广播地址,对本机来说,这个地址指本网段内(同一广播域)的所有主 机。这个地址不能被路由器转发。 127.0.0.1 :本机地址主要用于测试。这样一个地址,是不能把它发到网络接口的。 本文档使用 书栈(BookStack.CN) 构建 - 21 -

22.IP 本文档使用 书栈(BookStack.CN) 构建 - 22 -

23.HTTP HTTP HTTP Http的报文结构 HTTP 请求报文头部 HTTP 响应头 Http的状态码含义。 Http request的几种类型。 条件 GET 持久连接 跨站攻击 防范的方法 断点续传 HTTP HTTP构建于 TCP/IP 协议之上,默认端口号是80。 HTTP是 无连接无状态 的。 无连接的含义是 限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即 断开连接。采用这种方式可以节省传输时间。后来使用了 Keep-Alive 技术。 无状态是指 协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。 HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成不必 要连接占用,缺点在于每次请求会传输大量重复的内容信息。 为了解决HTTP无状态的缺点,两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie ,而另一个则是 Session 。 Cookie 在客户端记录状态,比如登录状态。 Session 在 服务器记录状态。 Http的报文结构 HTTP 请求报文头部 User-Agent :产生请求的浏览器类型。 Accept :客户端可识别的响应内容类型列表; Accept-Language :客户端可接受的自然语言; Accept-Encoding :客户端可接受的编码压缩格式; 本文档使用 书栈(BookStack.CN) 构建 - 23 -

24.HTTP Accept-Charset :可接受的应答的字符集; Host :请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机; Connection :连接方式(close 或 keep-alive ); Cookie :存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie; 请求包体 :在 POST 方法中使用。 Referer :包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。 If-Modified-Since :文档的最后改动时间 HTTP 响应头 Allow 服务器支持哪些请求方法(如GET、POST等)。 Content-Encoding 文档的编码(Encode)方法。 Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。 Content-Type 表示后面的文档属于什么MIME类型。 Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。 Expires 应该在什么时候认为文档已经过期,从而不再缓存它。 Last-Modified 文档的最后改动时间。 Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。 Server 服务器名字。 Set-Cookie 设置和页面关联的Cookie。 ETag :被请求变量的实体值。ETag是一个可以与Web资源关联的记号(MD5值)。 Cache-Control :这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。 max-age:表示当访问此网页后的 x 秒内再次访问不会去服务器;no-cache,实际上Cache-Control: no-cache是会被 缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性;no-store,这个才是 响应不被缓存的意思; Last-Modified 与 If-Modified-Since 都是用来记录页面的最后修改时间。当客户端访问页面时,服务器会将页面最 后修改时间通过 Last-Modified 标识由服务器发往客户端,客户端记录修改时间,再次请求本地存在的cache页面时,客户端会 通过 If-Modified-Since 头将先前服务器端发过来的最后修改时间戳发送回去,服务器端通过这个时间戳判断客户端的页面是否 是最新的,如果不是最新的,则返回新的内容,如果是最新的,则返回 304。 Http的状态码含义。 1** 信息,服务器收到请求,需要请求者继续执行操作 2** 成功,操作被成功接收并处理 3** 重定向,需要进一步的操作以完成请求 301 Moved Permanently 。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏 览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 302 Moved Temporarily 。与301类似。但资源只是临时被移动。客户端应继续使用原有URI 304 Not Modified 。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客 户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后 修改的资源。 本文档使用 书栈(BookStack.CN) 构建 - 24 -

25.HTTP 4** 客户端错误,请求包含语法错误或无法完成请求 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。 401 Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使 用 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提 供服务的原因 404 Not Found 请求的资源不存在,例如,输入了错误的URL 5** 服务器错误,服务器在处理请求的过程中发生了错误 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可 能会恢复正常。 Http request的几种类型。 GET 请求指定的页面信息,并返回实体主体。 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体 中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 PUT 从客户端向服务器传送的数据取代指定的文档的内容。 DELETE 请求服务器删除指定的页面。 GET可提交的数据量受到URL长度的限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限 制 理论上讲,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,出于安全考虑,服务器软件在实现时会做一定限制 条件 GET HTTP条件GET 是 HTTP 协议为了减少不必要的带宽浪费,提出的一种方案。实际上就是利用 If- Modified-Since 做浏览器缓存。 持久连接 我们知道 HTTP 协议采用 请求-应答 模式,当使用普通模式,即非 Keep-Alive 模式时,每个请 求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当 使用 Keep-Alive 模式 (又称持久连接、连接重用)时, Keep-Alive 功能使客户端到服务器端的 连接持续有效,当出现对服务器的后继请求时, Keep-Alive 功能避免了建立或者重新建立连接。 在 HTTP 1.0 中, 没有官方的 keep alive 的操作。通常是在现有协议上添加一个指数。如果浏 览器支持 keep-alive,它会在请求的包头中添加: 本文档使用 书栈(BookStack.CN) 构建 - 25 -

26.HTTP 1. Connection: Keep-Alive 然后当服务器收到请求,作出回应的时候,它也添加一个头在响应中: 1. Connection: Keep-Alive 这样做,连接就不会中断(超过 Keep-Alive 规定的时间—服务器设置,意外断电等情况除外), 而是保持连接。当客户端发送另一个请求时,它会使用同一个连接。这一直继续到客户端或服务器端 认为会话已经结束,其中一方中断连接。 在 HTTP 1.1 版本中,默认情况下所有连接都被保持,如果加入 “Connection: close” 才关 闭。 HTTP Keep-Alive 简单说就是保持当前的TCP连接,避免了重新建立连接。 HTTP 长连接不可能一直保持,例如 Keep-Alive: timeout=5, max=100,表示这个TCP通道可以保持5秒,max=100,表示这 个长连接最多接收100次请求就断开。 HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive没能改变这个结果。另外,Keep-Alive也不能保证客户端和 服务器之间的连接一定是活跃的,在HTTP1.1版本中也如此。唯一能保证的就是当连接被关闭时你能得到一个通知,所以不应该让程 序依赖于Keep-Alive的保持连接特性,否则会有意想不到的后果。 使用长连接之后,客户端、服务端怎么知道本次传输结束呢?两部分:1. 判断传输数据是否达到了Content-Length 指示的大小; 2. 动态生成的文件没有 Content-Length ,它是分块传输(chunked),这时候就要根据 chunked 编码来判断,chunked 编 码的数据在最后有一个空 chunked 块,表明本次传输数据结束。 跨站攻击 CSRF(Cross-site request forgery,跨站请求伪造)伪造请求,冒充用户在站内的正常操 作,比如爬虫。 防范的方法 关键操作只接受POST请求 验证码 检测 Referer Token Token 要足够随机——只有这样才算不可预测 Token 是一次性的,即每次请求成功后要更新Token——这样可以增加攻击难度,增加预测 难度 Token 要注意保密性——敏感操作使用 post,防止 Token 出现在 URL 中 断点续传 本文档使用 书栈(BookStack.CN) 构建 - 26 -

27.HTTP 要实现断点续传的功能,通常都需要客户端记录下当前的下载进度,并在需要续传的时候通知服务端 本次需要下载的内容片段。 HTTP1.1协议中定义了断点续传相关的HTTP头 Range 和 Content-Range 字段,一个最简单的 断点续传实现大概如下: 1. 客户端下载一个1024K的文件,已经下载了其中512K 2. 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片 段: Range:bytes=512000- ,这个头通知服务端从文件的512K位置开始传输文件。 3. 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加: Content- Range:bytes 512000-/1024000 ,并且此时服务端返回的HTTP状态码应该是 206 ,而不是200。 但是在实际场景中,会出现一种情况,即在终端发起续传请求时,URL对应的文件内容在服务端已经 发生变化,此时续传的数据肯定是错误的。如何解决这个问题了?显然此时我们需要有一个标识文件 唯一性的方法。在RFC2616中也有相应的定义,比如 实现Last-Modified来标识文件的最后修改时 间,这样即可判断出续传文件时是否已经发生过改动。同时RFC2616中还定义有一个ETag的头,可以 使用ETag头来放置文件的唯一标识,比如文件的MD5值。 客户端在发起续传请求时应该在HTTP头中申明 If-Match 或者 If-Modified-Since 字段,帮助服 务端判别文件变化。 本文档使用 书栈(BookStack.CN) 构建 - 27 -

28.面试题 面试题 面试题 CSMA/CD有什么作用? Http会话的过程? TCP协议如何实现可靠传输? 面试题 CSMA/CD有什么作用? CSMA/CD即带冲突检测的载波监听多路访问技术,应用在 OSI 的第二层数据链路层,是为了解决 共享介质的传输效率的问题。其原理简单总结为:先听后发,边发边听,冲突停发,随机延迟后重 发。 Http会话的过程? 建立tcp连接 发出请求文档 发出响应文档 释放tcp连接 TCP协议如何实现可靠传输? TCP 协议是通过ARQ协议以及等待、确认、重传等机制实现可靠传输。 本文档使用 书栈(BookStack.CN) 构建 - 28 -

29.数据结构与算法 数据结构与算法 数据结构与算法 数据结构与算法 本文档使用 书栈(BookStack.CN) 构建 - 29 -