2022-03-09

思想

迪米特法则

最小知道法则,外部调用的时候越简单越好

设计模式

构建者设计模式

这个用户参数多于5个,并且可选可配的情况下,感觉已经被kotlin默认参数,指定参数代替

门面模式(外观模式)

吧复杂操作隐藏,留出最简单的接口个i 用户调用,符合迪米特,最小知道原则,如socket,比如我们调用sdk的时候,一般不会直接调用sdk相关对象,而是在外面包一个类,这样的话方便切换sdk和应对sdk的修改

装饰器模式

组合大于集成的概念,当我们需要增加A类的功能时,不是走继承,而是用类B实现和A类同样的接口,同时持有A类,新增方法走自己的,原来的继续走A对象里方法,比如contextimpl = a,contextwrapper = b

装饰模式和代理模式的区别

装饰模式主要了扩展功能,代理模式主要为了控制功能是否访问,比如经纪人代理演员,拍戏时由演员去拍,经纪人可以通过价格判断是否进行拍戏,代理更像是一种aop的思想,比如所有方法调用前先加log,参考retrofit网络请求

适配设计模式

其实就可以理解为中间层,没必要想太多,就是吧原来不适合的变得适合,比如返回的是string,但我要的bean,那么gson就是个适配层

策略设计模式

其实就是为了同一个目的,执行不同的策略,比如出行去xx,是走路,开车,还是公交
if else也算策略者设计模式,比如经常返回值是个接口,我们提供不同的实现。
觉得更好的就是减少if else的过程,因为这样逻辑会很复杂,比如我们的测滑栏里的业务,如果我是每个业务都绑定了一个策略,点击触发执行,而不是一个类型,判断点击类型提供不同策略,前面好像更好点

网络

osi和tcp/ip

osi七层模型是由iso 公司提出来的,主要用于学术中
工程中通常用ieee提出来的tcp/ip 4层模型

滑动窗口

ack应答的时候告诉对方我能多少多少数据

大写ACK 小写ack区别

大写ACK 表示这次是个ack应答,小写ack代表之前的序列号+收到的数据(握手时➕1)

syn宏范攻击

tcp在进行第一次握手的时候,会带上自己的ip,但是如果我给个假的ip,服务器的就永远进入syn_recv状态不能进入established状态,
解决办法,防火墙,确定连接有效再给服务器,其次是线程检查这种半开链接给释放

四次挥手

关闭发起端可能是客户端,也可能是服务器,我们这里用客户端举例
1,c发送fin = 1,seq告诉服务器我不会再发消息给你啦
2, s 发送ACK = 1,seq+1告诉客户端,我知道你不会发消息给我啦
3, s 发送fin = 1 进入close状态,告诉客户端,我也不发消息给你啦
4 , c 告诉s 我知道你不发消息给我啦 ,c进入time_watting 状态,等待两个消息超时时间,s 如果收到ack应答进入closed状态

问题一,2,3为什么不合并

其实可能会合并,甚至1可能是和最后一条有用信息一起发过来
2,3 是否合并主要,服务器知道客户端不给自己发消息以后,自己还有没有消息需要发给客户端,确定没有才走3

问题二,为什么c要进入time_watting

如果不进入time_watting 可能会有俩个问题
1, 可靠,最后c的ack消息,服务器没有收到,这样服务器会以为是不是自己没发过去,这样重走3,c接到以后重走4,这样一来一回,就是2个time_waiting
2,假设客户端直接关了,有了别的程序占用了这个端口,这样服务器重发的3的消息,就会直接发给别的程序,导致混乱

bpf 语法

原语 + 组合符号 + 原语
总共三种限定词
方向限定词,目标还是来自
类型限定词,代表后面跟的是什么类型,如 host port
协议限定词,如tcp udp

nio

三个大的组建1,
selector 有事件的时候通知对应的注册者
channel 通信管道
buffer 缓存

你可能感兴趣的:(2022-03-09)