计算机网络面试必备(一)

 

OSI七层协议

    OSI全称为Open System InterConnection,即开放式系统互联,国际标准化组织ISO制定了OSI模型。该模型按照功能、分工的不同,人为地将网络通信的工作分成了7层。互联网的本质就是一系列网络协议。每一层都运行不同的协议,协议就是标准。实际上这个7层是不存在的,区分出这7层的目的就是让你明白哪一层是干嘛的!另外,还有人把它划成四层、五层,具体如下:

    对等层之间不能相互直接通信,各层之间是严格单向依赖,上层使用下层提供的服务,下层向上层提供服务。 

下面先从最底层的物理层开始介绍:

1.物理层(比特bit)

    通过媒介传输比特,确定机械及电气规范。 规定如何为网络通信实现最底层的物理连接。 如:如何使用电缆和接头的类型、用来传送信号的电压等。 物理层实际上是一种规定,规定物理媒介设备在连接网络时的各种规格、参数以及工作方式。 物理媒介(网线,电缆)不属于物理层,光纤、同轴电缆、双绞线、中继器集线器等物理媒介等是物理层的实现。

 

2.数据链路层(桢frame)

    将比特组装成帧和点到点的连接。 规定了如何进行物理地址寻址,如何在物理线路上进行数据(帧frame)的可靠传递以及流量控制,通过使用接收系统的硬件地址或物理地址来寻址。 协议有SLIP协议,CSLIP协议,PPP协议等。 交换机工作在数据链路层,对帧解码并根据帧中包含的信息把数据发送到正确的接收方。 

 

3.网络层(包package)

     网络层也称通信子网层,是高层协议之间的界面层,用于控制通信子网的操作,是通信子网与资源子网的接口。在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。网络层将解封装数据链路层收到的帧,提取数据包,包中封装有网络层包头,其中含有逻辑地址信息源站点和目的站点地址的网络地址。

     如果你在谈论一个IP地址,那么你是在处理第3层的问题,这是“数据包”问题,而不是第2层的“”。IP是第3层问题的一部分,此外还有一些路由协议地址解析协议(ARP)。有关路由的一切事情都在第3层处理。地址解析和路由是3层的重要目的。网络层还可以实现拥塞控制、网际互连、信息包顺序控制及网络记账等功能。

    网络层典型设备:网关路由器

 

4.传输层(段segment)

    传输层建立在网络层和会话层之间,实质上它是网络体系结构中高低层之间衔接的一个接口层。用一个寻址机制来标识一个特定的应用程序(端口号)。传输层不仅是一个单独的结构层,它还是整个分层体系协议的核心,没有传输层整个分层协议就没有意义。

     传输层的数据单元是由数据组织成的数据段(segment)这个层负责获取全部信息,因此,它必须跟踪数据单元碎片、乱序到达的数据包和其它在传输过程中可能发生的危险。传输层为上层提供端到端(最终用户到最终用户)的透明的、可靠的数据传输服务,所谓透明的传输是指在通信过程中传输层对上层屏蔽了通信传输系统的具体细节。

     输层的主要功能是从会话层接收数据,根据需要把数据切成较小的数据片,并把数据传送给网络层,确保数据片正确到达网络层,从而实现两层数据的透明传送。传输层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用。当网络层服务质量不能满足要求时,它将服务加以提高,以满足高层的要求;当网络层服务质量较好时,它只用很少的工作。传输层还可进行复用,即在一个网络连接上创建多个逻辑连接。

    

5.会话层(会话协议数据单元SPDU)

     在会话层及以上的高层次中,数据传送的单位不再另外命名,统称为报文。会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。如服务器验证用户登录便是由会话层完成的

    会话层提供的服务可使应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。会话层、表示层应用层构成开放系统的高3层,面对应用进程提供分布处理,对话管理,信息表示,恢复最后的差错等。会话层同样要担负应用进程服务要求,而运输层不能完成的那部分工作,给运输层功能差距以弥补。主要的功能是对话管理,数据流同步和重新同步。要完成这些功能,需要由大量的服务单元功能组合,已经制定的功能单元已有几十种。

 

6.表示层(表示协议数据单元PPDU)

    表示层向上对应用层提供服务,向下接收来自会话层的服务。表示层是为在应用过程之间传送的信息提供表示方法的服务,它关心的只是发出信息的语法与语义。表示层要完成某些特定的功能,主要有不同数据编码格式的转换,提供数据压缩、解压缩服务,对数据进行加密、解密。例如图像格式的显示,就是由位于表示层的协议来支持。

    表示层为应用层提供服务包括语法选择、语法转换等。语法选择是提供一种初始语法和以后修改这种选择的手段。语法转换涉及代码转换和字符集的转换、数据格式的修改以及对数据结构操作的适配。

 

