Android面试之网络

5,581 阅读22分钟

本文是Android面试题整理中的一篇,结合右下角目录食用更佳

1. 计算机网络的分层

按照不同组织的标准和规范,可以有不同的分层方式

OSI七层

应用层、表示层、会话层、运输层、网络层、数据链路层、物理层

TCP/IP(四层)

应用层、传输层、网络层、网络接口层

五层协议

  1. 应用层:为操作系统或网络应用程序提供访问网络服务的接口;通过应用进程间的交互来完成特定网络应用,应用层协议定义的是应用进程间通信和交互规则。不同的网络应用层有不同的应用层协议,如:万维网应用的HTTP协议,电子邮件的SMTP协议,支持文件传送的FTP协议,应用层交互的数据单元称为报文。当不同的应用进程数据通信或者数据交换时,就去调用应用层的不同协议实体,让这些实体去调用TCP或者UDP层服务来进行网络传输
  2. 传输层:向两个主机中应用进程之间的通信提供通用的数据传输服务。应用进程以利用该服务传送应用层报文。运输层使用以下两种协议:传输控制协议TCP(提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段);用户数据报协议UDP(提供无连接的、尽最大努力的数据传输服务,不保证数据传输的可靠性,单位是用户数据报);
  3. 网络层: 数据报封装和路由寻址功能 网络互连层的主要功能是寻址和对数据报的封装以及重要的路由选择功能。 这些功能大部分都是由IP协议来完成的,再加上地址解析协议(Address Resolution Protocol,ARP)、因特网控制报文协议(Internet Control Message Protocol,ICMP)等协议从旁协助,所以IP协议是本层众多实体中的核心。下面简单介绍这几个协议。 **网际协议(Internet Protocol,IP)。该协议是一个无连接的协议,主要负责将数据报从源结点转发到目的结点。也就是说,IP协议通过对每个数据报中都有的源地址和目的地址进行分析,然后进行路由选择(即选择一条到达目标的最佳路径),最后再转发到目的地。**需要注意的是:IP协议只是负责对数据进行转发,并不对数据进行检查。也就是说,它不负责数据的可靠性,这样设计的主要目的是提高IP协议传送和转发数据的效率。 地址解析协议(Address Resolution Protocol,ARP)。该协议主要负责将TCP/IP网络中的IP地址解析和转换成计算机的物理地址,以便于物理设备(如网卡)按该地址来接收数据。 反向地址解析协议(Reverse Address Resolution Protocol,RARP)。该协议的作用与ARP的作用相反,它主要负责将设备的物理地址解析和转换成IP地址。 因特网控制报文协议(Internet Control Message Protocol,ICMP)。该协议主要负责发送和传递包含控制信息的数据报,这些控制信息包括哪台计算机出了什么错误、网络路由出现了什么错误等内容
  4. 数据链路层 :两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议,数据链路层将网络层交下来IP数据报组装成数据帧,在两个相邻节点间的链路上传送帧;数据帧:(所谓数据帧(Data frame),就是数据链路层的协议数据单元,它包括三部分:帧头,数据部分,帧尾。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等;数据部分则包含网络层传下来的数据,比如IP数据包)
  5. 物理层:物理层上所传数据的单位是比特,确定要连接电缆的插头应当有多少根引脚,以及各条引脚应如何连接。传递信息所利用的是一些物理媒体,如电缆、光缆、无线信道等,并不在物理层协议之内而是在物理层协议的下面

2. TCP与UDP的区别

  1. TCP协议是一种可靠的、面向连接的协议:保证通信主机之间有可靠的字节流传输,完成流量控制功能,协调收发双方的发送与接收速度,达到正确传输的目的
  2. UDP是一种不可靠、无连接的协议:其特点是协议简单、额外开销小、效率较高,但是不能保证传输是否正确

3. TCP对应的协议和UDP对应的协议

TCP

  1. HTTP协议:从Web服务器传输超文本到本地浏览器的传送协议,默认使用80端口。
  2. FTP:文件传输协议,默认使用21端口。
  3. SMTP:简单邮件传送协议,用于发送邮件,默认使用25号端口。
  4. POP3:和SMTP对应,POP3用于接收邮件,默认使用110端口
  5. Telnet:一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务,默认使用23端口

UDP

  1. DNS:域名解析服务,将域名地址转换为IP地址,默认使用53号端口。
  2. TFTP(Trival File Transfer Protocal):简单文件传输协议,默认使用69号端口。
  3. SNMP:简单网络管理协议,默认使用161号端口,是用来管理网络设备的。

4. TCP的报文段

