Java面试题7 网络
自己尝试通过打字来回答一些网上常见的面试题,答案仅代表我自己的观点
79. http 响应码 301 和 302 代表的是什么?有什么区别?
它们都代表访问的页面发生了转移,301代表永久性转移,302代表暂时性转移。
80. forward 和 redirect 的区别?
forward是服务端内部将该请求移交到另一个控制器组件来处理,这对前端是完全透明的,前端不知道发生了forward,在前端看来,这是一次请求。
redirect是向前端发送重定向响应,前端接收到重定向响应之后知道我应该再次发送一个请求到指定的页面,在前端看来,这是两次请求。
forward之间的传值很容易,因为根本没有脱离后端,redirect就需要你自己考虑如何传值了,比如通过URL参数。
81. 简述 tcp 和 udp的区别?
tcp和udp是TCP/IP协议簇中传输层的两个协议。传输层下面是网络层,TCP/IP的网络层只提供尽力而为交付数据的功能,没有任何其它服务提供给上层。udp只是对网络层的简单包装,它不提供任何保护服务,也是尽力而为的交付数据,用Java程序员熟悉的话来说,udp是底层IP协议的一个代理。udp的数据单元是数据报(Datagram)。TCP提供可靠的面向连接的数据传输,它确保数据按顺序交付到对方,并提供拥塞控制、流量控制、顺序控制等服务。同时,TCP要保证的东西更多,它的实时性就没有udp好。
TCP是端到端的,传输前需要先建立端到端的连接,传输完毕后需要拆除连接。UDP并不用,它可以单播或者多播。
总而言之,udp更加适合对于偶尔丢包不太敏感的情况下,比如语音电话、视频聊天,tcp更加适合需要保证数据正确性的情况,比如两台数据库服务器之间的数据交换。然而也有反对者说udp由于没有拥塞控制机制,用它传输语音电话、视频聊天等信息很可能让信道的拥塞情况变得越来越不乐观。
82. tcp 为什么要三次握手,两次不行吗?为什么?
我先理一下三次握手的过程
- 客户端选择一个初始序号,并通过SYN包发送给服务器
- 服务器接收到SYN,记录客户端的初始序号并选择一个自己的初始序号,通过SYNACK包发给客户端,该包除了向客户端发布自己的初始序号外,还通知了客户端我已经接收到了你的初始序号
- 客户端接收到SYNACK,记录下服务器端的初始序号,再发送ACK给服务器端,这样服务器端才能确定SYNACK包没丢,双方已经知道了彼此的初始序号,可以进行通信了。
83. 说一下 tcp 粘包是怎么产生的?
沾包可能发生在发送端和接收端,原因是两端都具有缓存
发送端可能由于启用了Nagle算法来对发送方的多个小数据包进行合并,以变成一个大的数据包,这样能够减少通信的流量消耗,因为每个TCP包都是有头的,下面的层也都有自己的头,对于小型数据包来说,可能它其中的数据还没有头大。所以你以为你单独发出的数据包,到了另一头其实可能是多个数据包合并起来的。
接收端可能在缓存中一下拿出多个已经到达的包,这样就又产生了站沾包。
84. OSI 的七层模型都有哪些?
- 应用层
- 会话层
- 表示层
- 传输层
- 网络层
- 数据链路层
- 物理层
85. get 和 post 请求有哪些区别?
- get没有请求体,只能通过URL进行参数传递
- post具有请求体,能通过body承载数据
- post回退时会重新提交表单,get不会
86. 如何实现跨域?
我只知道一个CORS和一个代理,剩下的我今天研究一下
87.说一下 JSONP 实现原理?
这个不会yunyun