面试知识点八:网络

79.http 响应码 301 和 302 表明的是什么?有什么区别?javascript

80.forward 和 redirect 的区别?php

81.简述 tcp 和 udp的区别?html

82.tcp 为何要三次握手,两次不行吗?为何?java

83.说一下 tcp 粘包是怎么产生的?web

84.OSI 的七层模型都有哪些?算法

85.get 和 post 请求有哪些区别?json

86.如何实现跨域?segmentfault

87.说一下 JSONP 实现原理?后端

 

79.http 响应码 301 和 302 表明的是什么?有什么区别?跨域

官方的比较简洁的说明:

        301 redirect: 301 表明永久性转移(Permanently Moved)

        302 redirect: 302 表明暂时性转移(Temporarily Moved )

详细来讲,301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址能够从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另外一个地址B)——这是它们的共同点。他们的不一样在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向以后的网址;302表示旧地址A的资源还在(仍然能够访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。

  http状态码301和302详解及区别

80.forward 和 redirect 的区别?

  在学习Servlet和JSP时,常常会使用到forward和redirect,咱们先来看这二者在Servlet中的调用方式:

  1.forward

  request.getRequestDispatcher("new.jsp").forward(request, response);   //转发到new.jsp

  2.redirect

  response.sendRedirect("new.jsp");   //重定向到new.jsp

  很明显一个是用request对象调用,一个是用response对象调用,那么,这二者有什么区别呢?

  1、数据共享方面

  forward:转发页面和转发到的页面能够共享request里面的数据
  redirect:不能共享数据

  2、地址栏显示方面

  forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因此它的地址栏仍是原来的地址.
  redirect是服务端根据逻辑,发送一个状态码,告诉浏览器从新去请求那个地址.因此地址栏显示的是新的URL.

  3、本质区别

  转发是服务器行为,重定向是客户端行为。为何这样说呢,这就要看两个动做的工做流程: 

  转发过程:客户浏览器发送http请求--->web服务器接受此请求--->调用内部的一个方法在容器内部完成请求处理和转发动做--->将目标资源 发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其余的web路径上去,中间传递的是本身的容器内的request。在客 户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感受不到服务器作了转发的。转发行为是浏览器只作了一次访问请求。 

  重定向过程:客户浏览器发送http请求--->web服务器接受后发送302状态码响应及对应新的location给客户浏览器--->客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址--->服务器根据此请求寻找资源并发送给客户。在这里 location能够重定向到任意URL,既然是浏览器从新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的 路径,客户能够观察到地址的变化的。重定向行为是浏览器作了至少两次的访问请求的。   

  重定向,实际上是两次request:第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE能够看到地址变了,并且历史的回退按钮也亮了。重定向能够访问本身web应用之外的资源。在重定向的过程当中,传输的信息会被丢失。 

  4、从效率来讲:

  forword效率高,而redirect效率低

  5、从请求的次数来讲:

  forword只有一次请求;而redirect有两次请求

forward(转发)与redirect(重定向)的区别

forward和redirect的区别是什么?

81.简述 tcp 和 udp的区别?

  TCP/IP协议是一个协议簇。里面包括不少协议的。UDP只是其中的一个。之因此命名为TCP/IP协议,由于TCP,IP协议是两个很重要的协议,就用他两命名了。
TCP/IP协议集包括应用层,传输层,网络层,网络访问层。

  TCP(Transmission Control Protocol,传输控制协议)是面向链接的协议,也就是说,在收发数据前,必须和对方创建可靠的链接。一个TCP链接必需要通过三次“对话”才能创建起来,其中的过程很是复杂,只简单的描述下这三次对话的简单过程:主机A向主机B发出链接请求数据包:“我想给你发数据,能够吗?”,这是第一次对话;主机B向主机A发送赞成链接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工做)的数据包:“能够,你何时发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我如今就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,通过三次“对话”以后,主机A才向主机B正式发送数据。

  UDP(User Data Protocol,用户数据报协议)
(1) UDP是一个非链接的协议,传输数据以前源端和终端不创建链接,当它想传送时就简单地去抓取来自应用程序的数据,并尽量快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每一个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 因为传输数据不创建链接,所以也就不须要维护链接状态,包括收发状态等,所以一台服务机可同时向多个客户机传输相同的消息。

  小结TCP与UDP的区别:
  1.基于链接与无链接;
  2.对系统资源的要求(TCP较多,UDP少);
  3.UDP程序结构较简单;
  4.流模式与数据报模式 ;
  5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

  TCP和UDP的区别(转)