7.应用层(应用协议数据单元APDU)

     网络应用层是通信用户之间的窗口,为用户提供网络管理、文件传输、事务处理等服务。其中包含了若干个独立的、用户通用的服务协议模块。网络应用层是OSI的最高层,为网络用户之间的通信提供专用的程序。应用层的内容主要取决于用户的各自需要,这一层设计的主要问题是分布数据库、分布计算技术、网络操作系统和分布操作系统、远程文件传输、电子邮件、终端电话及远程作业登录与控制等。至2011年应用层在国际上没有完整的标准,是一个范围很广的研究领域。在OSI的7个层次中,应用层是最复杂的,所包含的应用层协议也最多,有些还在研究和开发之中。

     应用层为操作系统或网络应用程序提供访问网络服务的接口。

https://www.cnblogs.com/gdayq/p/5797645.html

 

TCP/IP四层模型及原理

    TCP/IP协议这个名字是两个协议的组合,即TCP:Transmission Control Protocol 传输控制协议 、 IP: Internet Protocol 互联网协议,该协议是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,两台主机要实现通讯,都必须遵守TCP/IP协议。

 首先谈一下,OSI七层和TCP/IP四层的关系:

①OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。

②OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型。

③OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。

总结下两者的异同之处:

相同点:都采用了层次结构的概念;都能够提供面向连接(TCP协议)和无连接(UDP协议)两种通信服务机制。

不同点:

  • 对可靠性要求不同,TCP/IP参考模型的要求更高
  • OSI参考模型是在协议开发前设计的,具有通用性TCP/IP参考模型是在有协议集的情况下建立的,不适用非TCP/IP网络
  • OSI参考模型只是理论上的模型,并没有成熟的产品支持;而TCP/IP参考模型已经成为“实际上的国际标准”

TCP/IP与OSI最大的不同在于OSI是一个理论上的网络通信模型,而TCP/IP则是实际运行的网络协议

 

下面分别说说:网络接口层、网络层、传输层、应用层
1.网络接口层 / 数据链路层 / 主机到网络层

    实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层——网络互联层一个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。

    作用:(1) 实现网卡接口的网络驱动,以处理数据在以太网线等物理媒介上的传输

               (2) 网络驱动程序隐藏了不同物理网络的不同电气特性,为上层协议提供一个统一的接口 。

    协议应用:ARP和RARP(Reverse Address Resolve Protocol,逆地址解析协议)实现了IP地址和物理/Mac地址之间的转换 。

 

2.网络层 / 网络互联层 

    是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。
    网络互连层除了需要完成路由的功能外,也可以完成将不同类型的网络(异构网)互连的任务。除此之外,网络互连层还需要完成拥塞控制的功能。  

     作用:网络有分局域网(LAN, Local Area Network)和广域网(WAN, Wide Area Network)。对于后者通常需要使用众多分级的路由器来连接分散的主机或者LAN,即通讯的两台主机一般不是直接连接,而是通过多个中间节点(路由器)连接的,从而形成网络拓扑连接。(1) 网络层的任务之一就是选择这些中间节点,以确定两台主机间的通讯路径。   (2) 其次网络层对上层协议隐藏了网络拓扑连接的细节,在使得传输层看来通讯双方是直接连接的   

    协议应用:

     (1) IP协议: IP协议(Internet Protocol)是网络层最核心的协议,它根据数据包的目的IP地址来决定如何投递该数据包。若数据包不可直接发送给目标主机,那么IP协议就为它寻找一个合适的下一跳路由器,并将数据包交付给该路由器去转发,如此循环直至到达目标主机或者发送失败而丢弃该数据包。

     (2) ICMP协议: ICMP协议(Internet Control Message Protocol,因特网控制报文协议)是IP协议的补充,用于检测网络的连接状态,如ping应用程序就是ICMP协议的使用。ICMP包发送是不可靠的,所以不能依靠接收ICMP包解决网络问题;ICMP与TCP/UDP不同,它们是传输层协议,虽然都具有类型域和代码域,但是前者和后者不同,ping用到的ICMP协议,不是端口。ICMP协议使用的是IP协议而非使用下层协议提供的的服务,所以严格来讲它并非网络层协议,而是网络层程序。

 