TCP是一种面向连接的、可靠的传输层协议,通过TCP报文段进行传输,报文段分为头部和数据两个部分,头部包含了此报文段的一些基本信息,基本格式如下图。

  1. 原端口和目的端口:即应用程序在客户端和服务器端所对应的端口号
  2. 序号(seq)和确认序号(ack):是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
  3. 数据偏移/首部长度:表明报文段头部的长度。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
  4. 保留:为将来定义新的用途保留,现在一般置0。
  5. 控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能,0无效,1有效
    1. URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
    2. ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
    3. PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
    4. RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求
    5. SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
    6. FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
  6. 窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
  7. 校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证
  8. 紧急指针:指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。

5. TCP三次握手

三次握手:TCP是通过报文段进行通信的,在建立TCP连接过程中,需要客户端和服务端总共发送3个报文段以确认连接的建立。

  1. 第一次握手:Client将标志位SYN置为1,随机产生一个序号(seq)J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  2. 第二次握手:Server接收到报文段,生成一个新的报文段发送给Client,新报文段中:SYN = 1,ACK = 1,序号(seq)= J+1,确认序号(ack) = k(k为随机生成);Server进入SYN_RCVD状态
  3. 第三次握手:Client收到报文段,对报文段进行校验(ACK是否为1,ack是否为J+1),校验通过生成一个新的报文段发送给Server:ACK = 1,ack = K+1,此时Client进入ESTABLISHED状态;Server对接收到的报文段校验,校验通过进入ESTABLISHED状态。

6. TCP为什么是三次握手不是两次

TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机:如果使两次握手,有可能能第一次握手客户端发送的报文段过了很久才到达服务器端,此时客户端已经不需要连接了,如果服务器端建立了连接,就会造成服务器资源的浪费

7. TCP四次挥手


由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

  1. 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
  2. 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  3. 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  4. 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

8. 挥手中TCP为什么要等待终止

  1. 假如 Client 最后的 ACK 报文段丢失了,这时 Server 就会重新发送 FIN+ACK 报文给 Client,如果 Client 不等待 2MSL 直接关闭连接,那么 Server 就会一直处于 LAST-ACK 状态,造成了 Server 的资源浪费。而等待 2MSL,Client 就会再次收到 Server 的 FIN+ACK 报文,然后重新给 Server 发送 ACK 报文,确保双方都确认要关闭连接。
  2. 假如 ACK 报文段没有丢失,也是在网络中滞留了,这 2MSL 的等待时间可以让滞留的报文传到 Server,保证本连接持续的时间内所生产的报文都从网络中消失,以免影响下一次连接。还有如果不等待 2MSL ,报文滞留也可能导致 Server 资源浪费,原因同 (1)。

9. 为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

10. TCP流量控制:滑动窗口

  1. 所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收
  2. 每次Client返回的ACK都会告知Server当前Client窗口的大小,Server会根据窗口的大小来控制发送数据和向前滑动

11. TCP的拥塞控制

防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。

拥塞控制方法: 慢开始( slow-start )和拥塞避免( congestion avoidance ) 发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口的大小。 发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

  1. 慢开始算法:每经过一个传输轮次,拥塞窗口 cwnd 就加倍。慢开始的"慢"并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd。 为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量(如何设置ssthresh)。慢开始门限ssthresh的用法如下: 当 cwnd < ssthresh 时,使用上述的慢开始算法。 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
  2. 拥塞避免算法:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

快重传算法:要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时才进行捎带确认。 快重传算法还规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器到期。
快恢复过程 1.当发送方连续收到三个重复确认,就执行"乘法减小"算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法。 2.由于发送方现在认为网络很可能没有发生拥塞,因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法("加法增大"),使拥塞窗口缓慢地线性增大。

12. 在浏览器中输入www.baidu.com 后执行的全部过程

  1. 客户端浏览器请求DNS服务器解析域名www.baidu.com 对应的IP地址,然后通过这个IP地址和默认端口80,和服务器建立TCP连接,连接建立之后通过TCP将HTTP会话封装成数据包。
  2. 在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口(如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口)然后使用IP层的IP地址查找目的端。
  3. 在客户端的网络层,通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,主要是通过查找路由表来决定通过哪个路径到达服务器。
  4. 在客户端的链路层,数据包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP(地址解析协议:将ip地址解析成物理地址)的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

13. HTTP协议包括哪些请求?

常用的请求有:get,post,update,delete,head,options。GET:请求读取由URL所标志的数据 POST:给服务器添加或者更新数据 PUT:在给定的URL下存储一个文档 DELETE:删除给定的URL所标志的资源 OPTIONS:服务器针对特定资源所支持的HTTP请求方法 HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息

