Android客户端面试基础(四)-TCP/IP

  1. OSI,TCP/IP,五层协议的体系结构,以及各层协议
  • OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

  • TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。

  • 五层协议 (5层):物理层、数据链路层、网络层、运输层、 应用层。

  • 每一层的协议如下:

    • 物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器)

    • 数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机)

    • 网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)

    • 传输层:TCP、UDP、SPX

    • 会话层:NFS、SQL、NETBIOS、RPC

    • 表示层:JPEG、MPEG、ASII

    • 应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS

  • 每一层的作用如下:

    • 物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)

    • 数据链路层:将比特组装成帧和点到点的传递(帧Frame)

    • 网络层:负责数据包从源到宿的传递和网际互连(包PackeT)

    • 传输层:提供端到端的可靠报文传递和错误恢复(段Segment)

    • 会话层:建立、管理和终止会话(会话协议数据单元SPDU)

    • 表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)

    • 应用层:允许访问OSI环境的手段(应用协议数据单元APDU)

  1. TCP与UDP的区别
  • TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

  • TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

  • TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
    UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

  • 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

  • TCP首部开销20字节;UDP的首部开销小,只有8个字节

  • TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

  1. TCP报文结构
    Android客户端面试基础(四)-TCP/IP_第1张图片

  2. TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。

  • 建立连接三次握手

    第一次握手:主机A发送位码为syn=1,随机产生seq number=10001的数据包到服务器,主机B由SYN=1知道,A要求建立联机,此时状态为SYN_SENT;

    第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=20001的包,此时状态由LISTEN变为SYN_RECV;

    第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功,双方状态ESTABLISHED。

    完成三次握手,主机A与主机B开始传送数据。

  • 各个状态名称与含义

    - CLOSED: 这个没什么好说的了,表示初始状态。 
    
    - LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。 
    
    - SYN_RECV: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本 上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态 时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。 
    
    • SYN_SENT: 这个状态与SYN_RECV遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状 态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

    • ESTABLISHED:这个容易理解了,表示连接已经建立了。

  • 关闭连接四次挥手

    由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

    CP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

    1. 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。

    2. 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

    3. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

    4. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

  • TIME_WAIT

    TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。

  1. TCP拥塞控制

    TCP的拥塞控制由4个核心算法组成:“慢启动”(Slow Start)、“拥塞避免”(Congestion voidance)、“快速重传”(Fast Retransmit)、“快速恢复”(Fast Recovery)。

  2. TCP滑动窗口与回退N针协议

    滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。

    慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。

    发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4。这是一种指数增加的关系。

  • 1比特滑动窗口协议

    当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议(stop-and-wait)。该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继续发送下一帧。由于接收方需要判断接收到的帧是新发的帧还是重新发送的帧,因此发送方要为每一个帧加一个序号。
    
  • 后退n协议

     由于停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因此又提出了后退n协议。后退n协议中,发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍收到确认帧,就要重发相应的数据帧。如:当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。
    
  • 选择重传协议

    在后退n协议中,接收方若发现错误帧就不再接收后续的帧,即使是正确到达的帧,这显然是一种浪费。另一种效率更高的策略是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。这种方法称为选择重发(SELECTICE REPEAT),其工作过程如图所示。显然,选择重发减少了浪费,但要求接收方有足够大的缓冲区空间。
    
  1. Http的报文结构

    HTTP 有两类报文:

    (1) 请求报文----从客户向服务器发送请求报文.

    (2) 响应报文----从服务器到客户的回答

    HTTP请求报文和响应报文都是由三个部分组成。可以看出,这两种报文格式的区别就是开始行不同。

    (1) 开始行 用于区分是请求报文还是响应报文。在请求报文中的开始行叫做请求行(Request-Line),
    而在响应报文中的开始行叫做状态行(Staus-Line).在开始行的三个字段之间都以空格隔开,最后的“CR”
    和“LF”分别表示“回车”和“换行”。

    (2)首部行 用来说明浏览器,服务器或报文主体的一些信息。首部可以有好几行,也可以不使用。
    在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”。整个首部行
    结束时,还有一空行将首部行和后面的实体主体分开。

    (3)实体主体 在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。

  2. Http的状态码含义

  • 200状态码:
     
    成功2××: 成功处理了请求的状态码。
      
    1、200 :服务器已成功处理了请求并提供了请求的网页。
      
    2、204: 服务器成功处理了请求,但没有返回任何内容。

  • 300状态码:

     重定向3×× :每次请求中使用重定向不要超过 5 次。 
    
     1、301: 请求的网页已永久移动到新位置。当URLs发生变化时,使用301代码。搜索引擎索引中保存新的URL。 
    

2、302: 请求的网页临时移动到新位置。搜索引擎索引中保存原来的URL。
  
3、304: 如果网页自请求者上次请求后没有更新,则用304代码告诉搜索引擎机器人,可节省带宽和开销。

  • 400状态码:

      客户端错误4×× :表示请求可能出错,妨碍了服务器的处理。 
    

