Android面试之网络

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

1. 计算机网络的分层

按照不一样组织的标准和规范,能够有不一样的分层方式linux

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
相关文章
相关标签/搜索