82.tcp 为何要三次握手,两次不行吗?为何?

  传输层创建了主机端到端的连接,传输层的做用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通讯的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。咱们一般说的,TCP UDP就是在这一层。端口号既是这里的“端”。

一、三次握手

(1)三次握手的详述

首先Client端发送链接请求报文,Server段接受链接后回复ACK报文,并为此次链接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP链接就创建了。

 

 最初两端的TCP进程都处于CLOSED关闭状态,A主动打开链接,而B被动打开链接。(A、B关闭状态CLOSED——B收听状态LISTEN——A同步已发送状态SYN-SENT——B同步收到状态SYN-RCVD——A、B链接已创建状态ESTABLISHED

  • B的TCP服务器进程先建立传输控制块TCB,准备接受客户进程的链接请求。而后服务器进程就处于LISTEN(收听)状态,等待客户的链接请求。如有,则做出响应。
  • 1)第一次握手:A的TCP客户进程也是首先建立传输控制块TCB,而后向B发出链接请求报文段,(首部的同步位SYN=1初始序号seq=x),(SYN=1的报文段不能携带数据)但要消耗掉一个序号,此时TCP客户进程进入SYN-SENT(同步已发送)状态。
  • 2)第二次握手:B收到链接请求报文段后,如赞成创建链接,则向A发送确认,在确认报文段中(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),测试TCP服务器进程进入SYN-RCVD(同步收到)状态;
  • 3)第三次握手:TCP客户进程收到B的确认后,要向B给出确认报文段(ACK=1,确认号ack=y+1,序号seq=x+1)(初始为seq=x,第二个报文段因此要+1),ACK报文段能够携带数据,不携带数据则不消耗序号。TCP链接已经创建,A进入ESTABLISHED(已创建链接)。
  • 当B收到A的确认后,也进入ESTABLISHED状态。

(2)总结三次握手过程:

  • 第一次握手:起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN-SENT状态,等待Server确认;
  • 第二次握手:Server收到数据包后由标志位SYN=1得知Client请求创建链接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认链接请求,Server进入SYN-RCVD状态,此时操做系统为该TCP链接分配TCP缓存和变量;
  • 第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,若是正确则将标志位ACK置为1,ack=y+1,而且此时操做系统为该TCP链接分配TCP缓存和变量,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,若是正确则链接创建成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server就能够开始传输数据。

起初A和B都处于CLOSED状态——B建立TCB,处于LISTEN状态,等待A请求——A建立TCB,发送链接请求(SYN=1,seq=x),进入SYN-SENT状态——B收到链接请求,向A发送确认(SYN=ACK=1,确认号ack=x+1,初始序号seq=y),进入SYN-RCVD状态——A收到B的确认后,给B发出确认(ACK=1,ack=y+1,seq=x+1),A进入ESTABLISHED状态——B收到A的确认后,进入ESTABLISHED状态。

TCB传输控制块Transmission Control Block,存储每个链接中的重要信息,如TCP链接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号。

(3)为何A还要发送一次确认呢?能够二次握手吗?

  答:主要为了防止已失效的链接请求报文段忽然又传送到了B,于是产生错误。如A发出链接请求,但因链接请求报文丢失而未收到确认,因而A再重传一次链接请求。后来收到了确认,创建了链接。数据传输完毕后,就释放了链接,A工发出了两个链接请求报文段,其中第一个丢失,第二个到达了B,可是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到链接释放之后的某个时间才到达B,此时B误认为A又发出一次新的链接请求,因而就向A发出确认报文段,赞成创建链接,不采用三次握手,只要B发出确认,就创建新的链接了,此时A不理睬B的确认且不发送数据,则B一致等待A发送数据,浪费资源。

TCP三次握手和四次挥手过程

 

83.说一下 tcp 粘包是怎么产生的?

1 什么是粘包现象

  TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

2 为何出现粘包现象

  (1)发送方缘由

  咱们知道,TCP默认会使用Nagle算法。而Nagle算法主要作两件事:1)只有上一个分组获得确认,才会发送下一个分组;2)收集多个小分组,在一个确认到来时一块儿发送。

  因此,正是Nagle算法形成了发送方有可能形成粘包现象。

  (2)接收方缘由

  TCP接收到分组时,并不会马上送至应用层处理,或者说,应用层并不必定会当即处理;实际上,TCP将收到的分组保存至接收缓存里,而后应用程序主动从缓存里读收到的分组。这样一来,若是TCP接收分组的速度大于应用程序读分组的速度,多个包就会被存至缓存,应用程序读时,就会读到多个首尾相接粘到一块儿的包。