1、400: 服务器不理解请求的语法。
  
2、403: 服务器拒绝请求。
  
3、404: 服务器找不到请求的网页。服务器上不存在的网页经常会返回此代码。
  
4、410 :请求的资源永久删除后,服务器返回此响应。该代码与 404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时用来替代404 代码。如果资源已永久删除,应当使用 301 指定资源的新位置。

  • 500状态码:
      
    服务器错误5×× :表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
      
    1、500 :服务器遇到错误,无法完成请求。
      
    2、503: 服务器目前无法使用(由于超载或停机维护)。
  1. Http request的几种类型

    HTTP协议中共定义了八种方法或者叫“动作”来表明对Request-URI指定的资源的不同操作方式,具体介绍如下:

    • OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。

    • HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。

  • GET:向特定的资源发出请求。

  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。

  • PUT:向指定资源位置上传其最新内容。

  • DELETE:请求服务器删除Request-URI所标识的资源。

  • TRACE:回显服务器收到的请求,主要用于测试或诊断。

  • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

    虽然HTTP的请求方式有8种,但是我们在实际应用中常用的也就是get和post,其他请求方式也都可以通过这两种方式间接的来实现。

  1. Http1.1和Http1.0的区别

    • HTTP/1.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象,;

    • HTTP/1.1默认使用持久连接(然而,HTTP/1.1协议的客户机和服务器可以配置成使用非持久连接)。在持久连接下,不必为每个Web对象的传送建立一个新的连接,一个连接中可以传输多个对象!

  2. Http怎么处理长连接

    基于http协议的长连接

    在HTTP1.0和HTTP1.1协议中都有对长连接的支持。其中HTTP1.0需要在request中增加”Connection: keep-alive“ header才能够支持,而HTTP1.1默认支持.

    http1.0请求与服务端的交互过程:

    (1)客户端发出带有包含一个header:”Connection: keep-alive“的请求

    (2)服务端接收到这个请求后,根据http1.0和”Connection: keep-alive“判断出这是一个长连接,就会在response的header中也增加”Connection: keep-alive“,同时不会关闭已建立的tcp连接.

    (3)客户端收到服务端的response后,发现其中包含”Connection: keep-alive“,就认为是一个长连接,不关闭这个连接。并用该连接再发送request.转到(1)

    http1.1请求与服务端的交互过程:

    (1)客户端发出http1.1的请求

    (2)服务端收到http1.1后就认为这是一个长连接,会在返回的response设置Connection: keep-alive,同时不会关闭已建立的连接.

    (3)客户端收到服务端的response后,发现其中包含”Connection: keep-alive“,就认为是一个长连接,不关闭这个连接。并用该连接再发送request.转到(1)

基于http协议的长连接减少了请求,减少了建立连接的时间,但是每次交互都是由客户端发起的,客户端发送消息,服务端才能返回客户端消息。因为客户端也不知道服务端什么时候会把结果准备好,所以客户端的很多请求是多余的,仅是维持一个心跳,浪费了带宽。

  1. Cookie与Session的作用与原理

    一、Cookie详解

    (1)简介

     因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这点,就需要使用到Cookie了。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
    

    Cookie(复数形态:Cookies),是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。

    Cookie是由服务端生成的,发送给客户端(通常是浏览器)的。Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie:

    内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。

    硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。

(2)工作原理

    1、创建Cookie

      当用户第一次浏览某个使用Cookie的网站时,该网站的服务器就进行如下工作:
      
      ①该用户生成一个唯一的识别码(Cookie id),创建一个Cookie对象;

      ②默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。如果网站希望浏览器将该Cookie存储在磁盘上,则需要设置最大时效(maxAge),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该Cookie);

      ③将Cookie放入到HTTP响应报头,将Cookie插入到一个 Set-Cookie HTTP请求报头中。

      ④发送该HTTP响应报文。

    2、设置存储Cookie

      浏览器收到该响应报文之后,根据报文头里的Set-Cookied特殊的指示,生成相应的Cookie,保存在客户端。该Cookie里面记录着用户当前的信息。

    3、发送Cookie

     当用户再次访问该网站时,浏览器首先检查所有存储的Cookies,如果某个存在该网站的Cookie(即该Cookie所声明的作用范围大于等于将要请求的资源),则把该cookie附在请求资源的HTTP请求头上发送给服务器。

    4、读取Cookie

    服务器接收到用户的HTTP请求报文之后,从报文头获取到该用户的Cookie,从里面找到所需要的东西。

(3)作用

      Cookie的根本作用就是在客户端存储用户访问网站的一些信息。典型的应用有:

      1、记住密码,下次自动登录。

      2、购物车功能。
      
      3、记录用户浏览数据,进行商品(广告)推荐。