3.传输层

    传输层为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。

    作用:(1) 定义了两个主要的协议:传输控制协议(TCP)、用户数据报协议(UDP),其中TCP协议是可靠的、面向连接的协议;UDP协议是不可靠的,面向无连接的协议;  (2)确定接收端的端口号即发送端的端口号,应用程序提供端对端通讯的”错觉”,即为应用程序隐藏了数据包跳转的细节,负责数据包的收发、链路超时重连等。
    协议应用:

    (1) TCP协议:(Transmission Control Protocol, 传输控制协议) 为应用程序提供可靠的、面向连接的、基于流的服务,具有超时重传、数据确认等方式来确保数据包被正确发送到目的端。因此TCP服务是可靠的,使用TCP协议通讯的双方必须先建立起TCP连接,并在系统内核中为该连接维持一些必要的数据结构,比如连接的状态,读写缓冲区,多个定时器等。当通讯结束时双方必须关闭连接以释放这些内核数据。基于流发送意思是数据是没有长度限制,它可源源不断地从通讯的一段流入另一端。   (2) UDP协议: (User Datagram Protocol, 用户数据报协议) 与TCP协议相反,它为应用程序提供的是不可靠的、无连接的基于数据报的服务。 无连接:通讯双方不保持一个长久的联系,因此应用程序每次发送数据都要明确指定接收方的地址; 基于数据报的服务:这是相对于数据流而言的,每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其内容一次性读出,否则数据将被截断。UDP不具有发送时是被重发功能,所以UDP协议在内核实现中无需为应用程序的数据保存副本,当UDP数据报被成功发送之后,UDP内核缓冲区中该数据报就被丢弃了

    (3)SCTP协议:(Stream Control Transmission Protocol, 流控制传输协议)是为了在因特网上传输电话信号而设计的。 

 

4.应用层

     TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协议(File Transfer Protocol,FTP)、虚拟终端协议(TELNET)、超文本链接协议(Hyper Text Transfer Protocol,HTTP),也有基于UDP协议的。

     作用:前面所述的三层负责处理网络通讯的相关细节,这部分需要稳定高效,因此它们是在操作系统的内核空间中,而应用层是在用户空间实现的,负责处理众多业务逻辑,如文件传输、网络管理。  

协议应用

    (1) telne协议:远程登录协议,它使我们能在本地完成远程任务   

    (2) OSPF协议: (Open Shorttest Path First, 开放最短路径优先) 是一种动态路由更新协议,用于路由器之间的通讯,以告知对方自身的路由信息 。

   (3) DNS协议:(Domain Name Service, 域名服务) 提供机器域名到IP地址的转换。如百度的域名是www.baidu.com,对应的IP地址是http://119.75.217.109/。DNS协议可以跳过传输层直接使用网络层提供的服务,比如ping程序和OSPF协议;也可以既使用TCP服务,又使用UDP服务。(注:ping是应用程序而非协议,它利用网络层的ICMP协议监测网络连接)

 

TCP、UDP区别

两者都是传输层协议,先简单的看看他们的区别:

TCPUDP
面向连接无连接
要求系统资源较多要求系统资源较少
程序结构较复杂程序结构较简单
字节流模式数据报模式
保证数据正确性、顺序可能丢包、不保证顺序

 

 

 

 

 

 

注:TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。TCP一般应用在对可靠性要求比较高的场合,例如http、ftp等等。

UDP的应用场景:RIP选路表的更新、 DNS、SNMP等都是运行在UDP之上。 面向数据报方式、网络数据大多为短消息、拥有大量Client、对数据安全性无特殊要求、网络负担非常重,但对响应速度要求高 。

TCP与UDP区别总结:

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

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

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

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

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

    6、TCP的逻辑通信信道是全双工的可靠信道;UDP则是不可靠信道。

为什么UDP有时比TCP更有优势?

    UDP以其简单、传输快的优势,在越来越多场景下取代了TCP,如实时游戏。

(1)网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。

(2)TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP内置的系统协议栈中,极难对其进行改进。 采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。

 

HTTP请求和响应的全过程

HTTP无状态性

    HTTP协议是无状态的(stateless)。也就是同一个客户端在第二次访问同一个 服务器上的页面时,服务器无法知道这个客户端曾经访问过,服务器也无法分辨客户端。HTTP无状态性简化了服务器的设计,使服务器更好的支持大量的并发请求。