3 何时须要处理粘包现象

  (1)若是发送方发送的多个分组原本就是同一个数据的不一样部分,好比一个很大的文件被分红多个分组发送,这时,固然不须要处理粘包的现象;

  (2)但若是多个分组本绝不相干,甚至是并列的关系,咱们就必定要处理粘包问题了。好比,我当时要接收的每一个分组都是一个有固定格式的商品信息,若是不处理粘包问题,每一个读进来的分组我只会处理最前边的那个商品,后边的就会被丢弃。这显然不是我要的结果。

4 如何处理粘包现象

  (1)发送方

  对于发送方形成的粘包现象,咱们能够经过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭Nagle算法。

  (2)接收方

  遗憾的是TCP并无处理接收方粘包现象的机制,咱们只能在应用层进行处理。

  (3)应用层处理

  应用层的处理简单易行!而且不只能够解决接收方形成的粘包问题,还能解决发送方形成的粘包问题。

  解决方法就是循环处理:应用程序在处理从缓存读来的分组时,读完一条数据时,就应该循环读下一条数据,直到全部的数据都被处理;可是如何判断每条数据的长度呢?

  两种途径:

   1)格式化数据:每条数据有固定的格式(开始符、结束符),这种方法简单易行,但选择开始符和结束符的时候必定要注意每条数据的内部必定不能出现开始符或结束符;

   2)发送长度:发送每条数据的时候,将数据的长度一并发送,好比能够选择每条数据的前4位是数据的长度,应用层处理时能够根据长度来判断每条数据的开始和结束。

  当时在作购物车的时候,我最开始的作法是设置开始符(0x7e)和结束符(0xe7),但在测试大量数据的时候,发现了数据异常。正如我所猜想,在调试过程当中发现某些数据内部包含了它们。由于要处理的数据是量很是庞大,为作到万无一失,最后我采用了发送长度的方式。再也没有由于粘包而出过问题。

  TCP的粘包现象

84.OSI 的七层模型都有哪些?

一、OSI的来源
        OSI(Open System Interconnect),即开放式系统互联。 通常都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。
        ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐全部公司使用这个规范来控制网络。这样全部公司都有相同的规范,就能互联了。
二、OSI七层模型的划分
       OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。以下图。
        每一层实现各自的功能和协议,并完成与相邻层的接口通讯。OSI的服务定义详细说明了各层所提供的服务。某一层的服务就是该层及其下各层的一种能力,它经过接口提供给更高一层。各层所提供的服务与这些服务是怎么实现的无关。
    

 

三、各层功能定义
        这里咱们只对OSI各层进行功能上的大概阐述,不详细深究,由于每一层实际都是一个复杂的层。后面我也会根据我的方向展开部分层的深刻学习。这里咱们就大概了解一下。咱们从最顶层——应用层 开始介绍。 整个过程以公司A和公司B的一次商业报价单发送为例子进行讲解。
<1>    应用层
        OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各类网络服务。咱们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP三、SMTP等。
         实际公司A的老板就是咱们所述的用户,而他要发送的商业报价单,就是应用层提供的一种网络服务,固然,老板也能够选择其余服务,好比说,发一份商业合同,发一份询价单,等等。
 
<2>    表示层
        表示层提供各类用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另外一个系统的应用层识别。若是必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通讯中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。
        因为公司A和公司B是不一样国家的公司,他们之间的商定统一用英语做为交流的语言,因此此时表示层(公司的文秘),就是将应用层的传递信息转翻译成英语。同时为了防止别的公司看到,公司A的人也会对这份报价单作一些加密的处理。这就是表示的做用,将应用层的数据转换翻译等。
<3>    会话层
        会话层就是负责创建、管理和终止表示层实体之间的通讯会话。该层的通讯由不一样设备中的应用程序之间的服务请求和响应组成。      
          会话层的同事拿到表示层的同事转换后资料,(会话层的同事相似公司的外联部),会话层的同事那里可能会掌握本公司与其余好多公司的联系方式,这里公司就是实际传递过程当中的实体。他们要管理本公司与外界好多公司的联系会话。当接收到表示层的数据后,会话层将会创建并记录本次会话,他首先要找到公司B的地址信息,而后将整份资料放进信封,并写上地址和联系方式。准备将资料寄出。等到肯定公司B接收到此份报价单后,这次会话就算结束了,外联部的同事就会终止这次会话。
<4>   传输层
        传输层创建了主机端到端的连接,传输层的做用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通讯的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。咱们一般说的,TCP UDP就是在这一层。端口号既是这里的“端”。
         传输层就至关于公司中的负责快递邮件收发的人,公司本身的投递员,他们负责将上一层的要寄出的资料投递到快递公司或邮局。
