# 网络


### 网络

1. `HTTP 1.0`: 短连接 (100张图, 发起100次 TCP 握手挥手)

   `HTTP 1.1`: 长连接 (100张图, 一次 TCP 握手挥手, 在一个TCP连接上可以传送多个HTTP请求和响应)

   `HTTP 2.0`: 长连接 + IO 多路复用 (同时通过单个 HTTP/2 连接发起多重的请求-响应消息, 可以很容易实现多流并行而不依赖多个 TCP 连接)

2. `GET 和 POST 有啥区别`? 事实上 POST 能干的 GET 也不是不行, 只是我们应该遵守 RESTful api罢了

   1. GET 应该是幂等的, 反复读取不应该对访问的数据有副作用
   2. GET 中可以但不应该包含 body, 而应该使用 cookie 和 form 表单进行传递数据

3. `TCP / UDP`:

   1. `UDP` 无连接、开销小、速度快, 但存在丢包, 适用于音频/视频/直播这种偶尔丢失一两个数据包也没什么关系的

   2. `TCP` 通过三次握手确保建立好可靠数据连接才会进行传输, 以及采用了超时重传/错误校验等机制保证数据的可靠传输

      三次握手: 客户端:"我准备好了" 服务端:"我收到了 你开始吧" 客户端:"好的 那我开始了"
      四次挥手: 客户端:"我发完了" 服务端:"我知道了" 服务端:"那你关闭吧" 客户端:"那我关了"

   3. 为什么`一定要三次握手`? 

      TCP 的可靠连接是靠起始序列号 seq(sequence numbers) 来达成的, 如果只有两次的话, 客户端发送了自己的序列号服务端进行确认, 而服务端发出的起始序列号客户端不能进行确认 (只能接受), 不能确保数据传输可靠性.

### 编程基础

1. 什么是`事务`? 怎么理解事务? 事务是并发控制的基本单位, 这个主要用于后端数据库操作吧

      事务应该具有4个属性：原子性、一致性、隔离性、持久性，这四个属性通常称为ACID特性

      **原子性(atomicity)**：事务是最小的执行单位，不允许分割。事务的原子性确保动作要么全部完成，要么完全不起作用；

      **一致性(consistency)**： 执行事务前后，数据保持一致，多个事务对同一个数据读取的结果是相同的；

      **隔离性(isolation)**：并发访问数据库时，一个用户的事务不被其他事务所干扰，各并发事务之间数据库是独立的；

      **持久性(durability)**：持久性也称永久性(permanence)，一个事务被提交之后。它对数据库中数据的改变是持久的，即使数据库发生故障也不应该对其有任何影响。

2. 怎么理解`面向对象`?

      面向对象产生我觉得主要是为了降低耦合, 便于开发维护, 假如我们还使用面向过程的话我们每个方法的实现都是拆的很散的, 每次需求改变都需要在大量的方法中寻找自己需要的.
      而如果采用面向对象, 那么我们就把一类事务封装在一起, 而在我们需要的时候去命令对象做什么事情.

3. `抽象类`和`接口`有什么区别呢?

   抽象类可以有默认实现, 而子类进行继承. 接口本身什么事情都干不了
   接口是为了方便某个类去开放一些方法, 而抽象类是为了方便同种的类去实现这一类功能
   
4. 基本 sql 语句

      ```sql
      select * from students;
      delete from students where gender='M';
      insert into students (name,gender,score) values ('wrnm','K',10);
      update students set name='nb',gender='F',score=10000 where score<20;
      select * from students order by score desc limit 3 offset 0;
      ```