HTTP持久连接

    HTTP /1.0采用的是非持久连接,主要缺点是客户端必须为每一个待请求的对象建立并维护一个新的连接,即每请求一个文档就要有两倍RTT 的开销。因为同一个页面可能存在多个对象,所以非持久连接可能使一个页面的下载变得十分缓慢,而且这种短连接增加了网络传输的负担。

    HTTP /1.1 使用持久连接keep alive,所谓持久连接,就是服务器在发送响应后仍然在一段时间内保持这条连接,允许在同一个连接中存在多次数据请求和响应,即在持久连接情况下,服务器在发送完响应后并不关闭TCP 连接,而客户端可以通过这个连接继续请求其他对象。HTTP/1.1 协议的持久连接有两种方式:非流水线方式:客户在收到前一个响应后才能发出下一个请求;流水线方式:客户在收到HTTP的响应报文之前就能接着发送新的请求报文。

    注:RTT(Round-Trip Time): 往返时延,在计算机网络中它也是一个重要的性能指标,它表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。

 

HTTP请求与响应全过程

    在用户在浏览器的地址栏输入网址之后:

    ①浏览器根据域名解析地址

浏览器根据访问的域名找到其IP地址。DNS查找过程如下:

      浏览器缓存:浏览器会缓存DNS记录一段时间。 但操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。 系统缓存:如果在浏览器缓存里没有找到需要的域名,浏览器会做一个系统调用(windows里是gethostbyname),这样便可获得系统缓存中的记录。路由器缓存:如果系统缓存也没找到需要的域名,则会向路由器发送查询请求,它一般会有自己的DNS缓存。ISP DNS缓存:如果依然没找到需要的域名,则最后要查的就是ISP缓存DNS的服务器。在这里一般都能找到相应的缓存记录。

        就是将网站名称转变成IP地址:localhost-->127.0.0.1,像什么hosts文件,DNS域名解析等等可以实现这种功能。域名解析的方式主要有两种,分别是:

   

 

    ② 浏览器与Web服务器建立一个TCP连接(TCP三次握手)

         在客户机和服务器之间建立正常的TCP网络连接时:★ 客户机首先发出一个SYN消息   ★服务器使用SYN+ACK应答表示接收到了这个消息  ★最后客户机再以ACK消息响应。 这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。

一次完整的HTTP事务

      拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序(本文就以Nginx为例),最终建立了TCP/IP的连接。

    ③浏览器给Web服务器发送一个HTTP请求

       所谓的HTTP请求,也就是Web客户端向Web服务器发送信息,这个信息由如下三部分组成:

    ●请求行

    例如:GET www.cnblogs.com HTTP/1.1。请求行写法是固定的,由三部分组成,第一部分是请求方法:(除了常见的只有Get和Post方法,实际上HTTP请求方法还有很多,比如: PUT方法,DELETE方法,HEAD方法,CONNECT方法,TRACE方法),第二部分是请求网址,第三部分是HTTP版本。

    ●HTTP头

    HTTP头在HTTP请求可以是3种HTTP头:请求头(request header) 、普通头(general header)、 实体头(entity header)。通常来说,由于Get请求往往不包含内容实体,因此也不会有实体头。

   ●内容: 只在POST请求中存在,因为GET请求并不包含任何实体。

    ④服务器端响应http请求,浏览器得到html代码

    当Web服务器收到HTTP请求后,会根据请求的信息做某些处理(这些处理可能仅仅是静态的返回页,或是包含Asp.net, PHP, Jsp等语言进行处理后返回),相应的返回一个HTTP响应。HTTP响应在结构上类似于HTTP请求,也是由三部分组成,分别为:

    ▲状态行 

     例如:HTTP/1.1 200 OK,第一部分是HTTP版本,第二部分是响应状态码,第三部分是状态码的描述。状态码(三位数)分类:信息类 (100-199)、响应成功 (200-299)、重定向类 (300-399)、客户端错误类 (400-499)、服务端错误类 (500-599)。

    ▲HTTP头

     HTTP响应中包含的头包括:响应头(response header)、普通头(general header)、实体头(entity header)。

    ▲返回内容

     HTTP响应内容就是HTTP请求所请求的信息。这个信息可以是一个HTML,也可以是一个图片。响应的数据格式通过Content-Type字段来获得:Content-Type:image/png;或者我们熟悉的Content-Type:text/html

    ⑤浏览器解析html代码,并请求html代码中的资源

     了解持久连接:有时候我们获取一个HTML页面,在对浏览器对HTML解析的过程中,如果发现额外的URL需要获取的内容,会再次发起HTTP请求去服务器获取,比如样式文件,图片。许多个HTTP请求,只依靠一个TCP连接就够了,这就是所谓的持久连接。也是所谓的一次HTTP请求完成。

    ⑥浏览器对页面进行渲染呈现给用户

 

 

