网络协议网络协议1. Http的长连接和短连接2. 请求转发和重定向的区别3. Http协议和Https协议的区别4. TCP协议和UDP协议的区别5. TCP为什么要三次握手而不是两次6. TCP关闭连接为什么是四次挥手为什么TIME_WAIT状态需要经过2MSL时间才能进入到CLOSE状态7. 会话是什么8. session和cookie的区别9. session的工作原理10. 如果客户端禁止cookie能实现session还能用嘛11. GET和POST请求的区别有哪些12. 什么是跨域怎么解决跨域问题13. 说一下JSONP的实现原理14. 什么是XSS攻击如何避免15. 什么是CSRF攻击如何避免16. 什么是TCP粘包是怎么产生的怎么解决17. OSI是什么OSI的七层模型有哪些18. http响应码301和302代表的是什么有何区别JSP | Servlet1. jsp和servlet有什么区别2. jsp有哪些内置对象作用分别是什么3. jsp的四种作用域4. 如何知道是哪一个客户端正在请求你的Servlet5. Servlet中doGet方法和doPost方法有何区别6. 什么是Servlet7. 解释以下Servlet的生命周期8. jsp中如何引用本地路径图片?9. jsp中怎么获取地址栏URLKV的传参10. Servlet和JSP中设置编码格式(解决中文乱码)网络协议1. Http的长连接和短连接对比维度短连接长连接Keep-Alive工作方式一次请求 → 一次响应→完成立即断开 TCP一次 TCP 连接多次请求复用超时断开默认协议HTTP/1.0默认短连接HTTP/1.1默认长连接请求头Connection: closeConnection: keep-aliveTCP 握手每次请求都要三次握手 / 四次挥手开销大只握手一次大幅减少开销性能频繁请求延迟高、效率低连续请求速度快、性能好资源占用不占用常驻连接资源长期占用连接需超时释放适用场景网页静态资源、单次查询、低频请求接口批量请求、前后端高频交互、数据库采用长连接主要问题频繁握手挥手开销大连接堆积需要超时控制核心对比短连接一问一答就断。长连接一条 TCP 通道批量传输多个 HTTP 请求。2. 请求转发和重定向的区别重定向 response.sendRedirect()是服务器根据业务逻辑发送一个状态码告知浏览器去请求新的地址所以地址栏显示的是新的URL。请求转发 request.getRequestDispatcher().forward()是服务器直接请求资源服务器直接访问目标URL然后把响应回的内容再发送给浏览器。浏览器根本不知道响应回的资源来自哪个URL所以浏览器的地址还是原来的地址。3. Http协议和Https协议的区别Http 协议传输地数据都是明文也就是未加密地因此使用Http协议传输隐私信息是非常不安全地于是网景公司设计了 SSLSecure Sockets Layer协议用于对Http协议传输的数据进行加密从而就诞生了Https。简单总结Https协议是由SSL Http协议构建的可进行加密传输身份认证的安全网络协议。对比维度HTTPHTTPS全称HyperText Transfer Protocol超文本传输协议HyperText Transfer Protocol Secure安全超文本传输协议传输方式无加密明文传输抓包可直接查看账号、密码、聊天内容等原始数据HTTP SSL/TLS 加密层混合加密传输默认端口80443安全性无加密易窃听、篡改、钓鱼加密防窃听、防篡改、校验服务器身份证书无需证书必须申请 SSL/TLS 数字证书性能无加密损耗更快加解密存在轻微性能消耗适用场景内网、无敏感信息页面登录、支付、官网、对外业务接口身份认证无服务器身份校验易遭遇钓鱼网站证书机构颁发 SSL 证书验证服务器真实身份防止钓鱼劫持4. TCP协议和UDP协议的区别对比维度TCPUDP连接特性面向连接需三次握手建连、四次挥手断连无连接直接发送报文无需建立连接传输可靠性可靠传输不丢包、有序、无重复不可靠传输存在丢包、乱序问题数据格式字节流无消息边界存在粘包拆包独立报文自带边界不会粘包报文头部20~60 字节控制字段多固定 8 字节头部极简控制机制有序号、ACK 确认、重传、流量 / 拥塞控制无确认、无重传、无流控与拥塞控制传输速度开销大速度较慢开销极小延迟低、速度快典型场景HTTP、数据库连接、文件传输、支付直播、语音视频、游戏、DNS、广播5. TCP为什么要三次握手而不是两次SYNSynchronize Sequence Numbers同步序列号报文是 TCP 建立连接专用控制包不带业务数据SYN 的唯一职责交换双方初始序列号主要防止已经失效的连接请求报文突然又传送到了服务器从而产生不必要的连接资源浪费。如果使用的是两次握手建立连接假设有这样一种场景客户端发送了第一个请求连接并且没有丢失只是因为在网络结点中滞留的时间太长了由于TCP的客户端迟迟没有收到确认报文以为服务器没有收到此时重新向服务器发送这条报文此后客户端和服务器经过两次握手完成连接传输数据然后关闭连接。此时此前滞留的那一次请求连接网络通畅了到达了服务器这个报文本该是失效的但是两次握手的机制将会让客户端和服务器再次建立连接这将导致不必要的错误和资源的浪费。如果采用的是三次握手就算是那一次失效的报文传送过来了服务端接受到了那条失效报文并且回复了确认报文但是客户端识别这是过期连接不会再次发出确认。由于服务器收不到确认就知道客户端并没有请求连接。一 、三次握手流程回顾客户端发 SYN请求连接服务端回 SYNACK同意连接同时确认客户端报文客户端回 ACK确认服务端的 SYN二、两次握手存在致命问题核心两点1. 解决「失效延迟报文」造成的错误连接场景客户端很早之前发过一个 SYN 包网络拥堵延迟很久才到达服务端。客户端发送 SYN 后启动超时计时器超时前没收到服务端 SYNACK会重新发送 SYN 多次重传失败后才判定连接建立失败如果只有两次握手服务端收到旧 SYN直接回复 SYNACK单方面建立连接分配缓冲区、连接资源。客户端此时早已断开不会发任何数据这条无效连接会一直占用服务端资源造成资源泄露。三次握手方案服务端收到旧 SYN 回复 SYNACK 后必须等待客户端第三次 ACK客户端识别这是过期连接直接丢弃不回 ACK服务端超时后自动释放连接不浪费资源。2. 保证双方收发能力都正常TCP 是全双工通信需要确认客户端能发、服务端能收服务端能发、客户端能收两次握手只能证明客户端发得出去、服务端收得到无法验证服务端发送的数据客户端能不能收到。三次握手第一次客户端发送能力 OK第二次服务端接收 发送能力 OK第三次客户端接收服务端报文的能力 OK双方读写通道全部校验完毕才能安全传输数据。三、一句话总结两次握手只能保证单向通路还会产生无效闲置连接浪费服务器资源三次握手既能校验双方双向收发通道又能过滤网络滞留的过期请求是最低成本的可靠方案。6. TCP关闭连接为什么是四次挥手为什么TIME_WAIT状态需要经过2MSL时间才能进入到CLOSE状态TCP 是全双工读写通道相互独立关闭需要分别断开两个方向客户端发 FIN停止上传数据服务器回 ACK确认收到关闭请求仍可下发数据服务器发 FIN下发数据全部发完停止下发客户端回 ACK确认服务器关闭连接结束。由于服务器确认报文ACK和自身关闭报文FIN不能合并因此一共四次挥手。关闭连接时当服务端收到FIN报文时很可能并不会立即关闭SOCKET所以只能先回复一个ACK报文告诉客户端“你发的FIN报文我收到了”。只有等到服务端所有的报文都发送完了才能发送FIN报文给客户端因此不能一起发送故需要四次挥手。按道理四个报文都发送完毕我们可以直接进入CLOSE状态了但是我们必须假象网络是不可靠的有可能最后一个ACK丢失。所以TIME_WAIT状态等待的2MSL时间就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复但该ACK可能丢失。Server如果没有收到ACK将不断重复发送FIN片段。2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSLClient都没有再次收到FIN那么Client推断ACK已经被成功接收则结束TCP连接。7. 会话是什么从打开一个浏览器访问某个站点到关闭这个浏览器的整个过程成为一次会话。8. session和cookie的区别cookie和session存在的意义cookie session机制的出现就是为了解决http协议无状态的弊端cookie和session都是用来跟踪浏览器用户身份的会话方式。cookie浏览器第一次访问Web服务器服务器生成一个cookie并响应给客户端。浏览器会在本地文件中为每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候同时会发送所有为该服务器存储的cookie。session浏览器第一次访问Web服务器服务器生成一个Session对象同时生成一个名为JSESSIONID的cookie响应到客户端后续客户端的请求会带上这个cookie同时根据这个名为JSESSIONID的cookie的值去服务器端获取用户专属数据。对比维度CookieSession存储位置客户端浏览器服务端存储容量小单条 4KB 左右无严格限制数据形式明文存储可被篡改服务端保存更安全有效期可设置持久 / 会话级过期浏览器关闭默认失效可手动延长依赖关系不依赖 Session依赖 Cookie 存放 SessionId安全风险易 XSS 窃取敏感数据不适合存放数据存在服务端安全性更高网络传输每次请求自动携带仅传输 SessionId流量更小共享范围同域名下页面共享单服务有效分布式需共享存储用途保存偏好、标识、轻量数据保存用户登录状态、隐私信息9. session的工作原理session是一个存在服务器上的文件。里面存有我们需要的信息在需要的时候可以从里面取出来。类似于一个大号的map里面的键存储的是用户的sessionID用户向服务器发送请求的时候会带上这个sessionID。这时就可以从中取出对应的值了。10. 如果客户端禁止cookie能实现session还能用嘛1.一般情况下如果浏览器禁用了cookie浏览器请求服务器无法携带sessionID服务器无法识别请求中用户身份session失效。2.通过其他方法继续使用session①把sessionID作为参数追加到原URL中。②用文件、数据库等形式保存sessionID在跨页过程中手动调用。11. GET和POST请求的区别有哪些对比维度GETPOST数据存放URL 拼接参数请求体 body 携带数据数据大小受 URL 长度限制容量小无硬性长度限制可传大量数据数据安全性参数暴露在地址栏敏感数据易泄露数据在请求体相对更安全编码类型仅支持 ASCII 字符支持多种编码可传二进制、文件缓存特性默认浏览器缓存请求结果默认不缓存书签 / 历史URL 可保存书签、留存历史记录无法保存书签幂等性安全幂等多次请求无副作用非幂等多次提交易重复新增数据作用规范查询数据不修改服务器资源提交、新增、修改服务端数据请求传参示例/user?id1nametestbody{id:1,name:test}12. 什么是跨域怎么解决跨域问题跨域是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的是浏览器施加的安全限制。**同源策略**域名协议端口号相同。例1http://www.taobao.com/index.html 调用 http://www.taobao.com/server.php 同源例2http://www.taobao.com/index.html 调用 http://www.tencent.com/server.php taobao/tencent 跨域主域名不同例3http://www.taobao.com/index.html 调用 http://zzz.taobao.com/server.php www/zzz 跨域子域名不同例4http://www.taobao.com:8080/index.html 调用 http://www.taobao.com:8088/server.php 8080/8088跨域端口不同例5http://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客户端浏览器13. 说一下JSONP的实现原理JSONP JSON Padding动态创建script标签利用script标签的src属性可以获取任何域下的JS脚本通过这个特性服务器端不在返回JSON格式而是返回一段调用某个函数的JS代码在src中进行了调用这样就实现了跨域。14. 什么是XSS攻击如何避免XSS攻击又称CSS全称Cross Site Script (跨站脚本攻击)其原理是攻击者向有XSS漏洞的网站输入恶意的HTML代码当用户浏览该网站时这段HTML代码会自动执行从而达到攻击的目的。XSS防范的总体思路是对输入进行过滤对输出进行编码。15. 什么是CSRF攻击如何避免CSRFCross-site request forgery跨站请求伪造。一般来说攻击者通过伪造用户的浏览器的请求向访问一个用户自己曾经认证访问过的网站发送出去使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗号转账等待。如何避免1.验证HTTP Referer字段2.使用验证码3.在请求地址中添加token并验证4.在Http头中自动逸属性并验证16. 什么是TCP粘包是怎么产生的怎么解决概念发送方发送的多个数据包到接收方缓冲区首尾相连粘成一包被接收。原因发送方产生粘包TCP协议默认使用Nagle算法可能会把多个数据包一次发送到接收方。接收方产生粘包 如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度多个包就会被缓存应用程序就有可能读取到多个首尾相接粘到一起的包。粘包对业务的核心负面影响业务数据解析错乱最直接、最常见接收方按预设规则读取数据读到的是多条消息拼接在一起解析直接失败-场景1每条消息固定长度100字节一次读到200字节会把两条消息当成一条解析字段错位、数值乱码。-场景2JSON/Protobuf文本消息两条JSON粘在一起 {a:1}{b:2}JSON解析器直接抛出语法异常程序报错崩溃。-场景3自定义二进制协议头部长度字段被拼接污染读取长度错误后续全部数据偏移。解决方法①发送方对于发送方造成的粘包问题可以通过关闭Nagle算法来解决使用TCP_NODELAY选项来关闭算法。②接收方无法处理交由应用层处理。③应用层循环处理应用程序从接收缓存中读取分组时读完一条数据就应该循环读取下一条数据直到所有数据都被处理完成但是如何判断每条数据的长度呢格式化数据每条数据有固定的格式开始符结束符这种方法简单易行但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。发送长度发送每条数据时将数据的长度一并发送例如规定数据的前4位是数据的长度应用层在处理时可以根据长度来判断每个分组的开始和结束位置。17. OSI是什么OSI的七层模型有哪些开放式系统互联通信参考模型Open System InterConnection Reference Model简写OSI。是一种概念模型由国际标准化组织提出一个试图使各种计算机在世界范围内互联为网络的标准框架。①应用层提供为应用软件而设的接口以设置与另一应用软件之间的通信。②表达层把数据转换为能与接收者的系统格式兼容并适合传输的格式。③会话层负责在数据传输中设置和维护计算机网络中两台计算机之间的通信连接。④传输层把传输表头TH加至数据以形成数据包。⑤网络层决定数据的路径选择和转寄将网络表头NH加至数据包以形成分组。网络表头包含了网络数据。⑥数据链路层负责网络寻址、错误侦测和改错。⑦ 物理层在局部局域网上传送数据帧data frame它负责管理计算机通信设备和网络媒体之间的互通。18. http响应码301和302代表的是什么有何区别301302都是HTTP状态的编码都代表着某个URL发生了转移。区别301 redirect代表永久性转移。302 redirect代表暂时性转移。JSP | Servlet1. jsp和servlet有什么区别① jsp编译后就变成了Servlet。JSP的本质就是Servletjava虚拟机只能识别java的类不能识别JSP的代码Web容器将JSP的代码编译成Java类② jsp更擅长页面显示servlet更擅长逻辑控制。③ jsp有内置对象servlet没有内置对象。2. jsp有哪些内置对象作用分别是什么JSP有9大内置对象①request 封装客户端的请求GET,POST请求的参数②response封装服务器对客户端的响应③pageContext通过该对象可以获取其他内置对象④session封装用户会话的对象⑤application封装服务器运行环境的对象⑥out输出服务器响应的输出流对象⑦configWeb应用的配置对象⑧pageJSP页面本身⑨exception封装页面抛出异常的对象3. jsp的四种作用域① page代表与一个页面相关的对象和属性。② request代表与Web客户端发出的一个请求相关的对象和属性。③ session代表某个用户与服务器建立一次会话相关的对象和属性。④ application代表与整个Web应用程序相关的对象和属性全局作用域。4. 如何知道是哪一个客户端正在请求你的ServletHttpServletRequest类可以找出客户端的ip地址和主机名。Stringiprequest.getRemoteAddr();Stringhostrequest.getRemoteHost();5. Servlet中doGet方法和doPost方法有何区别doGet方法用来处理以Get方式提交的客户端请求Get方法把请求参数追加到URL后面可以发送的参数数目是有限制的。doPost方法用来处理以Post方式提交的客户端请求。Post方法把请求参数放在请求体中可以发送的参数数目是无限制的。6. 什么是ServletServlet是用来处理客户端请求并产生动态网页内容的Java类。存储HTML表单提交的数据7. 解释以下Servlet的生命周期①Servlet通过调用init()方法进行初始化。②Servlet通过调用service()方法来处理客户端的请求。③Servlet通过调用destroy()方法自毁。8. jsp中如何引用本地路径图片?1.上传图片到服务器的文件系统中.2.把图片的地址保存到数据库。3.读取图片的地址设置到img src/工程名/文件夹名/文件名(EL表达式动态获取图片地址)/的src属性中。9. jsp中怎么获取地址栏URLKV的传参1.${param.K}2.嵌套在EL表达式中${users[param.K].username}10. Servlet和JSP中设置编码格式(解决中文乱码)1.response.setCharacterEncoding(“UTF-8”)设置浏览器解码格式设置服务器响应的编码格式2.request.setCharacterEncoding(“UTF-8”)设置对 【客户端请求】 进行重新编码的格式。对于表单POST方式提交的数据在获得数据的JSP或者Servlet中的request.setCharacterEncoding要和生成提交该表单的JSP页面的 response.setCharacterEncoding设置成相同的值。对于URL方式和表单GET方式提交的数据在接收数据的JSP中设置request.setCharacterEncoding参数是不行的get方式提交的参数编码只支持iso8859-1编码解决方法如下Stringnamerequest.getParameter(name);StringNewnamenewString(name.getBytes(iso8859-1),utf-8);3.response.setContentTypetext/html;charsetUTF-8设置浏览器解码格式推荐方式