目录
前言
你好,我是Dr.叶子,用心写最优美的博客,弹最好听的钢琴!
最近更新:
- 2020年10月10日
1. TCP三次握手、四次挥手流程
seq: 序号,TCP 是面向字节流的,在一个 TCP 连接中传输的字节流中的每个字节都按照顺序编号。
ack(小写): 确认号,表示期望收到对方下一个报文段的序号值;
TCP的标志位
- SYN: 同步标志位,当 SYN = 1 的时候,表明这是一个请求连接报文段;
- FIN: 完成标志位,当 FIN = 1 时,表示此报文段的发送方的数据已经发送完毕,并要求释放 TCP 连接;
- ACK(大写): 确认标志位,对已接收的数据包进行确认,TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 设置为 1;
- PSH: 推送标志位,表示该数据包被对方接收后应立即交给上层应用,而不在缓冲区排队;
- RST: 重置标志位,用于连接复位、拒绝错误和非法的数据包;
- URG: 紧急标志位,表示数据包的紧急指针域有效,用来保证连接不被阻断,并督促中间设备尽快处理;
具体参考: 理解 TCP 和 UDP.
步骤:
- 客户端,把 SYN 标志位置为 1 ,并随机产生序号 seq = x,组成 SYN 报文发送给服务端,表示向服务端发起连接,之后客户端处于
SYN-SENT
状态;(报文不包含应用层数据)- 服务端,收到客户端的 SYN 报文后,首先随机产生序号 seq = y,其次将确认号 ack = x + 1,然后把 SYN 和 ACK 标志位置为 1,组成报文发给客户端,之后服务端处于
SYN-RCVD
状态;(报文不包含应用层数据)- 客户端,收到服务端报文后,首先将 ACK 标志位置为 1 ,其次确认号 ack = y + 1 ,组成应答报文发送给服务端,之后客户端处于
ESTABLISHED
状态。服务端收到应答报文后,也进入ESTABLISHED
状态。(可以携带数据)
步骤:
- 客户端,准备关闭连接,将 FIN 标志位置为 1 ,产生随机序号 seq = x,组成 FIN 报文发送给服务端,之后客户端进入
FIN_WAIT_1
状态;- 服务端,收到该报文后,将 ACK 标志位置为 1,确认号 ack = x + 1,产生随机序号 seq = y,组成应答报文向客户端发送 ,之后服务端进入
CLOSED_WAIT
状态;
客户端,接收到应答报文后进入FIN_WAIT_2
状态;- 服务端,处理完数据后,也向客户端发送 FIN 报文,之后服务端进入
LAST_ACK
状态;- 客户端,收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入
TIME_WAIT
状态;
服务端,收到了 ACK 应答报文后 , 进入CLOSE
状态,服务端完成关闭;
客户端,过 2MSL 最大生存时间后,进入CLOSE
状态,客户端完成关闭。
2. 为什么三次握手?
- 避免历史连接
- 同步双方初始序号
- 避免资源浪费
3. 为什么四次挥手?
- 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
- 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
注:服务端,通常需要等待完成数据的发送和处理。
4. 同步&异步的概念
5. 进程、线程
-
进程(Process): 指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。
-
线程(Thread): 是进程中的一个实体,作为系统任务调度的基本单位。
【形象描述】
进程=火车,线程=车厢
1. 线程在进程下行进。(单纯的车厢无法运行)
2. 一个进程可以包含多个线程。(一辆火车可以有多个车厢)
3. 不同进程间数据很难共享。(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
4. 同一进程下不同线程间数据很易共享。(A车厢换到B车厢很容易)
5. 进程要比线程消耗更多的计算机资源。(采用多列火车相比多个车厢更耗资源)
6. 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉。(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
7. 进程可以拓展到多机,进程多适合多核。(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
8. 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-“互斥锁”
9. 进程使用的内存地址可以限定使用量。(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”
- 为什么要用多线程?
线程是独立调度的基本单位,进程是拥有资源的基本单位,不仅进程之间可以并发执行,并且线程之间也可以并发执行,使得操作系统具有更好的并发性,因为线程不拥有系统资源故使用线程调度时系统开销小。
进程是与资源有关的,而进程又是动态的,因此进程切换时需要占用系统较多的开销,影响了系统的并发性能,引入线程,尽量减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。
- Windows 编程中创建进程耗时大
创建一个进程,在进程中往内存写若干数据,然后读出该数据,然后退出。此过程重复 1000 次,相当于创建/销毁进程 1000 次。测试结果是:
- Ubuntu / Linux:耗时 0.8 秒
- Windows7:耗时 79.8 秒
- 多线程使用场景?
- 需要频繁创建销毁的优先用线程(进程的创建和销毁开销过大)
- 需要进行大量计算的优先使用线程(CPU频繁切换)
- Java中的多线程是可以利用多核的,真正的多线程!
- Python中的多线程只能利用单核,假的多线程!
6. 负载均衡
- 当系统面临大量用户访问,负载过高的时候,通常会使用增加服务器数量来进行横向扩展,使用集群和负载均衡提高整个系统的处理能力;
7. 什么是CDN缓存
- CDN 是一种部署策略,根据不同的地区部署类似nginx 这种服务服务,会缓存静态资源;
- 前端优化,一般在静态资源上加上一个 hash 值,每次更新改变这个 hash,会去重新取资源;
8. 跨域问题
-
产生:
浏览器的同源策略导致了跨域,用于隔离潜在恶意文件的一种安全机制; -
解决:
① 使用 jsonp ,允许 script 加载第三方资源;
② 使用 nginx 反向代理(配置 Access-Control-Allow-Origin *);
③ 使用 cors 前后端分离模式,设置请求头 Access-Control-Allow-Origin 等;
④ 使用 iframe 嵌套通讯;
9. GET 与 POST 通讯的区别
GET | POST |
---|---|
能缓存 | 不能能缓存 |
传输数据少 | 传输数据多 |
请求的参数在URL,不安全 | URL不显示参数,相对安全 |
请求参数受URL长度限制 | 无限制 |
10. 堆、栈(内存)
-
栈区(stack): 由编译器自动分配释放,存储函数的参数值,局部变量的值等,其操作方式类似于数据中的栈,先进先后。
-
堆区(heap):——一般由程序员分配释放,若程序员不分配也就没有堆,不释放,程序结束时可能由OS回收。
堆内存(heap) | 栈内存(stack) |
---|---|
存储的是实体对象 | 存储的是局部变量 |
更新速度慢 | 更新速度快(因为局部变量的生命周期很短) |
实体会被垃圾回收机制不定时的回收 | 变量生命周期一旦结束就会被释放 |
线程共有的 | 线程私有的 |
在二级缓存中,生命周期由虚拟机的垃圾回收算法决定 | 使用一级缓存,通常是被调用时处于存储空间,调用完立即释放 |
先进先出 | 先进后出 |
空间大 | 空间小 |
推荐阅读
【1】一文彻底搞懂 TCP三次握手、四次挥手过程及原理.
【2】图解TCP三次握手和四次挥手!(简单易懂).
【3】wireshark抓包图解 TCP三次握手/四次挥手详解.
系列文章
后语
- 原创内容,转载说明出处哦!
- 以上内容本人整理,亲测可行,如有任何问题,敬请指正,谢谢~~
- 点赞、收藏、也欢迎打赏,我弹钢琴你听呀~~哈哈!