HTTP常见响应码(200、301、302、404、500)

    状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。             

    1xx信息性状态码,表示服务器已接收了客户端请求,客户端可继续发送请求。 100:Continue、101:Switching Protocols

    2xx成功状态码,表示服务器已成功接收到请求并进行处理。200:OK 表示客户端请求成功、204 No Content 成功,但不返回任何实体的主体部分 、206:Partial Content 成功执行了一个范围(Range)请求。          

    3xx重定向状态码,表示服务器要求客户端重定向。301:Moved Permanently 永久性重定向,响应报文的Location首部应该有该资源的新URL302:Found 临时性重定向,响应报文的Location首部给出的URL用来临时定位资源 、303:See Other 请求的资源存在着另一个URI,客户端应使用GET方法定向获取请求的资源、304:Not Modified 客户端发送附带条件的请求(请求首部中包含如If-Modified-Since等指定首部)时,服务端有可能返回304,此时,响应报文中不包含任何报文主体、307 Temporary Redirect 临时重定向。与302 Found含义一样。302禁止POST变换为GET,但实际使用时并不一定,307则更多浏览器可能会遵循这一标准,但也依赖于浏览器具体实现。              

     4xx客户端错误状态码,表示客户端的请求有非法内容。400:Bad Request 表示客户端请求有语法错误,不能被服务器所理解、401:Unauthonzed 表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用、403 Forbidden:表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因、404:Not Found 请求的资源不存在,例如,输入了错误的URL。             

     5xx服务器错误状态码,表示服务器未能正常处理客户端的请求而出现意外错误。500:Internel Server Error 表示服务器发生不可预期的错误,导致无法完成客户端的请求、503:Service Unavailable 表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常 。

 

HTTPS和HTTP/2

    HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。相对HTTP协议来说,HTTPS协议建立数据通道的更加耗时,若直接部署到App中,势必降低数据传递的效率,间接影响用户体验。HTTP网站可以访问HTTPS链接,HTTPS网站无法访问HTTP链接(除了部分支持mixed-content的浏览器)。

HTTPS作为安全协议而诞生,那么就不得不面对以下两大安全问题:

  • 身份验证:确保通信双方身份的真实性。A希望与B通信,A如何确认B的身份不是由C伪造的。(由C伪造B的身份与A通信,称为中间人攻击)。

  • 通信加密:通信的机密性、完整性依赖于算法与密钥,通信双方是如何选择算法与密钥的。

    能同时解决以上两个问题,就能确保真实有效的通信双方采取有效的算法与密钥进行通信,便完成了协议安全的初衷。在介绍HTTPS协议如何解决两大安全问题前,我们首先了解几个概念。

  • 数字证书:数字证书是互联网通信中标识双方身份信息的数字文件,由CA签发。CA(certification authority)是数字证书的签发机构。作为权威机构,其审核申请者身份后签发数字证书,这样我们只需要校验数字证书即可确定对方的真实身份。

  • HTTPS协议、SSL协议、TLS协议、握手协议的关系

         HTTPS是Hypertext Transfer Protocol over Secure Socket Layer的缩写,即HTTP over SSL,可理解为基于SSL的HTTP协议。HTTPS协议安全是由SSL协议(目前常用的,本文基于TLS 1.2进行分析)实现的。SSL协议是一种记录协议,扩展性良好,可以很方便的添加子协议,而握手协议便是SSL协议的一个子协议TLS协议是SSL协议的后续版本,本篇中涉及的SSL协议默认是TLS协议1.2版本。

     HTTPS协议的安全性由SSL协议实现,当前使用的TLS协议1.2版本包含了四个核心子协议:握手协议密钥配置切换协议应用数据协议报警协议解决身份验证与通信加密的核心,便是握手协议,接下来着重介绍握手协议。

    握手协议的作用便是通信双方进行身份确认、协商安全连接各参数(加密算法、密钥等),确保双方身份真实并且协商的算法与密钥能够保证通信安全。对握手协议的介绍限于客户端对服务端的身份验证,单向身份验证也是目前互联网公司最常见的认证方式。

 

    随着互联网的快速发展,HTTP1.x协议得到了迅猛发展,但当App一个页面包含了数十个请求时,HTTP1.x协议的局限性便暴露了出来:

  • 每个请求与响应需要单独建立链路进行请求(Connection字段能够解决部分问题),浪费资源。
  • 每个请求与响应都需要添加完整的头信息,应用数据传输效率较低。
  • 默认没有进行加密,数据在传输过程中容易被监听与篡改。