(4)缺陷

       ①Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。

       ②由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS)

       ③Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。

 二、Session详解

  (1)简介
  
        Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。

        Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息。

        Session由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中。
        
 (2)工作原理

        1、创建Session

        当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个SESSION,在创建这个SESSION的时候,服务器首先检查这个用户发来的请求里是否包含了一个SESSION ID,如果包含了一个SESSION ID则说明之前该用户已经登陆过并为此用户创建过SESSION,那服务器就按照这个SESSION ID把这个SESSION在服务器的内存中查找出来(如果查找不到,就有可能为他新创建一个),如果客户端请求里不包含有SESSION ID,则为该客户端创建一个SESSION并生成一个与此SESSION相关的SESSION ID。

       这个SESSION ID是唯一的、不重复的、不容易找到规律的字符串,这个SESSION ID将被在本次响应中返回到客户端保存,而保存这个SESSION ID的正是COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。 

    2、使用Session

    我们知道在IE中,我们可以在工具的Internet选项中把Cookie禁止,那么会不会出现把客户端的Cookie禁止了,那么SESSIONID就无法再用了呢?找了一些资料说明,可以有其他机制在COOKIE被禁止时仍然能够把Session id传递回服务器。
    
    经常被使用的一种技术叫做URL重写,就是把Session id直接附加在URL路径的后面一种是作为URL路径的附加信息,表现形式为: 
    http://…./xxx;jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764; 

    另一种是作为查询字符串附加在URL后面,表现形式为: 
    http://…../xxx?jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 

    还有一种就是表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把Session id传递回服务器。

(3)作用

    Session的根本作用就是在服务端存储用户和服务器会话的一些信息。典型的应用有:

    1、判断用户是否登录。

    2、购物车功能。

三、Cookie和Session的区别

  1、存放位置不同

        Cookie保存在客户端,Session保存在服务端。

  2 、存取方式的不同

     Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。 

     而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。 

 3、安全性(隐私策略)的不同 

    Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。

    而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 

    假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。

    而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。 

4、有效期上的不同

    只需要设置Cookie的过期时间属性为一个很大很大的数字,Cookie就可以在浏览器保存很长时间。 由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。

5、对服务器造成的压力不同

    Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。

6、 跨域支持上的不同

    Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。
  1. 电脑上访问一个网页,整个过程是怎么样的

    DNS、HTTP、TCP、OSPF、IP、ARP。

    连接-》请求-》应答-》关闭连接

  2. Ping的整个过程

  • 首先查本地arp cache信息,看是否有对方的mac地址和IP地址映射条目记录

  • 如果没有,则发起一个arp请求广播包,等待对方告知具体的mac地址

  • 收到arp响应包之后,获得某个IP对应的具体mac地址,有了物理地址之后才可以开始通信了,同时对ip-mac地址做一个本地cache

  • 发出icmp echo request包,收到icmp echo reply包

  1. C/S模式下使用socket通信,几个关键函数。
  • socket函数

  • bind函数

  • listen函数

  • accept函数

  • connect函数

  1. IP地址分类
  • A类地址

    A类地址的表示范围为:0.0.0.0~126.255.255.255,默认网络掩码为:255.0.0.0;A类地址分配给规模特别大的网络使用。
    
    A类网络用第一组数字表示网络本身的地址,后面三组数字作为连接于网络上的主机的地址。分配给具有大量主机(直接个人用户)而局域网络个数较少的大型网络。例如IBM公司的网络。
    
  • B类地址

    B类地址的表示范围为:128.0.0.0~191.255.255.255,默认网络掩码为:255.255.0.0;B类地址分配给一般的中型网络。

    B类网络用第一、二组数字表示网络的地址,后面两组数字代表网络上的主机地址。

  • C类地址

    C类地址的表示范围为:192.0.0.0~223.255.255.255,默认网络掩码为:255.255.255.0;C类地址分配给小型网络,如一般的局域网和校园网,它可连接的主机数量是最少的,采用把所属的用户分为若干的网段进行管理。

    C类网络用前三组数字表示网络的地址,最后一组数字作为网络上的主机地址。

    实际上,还存在着D类地址和E类地址。但这两类地址用途比较特殊,在这里只是简单介绍一下:D类地址称为广播地址,供特殊协议向选定的节点发送信息时用。E类地址保留给将来使用。

  1. 路由器与交换机区别
  • 路由器工作于OSI模型的网络层,能够识别IP地址,并根据IP地址转发数据包,并维护着路由表,能够基于路由表进行最佳路线选择;

  • 路由器上还能开启ACL访问控制列表、NAT地址转换等功能,扩展网络应用,;

  • 传统交换机工作于OSI模型的数据链路层,能够识别MAC地址,根据MAC地址转发数据帧,并维护着一张桥表,根据桥表上MAC地址和端口的对应关系进行数据帧转发。

  • 交换机能够隔离冲突域,并划分VLAN。

你可能感兴趣的:(Android,面试)