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,搜索引擎会抓取新的内容而保存旧的网址。
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有两次请求
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不保证。
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)
(2)总结三次握手过程:
起初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发送数据,浪费资源。
83.说一下 tcp 粘包是怎么产生的?
TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
(1)发送方缘由
咱们知道,TCP默认会使用Nagle算法。而Nagle算法主要作两件事:1)只有上一个分组获得确认,才会发送下一个分组;2)收集多个小分组,在一个确认到来时一块儿发送。
因此,正是Nagle算法形成了发送方有可能形成粘包现象。
(2)接收方缘由
TCP接收到分组时,并不会马上送至应用层处理,或者说,应用层并不必定会当即处理;实际上,TCP将收到的分组保存至接收缓存里,而后应用程序主动从缓存里读收到的分组。这样一来,若是TCP接收分组的速度大于应用程序读分组的速度,多个包就会被存至缓存,应用程序读时,就会读到多个首尾相接粘到一块儿的包。
(1)若是发送方发送的多个分组原本就是同一个数据的不一样部分,好比一个很大的文件被分红多个分组发送,这时,固然不须要处理粘包的现象;
(2)但若是多个分组本绝不相干,甚至是并列的关系,咱们就必定要处理粘包问题了。好比,我当时要接收的每一个分组都是一个有固定格式的商品信息,若是不处理粘包问题,每一个读进来的分组我只会处理最前边的那个商品,后边的就会被丢弃。这显然不是我要的结果。
(1)发送方
对于发送方形成的粘包现象,咱们能够经过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭Nagle算法。
(2)接收方
遗憾的是TCP并无处理接收方粘包现象的机制,咱们只能在应用层进行处理。
(3)应用层处理
应用层的处理简单易行!而且不只能够解决接收方形成的粘包问题,还能解决发送方形成的粘包问题。
解决方法就是循环处理:应用程序在处理从缓存读来的分组时,读完一条数据时,就应该循环读下一条数据,直到全部的数据都被处理;可是如何判断每条数据的长度呢?
两种途径:
1)格式化数据:每条数据有固定的格式(开始符、结束符),这种方法简单易行,但选择开始符和结束符的时候必定要注意每条数据的内部必定不能出现开始符或结束符;
2)发送长度:发送每条数据的时候,将数据的长度一并发送,好比能够选择每条数据的前4位是数据的长度,应用层处理时能够根据长度来判断每条数据的开始和结束。
当时在作购物车的时候,我最开始的作法是设置开始符(0x7e)和结束符(0xe7),但在测试大量数据的时候,发现了数据异常。正如我所猜想,在调试过程当中发现某些数据内部包含了它们。由于要处理的数据是量很是庞大,为作到万无一失,最后我采用了发送长度的方式。再也没有由于粘包而出过问题。
84.OSI 的七层模型都有哪些?
数据链路层又分为2个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。
MAC子层处理CSMA/CD算法、数据出错校验、成帧等;LLC子层定义了一些字段使上次协议能共享数据链路层。 在实际使用中,LLC子层并不是必需的。
这个没找到合适的例子
<7> 物理层
85.get 和 post 请求有哪些区别?
什么是 HTTP?
超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通讯。
HTTP 的工做方式是客户机与服务器之间的请求-应答协议。
web 浏览器多是客户端,而计算机上的网络应用程序也可能做为服务器端。
举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。
两种 HTTP 请求方法: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 实现原理?