HTTP2正是为了解决HTTP1.x暴露出来的问题而诞生的。

说到HTTP2不得不提spdy。 
由于HTTP1.x暴露出来的问题,Google设计了全新的名为spdy的新协议。spdy在五层协议栈的TCP层与HTTP层引入了一个新的逻辑层以提高效率。spdy是一个中间层,对TCP层与HTTP层有很好的兼容,不需要修改HTTP层即可改善应用数据传输速度。 spdy通过多路复用技术,使客户端与服务器只需要保持一条链接即可并发多次数据交互,提高了通信效率。 而HTTP2便是基于spdy的思路开发的。 通过流与帧概念的引入,继承了spdy的多路复用,并增加了一些实用特性。

     HTTP2为了解决HTTP1.x中头信息过大导致效率低下的问题,提出的解决方案便是压缩头部信息。具体的压缩方式,则引入了HPACK。HPACK压缩算法是专门为HTTP2头部压缩服务的。为了达到压缩头部信息的目的,HPACK将头部字段缓存为索引,通过索引ID代表头部字段。客户端与服务端维护索引表,通信过程中尽可能采用索引进行通信,收到索引后查询索引表,才能解析出真正的头部信息。HPACK索引表划分为动态索引表与静态索引表,动态索引表是HTTP2协议通信过程中两端动态维护的索引表,而静态索引表是硬编码进协议中的索引表。

    HTTP2有什么特性呢?HTTP2的特性不仅解决了上述已暴露的问题,还有一些功能使HTTP协议更加好用。

  • 多路复用(http2为了优化http1.x对TCP性能的浪费。同一域名下的请求,可通过同一条TCP链路进行传输,使多个请求不必单独建立链路,节省建立链路的开销。)
  • 压缩头信息
  • 对请求划分优先级
  • 支持服务端Push消息到客户端

      此外,HTTP2目前在实际使用中,只用于HTTPS协议场景下,通过握手阶段ClientHello与ServerHello的extension字段协商而来,所以目前HTTP2的使用场景,都是默认安全加密的。

    HTTP/2和SPDY的区别: HTTP/2支持HTTP传输,SPDY只支持HTTPS; HTTP/2和SPDY的header压缩算法不同。

 

get和Post的区别

      在我大万维网世界中,TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET、POST、PUT、 DELETE等等,HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。

    在我大万维网世界中,还有另一个重要的角色:运输公司。不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司。虽然理论上,你可以在车顶上无限的堆货物(url中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到哦。

    GET和POST还有一个重大区别:对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。简言之—— GET产生一个TCP数据包;POST产生两个TCP数据包。也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

◆GET与POST都有自己的语义,不能随便混用。

◆据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

◆并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

总结一下GET和POST的区别:

  • get参数通过url传递,post放在request body中。

  • get请求在url中传递的参数是有长度限制的,而post没有。

  • get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。

    • get请求只能进行url编码,而post支持多种编码方式

    • get请求会浏览器主动cache,而post支持多种编码方式。

    • get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。

  • GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
  • GET产生一个TCP数据包;POST产生两个TCP数据包。

 

forward和redirect的区别

直接转发(forward)和间接转发(redirect)的原理及区别是什么?

    Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的sendRedirect()方法。 对于间接方式,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。它本质上是两次HTTP请求,对应两个request对象。 对于直接方式,客户端浏览器只发出一次请求,Servlet把请求转发给Servlet、HTML、JSP或其它信息资源,由第2个信息资源响应该请求,两个信息资源共享同一个request对象

下面从以下四个方面来阐述它俩的区别:

■ 地址栏

    forward方式为服务器直接跳转,客户端浏览器并不知道,地址栏内容不变(服务器内部动作,服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址);

    redirect方式为客户端浏览器根据URL地址,重新向服务器请求,地址栏变(服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL)

■ 数据共享

    forward方式转发页面和转发到的页面可以共享request里面的数据 ;

    redirect方式是全新的request。

■ 运用的地方

    forward:用户登录后根据角色跳转页面;

    redirect:在用户注销后跳转主页或其他页面 。

■ 效率:

forward比redirect少了一次服务器请求,效率高一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值