<5>   网络层
       本层经过IP寻址来创建两个节点之间的链接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是一般说的IP层。这一层就是咱们常常说的IP协议层。IP协议是Internet的基础。
         网络层就至关于快递公司庞大的快递网络,全国不一样的集散中心,好比说,从深圳发往北京的顺丰快递(陆运为例啊,空运好像直接就飞到北京了),首先要到顺丰的深圳集散中心,从深圳集散中心再送到武汉集散中心,从武汉集散中心再寄到北京顺义集散中心。这个每一个集散中心,就至关于网络中的一个IP节点。
<6>   数据链路层 
        将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。

     数据链路层又分为2个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。

        MAC子层处理CSMA/CD算法、数据出错校验、成帧等;LLC子层定义了一些字段使上次协议能共享数据链路层。 在实际使用中,LLC子层并不是必需的。

        这个没找到合适的例子

<7>  物理层     

        实际最终信号的传输是经过物理层实现的。经过物理介质传输比特流。规定了电平、速度和电缆针脚。经常使用设备有(各类物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。
          快递寄送过程当中的交通工具,就至关于咱们的物理层,例如汽车,火车,飞机,船。
 

85.get 和 post 请求有哪些区别?

什么是 HTTP?

超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通讯。

HTTP 的工做方式是客户机与服务器之间的请求-应答协议。

web 浏览器多是客户端,而计算机上的网络应用程序也可能做为服务器端。

举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。

两种 HTTP 请求方法:GET 和 POST

在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

  • GET - 从指定的资源请求数据。
  • POST - 向指定的资源提交要被处理的数据

下面的表格比较了两种 HTTP 方法:GET 和 POST。

  GET POST
后退按钮/刷新 无害 数据会被从新提交(浏览器应该告知用户数据会被从新提交)。
书签 可收藏为书签 不可收藏为书签
缓存 能被缓存 不能缓存
编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
历史 参数保留在浏览器历史中。 参数不会保存在浏览器历史中。
对数据长度的限制 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 无限制。
对数据类型的限制 只容许 ASCII 字符。 没有限制。也容许二进制数据。
安全性

与 POST 相比,GET 的安全性较差,由于所发送的数据是 URL 的一部分。

在发送密码或其余敏感信息时毫不要使用 GET !

POST 比 GET 更安全,由于参数不会被保存在浏览器历史或 web 服务器日志中。
可见性 数据在 URL 中对全部人都是可见的。 数据不会显示在 URL 中。

86.如何实现跨域?

什么是跨域?

  跨域,指的是浏览器不能执行其余网站的脚本。它是由浏览器的同源策略形成的,是浏览器施加的安全限制。

  所谓同源是指,域名,协议,端口均相同,不明白不要紧,举个栗子:

  http://www.123.com/index.html 调用 http://www.123.com/server.php (非跨域)

  http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不一样:123/456,跨域)

  http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不一样:abc/def,跨域)

  http://www.123.com:8080/index.html 调用 http://www.123.com:8081/server.php (端口不一样:8080/8081,跨域)

  http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不一样:http/https,跨域)

  请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。

  浏览器执行javascript脚本时,会检查这个脚本属于哪一个页面,若是不是同源页面,就不会被执行。

解决办法:

  一、JSONP:

  JSONP 是服务器与客户端跨源通讯的经常使用方法。最大特色就是简单适用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求。

  核心思想:网页经过添加一个<script>元素,向服务器请求 JSON 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。

<script src="http://test.com/data.php?callback=dosomething"></script>
// 向服务器test.com发出请求,该请求的查询字符串有一个callback参数,用来指定回调函数的名字

// 处理服务器返回回调函数的数据
<script type="text/javascript">
function dosomething(data){
//处理得到的数据
}
</script>

  二、代理:

  例如www.123.com/index.html须要调用www.456.com/server.php,能够写一个接口www.123.com/server.php,由这个接口在后端去调用www.456.com/server.php并拿到返回值,而后再返回给index.html,这就是一个代理的模式。至关于绕过了浏览器端,天然就不存在跨域问题。

  三、PHP端修改header(XHR2方式)

  在php接口脚本中加入如下两句便可:

  header('Access-Control-Allow-Origin:*');//容许全部来源访问

  header('Access-Control-Allow-Method:POST,GET');//容许访问的方式

  参考:什么是跨域?怎么解决跨域问题?

     什么是跨域?跨域解决方法

     不要再问我跨域的问题了

87.说一下 JSONP 实现原理?

  参考:jsonp原理详解——终于搞清楚jsonp是啥了

     完全弄懂jsonp原理及实现方法