JAVA后端面试《网络》

网络

    • 1.http响应码301和302代表的是什么?有何区别?
    • 2.forward和redirect的区别?
    • 3.同步和异步有何异同?什么场景使用?举例说明!
    • 4.简述TCP协议和UDP协议的区别?
    • 5.TCP为什么要三次握手,两次不行吗?为什么?
    • 6.什么是TCP粘包?是怎么产生的?怎么解决?
    • 7.OSI是什么?OSI的七层模型有哪些?
    • 8.GET和POST请求的区别有哪些?
    • 9.什么是跨域?怎么解决跨域问题?
    • 10.说一下JSONP的实现原理?

1.http响应码301和302代表的是什么?有何区别?

  • 301,302都是HTTP状态的编码,都代表着某个URL发生了转移。
  • 区别:
    • 301 redirect:代表永久性转移。
    • 302 redirect:代表暂时性转移。

2.forward和redirect的区别?

  • ①地址栏上:请求转发地址栏不发生变化,重定向地址栏发生变化。
  • ②数据共享上:请求转发可以带着数据跳转下一个页面,而重定向不行。
  • ③应用场景上:
    • forward用于用户登录,根据角色转发到相应模块。
    • redirect用于用户注销登录返回主页,或者跳转到其它网站。
  • ④效率上:请求转发要高于重定向。
  • ⑤请求次数上:请求转发一次,重定向两次。
    • forward:客户端和浏览器只发出一次请求。
    • Redirect:服务器端在响应第一次请求的时候,让浏览器再向另外一URL发出请求,从而达到转发目的。

3.同步和异步有何异同?什么场景使用?举例说明!

  • 同步:发送一个请求,等待返回之后,再发送下一个请求。
  • 异步:发送一个请求,无需等待返回,随时可以再发送下一个请求。
  • 同步的优点:同步可以避免死锁的出现和脏读数据的发生。一般多线程环境下共享某一资源的时候用同步,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取到另一个人已经删除的内容,就会出错。
  • 异步的优点:异步可以提高效率,现在cpu都是双核或四核,异步处理的话可以同时使用多个核,大大提高效率。
  • 同步和异步最大区别:同步需要等待,异步不需要等待。
    • 比如发送短信就是一个异步例子。发送者不需要等待接收者的返回信息,也可以继续发送。
    • 比如电话就是一个同步例子。发起者需要等待接收者接通电话后才能开始通信。

4.简述TCP协议和UDP协议的区别?

  • ①面向连接:TCP是面向连接的(三次握手);UDP不是面向连接的。
  • ②量级:TCP是一个重量级协议;UDP是一个轻量级协议。
  • ③可靠性:TCP交付保证:如果消息再传输中丢失,那么它将重发;UDP没有交付保证,一个数据包再传输过程中可能丢失。
  • ④有序性:消息到达网络的另一端可能是无序的,TCP协议会为你排好序;UDP不提供任何有序性的保证。
  • ⑤速度:TCP慢,适合传输大量数据;UDP快,适合传输少量数据。
  • ⑥流量控制和拥塞控制:TCP有,UDP没有。
  • ⑦TCP面向字节流,UDP面向报文。
  • ⑧TCP连接只能是点到点的;而UDP支持1对1,1对多,多对1,多对多的交互通信。

5.TCP为什么要三次握手,两次不行吗?为什么?

  • 为了实现可靠数据传输,TCP协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。
  • 如果是两次握手,最多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认。

6.什么是TCP粘包?是怎么产生的?怎么解决?

  • 概念:发送方发送的多个数据包,到接收方缓冲区首尾相连,粘成一包,被接收。
  • 原因:
    • 发送方产生粘包:TCP协议默认使用Nagle算法可能会把多个数据包一次发送到接收方。
      JAVA后端面试《网络》_第1张图片
    • 接收方产生粘包: 如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。
      JAVA后端面试《网络》_第2张图片
  • 解决方法 :
    • ①发送方:对于发送方造成的粘包问题,可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。
    • ②接收方:无法处理,交由应用层处理。
    • ③应用层:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成,但是如何判断每条数据的长度呢?
      • 格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。
      • 发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。

7.OSI是什么?OSI的七层模型有哪些?

  • 开放式系统互联通信参考模型(Open System InterConnection Reference Model)简写:OSI。是一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互联为网络的标准框架。
    • ①应用层:提供为应用软件而设的接口,以设置与另一应用软件之间的通信。
    • ②表达层:把数据转换为能与接收者的系统格式兼容并适合传输的格式。
    • ③会话层:负责在数据传输中设置和维护计算机网络中两台计算机之间的通信连接。
    • ④传输层:把传输表头(TH)加至数据以形成数据包。
    • ⑤网络层:决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成分组。网络表头包含了网络数据。
    • ⑥数据链路层:负责网络寻址、错误侦测和改错。
    • ⑦ 物理层:在局部局域网上传送数据帧(data frame),它负责管理计算机通信设备和网络媒体之间的互通。

8.GET和POST请求的区别有哪些?

  • ①浏览器回退:GET是无害的,而POST会再次提交请求。
  • ②书签:GET产生的URL地址可以被收藏为书签,而POST不可以。
  • ③缓存:GET请求会被浏览器主动缓存,而POST不会,除非手动设置。
  • ④编码:GET请求只能进行URL编码,而POST支持多种编码格式。
  • ⑤历史:GET请求参数会被完整保留在浏览器历史记录中,而POST中的参数不会被保留。
  • ⑥对数据长度限制:GET在URL传参的长度是有限制的,而POST没有限制。
  • ⑦对数据类型的限制:GET只接收ASCII字符,而POST没有限制。
  • ⑧安全性:GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • ⑨参数存放位置:GET通过URL传参,POST放在Request Body中。

9.什么是跨域?怎么解决跨域问题?

  • 跨域:是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。
    • **同源策略:**域名,协议,端口号相同。
    • 例1:http://www.taobao.com/index.html 调用 http://www.taobao.com/server.php (同源)
    • 例2:http://www.taobao.com/index.html 调用 http://www.tencent.com/server.php (taobao/tencent 跨域)主域名不同
    • 例3:http://www.taobao.com/index.html 调用 http://zzz.taobao.com/server.php (www/zzz 跨域)子域名不同
    • 例4:http://www.taobao.com:8080/index.html 调用 http://www.taobao.com:8088/server.php (8080/8088,跨域)端口不同
    • 例5:http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不同:http/https,跨域)
    • 请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。
  • 解决方法:
    • 1.JSONP:只支持GET请求,不支持POST请求。
    • 2.代理:代理模式从后台绕过浏览器端。
      • DomainA客户端(浏览器) ==> DomainA服务器 ==> DomainB服务器 ==> DomainA客户端(浏览器)

10.说一下JSONP的实现原理?

  • JSONP=JSON+Padding,动态创建script标签,利用script标签的src属性可以获取任何域下的JS脚本,通过这个特性,服务器端不在返回JSON格式,而是返回一段调用某个函数的JS代码,在src中进行了调用,这样就实现了跨域。

你可能感兴趣的:(JAVA后端面试)