HTTP中POST与GET的区别

  1. GET是将请求参数加到URL中,POST是将请求数据放在请求体中。
  2. GET传送的数据量较小,不能超过2KB(1024字节?),POST传送的数据量较大,默认为不受限制。

14. HTTP协议的格式

HTTP请求

  1. 请求行:三个部分组成:第一部分是请求方法,第二部分是请求网址,第三部分是HTTP版本
  2. 请求头:请求头(request header) ;普通头(general header) ;实体头(entity header)
  3. 内容:通常来说,由于GET请求往往不包含内容实体,因此也不会有实体头。 第三部分内容只在POST请求中存在,因为GET请求并不包含任何实体

HTTP响应

  1. 状态行:第一部分是HTTP版本,第二部分是响应状态码,第三部分是状态码的描述
  2. HTTP头:响应头(response header) ;普通头(general header) ;实体头(entity header)
  3. 内容:响应内容就是HTTP请求所请求的信息。这个信息可以是一个HTML,也可以是一个图片

15. HTTP缓存

####HTTP缓存的处理流程:

  1. 请求处理 用户发起一个http请求,缓存获取到URL,根据URL查找是否有匹配的副本,这个副本可能在内存中,也可能在本地磁盘。
  2. 新鲜度检测 如果缓存中存在所请求资源的副本,则进行新鲜度检测。新鲜度检测举个简单的例子,我们在商店买了一瓶汽水,汽水瓶上肯定会标有过期时间,我们会根据这个过期时间和现在的时间做对比,看看饮料过期了没,如果没过期,我们正常喝就行了,如果已经过期,我们肯定要找商家。其实这就是一个新鲜度检测的过程,HTTP请求的新鲜度检测流程也是这样的,HTTP发起一个请求时,发现缓存中有相应的副本,接着就会检查这个副本有没有过期,如果没有过期,直接使用。如果已经过期,则进行再验证。
  3. 服务器再验证 缓存中的文档过期了并不代表它和服务器上的不一样,所以这个时候就需要问问服务器,过期的这段时间里这个文档到底有没有改变。如果改变了,缓存就会获取一份新的文档副本,然后发送给客户端。如果没有改变,缓存只需要获取新的首部,包括一个新的过期时间,并对缓存中的首部更新。
  4. 创建响应并返回 我们希望缓存看起来就像是来自原始服务器一样,缓存将已缓存的服务器响应首部作为响应首部,发送给客户端。

扩展(缓存保质期的实现):HTTP中,通过Cache-Control首部和Expires首部为文档指定了过期时间,通过对过期时间的判断,缓存就可以知道文档是不是在保质期内。Expires首部和Cache-Control:max-age 首部都是来告诉缓存文档有没有过期,为什么需要两个响应首部来做这件简单的事情了?其实这一切都是历史原因,Expires首部是HTTP 1.0中提出来的,因为他使用的是绝对日期,如果服务端和客户端时钟不同步的话(实际上这种情况非常常见),缓存可能就会认为文档已经过了保质期。 HTTP 1.1为了修正这个问题,引入了Cache-Control:max-age 首部,这个首部使用相对时间来控制保质期。

16. Http和Socket区别

  1. Http是一个协议,Socket是一个接口
  2. Http可能是基于Socket的
  3. Socket可以维持一个长连接,http是请求响应式,通常Socket效率高

17. Http1.0 /1.1/2.0区别

  1. 1.1相对于1.0:
    1. 支持长连接
    2. 增加了host域
    3. 增加了range头域,支持断点续传
  2. 2.0 相对于1.x:
    1. 支持多路复用
    2. 采用二进制分帧
    3. 首部压缩
    4. 服务器推送

18. HTTPS

HTTPS是安全版本的HTTP,基于SSL加密。以下是SSL建立过程:

  1. 客户端给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法
  2. 服务器确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)
  3. 客户端确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给服务器
  4. 服务器使用自己的私钥,获取客户端丝发来的随机数(即Premaster secret)
  5. 客户端和服务器根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程

19. COOKIE和SESSION有什么区别

  1. 因为HTTP是无状态的,所以需要某种机制识别用户
  2. Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
  3. Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

20. Http 状态码

  1. 1 :继续
  2. 2 :成功
  3. 3 :重定向
  4. 4 :请求错误
  5. 5: 服务器内部错误

21. 常见请求和响应头

  1. 请求头:Accept/Accept—Language/Cache-Control/Cookie/User-Agent/Date/Host/Range
  2. 返回头:Accept-Ranges/Date/Cache-Control/Content-Length