Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitcaddfe0

Browse files
committed
Spring、TCP的一些总结
1 parent6e80708 commitcaddfe0

File tree

2 files changed

+54
-40
lines changed

2 files changed

+54
-40
lines changed

‎docs/network/理解TCP和UDP.md

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,23 @@ TCP 之所以可以保证可靠性主要得益于两个方面,一个是“状
1414

1515
**面向字节流**:是指 TCP 是以字节流的方式进行数据传输的。
1616

17-
##2. TCP三次握手
17+
**TCP 是传输层协议,对应 OSI 网络模型的第四层传输层,特点如下。**
18+
19+
- TCP 协议是基于链接的,也就是传输数据前需要先建立好链接,然后再进行传输。
20+
21+
- TCP 链接一旦建立,就可以在链接上进行双向的通信。
22+
23+
- TCP 的传输是基于字节流而不是报文,将数据按字节大小进行编号,接收端通过 ACK 来确认收到的数据编号,通过这种机制,TCP 协议能够保证接收数据的有序性和完整性,因此 TCP 能够提供可靠性传输。
24+
25+
- TCP 还能提供流量控制能力,通过滑动窗口来控制数据的发送速率。滑动窗口的本质是动态缓冲区,接收端根据自己的处理能力,在 TCP 的 Header 中动态调整窗口大小,通过 ACK 应答包通知给发送端,发送端根据窗口大小调整发送的的速度。
26+
27+
- 仅仅有了流量控制能力还不够,TCP 协议还考虑到了网络问题可能会导致大量重传,进而导致网络情况进一步恶化,因此 TCP 协议还提供拥塞控制。TCP 处理拥塞控制主要用到了慢启动、拥塞避免、拥塞发生、快速恢复四个算法,感兴趣的同学可以进一步了解。
28+
29+
##2. TCP三次握手与四次挥手
1830

1931
TCP 三次握手的执行流程,如下图所示:
2032

21-
<imgsrc="https://s0.lgstatic.com/i/image/M00/27/2D/CgqCHl70ccOALHS1AADhgTvLn9Q814.png"alt="img"style="zoom:50%;" />
33+
<imgsrc="http://s0.lgstatic.com/i/image2/M01/8A/6E/CgotOV13hviAU5H3AAAyMppFmf8039.png"alt="img" />
2234

2335
TCP 三次握手的执行流程图
2436

@@ -30,15 +42,27 @@ TCP 三次握手的执行流程图
3042

3143
**SEQ(Sequence Number),序列号。**
3244

33-
TCP的执行流程如下
45+
TCP的三次握手执行流程如下
3446

