计算机的存储

计算机的存储

  1. 层次化存储
    包括: 寄存器,cache(L1,L2,L3), 内存,disk(SSD)

locality(局部性):指令/数据周围的有很大概率被访问,时间上相近的访问很可能被重复访问

带来的问题就是 false memory: 伪共享

  1. 缓存上去的数据可能是老的数据,而没有读取新的数据
  2. 缓存是已经被更新的数据,还没有写入内存

cpp volatile 关键字:
主要是让编译器不要过度优化,每次访问数据应该访问的是内存的数据,而不是寄存器的数据

数据的一致性

  1. VM 和PM
  • VM:访问的地址空间可以比物理地址更多,大大增加可访问地址空间
  • 不同进程可以访问相同的虚拟地址,但不是相同的物理地址,保证了进程地址空间的隔离
  • TLB加速查找,硬件上,但是OS管理;但TLB也可能还没有构建出映射,也可能已有的映射从TLB被踢出了;所以会发生TLB miss,要么从页表中找或者构建新的表项
  • 物理页用完了,没有新的叶框;会用一定的策略将其存在disk(swap)

reg, cache (芯片内部)

memory (容易丢失)

disk(SSD)

BIOS: 不荣容易丢失的,上电之后最开始执行的程序

4次挥手

  • 主动关闭链接方发送FIN豹纹,进入FIN_WAIT_1状态
  • 被动方发送ACK豹纹,进入CLOSE_WAIT状态
  • 主动方接受ACK,进入FIN_WAIT__2状态,等被动方发送完所有数据并发送FIN豹纹,被动进入LAST_ACK
  • 主动方收到FIN,发送ACK;主动方进入TIME_WAIT,等到2MSL之后才进入CLOSE状态
  • 被动方收到ACK后,从LAST_ACK进入 CLOSE 状态

为什么要2MSL

  1. 确保ACK能够到达被动方,如果ACK没有到达的比如丢失了,会触发重发FIN报文
  2. 确保被动方发的包能够被主动方接受,所以需要2MSL的时间(这里是指在建立阶段传输的数据包) 如果在关闭链接之后再建立链接,数据包才到达会造成数据错乱

过多TIME_WAIT状态危害:

  1. 内存资源的占用
  2. 对端口资源的占用

如果建立连接,但是客户端突然出现故障

TCP 保活机制
定义一个时间段,如果没有任何连接相关的活动,TCP的包活机制
每个一个时间间隔,发送一个探测报文,如果连续几个探测报文没有响应,则认为当前TCP连接已经死亡

socket编程

服务端需要 穿件socket,bind,listen
客户端执行connect, 服务端执行accept就会建立连接(三次握手)
read write() 读和发送数据
close() 用于关闭连接

3次握手

  • 服务端listen端口
  • 主动发起连接方,发送SYN报文 seq=x
  • 被动连接方,接受报文SYN,ACK, 发送 seq=y, ack = x+1
  • 主动方接收到 ,发送ACK, ack = y+1

为什么3次握手

  • 避免历史连接,如果一个旧的SYN 报文比新的SYN报文先到服务端,那么服务端响应ACK,SYN, 客户端发现是旧的SYN报文就会发送RST终止这次连接;如果是两侧握手就无法终止判断当前连接是否为历史连接
  • 同步双方的序列序列号;如果客户端不恢复ack,无法确认服务端的序列号是否被同步
  • 避免资源浪费,因为sYN只会建立半连接队列

ISN随机

  1. 如果序列号相同,无法分辨该报文是否为历史报文
  2. 安全性,反之黑客伪造相同序列号的TCPO报文被对方接受

SYN 泛洪攻击

攻击这短时间内伪造不同的IP的SYN报文

  1. 控制队列大小
原文地址:https://www.cnblogs.com/fridayfang/p/14722162.html