转载:
https://blog.youkuaiyun.com/qq_38950316/article/details/81087809
很多,不一一列出来,主要是自己总结用的。
有错欢迎指出。杠精退散。
1.TCP,UDP区别,用途
TCP
TCP协议是面向连接的通信协议,即传输数据之前,
在发送端和接收端建立逻辑连接,然后再传输数据,
它提供了两台计算机之间可靠无差错的数据传输。
三次握手:
TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
第三次握手,客户端再次向服务器端发送确认信息,确认连接。
TCP协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等。
四次挥手:
一、客户端进程发出连接释放报文,并且停止发送数据。
二、服务器收到连接释放报文,发出确认报文,
TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,
这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,
等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
三、服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,
此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
四、客户端收到服务器的连接释放报文后,必须发出确认,
注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,
当客户端撤销相应的TCB后,才进入CLOSED状态。
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。
结束TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
三握四挥:
https://blog.youkuaiyun.com/qq_38950316/article/details/81087809
UDP
UDP协议是一个面向无连接的协议。
传输数据时,不需要建立连接,不管对方端服务是否启动,
直接将数据、数据源和目的地都封装在数据包中,直接发送。
每个数据包的大小限制在64k以内。
它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。
日常应用中,例如视频会议、QQ聊天等。
TCP通信分析图解
【服务端】启动,创建ServerSocket对象,等待连接。
Socket client = new Socket("127.0.0.1", 6666);
ServerSocket server = new ServerSocket(6666);
【客户端】启动,创建Socket对象,请求连接。
【服务端】接收连接,调用accept方法,并返回一个Socket对象。
【客户端】Socket对象,获取OutputStream,向服务端写出数据。
【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。
2.tcp通过什么来保证可靠传输的
1、应用数据被分割成TCP认为最适合发送的数据块。
这和UDP完全不同,应用程序产生的数据报长度将保持不变。 (将数据截断为合理的长度)
2、当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。
如果不能及时收到一个确认,将重发这个报文段。 (超时重发)
3、当TCP收到发自TCP连接另一端的数据,它将发送一个确认。
这个确认不是立即发送,通常将推迟几分之一秒。
(对于收到的请求,给出确认响应) (之所以推迟,可能是要对包做完整校验)
4、TCP将保持它首部和数据的检验和。
这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。
如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
(希望发端超时并重发)
(校验出包有错,丢弃报文段,不给出响应,TCP发送数据端,超时时会重发数据)
5、既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,
因此TCP报文段的到达也可能会失序。
如果必要,TCP将对收到的数据进行重新排序,
将收到的数据以正确的顺序交给应用层。
(对失序数据进行重新排序,然后才交给应用层)
6、既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
(对于重复数据,能够丢弃重复数据)
7、TCP还能提供流量控制。
TCP连接的每一方都有固定大小的缓冲空间。
TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。 (TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出)
3.tcp 为什么要三次握手,两次不行吗?为什么?
两次握手只能保证单向连接是畅通的。
Step1 A -> B : 你好,B。
Step2 A <- B : 收到。你好,A。
这样的两次握手过程, A 向 B 打招呼得到了回应,即 A 向 B 发送数据,B 是可以收到的。
但是 B 向 A 打招呼,A 还没有回应,B 没有收到 A 的反馈,无法确保 A 可以收到 B 发送的数据。
只有经过第三次握手,才能确保双向都可以接收到对方的发送的 数据。
Step3 A -> B : 收到,B。
这样 B 才能确定 A 也可以收到 B 发送给 A 的数据。
4.一次URL请求过程
1.DNS域名解析
2.建立TCP连接(三次握手)
3.发送请求–tomcat进行处理
4.四次挥手关闭连接
5. servlet
概念:
运行在服务器端的小程序
Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
public class ServletDemo1 implements Servlet
实现接口中的抽象方法
配置Servlet
在web.xml中配置:
<!--配置Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
执行原理:
1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3. 如果有,则在找到对应的<servlet-class>全类名
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法
Servlet中的生命周期方法:
1. 被创建:执行init方法,只执行一次
Servlet什么时候被创建?
默认情况下,第一次被访问时,Servlet被创建
第一次被访问时,创建
<load-on-startup>的值为负数
在服务器启动时,创建
<load-on-startup>的值为0或正整数
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
2. 提供服务:执行service方法,执行多次
每次访问Servlet时,Service方法都会被调用一次。
3. 被销毁:执行destroy方法,只执行一次
Servlet被销毁时执行。服务器关闭时,Servlet被销毁.
只有服务器正常关闭时,才会执行destroy方法。
destroy方法在Servlet被销毁之前执行,一般用于释放资源
Servlet3.0:
支持注解配置。可以不需要web.xml了。
6、get提交和post提交有何区别
(1)get一般用于从服务器上获取数据,
post一般用于向服务器传送数据
(2)请求的时候参数的位置有区别,
get的参数是拼接在url后面,用户在浏览器地址栏可以看到。
post是放在http包的包体中。
比如说用户注册,你不能把用户提交的注册信息用get的方式吧,
那不是说把用户的注册信息都显示在Url上了吗,是不安全的。
(3)能提交的数据有区别,
get方式能提交的数据只能是文本,且大小不超过1024个字节,
而post不仅可以提交文本还有二进制文件。
所以说想上传文件的话,那我们就需要使用post请求方式
(4)servlet在处理请求的时候分别对应使用doGet和doPost方式进行处理请求
7、JSP与Servlet有什么区别
Servlet是服务器端的程序,动态生成html页面发送到客户端,
但是这样程序里会有很多out.println(),java与html语言混在一起,很乱,
所以后来sun公司推出了JSP.
其实JSP就是Servlet,每次运行的时候JSP都首先被编译成servlet文件,
然后再被编译成.class文件运行。
有了jsp,在MVC项目中servlet不再负责动态生成页面,
转而去负责控制程序逻辑的作用,控制jsp与javabean之间的流转。
8、doGet与doPost方法的两个参数是什么
HttpServletRequest:封装了与请求相关的信息
HttpServletResponse:封装了与响应相关的信息
9、request.getAttribute()和request.getParameter
(1)有setAttribute,没有setParameter方法
(2)getParameter获取到的值只能是字符串,不可以是对象,
而getAttribute获取到的值是Object类型的。
(3)通过form表单或者url来向另一个页面或者servlet传递参数的时候需要用getParameter获取值;getAttribute只能获取setAttribute的值
(4)setAttribute是应用服务器把这个对象放到该页面所对应的一块内存当中,
当你的页面服务器重定向到另一个页面的时候,
应用服务器会把这块内存拷贝到另一个页面对应的内存当中。
通过getAttribute可以取得你存下的值,当然这种方法可以用来传对象。
用session也是一样的道理,这是说request和session的生命周期不一样而已。
10、JSP有哪些内置对象,作用是什么?
名称 作用
request 包含用户端请求的信息
response 包含服务器传回客户端的响应信息
session 与请求有关的会话期
pageContext 管理网页属性
application 服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息
out 向客户端输出数据
config servlet的架构部件
page 指网页本身
exception 针对错误页面才可使用
11、四种会话跟踪技术作用域
(1)page:一个页面
(2)request::一次请求
(3)session:一次会话
(4)application:服务器从启动到停止。
12、forward和redirect的区别
(1)从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,
把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.
浏览器根本不知道服务器发送的内容从哪里来的,
所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,
告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
(2)从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
(3)从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
(4)从效率来说
forward:高.
redirect:低.
13.cookie和session的区别
Cookie:
客户端会话技术,将数据保存到客户端
1. 创建Cookie对象,绑定数据
* new Cookie(String name, String value)
2. 发送Cookie对象
* response.addCookie(Cookie cookie)
3. 获取Cookie,拿到数据
* Cookie[] request.getCookies()
实现原理
基于响应头set-cookie和请求头cookie实现
1. 一次可不可以发送多个cookie?
* 可以
* 可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
2. cookie在浏览器中保存多长时间?
1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
2. 持久化存储:
* setMaxAge(int seconds)
1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
2. 负数:默认值
3. 零:删除cookie信息
3. cookie能不能存中文?
* 在tomcat 8 之前 cookie中不能直接存储中文数据。
* 需要将中文数据转码---一般采用URL编码(%E3)
* 在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析
4. cookie共享问题?
1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
* 默认情况下cookie不能共享
* setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
* 如果要共享,则可以将path设置为"/"
cookie.setPath("/");
2. 不同的tomcat服务器间cookie共享问题?
* setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
* setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
Cookie的特点和作用
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4kb)
3. 对同一个域名下的总cookie数量也有限制(20个)
* 作用:
1. cookie一般用于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别
Session:
服务器端会话技术,在一次会话的多次请求间共享数据,
将数据保存在服务器端的对象中。
1. 获取HttpSession对象:
HttpSession session = request.getSession();
2. 使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
Session的实现是依赖于Cookie的。
1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
* 默认情况下。不是。
* 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
* 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
* session的钝化:
* 在服务器正常关闭之前,将session对象系列化到硬盘上
* session的活化:
* 在服务器启动后,将session文件转化为内存中的session对象即可。
3. session什么时候被销毁?
1. 服务器关闭
2. session对象调用invalidate() 。
3. session默认失效时间 30分钟
选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
session的特点
1. session用于存储一次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意大小的数据
session与Cookie的区别:
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全
14、SpringMVC通过注解的方式允许跨域
在Controller类或其方法上加@CrossOrigin注解,来使之支持跨域。
@CrossOrigin(origins = “*”, maxAge = 3600)