3547
- 最开始时客户端和服务端都处于 CLOSED 状态,然后服务端先主动监听某个端口,此时服务器端就变成了 LISTEN(监听)状态;
36-
3748
- 然后客户端主动发起连接,发送 SYN(同步序列编号),此时客户端就变成了 SYN-SENT 状态;
38-
3949
- 服务端接收到信息之后返回 SYN 和 ACK 至客户端,此时服务器端就变成了 SYN-REVD 状态;
50+
- 客户端接收到消息之后,再发送 ACK 至服务器端,此时客户端就变成了 ESTABLISHED(已确认)状态,服务端收到 ACK 之后,也变成了 ESTABLISHED 状态,此时连接工作就执行完了。
51+
52+
TCP 四次挥手的执行流程,如下图所示:
53+
54+
![img](http://s0.lgstatic.com/i/image2/M01/8A/4E/CgoB5l13hviAZRJ1AABEfmQ55Jw991.png)
55+
56+
TCP 的四次挥手执行流程如下:
57+
58+
- TCP 链接的关闭,通信双方都可以先发起,我们暂且把先发起的一方看作 Client,从图中看出,通信中 Client 和 Server 两端的链接都是 ESTABLISHED 状态,然后 Client 先主动发起了关闭链接请求,Client 向 Server 发送了一个 FIN 包,表示 Client 端已经没有数据要发送了,然后 Client 进入了 FIN_WAIT_1 状态。
59+
60+
- Server 端收到 FIN 后,返回 ACK,然后进入 CLOSE_WAIT 状态。此时 Server 属于半关闭状态,因为此时 Client 向 Server 方向已经不会发送数据了,可是 Server 向 Client 端可能还有数据要发送。
61+
62+
- 当 Server 端数据发送完毕后,Server 端会向 Client 端发送 FIN,表示 Server 端也没有数据要发送了,此时 Server 进入 LAST_ACK 状态,就等待 Client 的应答就可以关闭链接了。
63+
64+
- Client 端收到 Server 端的 FIN 后,回复 ACK,然后进入 TIME_WAIT 状态。TIME_WAIT 状态下需要等待 2 倍的最大报文段生存时间,来保证链接的可靠关闭,之后才会进入 CLOSED 关闭状态。而 Server 端收到 ACK 后直接就进入 CLOSED 状态。
4065

41-
- 客户端接收到消息之后,再发送 ACK 至服务器端,此时客户端就变成了 ESTABLISHED(已确认)状态,服务端收到 ACK 之后,也变成了 ESTABLISHED 状态,此时连接工作就执行完了。\
4266

4367
##3.为什么TCP需要三次握手呢?
4468

@@ -57,16 +81,18 @@ TCP 的执行流程如下:
5781
那么在**建立 TCP 连接时就需要同步初始化一个序列号来保证 TCP 的稳定性**,因此它需要执行以下过程:
5882

5983
1. 首先客户端发送一个携带了初始序列号的 SYN 报文给服务器端;
60-
6184
2. 服务端接收到消息之后会回复一个 ACK 的应答报文,表示客户端的 SYN 报文已被服务端成功接收了;
62-
6385
3. 而客户端收到消息之后也会发送一个 ACK 给服务端,服务器端拿到这个消息之后,我们就可以得到一个可靠的初始化序列号了。
64-
6586
4. 而如果是两次握手的话,就无法进行序列号的确认工作了,因此也就无法得到一个可靠的序列号了,所以 TCP 连接至少需要三次握手。
66-
6787
5. 以上两种原因就是 TCP 连接为什么需要三次握手的主要原因,当然 TCP 连接还可以四次握手,甚至是五次握手,也能实现 TCP 连接的稳定性,但三次握手是最节省资源的连接方式,因此 TCP 连接应该为三次握手。
6888

69-
##4. UDP是什么?
89+
##4. 为什么需要等待 2 倍最大报文段生存时间之后再关闭链接?
90+
91+
1. 保证 TCP 协议的全双工连接能够可靠关闭;
92+
93+
2. 保证这次连接的重复数据段从网络中消失,防止端口被重用时可能产生数据混淆。
94+
95+
##5. UDP是什么?
7096

7197
>UDP(User Data Protocol,用户数据报协议)是无连接的、简单的、面向数据报的传输层协议。也就是 UDP 在发送数据之前,无须建立客户端与服务端的连接,直接发送消息即可。
7298

‎docs/框架/Spring.md

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,14 @@
11
##Spring
22

3-
Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 SpringBoot,也是基于 Spring 实现的,SpringBoot 的诞生是为了让开发者更方便地使用 Spring,因此 Spring 在 Java 体系中的地位可谓首屈一指。
4-
当然,如果想要把 Spring 所有功能都讲的一清二楚,远远不是一两篇文章能够做到的,但幸运的是,Spring 的基础资料可以很轻易的搜索到,那么我们本讲主要的目的就是把 Spring 中的核心知识点和常见面试题分享给大家,希望对大家能有所帮助。
5-
63
###Spring 介绍
74

8-
Spring 是一个开源框架,为了解决企业应用程序开发复杂性而创建的,Spring 的概念诞生于 2002 年,于 2003 年正式发布第一个版本 Spring Framework 0.9。下面一起来看 Spring 各个版本的更新特性和它的发展变化吧。Spring 特性如下图所示:
9-
10-
<imgsrc="C:\Users\孙白胖的爸爸\AppData\Roaming\Typora\typora-user-images\image-20200720165026696.png"alt="image-20200720165026696"style="zoom:50%;" />
11-
12-
Spring 模块如下图所示:
13-
14-
<imgsrc="C:\Users\孙白胖的爸爸\AppData\Roaming\Typora\typora-user-images\image-20200720165200616.png"alt="image-20200720165200616"style="zoom:67%;" />
15-
16-
####Spring 1.x
17-
18-
此版本主要是为了解决企业应用程序开发复杂性而创建的,当时 J2EE 应用的经典架构是分层架构:表现层、业务层、持久层,最流行的组合就是 SSH(Struts、Spring、Hibernate)。
19-
Spring 1.x 仅支持基于 XML 的配置,确保用户代码不依赖 Spring,它主要包含了以下功能模块:aop、beans、ejb、jdbc、jndi、orm、transation、validation、web 等。
20-
21-
####Spring 2.x
22-
23-
Spring 2.x 的改动并不是很大,主要是在 Spring 1.x 的基础上增加了几个新模块,如 ehcache、jms、jmx、scripting、stereotype 等。
24-
25-
####Spring 3.x
5+
Spring 是一个开源框架,为了解决企业应用程序开发复杂性而创建的,Spring 的概念诞生于 2002 年,于 2003 年正式发布第一个版本 Spring Framework 0.9。下面一起来看 Spring 各个版本的更新特性和它的发展变化吧。
266

27-
Spring 3.x 开始不止支持 XML 的配置,还扩展了基于 Java 类的配置,还增加了 Expression、Instructment、Tomcat、oxm 等组件,同时将原来的 Web 细分为:Portlet、Servlet。
7+
![img](http://s0.lgstatic.com/i/image2/M01/8A/C6/CgoB5l14puyAXsN8AAB-CNBQpnQ843.png)
288

29-
####Spring4.x
9+
图中红框框住的是比较重要的组件,Core 组件是Spring所有组件的核心;Bean 组件和 Context 组件我刚才提到了,是实现 IoC 和依赖注入的基础;AOP 组件用来实现面向切面编程;Web 组件包括 SpringMVC,是 Web 服务的控制层实现。
3010

31-
Spring 4.x 扩充了 Groovy、Messaging、WebMvc、Tiles2、WebSocket 等功能组件,同时 Spring 还适配了 Java 版本,全面支持 Java 8.0、Lambda 表达式等。随着 RESTful 架构风格被越来越多的用户所采用,Spring 4.x 也提供了 RestController 等注解新特性。
32-
33-
####Spring 5.x
34-
35-
Spring 5.x 紧跟 Java 相关技术的更新迭代,不断适配 Java 的新版本,同时不断重构优化自身核心框架代码,支持函数式、响应式编程模型等。
11+
<imgsrc="http://s0.lgstatic.com/i/image2/M01/8A/C6/CgoB5l14puyAK0COAAGd_8jLTtQ986.png"alt="img"style="zoom:80%;" />
3612

3713
###Spring 核心
3814

@@ -46,7 +22,17 @@ Spring 核心包括以下三个方面:
4622

4723
####控制反转(IoC)
4824

49-
控制反转(Inversion of Control,IoC),Spring的控制反转指一个对象依赖的其他对象将会在容器的初始化完成后主动将其依赖的对象传递给它,而不需要这个对象自己创建或者查找其依赖的对象。Spring基于控制反转技术实现系统对象之间依赖的解耦。
25+
控制反转(Inversion of Control,IoC),Spring的控制反转指一个对象依赖的其他对象将会在容器的初始化完成后主动将其依赖的对象传递给它,而不需要这个对象自己创建或者查找其依赖的对象。Spring基于控制反转技术实现系统对象之间依赖的解耦。举个例子如下图,拿公司招聘岗位来举例。假设一个公司有产品、研发、测试等岗位。如果是公司根据岗位要求,逐个安排人选,如图中向下的箭头,这是正向流程。如果反过来,不用公司来安排候选人,而是由第三方猎头来匹配岗位和候选人,然后进行推荐,如图中向上的箭头,这就是控制反转。
26+
27+
![img](http://s0.lgstatic.com/i/image2/M01/8A/E6/CgotOV14puyAODLyAAAnwOuTkEk368.png)
28+
29+
在 Spring 中,对象的属性是由对象自己创建的,就是正向流程;如果属性不是对象创建,而是由 Spring 来自动进行装配,就是控制反转。这里的 DI 也就是依赖注入,就是实现控制反转的方式。正向流程导致了对象于对象之间的高耦合,IoC 可以解决对象耦合的问题,有利于功能的复用,能够使程序的结构变得非常灵活。
30+
31+
####Context 和 Bean
32+
33+
Spring 进行 IoC 实现时使用的两个概念:Context 上下文和 Bean。如下图所示,所有被 Spring 管理的、由 Spring 创建的、用于依赖注入的对象,就叫作一个 Bean。Spring 创建并完成依赖注入后,所有 Bean 统一放在一个叫作 Context 的上下文中进行管理。
34+
35+
![img](http://s0.lgstatic.com/i/image2/M01/8A/C6/CgoB5l14puyAWtEwAAA9kZ-6cDw595.png)
5036

5137
####依赖注入(DI)
5238

@@ -470,6 +456,8 @@ public void save() {
470456

471457
答:Spring 中 Bean 的生命周期如下:
472458

459+
![img](http://s0.lgstatic.com/i/image2/M01/8A/C6/CgoB5l14puyAAa1gAABPP0lufvQ678.png)
460+
473461
- ① 实例化 Bean:对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 Bean 时,或初始化 Bean 的时候需要注入另一个尚未初始化的依赖时,容器就会调用 createBean 进行实例化。对于 ApplicationContext 容器,当容器启动结束后,通过获取 BeanDefinition 对象中的信息,实例化所有的 Bean;
474462
- ② 设置对象属性(依赖注入):实例化后的对象被封装在 BeanWrapper 对象中,紧接着 Spring 根据 BeanDefinition 中的信息以及通过 BeanWrapper 提供的设置属性的接口完成依赖注入;
475463
- ③ 处理 Aware 接口:Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean:

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp