java 关于网络通讯/Tcp 基础知识
1.xml与json的区别?
都是一种数据交换格式,xml是重量级,json是轻量级
2.TCP协议主要分为几层?
应用层,传输层,网络层,链路层
3.http主要状态码?
200:表示请求成功
302:表示重定向
304:表示使用本地浏览器的缓存(适用于图片和js,这就是为什么第一次访问比较慢,以后都会直接使用本地的缓存。)
404:表示路径找不到
500:表示代码有问题
4.重定向原理
resp.sendRedirect(“url”);
上面的这就话其实就相当于下面这两句话。
resp.setStatus(302);
resp.setHeader("Location", "OtherServlet");
第一次浏览器进行请求,无服务器接受,返回状态码302,浏览器接受在状态码之后再响应头里面获取到location的值,然后进行转发,转发的实质是浏览器在做的,所以会发生地址的改变。
5.为什么使用ip地址
6.udp与tcp之间的区别?
udp:面向无连接,不需要建立连接,数据的大小限制在64k内,速度快
tcp:建立连接,形成数据传输通道,三次连接四次断开,效率低
聊天,网络视频,桌面共享用的就是udp
TCP与UDP在概念上的区别:
udp: a、是面向无连接, 将数据及源的封装成数据包中,不需要建立建立连接
b、每个数据报的大小在限制64k内
c、因无连接,是不可靠协议
d、不需要建立连接,速度快
tcp: a、建议连接,形成传输数据的通道.
b、在连接中进行大数据量传输,以字节流方式
c 通过三次握手完成连接,是可靠协议
d 必须建立连接m效率会稍低
7.说一说三次握手四次断开
为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在 一个报文里来发送。
但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报 文和FIN报文多数情况下都是分开发送的.
8.什么叫做http协议?
客户端向服务端之间的传输的格式规范,格式简称为"超文本传输协议".
9.什么叫http协议无状态协议
无状态协议对于事物处理没有记忆能力.简单来说,session和cookie联合维护了sessionid通过这个sessionid我们就能跟踪一个会话,用来识别是同一来源,如果没有sessionid我们就无法辨别请求的来源,所以说是http是无状态协议。
10.http协议有什么组成
请求包:
1).请求行:请求方法,uri,http版本
2).请求头
Referer:http://www.it315.org/index.jsp -- 当前请求来自于哪里,我们做白名单,黑名单已经防盗链的时候,就是根据它来判断的。
Host: www.it315.org:80 --(必须的)当前请求访问的目标地址(主机:端口)
Accept: text/html,image/* -- 浏览器接受的数据类型
Accept-Charset: ISO-8859-1 -- 浏览器接受的编码格式
3).请求内容
相应包:
1).状态行:包含http版本,状态码,状态码的原因短语
2).相应头
3).相应内容
11.http协议有哪些请求方式
get , post ,put
12.get请求与post请求的区别
自己查资料吧.....
13.http协议与https协议的区别
https就是http加上加密处理,一般是ssl+认证+完整性保护,抓包是抓不到的.
我们拓展一下,对于https的认识,为什么说HTTPS是安全的呢?
简单来说的话:公私钥对称,互相解密,公钥加密,私钥解密,私钥签名,公钥验签。
1.服务器如何辨别是同一个浏览器发送过来的数据呢?
当我们第一次请求服务器的时候,服务器会将证书发送给浏览器,浏览器生成一个随机的对称密码,然后利用证书的公钥(证书需要正规机构审核,否则浏览会打X)把对称密码加密,然后发送给服务器,服务器利用私钥解密得到对称密码,然后每次浏览器发送数据的时候都会用生成的随机的对称密码对数据加密发送给服务器,服务器接受之后会用刚才私钥解密得到的对称密码来解密。
2.浏览器端如何辨别是服务器端发送过来的数据呢?
我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,(其实发送的时候,应该是两端内容,一段是明文的C一段是密文的D)发给x,再告诉他解密看是不是c。他用我的公钥1解密,发现果然是c。这个时候,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名。
即使有别人截胡了数据,也无法修改用私钥加密的数据,浏览器解密之后的数据与明文数据不同,那就说明数据被篡改过了。
14.网络丢包的情况下是如何处理的?
15.TCP粘包、拆包问题解决方案
查看我的另一片文章,会有例子进行讲解:粘包和拆包解决方法
16.长连接与短连接的区别
17.如何防止盗链
首先写一个过滤器,过滤所有的路径,在过滤器中获取请求来源和当前的请求名称,如果请求来源和请求名称不一样说明是在盗链
//获取请求头中来源
String referer = req.getHeader("referer");
//获取当前请求名称
String serverName = request.getServerName();
if(referer==null||(!referer.contains(serverName))){
req.getRequestDispatcher("/imgs/error.png").forward(req, res);
return ;
}
chain.doFilter(req, res);
18.如何防止前段页面发布版本失效的问题?
因为浏览器会有缓存,当浏览器请求地址(js,img)如果没有变化的时候,就会使用本地的缓存,所以会造成版本失效。
最简单的方法就是在js或者图片后面加上一个参数例如t=时间戳就可以了,这样浏览器在请求的时候就会访问我们的后端了,并不是每个js或者图片都要添加,只是在修改的地方加上就可以了。
19.如何防止表单重复提交?
1.使用javascript 解决,就是搞一个flag字段,点击之后改变成false,使提交按钮失效
缺点:无法真正的解决问题,当我返回上一个页面,或者是重新刷新页面的时候,表单会再次的重复提交。
2.使用后端提交解决(前后端结合解决问题)
1---进入表单页面的同时,后端生成一个token,存放在session中,然后将token返回至前段页面
2---提交时,判断session里面是否有token,如果有的话,进行判断是否是和session里面的token相同,如果相同允许提交,并删除session里面的token。
20.如何防止XSS攻击?
XSS攻击使用Javascript脚本注入进行攻击
例如在input表单中注入: <script>location.href='http://www.itmayiedu.com'</script>
XSSFilter
public class XssFiter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
XssAndSqlHttpServletRequestWrapper xssRequestWrapper = new XssAndSqlHttpServletRequestWrapper(req);
chain.doFilter(xssRequestWrapper, response);
}
}
XssAndSqlHttpServletRequestWrapper
/**
* 这个类就是获取参数的工具类,使用的是装饰者模式
*/
public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrapper {
HttpServletRequest request;
public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
String value = request.getParameter(name);
System.out.println("name:" + name + "," + value);
if (!StringUtils.isEmpty(value)) {
// 转换Html
value = StringEscapeUtils.escapeHtml4(value);
}
return value;
}
}
21.如何防止模拟请求?
token+验证码
token生成的方式如果被别人获取了,但是验证码现在还没到100%被别人识别的地步。
22.你所应用的安全架构有哪些?
1.nginx反向代理(不暴露真实的ip)
2.使用https请求(防止抓包)
3.搭建企业黑名单与白名单
4.模拟请求(crtf),xss攻击,sql注入,防盗链。
5.ddos流量攻击,也可以用nginx解决。
23.加密方式有哪些?
1.单向加密
MD5加密,只能加密不能解密,但是可以暴力解密,可以使用加盐的技术。
2.对称加密
可逆的,明文,密文,Base64 des(加解密都是同一把钥匙)。
3.非对称加密
公私钥互换,比如支付宝中,我们需要生成一对公私钥,私钥自己保存在服务器中,公钥配置在支付宝中,同时支付宝也会提供一个公钥,我们需要保存在服务中。
通过这个我们可以知道,我们使用自己生成的私钥来加密,支付宝使用我们提供的公钥来解密,同时支付宝给我们发送消息的时候,会使用自己的私钥加密,我们使用支付宝提供的公钥解密。
24.支付宝中的异步通知和同步通知的区别?
同步通知:是支付宝发送一个304,然后浏览器进行重定向我们的页面,但是是不会做任何状态的修改,只是展示页面而已。
异步通知:是支付宝通过http技术,发送到蚂蚁课堂,然后我们返回一个success状态,通知支付宝已经接受成功,如果没有返回状态,支付宝会有重试补偿机制。我们需要处理好幂等性的一个问题,比如判断订单号。