0%

截至今天,计网方面看完了《图解tcp—ip》《计算机网络自顶向下方法》和湖科大的教学视频。为了避免忘记,对一些面试问题做一下整理,既是复习重点也为之后面试的八股文做准备。

自己综合整理的

为什么网络要分层?

网络分层的原则:每一层独立于其它层完成自己的工作,而不需要相互依赖,上下层之间通 过标准结构来互相通信,简单易用又具有拓展性。复杂的系统需要分层,因为每一层都需要专注于一类事情。我们的网络分层的原因也是一 样,每一层只专注于做一类事情。

为什么计算机网络要分层呢?我们再来较为系统的说一说:

各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只 需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)这个和我们对开发时系统进行分层是一个道理。

提高了整体灵活性 :每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。这个和我们平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。

大问题化小 :分层可以将复杂的网络间题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。这 个和我们平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解 的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。

TCP-IP 网络模型

4层模型

应用层、运输层、网络层、网络接口层

5层模型 (一般回答)

应用层、运输层、网络层(数据平面、控制平面)、链路层、物理层

7层模型 (古老的理论)

应用层、表示层、会话层、运输层、网络层、链路层、物理层

HTTP 是哪一层的协议?http常见的状态码

HTTP 协议 属于应用层的协议。

HTTP 协议是基于 TCP 协议的,发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,也就是持续连接,这样的话建立的连接就可以在多次请求中被复用了。

另外, HTTP协议是无状态的协议,它无法记录客户端用户的状态一般我们都是通过Session 来记录客户端用户的状态。

此处应参考知乎回答

https://www.zhihu.com/question/23202402/answer/515842304
https://www.zhihu.com/question/23202402/answer/527748675

常见的状态码: 200、301、302、403、404、500、503

200:请求被成功处理

301 永久性重定向:比如建设一个网站后,将网站的url变换了,重新申请一个域名,但是希望之前的用户访问之前url仍然可以访问到,就可以做一个重定向新的url下面。比如京东最早域名www.360buy.com名重定向到现在www.jd.com (DNS解析 )
302 临时性重定向:比如用户在未登录时访问个人中心页面,这时可以临时重定向到登录的url。

304 Not Modified:当客户端拥有可能过期的缓存时,会携带缓存的标识 etag、时间等信息询问服务器缓存是否仍可复用,而304是告诉客户端可以复用缓存。

400 请求出错:由于语法格式有误,服务器无法理解此请求。不作修改,客户程序就无法重复此请求。

401 未授权:(未授权) 请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。

403 没有访问权限:系统中某些页面只有在某些权限下才能访问,当用户去访问了一个本身没有访问权限的url,回报403错误。

404 没有对应资源:一般是自己输入了一个url,这个url并不合法。找不到,Web 服务器找不到您所请求的文件或脚本。请检查URL 以确保路径正确。

405 不允许此方法:不允许此方法,对于请求所标识的资源,不允许使用请求行中所指定的方法。(get/post/put/delete/请求用混淆了,更正即可)请确保为所请求的资源设置了正确的 MIME 类型

406 不可接受:根据此请求中所发送的“接受”标题,此请求所标识的资源只能生成内容特征为“不可接受”的响应实体

407 需要代理身份验证:需要代理身份验证,在可为此请求提供服务之前,您必须验证此代理服务器。请登录到代理服务器,然后重试

412 前提条件失败:在服务器上测试前提条件时,部分请求标题字段中所给定的前提条件估计为FALSE。客户机将前提条件放置在当前资源 metainformation(标题字段数据)中,以防止所请求的方法被误用到其他资源

414 Request-URI 太长:Request-URL太长,服务器拒绝服务此请求。
仅在下列条件下才有可能发生此条件:

  1. 客户机错误地将 POST 请求转换为具有较长的查询信息的 GET 请求
  2. 客户机遇到了重定向问题(例如,指向自身的后缀的重定向前缀)
  3. 服务器正遭受试图利用某些服务器
    (将固定长度的缓冲区用于读取或执行 Request-URI)
    中的安全性漏洞的客户干扰

500 服务器错误:比如服务器某一个函数代码出错了,有没有捕获异常,这时候会报500错误。

500 服务器的内部错误,Web 服务器不能执行此请求。请稍后重试此请求。

501 未实现:Web 服务器不支持实现此请求所需的功能。请检查URL 中的错误

502 网关出错 :Bad Gateway,当用作网关或代理时,服务器将从试图实现此请求时所访问的upstream 服务器中接收无效的响应

503 服务器停机:系统正在维护或者服务器暂停的时候,回报500错误。

504 Gateway Timeout :代理服务器无法及时的从上游获得响应

HTTP 和 HTTPS 什么区别?

端口 :HTTP的URL由“http://”起始且默认使用端口80,而HTTPS的URL由“https://”起始且默认使用端口443。

安全性和资源消耗:HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL之上的HTTP协议,SSL运行在TCP之上。所有传输的内 容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。

对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称 加密算法有DES、AES等;

非对称密钥加密,加密和解密使用不同的密钥。通信发送方获得接收方的公开密钥之后,就 可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。可以更安全地将公 开密钥传输给通信发送方;运算速度慢。典型的非对称加密算法有RSA、DSA等

HTTPS 采用的加密方式: HTTPS 采用混合的加密机制。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。

HTTP 2.0

HTTP1.0和HTTP1.1区别
HTTP1.0和HTTP1.1最主要的区别就是:

HTTP1.1默认是持久化连接!
在HTTP1.0默认是短连接

相对于持久化连接还有另外比较重要的改动:HTTP 1.1增加host字段

HTTP 1.1中引入了Chunked transfer-coding,范围请求,实现断点续传(实际上就是利用HTTP消息头使用分块传输编码,将实体主体分块传输)

HTTP 1.1管线化(pipelining)理论,客户端可以同时发出多个HTTP请求,而不用一个个等待响应之后再请求注意:这个pipelining仅仅是限于理论场景下,大部分桌面浏览器仍然会选择默认关闭HTTP pipelining!所以现在使用HTTP1.1协议的应用,都是有可能会开多个TCP连接的!

HTTP2新改动:

二进制分帧
多路复用
头部压缩
服务器推送

参考知乎回答 https://www.zhihu.com/question/306768582/answer/576026225

http和smtp 区别

  1. http 拉 smtp 推
  2. smtp数据按照七比特ascii格式编码,http数据不受限制
  3. http把每个对象分别封装到自己的http响应报文(图片 文本),smtp则放在一个报文中

具体参考计网自顶向下 78面内容

HTTP报文详解?详细说一下请求报文,以及HTTP和TCP的区别

HTTP有两种报文:请求报文和响应报文

HTTP请求报文主要包括请求行、请求头部以及请求的数据(实体)三部分请求行(HTTP请求报文的第一行)由方法字段、URL字段和HTTP协议版本字段组成。其中,方法字段严格区分大小写,当前HTTP协议中的方法都是大写,方法字段如下介绍如下:POST GET HEAD

请求头部:位于请求行的下面, 是一个个的key-value值

空行(CR+LF):请求报文用空行表示header和请求数据的分隔 请求数据:GET方法没有携带数据, POST方法会携带一个body

HTTP的响应报文包括:状态行,响应头部,相应的数据(响应体)

状态行包括:HTTP版本号,状态码和状态值组成。响应头类似请求头,是一系列key-value值

空白行:同上,响应报文也用空白行来分隔header和数据 响应体:响应的数据

tcp三次握手 四次挥手 及其原因

知乎回答
https://www.zhihu.com/question/24853633/answer/254224088

https://www.zhihu.com/question/24853633/answer/115173386

https://www.zhihu.com/question/24853633/answer/573627478

补充如下

CLOSE-WAIT 状态问题:

客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送FIN 连接释放报文。

TIME-WAIT 状态问题:

客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:

确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。

等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一 个新的连接不会出现旧的连接请求报文。

通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。

TCP滑动窗口是干什么的?TCP的可靠性体现在哪里?拥塞控制如何实现的?

复习时应看自顶向下 152页 FSM应详细学习 且前面原理也应复习到,简略答案如下。

滑动窗口:窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接 收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。接收窗口只会对窗口内 最后一个按序到达的字节进行确认。如果发送窗口内的字节已经发送并且收到了确认,那么 就将发送窗口向右滑动一定距离,直到第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就滑动接收窗口。

流量控制如何实现:流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。(实际上会继续发送只有一个字节数据的报文段)

拥塞控制:如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞 程度更高。因此当出现拥塞时,应当控制发送方的速率。TCP主要通过四个算法来进行拥塞控制:慢启动、拥塞避免、快重传、快恢复。

发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量。

慢启动与拥塞避免:
发送的最初执行慢开始,令拥塞窗口大小为1MSS,发送方只能发送1个报文段;当收到确认后,将拥塞窗口大小加倍(每个轮次的ACK增加 1MSS)。设置一个慢启动门限,当 拥塞窗口的大小大于慢开始门限 时,进入拥塞避免,每个轮次只将拥塞窗口加1(相当于每个轮次的的ACK只能增加 1/cwnd MSS)。如果出现了超时,则令慢启动门限 = 拥塞窗口大小 / 2,然后重新执行慢开始。

快重传与快恢复:
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传, 立即重传下一个报文段。在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此 执行快恢复,令慢开始门限 = 拥塞窗口大小 / 2 ,拥塞窗口大小 = 慢开始门限+3(+3是三个重复确认ack 仔细看自顶向下) ,注意到此时直接进入拥塞避免。

TCP 通过按字节序号,累计确认,超时重传及快速重传确保传输的可靠性

(主要)TCP使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。

  1. 应用数据被分割成 TCP 认为最适合发送的数据块。

  2. TCP 给发送的每一个包进行编号,接收方对数据包进行排序(无序到达数据也被缓存),只把有序数据传送给应用层。

  3. 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。

  4. TCP 的接收端会丢弃重复的数据。

  5. 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。(TCP 利用滑动窗口实现流量控制)

  6. 拥塞控制: 当网络拥塞时,减少数据的发送。

  7. ARQ协议:也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。

  8. 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

  9. 选择重传:TCP 采用选择重传,滑动窗口,捎带确认,MSS (最大报文段大小),以及对接收窗口和发送窗口大小进行约束来确保传输效率。TCP 使用选择重传的方式来处理丢失的报文段,当 ACK 报文到达发送方,如果 ACK 序号在滑动窗口左边界以左则直接丢弃这个报文,如果该序号对应的报文在已发送待确认的序号之间,则确认该序号以前的数据被接收,并已该序号为开始选择报文段进行重传

tcp 服务器如果向客户端发送 1MB 数据,是如何得知 1MB 发送完毕

每个 socket 建立时均会分配输入缓冲区和输出缓冲区,write/send 方法会向输出缓冲区写入数据,写入方式分为阻塞和非阻塞两种,write/send 调用成功返回结果表示的是向输出缓冲区写入成功的字节数,并不代表接收端已接收到的数据。

而阻塞和非阻塞的区别是,如果写入的数据大于输出缓冲区可用大小,阻塞写入方式会阻塞直到全部数据写入成功然后返回总的数据字节数,非阻塞方式则直接按照缓冲区可用大小写入,然后返回写入的字节数

因此,可以通过 write/send 方法调用的返回值确定这 1MB 是否写入成功

read/recv 的阻塞模式则指的是如果输入缓冲区无数据则一直阻塞,有数据则读取返回,如果要读的数据大小大于缓冲区可读数据大小,则只会返回可读的字节数

叫你设计一个聊天应用层协议,需要考虑哪些重要问题

要设计一个应用层协议需要考虑:1)首先是基于哪些网络层,传输层和应用层协议来分工完成整个聊天应用的通信和传输;2)应用程序还需要传输一些信息来控制程序运行过程,因此还需要自行来定义应用层协议

大致设计如下:

1 TCP/Websocket 协议维护长连接

2 UDP 进行消息/文件的传输和接收

3 HTTP/HTTPS 完成用户登录,用户注销等应用功能

4 设计类似于 ICMP(一种错误侦测与回报机制) 的辅助控制协议,在客户端和服务端之间传输协议控制命令,如控制 UDP 传输的可靠性,发送心跳包等等

对于辅助控制协议的设计则需要考虑:1)协议头的设计;2)基于哪种协议来完成,UDP or TCP?

由于控制协议的消息很短,且无需维护长连接,那么排除 TCP,而且我们要设计的是应用层协议,使用 UDP 协议

协议头如下:
Flag:协议标识

Version:协议版本

Command:协议消息类型,即协议控制命令

Sequence:协议消息序号

ID:用户ID

Data:协议数据

CheckData:校验和数据,可以放到 Data 中,感觉没啥必要

TCP和UDP

1

TCP 是面向连接的可靠传输协议,面向字节流,能够确保每一个字节都按序到达接收端,会发生粘包和拆包现象,有拥塞控制,适合对数据传输可靠性较高的场景。

UDP 是无连接,不可靠的,尽最大努力交付,面向报文,不拆分不合并,不会有粘包和拆包现象发生,无拥塞控制,适合可容忍部分数据丢失的实时应用,能够实现 1 对 1,1 对多和多对多的实时交互通信。

UDP 的首部长度只有 8B,相比 TCP 开销很小

2

用户数据报协议 UDP是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。

传输控制协议 TCP是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数 据块),每一条 TCP 连接只能是点对点的(一对一)。

​TCP应用场景:

效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、 排序等操作,相比之下效率没有UDP高。举几个例子:文件传输、接受邮件、远程登录。

UDP应用场景:

效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网 络语音电话、广播通信(广播、多播)。

UDP为何快?

  1. 不需要建立连接
  2. 对于收到的数据,不用给出确认
  3. 没有超时重发机制
  4. 没有流量控制和拥塞控制

mac地址和ip地址 已经有了mac地址为什么还要ip地址 相反呢

MAC地址是烧录在网卡或者接口上的物理地址,具有全球唯一性,一般不能被改变。IP地址是网络中的主机或接口在网络中的逻辑地址,在同一个网络内具有唯一性。(ip地址因为 DHCP NAT协议改变)

知乎万能 https://www.zhihu.com/question/21546408/answer/149670503

先有mac地址后有ip地址

  1. 高效:mac地址过多,转发表太大,主机不可能一直不变,难以找到对应节点。
  2. 上下兼容:满足不同网络(以太网 WiFi ppp )之间的通信(互联网不止只有以太网),屏蔽掉各个厂家数据链路层不同的标准,达到异构网络的通信。

ip地址聚合可以快速高效找到对应节点,大大减少路由器计算量和所需储存空间,且屏蔽链路层不同实现异构网络通信。

有了ip为什么还要mac地址?

  1. DHCP 分配ip时通过mac地址标识主机
  2. mac地址在匹配转发时更快

    三层交换机 & 路由器在收到一个包的时候,需要拆下 IP 头进行解析,根据路由表找到目标地址所对应的出端口(如果入端口上配置了 NAT,还需要进行地址转换)。这一步完成后,数据包会被包上新的 IP 头(更新地址及 TTL 等信息)然后才能发出去。而二层交换机完全不拆 IP 头,基本是收一个包就转发一个包,快的要死。更一般地说,三层交换机和路由器可以看做是子网与子网之间的枢纽,相当于邮局;而二层交换机只能作为单个子网内的中转站(因为它完全不知道 IP 是什么东西)。当子网很大的时候(很大指设备多,此时端口不够用;或者距离长,衰弱太严重),不可避免的需要使用中转站,此时如果用三层的未免小题大做,而且效率不佳。

ip相当于学校的学号 mac相当于身份证号。

当你打开一个电商网站,都需要经历哪些过程?分别用到了什么协议

具体应看 自顶向下326面

  1. 浏览器查找域名的IP地址 (DNS:获取域名对应的IP)

  2. 浏览器向web服务器发送HTTP请求(cookies会随着请求发送给服务器)

  3. 服务器处理请求 (请求 处理请求 参数、cookies、生成一个HTML响应)

  4. 服务器返回HTTP报文,发回一个HTML响应。

  5. 浏览器解析渲染页面,浏览器开始显示HTML。

  6. 连接结束

使用的协议:

  1. DNS: 获取域名对应的IP TCP: 与服务器建立TCP连接

  2. IP: 建立TCP协议时,需要发送数据,发送数据在网络层上使用IP协议

  3. OSPF:IP数据包在路由器之间,路由选择使用OSPF协议

  4. ARP:路由器在与服务器进行通信的过程中,将IP地址装换成MAC地址

  5. HTTP:客户端浏览器与Web服务器之间的应用层通信协议,在TCP建立完成后,使用HTTP协议访问网页

电子邮件的发送过程

自顶向下 75面

一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。

邮件协议包含发送协议和读取协议,发送协议常用 SMTP,读取协议常用 POP3 和 IMAP(更复杂 更精细)。

  1. 用户A的邮箱是QQ邮箱,他要发往的邮箱是163邮箱,用户A写好一封邮件点击发送, 即提交到了QQ邮箱服务器,使用的是SMTP协议。

  2. QQ邮箱会对A发送邮件的收件地址进行解析,判断是否为内部邮箱的账号,如果也是QQ邮箱,会直接存储到自己的存储空间,如果不是则会发送到指定邮箱服务器,使用 的也是SMTP协议。

  3. 163的邮箱服务器收到邮件后会再次判断该邮件是否为自己的邮件,如果是则存到自己的存储空间,等待POP3服务去读取邮件。

  4. 用户B收到消息后,打开客户端访问163服务器,调用POP3服务。

  5. Pop3服务接到指令后,读取存储空间中发送给B的未读邮件服务。

  6. 将读取到的邮件返回给客户端软件。

DNS解析过程,DNS劫持

自顶向下 83面

DNS完成的工作是:域名到IP地址的解析。将域名和IP地址相互映射的一个分布式数据库。第一步:客户机提出域名解析请求,并将该请求发送给本地域名服务器。

第二步:当本地域名服务器收到请求后,就先查询本地缓存,如果有该纪录项,则本地域名

服务器就直接把查询结果返回。

第三步:如果本地缓存中没该纪录,则本地域名服务器就直接把请求发给根域名服务器,然 后根域名服务器再返回给本地域名服务器一个所查询域(根子域)主域名服务器地址。

第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自 己的缓存,如果没该纪录,则返回相关下级域名服务器地址。

第五步:重复第四步,直到找到正确纪录。

第六步:本地域名服务器把返回结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。

DNS劫持:在DNS服务器中,将www..com的域名对应的IP地址进行了变化。你解析出来的域名对应的IP,在劫持前后不一样。

HTTP劫持:你DNS解析的域名的IP地址不变。在和网站交互过程中的劫持了你的请求。在网站发给你信息前就给你返回了请求。

DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议。

GET和POST有什么不一样

详细看知乎https://www.zhihu.com/question/28586791/answer/767316172

GET和POST是HTTP请求的两种基本方法

  1. GET在浏览器回退时是无害的,而POST会再次提交请求。
  2. GET产生的URL地址可以被Bookmark,而POST不可以。
  3. GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  4. GET请求只能进行url编码,而POST支持多种编码方式。
  5. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  6. GET请求在URL中传送的参数是有长度限制的,而POST么有。
  7. 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  8. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  9. GET参数通过URL传递,POST放在Request body中。

SESSION和COOKIE

Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式

Cookie 一般用来保存用户信息,Session 的主要作用就是通过服务端记录用户的状态(此时客户端有一个 session cookie 记录 session ID)

Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果要在 Cookie 中存储一些敏感信息,不要直接写入 Cookie 中,最好能将Cookie 信息加密然后使用到的时候再去服务器端解密。

HTTP是不保存状态的协议,如何保存用户状态

HTTP 是一种无状态协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。主要通过session机制来进行解决,Session 的主要作用就是通过服务端记录用户的状态。

在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库redis 保存)。既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下, 通过在 Cookie中附加一个 Session ID 来方式来跟踪。

Cookie 被禁用怎么办 最常用的就是利用 URL 把 Session ID 直接附加在URL路径的后面

Arp协议

Arp协议能通过接收端的ip地址解析到mac地址。

如果发送端和目标端的主机都在同一个网段,发送端发送数据帧前检查是否拥有接收端的 mac地址,如果没有,则启动arp,先检查缓存ip-mac表中是否有接收端的mac地址,如果有 则直接拿来即用,如果没有则在本网段(局域网)广播arp包,本网段各计算机都收到arp请 求,从发送来的数据中检查请求过来的ip地址与自己是否一致,如果不一致,则丢弃,如果 ip一致,则单播返回mac地址给请求的计算机,发送端便获取到了接收端的mac地址,接收 到接收端的mac地址它还会缓存一份,用于下次拿来即用。

如果请求端和目标端的主机不在同一个网段呢?arp广播的数据是被路由阻断的,不能跨到不同的网段进行广播的,因为这样广播会导致广播数据泛滥。如果不在同一个网段,则请求端 拿到的目标端的mac地址其实是它网关的mac地址,将数据帧给到网关(网关路由对数据帧进行重新封装 根据自己的换缓存重写mac地址)再进行下一跳转发, 下一跳同样在自己的网段寻找到目标主机mac地址或再找到下一跳mac地址。

补充个知乎回答 https://www.zhihu.com/answer/223124156

DDos攻击

分布式拒绝服务,一般来说是指攻击者利用一些被控制的设备对目标网站在较短的时间内发 起大量请求,大规模消耗目标网站的主机资源,让它无法正常服务。

DNS 反射/放大

DNS 反射攻击是一种常见的攻击媒介,网络犯罪分子通过伪装其目标的 IP 地址,向开放的 DNS 服务器发送大量请求。作为回应,这些 DNS 服务器通过伪造的 IP 地址响应恶意请求,大量的 DNS 答复形成洪流,从而构成预定目标的攻击。很快,通过 DNS 答复产生的大量流量就会造成受害企业的服务不堪重负、无法使用,并造成合法流量无法到达其预定目的地。

SYN 泛洪攻击

人们连接到互联网应用的主要方式之一是通过传输控制协议 (TCP)。这种连接需要从 TCP 服务(如 Web 服务器)进行三方握手,涉及到从用户连接到服务器的位置发送所谓的 SYN(同步)数据包,然后服务器返回一个 SYN-ACK(同步确认)数据包,最终通过最后的 ACK(确认)通信作为应答,以此完成 TCP 握手。

在 SYN 泛洪攻击中,恶意客户端发送大量 SYN 数据包(通常在握手的第一部分),但永远不会发送确认以完成握手。这使得服务器一直等待对于这些半开放的 TCP 连接的响应,而这些连接最终会耗尽容量,造成服务器无法接受跟踪连接状态的新连接。

直接COPY的

简述OSI七层协议

OSI七层协议包括:物理层,数据链路层,网络层,运输层,会话层,表示层, 应用层

简述TCP/IP五层协议

TCP/IP五层协议包括:物理层,数据链路层,网络层,运输层,应用层

物理层有什么作用

主要解决两台物理机之间的通信,通过二进制比特流的传输来实现,二进制数据表现为电流电压上的强弱,到达目的地再转化为二进制机器码。网卡、集线器工作在这一层。

数据链路层有什么作用

在不可靠的物理介质上提供可靠的传输,接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路。提供物理地址寻址功能。交换机工作在这一层。

网络层有什么作用

将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方,通过路由选择算法为分组通过通信子网选择最佳路径。路由器工作在这一层。

传输层有什么作用

传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。

会话层有什么作用

建立会话:身份验证,权限鉴定等;
保持会话:对该会话进行维护,在会话维持期间两者可以随时使用这条会话传输局;
断开会话:当应用程序或应用层规定的超时时间到期后,OSI会话层才会释放这条会话。

表示层有什么作用

对数据格式进行编译,对收到或发出的数据根据应用层的特征进行处理,如处理为文字、图片、音频、视频、文档等,还可以对压缩文件进行解压缩、对加密文件进行解密等。

应用层有什么作用

提供应用层协议,如HTTP协议,FTP协议等等,方便应用程序之间进行通信。

TCP与UDP区别

TCP作为面向流的协议,提供可靠的、面向连接的运输服务,并且提供点对点通信
UDP作为面向报文的协议,不提供可靠交付,并且不需要连接,不仅仅对点对点,也支持多播和广播

为何TCP可靠

TCP有三次握手建立连接,四次挥手关闭连接的机制。
除此之外还有滑动窗口和拥塞控制算法。最最关键的是还保留超时重传的机制。
对于每份报文也存在校验,保证每份报文可靠性。

为何UDP不可靠

UDP面向数据报无连接的,数据报发出去,就不保留数据备份了。
仅仅在IP数据报头部加入校验和复用。
UDP没有服务器和客户端的概念。
UDP报文过长的话是交给IP切成小段,如果某段报废报文就废了。

简述TCP粘包现象

TCP是面向流协议,发送的单位是字节流,因此会将多个小尺寸数据被封装在一个tcp报文中发出去的可能性。
可以简单的理解成客户端调用了两次send,服务器端一个recv就把信息都读出来了。

TCP粘包现象处理方法

固定发送信息长度,或在两个信息之间加入分隔符。

简述TCP协议的滑动窗口

滑动窗口是传输层进行流量控制的一种措施,接收方通过通告发
送方自己的窗口大小,从而控制发送方的发送速度,防止发送方发送速度过快而导致自己被淹没。

简述TCP协议的拥塞控制

拥塞是指一个或者多个交换点的数据报超载,TCP又会有重传机制,导致过载。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量.

当cwnd < ssthresh 时,使用慢开始算法。
当cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当cwnd = ssthresh 时,即可使用慢开始算法,也可使用拥塞避免算法。

慢开始:由小到大逐渐增加拥塞窗口的大小,每接一次报文,cwnd指数增加。

拥塞避免:cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1。

快恢复之前的策略:发送方判断网络出现拥塞,就把ssthresh设置为出现拥塞时发送方窗口值的一半,继续执行慢开始,之后进行拥塞避免。

快恢复:发送方判断网络出现拥塞,就把ssthresh设置为出现拥塞时发送方窗口值的一半,并把cwnd设置为ssthresh的一半,之后进行拥塞避免。

简述快重传

如果在超时重传定时器溢出之前,接收到连续的三个重复冗余ACK,发送端便知晓哪个报文段在传输过程中丢失了,于是重发该报文段,不需要等待超时重传定时器溢出再发送该报文。

TCP三次握手过程

  1. 第一次握手:客户端将标志位SYN置为1,随机产生一个值序列号seq=x,并将该数据包发送给服务端,客户端
    进入syn_sent状态,等待服务端确认。
  2. 第二次握手:服务端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和
    ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给客户端以确认连接请求,服务端进入syn_rcvd状态。
  3. 第三次握手:客户端收到确认后检查,如果正确则将标志位ACK为1,ack=y+1,并将该数据包发送给服务端,服务端进行检查如果正确则连接建立成功,客户端和服务端进入established状态,完成三次握手,随后客户端和服务端之间可以开始传输
    数据了

为什么TCP握手需要三次,两次行不行?

不行。TCP进行可靠传输的关键就在于维护一个序列号,三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值。

如果只是两次握手, 至多只有客户端的起始序列号能被确认, 服务器端的序列号则得不到确认。

简述半连接队列

TCP握手中,当服务器处于SYN_RCVD 状态,服务器会把此种状态下请求连接放在一个队列里,该队列称为半连接队列。

简述SYN攻击

SYN攻击即利用TCP协议缺陷,通过发送大量的半连接请求,占用半连接队列,耗费CPU和内存资源。

优化方式:

  1. 缩短SYN Timeout时间
  2. 记录IP,若连续受到某个IP的重复SYN报文,从这个IP地址来的包会被一概丢弃。

TCP四次挥手过程

  1. 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入fin_wait_1状态。
  2. 第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。
  3. 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态。
  4. 第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手。

为什么TCP挥手需要4次

主要原因是当服务端收到客户端的 FIN 数据包后,服务端可能还有数据没发完,不会立即close。

所以服务端会先将 ACK 发过去告诉客户端我收到你的断开请求了,但请再给我一点时间,这段时间用来发送剩下的数据报文,发完之后再将 FIN 包发给客户端表示现在可以断了。之后客户端需要收到 FIN 包后发送 ACK 确认断开信息给服务端。

为什么四次挥手释放连接时需要等待2MSL

MSL即报文最大生存时间。设置2MSL可以保证上一次连接的报文已经在网络中消失,不会出现与新TCP连接报文冲突的情况。

简述DNS协议

DNS协议是基于UDP的应用层协议,它的功能是根据用户输入的域名,解析出该域名对应的IP地址,从而给客户端进行访问。

简述DNS解析过程

1、客户机发出查询请求,在本地计算机缓存查找,若没有找到,就会将请求发送给dns服务器

2、本地dns服务器会在自己的区域里面查找,找到即根据此记录进行解析,若没有找到,就会在本地的缓存里面查找

3、本地服务器没有找到客户机查询的信息,就会将此请求发送到根域名dns服务器

4、根域名服务器解析客户机请求的根域部分,它把包含的下一级的dns服务器的地址返回到客户机的dns服务器地址

5、客户机的dns服务器根据返回的信息接着访问下一级的dns服务器

6、这样递归的方法一级一级接近查询的目标,最后在有目标域名的服务器上面得到相应的IP信息

7、客户机的本地的dns服务器会将查询结果返回给我们的客户机

8、客户机根据得到的ip信息访问目标主机,完成解析过程

简述HTTP协议

http协议是超文本传输协议。它是基于TCP协议的应用层传输协议,即客户端和服务端进行数据传输的一种规则。该协议本身HTTP 是一种无状态的协议。

简述cookie

HTTP 协议本身是无状态的,为了使其能处理更加复杂的逻辑,HTTP/1.1 引入 Cookie 来保存状态信息。

Cookie是由服务端产生的,再发送给客户端保存,当客户端再次访问的时候,服务器可根据cookie辨识客户端是哪个,以此可以做个性化推送,免账号密码登录等等。

简述session

session用于标记特定客户端信息,存在在服务器的一个文件里。
一般客户端带Cookie对服务器进行访问,可通过cookie中的session id从整个session中查询到服务器记录的关于客户端的信息。

简述http状态码和对应的信息

1XX:接收的信息正在处理

2XX:请求正常处理完毕

3XX:重定向

4XX:客户端错误

5XX:服务端错误

常见错误码:
301:永久重定向
302:临时重定向
304:资源没修改,用之前缓存就行
400:客户端请求的报文有错误
403:表示服务器禁止访问资源
404:表示请求的资源在服务器上不存在或未找到

转发和重定向的区别

转发是服务器行为。服务器直接向目标地址访问URL,将相应内容读取之后发给浏览器,用户浏览器地址栏URL不变,转发页面和转发到的页面可以共享request里面的数据。

重定向是利用服务器返回的状态码来实现的,如果服务器返回301或者302,浏览器收到新的消息后自动跳转到新的网址重新请求资源。用户的地址栏url会发生改变,而且不能共享数据。

简述http1.0

规定了请求头和请求尾,响应头和响应尾(get post)

每一个请求都是一个单独的连接,做不到连接的复用

简述http1.1的改进

HTTP1.1默认开启长连接,在一个TCP连接上可以传送多个HTTP请求和响应。使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。

支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

服务端无法主动push

简述HTTP短连接与长连接区别

HTTP中的长连接短连接指HTTP底层TCP的连接。

短连接: 客户端与服务器进行一次HTTP连接操作,就进行一次TCP连接,连接结束TCP关闭连接。

长连接:如果HTTP头部带有参数keep-alive,即开启长连接网页完成打开后,底层用于传输数据的TCP连接不会直接关闭,会根据服务器设置的保持时间保持连接,保持时间过后连接关闭。

简述http2.0的改进

提出多路复用。多路复用前,文件时串行传输的,请求a文件,b文件只能等待,并且连接数过多。引入多路复用,a文件b文件可以同时传输。

引入了二进制数据帧。其中帧对数据进行顺序标识,有了序列id,服务器就可以进行并行传输数据。

http与https的区别

http所有传输的内容都是明文,并且客户端和服务器端都无法验证对方的身份。
https具有安全性的ssl加密传输协议,加密采用对称加密,
https协议需要到ca申请证书,一般免费证书很少,需要交费。

简述TLS/SSL, HTTP, HTTPS的关系

SSL全称为Secure Sockets Layer即安全套接层,其继任为TLSTransport Layer Security传输层安全协议,均用于在传输层为数据通讯提供安全支持。

可以将HTTPS协议简单理解为HTTP协议+TLS/SSL

https的连接过程

  1. 浏览器将支持的加密算法信息发给服务器
  2. 服务器选择一套浏览器支持的加密算法,以证书的形式回发给浏览器
  3. 客户端(SSL/TLS)解析证书验证证书合法性,生成对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,用服务器的公钥对客户端密钥进行非对称加密。
  4. 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端对称密钥发送给服务器
  5. 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
  6. 服务器将加密后的密文发送给客户端
  7. 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成

Get与Post区别

Get:指定资源请求数据,刷新无害,Get请求的数据会附加到URL中,传输数据的大小受到url的限制。

Post:向指定资源提交要被处理的数据。刷新会使数据会被重复提交。post在发送数据前会先将请求头发送给服务器进行确认,然后才真正发送数据。

Get方法参数有大小限制吗

一般HTTP协议里并不限制参数大小限制。但一般由于get请求是直接附加到地址栏里面的,由于浏览器地址栏有长度限制,因此使GET请求在浏览器实现层面上看会有长度限制。

了解REST API吗

REST API全称为表述性状态转移(Representational State Transfer,REST)即利用HTTP中get、post、put、delete以及其他的HTTP方法构成REST中数据资源的增删改查操作:

  • Create : POST
  • Read : GET
  • Update : PUT/PATCH
  • Delete: DELETE

浏览器中输入一个网址后,具体发生了什么

  1. 进行DNS解析操作,根据DNS解析的结果查到服务器IP地址
  2. 通过ip寻址和arp,找到服务器,并利用三次握手建立TCP连接
  3. 浏览器生成HTTP报文,发送HTTP请求,等待服务器响应
  4. 服务器处理请求,并返回给浏览器
  5. 根据HTTP是否开启长连接,进行TCP的挥手过程
  6. 浏览器根据收到的静态资源进行页面渲染

1

我天才的一面在于我有自己的思想,我能接受思想。

2

谎言是一种借口,一种假设,它会让你的生活形成断节,好的是你可以从任意一个断节处开始,坏的是你得有无数的悲伤与寂寞。

3

每个人有每个人要走的路,每个人有每个人要跨越的墙。

大学前我找不到自己喜欢的东西,大学后似乎也是这样,学什么感觉都可以、都还行、都能过得去。

例外的似乎只有物理,我在高中愿意花费宝贵的自习时间在物理上面干一些对高考没有任何价值的东西,单纯思考、反复锤炼自己的看法和观点。不过,我对于物理也不是那么喜爱,我更愿意出去晒太阳,和朋友一起散步,玩耍,去看自己喜欢的电影,读自己喜欢的书。

相比于其他学科,物理已经是我最喜欢的了。

高考由于志愿填报失误,阴差阳错学了化学。其实我化学一直都很好,中考化学距离满分差一分、高中一个很水的化学竞赛拿了一等奖,同样是全县最好的名次。可是我并不喜欢化学,拿到录取通知书的那一刻,我自嘲道:“难道未来要出现一个不喜欢化学的化学方面的院士吗?”。(过于naive

大一上,我过的浑浑噩噩,学着没有什么感觉的化学知识、做着令我厌恶的化学实验,连带着对于其它课程也产生反感,除了<线性代数>和<高等数学>这两门课程我比较(仅仅是比较)认真的去上课、去写作业,其它课程都是混了过去。转折点在于寒假时候,我突然想到了转专业,转去哪里呢?(此处要提一嘴的是,我大一上的英语挂科了)得益于我还算不错的理解和学习能力,我大一上虽然英语挂科但排名在化院依然是前20%,当时的我想着去学代码好呢还是去学物理好呢?(再提一嘴,我参加的转专业比较简单)

寒假和大一下,我学了不少东西来探索自己相对来说比较喜欢的学科,C++基础、一些简单的数据结构、csapp前面简单的章节、热力学和统计物理、原子物理的简单的部分、离散数学、图论入门、数学分析等等,大多数都是看看视频、粗略过了一遍,了解它们究竟是学什么的,我对于数学 物理 CS有了大概的了解。粗略量化估计一下的话,我对于物理的喜爱是8分的话、CS是7分、数学是6.5分(恶心的证明 虽然严谨但是繁琐无聊的概念 除外),其它学科则是5分。 但是,考虑到钱途的话,物理是8分、CS是8.5分、数学是6.5分,我也说过了,我对于物理并不是那么喜爱,我更喜欢悠闲自在的生活,而财富是生活的基础。转专业政策下来后,我才发现,人家不要挂科的,看了许久,只有物理和数学对于挂科与否没有要求,那还有什么好说的呢?转去物理吧,至少是学自己最喜欢的学科,至少脱离了令我厌恶的化学。于是,义无反顾的转去了物理与天文学院。

我当时考虑了两点

第一:晚毕业一年值得吗?现在来说,我很庆幸自己还能多享受一年本科时光,重新来过的大一生活让我沉淀了许多,变化了许多,我摆脱了自己不喜欢的学科,我现在每天都在学自己喜欢的东西,干着自己喜欢的事情(当然,偶尔还是会写烦人的物理实验报告和令人头疼的数学证明),我对于未来有了更加明确的规划,对于自己的人生的掌控力度大了那么一点点。而这些的代价仅仅是晚毕业一年,这太值得了。我想,没必要去和同龄人比较什么,和自己想要达成的目标去比较就好,人生是自己过的,在我的人生里面,不论在别人看来我过得如何,别人都是配角,自己才是唯一的主角,而电影的进度和精彩与否是由主角决定的。

第二:物理本科就业很难的,值得吗?我本来就学了有名的天坑化学专业,无所谓物理本科就业如何。目前来说,我倾向于未来写代码,毕竟赚钱自己又比较喜欢CS,钱这东西,对于普通人来说有几个人不喜欢呢?我当初做出转专业的决定的时候对于自己的学习能力是极为自信的,而物理这个专业的学生天生自带聪明 基础扎实的光环,这很cool。(虽然自己知道自己几斤几两就是了,笑)

现在我很满意自己的大学生活,物理专业课对我来说理解上并没有多大难度,我又不追求多么高多么优秀的成绩,对于实验报告又是糊弄下完事,所以我有了大把的时间去学自己想学的东西。我会认真的看物理教材去思考去检验自己的逻辑,而不是为了作业和成绩去做习题和试卷,我很讨厌做过多题目,我仅仅喜欢理解 喜欢探索未知 喜欢锤炼自己的逻辑和知识,虽然做题有助于帮助自己检验和纠正一些认知,但对我来说性价比太低且无趣。我会去学CS方面的课程,去为了自己未来的工作而努力。

我很喜欢 白如冰 的一句话 大意如下: 当你学物理的时候,把自己当成要成为物理学家的人;当你学别的东西的时候,把自己当成要靠那个东西活命的人。 这两点无法同时做到起码要做到其中的一点,最可怕的心态是:学物理的时候,觉得自己迟早要转行所以没必要搞那么清楚;学其他东西的时候,觉得自己有理科底子在,大概学一下知道怎么用就行。

学问笃实生光辉

我和自己对话,向自己描述世界,以此证明我还活着.

相见恨早不很晚

我没有去过很多想去的地方,其实到现在都没有。

小时候的我总会为自己没办法去想去的地方感到失落,总会在听见其他孩童讨论自己的旅游经历时感到失落。

现在想想感觉当时的自己很可爱,或许对于我们一直希望得到的事物来说,相见恨早不恨晚,漫长的等待过程为它们增加了厚重的期待,好像一壶酒慢慢的酿出香气。漫长的等待过程也让我们成长了许多,只有这样当我们品酒的时候才能尝出来其中蕴含的厚重和情感。

年少时不懂事的经历反而糟蹋了那些风景,看过一次的风景在再看时不会有初见的惊艳,所以我想说,晚一点经历或许会更好,给自己留下足够的期待的时间,给双方都留下成长的时间,这样很美好。

不仅仅是风景,一起看风景的人也是如此。

关于自卑

在所谓的天才面前感到自卑通常是被不了解的信息裹挟洗脑,我并不知道他们做了什么,也不了解他们的成果是怎么被发现的,我只是随着大众一起被他们所震撼。当我掌握足够多的知识后,当我真正了解他们所做的事情后,我才能摸着良心说 我佩服不佩服他们,而那时候的我已经能够甄别出自己相比于他们少的是什么了。

自卑来源于未知和恐惧、来源于对自己知识的匮乏,当我掌握足够多的知识,对他们有足够多的了解后,我为什么要自卑呢?我有的只是单纯的佩服和尊敬。

你自卑且不真诚,你不知道别人干了些什么,你不知道他们的成果对于后来者有什么帮助,你只是被媒体和大众裹挟着发出不真诚的感慨。真诚者从不自卑

害怕和虚伪

qq上加了一位年长我许多的好友,看见他说的一些话很有趣

龙族里有个片段,昂热不拔七宗罪,他说他害怕看到自己的极限。现在的人从来不自己写作或创作,却热衷于批判所有刷到的信息。原因是他们害怕看到自己绞尽脑汁却写不出什么东西的窘迫,以至于为了隐瞒这种黑皇后对白雪公主的、岳不群对令狐冲的恐惧,转而以严师出高徒为名,去剥夺那些有勇气直面自己上限的人的历练空间,似乎只要棒打出头鸟,所有人就可以放心躺平了。但现实刻薄只会伤敌八百自损一千,当人居高临下的对人宣泄着恶意,也让自己骑虎难下,倘若这种优越感源于,我不拔剑就假装自己无极限,我只要不去创作,不去行动,保持沉默就说明自己思想浩瀚,也就自绝经脉,对什么都不敢尝试了,因为怕看到自己的表现,特别怕看到自己曾不留情面吐槽地模样。包容的本质,是因为自己勇敢直面成长,并真诚希望,长江后浪推前浪,让晚辈代自己,攀登更高的山峰。

我高中时候也那么幼稚过,在传统的教育模式下,考试是判定一个学生的唯一标准,而那时候的自己总会仗着自己的所谓的聪明,营造出我贪玩我还能取得很不错的成绩,但我就是不好好学的形象,多么幼稚可笑啊,高一高二的我为了这个形象乐此不疲,沉浸于他人的羡慕眼光之中。高三因为高考缘故终于开始努力。

其实我只是害怕,害怕自己认真后还是不能取得一等一的成绩,我因为害怕,因为他人的目光,放弃了很多时间。

我并不怪当时的自己,无论过去是好是坏,这都是我的经历,它们都构成了现在的我。我只是偶尔会想,那时候的我真的好幼稚啊,想着想着就会笑起来,也会怀念当初的稚嫩。

差距

做国外lab的时候总会感到能力上的差距,当我得知CMU的学业压力的时候,我开始反思自己过的是不是太轻松了。

写lab的时候很难受,去网上找思路看见别人优雅的code的时候感到自己的能力不足,听教授说 cmu的学生不允许借鉴 参考别人代码,哪怕讨论也只允许在higher的层次上讨论,我为自己的轻松的大学生活感到难过。排除一些天才,学习天赋上人和人之间的差距并不大,能力的差距来源于刻意练习,国外学校的严格要求强迫学生去刻意练习,而我却只会在想不出来的时候去参考别人的代码。

要改变什么。

对比

电脑上挂机刷着入党培训班的视频,我二大爷似的坐在凳子上看木心的《哥伦比亚的倒影》,抬头突然发现,google浏览器在不停的为我工作——— 一行行中文被它翻译成了英文,有趣。

惯性

上海疫情仍旧严重,今天手机突然接到个电话,来电显示是上海市反电信网络诈骗中心,我心一凉,脑袋在一瞬间过了过自己的经历,没有干过什么坏事啊,然后直接挂断,拒绝接听。

我是数据和经历的集合

高中经常思考,我们是不是在玩一个游戏?每个人都在玩自己的游戏,都在自己的虚拟世界活着,在自己的这个世界,其他人都是npc,你对他们做什么也不会影响真实的他们,所有人的虚拟世界相互交互,共同发展。

今天散步时候突然想到,我这个观点有点像虚拟地址空间和进程的概念?我们每个进程都以为自己是独一无二的在进程看来自己独占所有的内存,自己是唯一的。在我的观点中,在我这个游戏世界,我也是唯一的,其他人都是虚拟的。

所有的进程之间通信,相当于我这个虚拟世界和其他人的虚拟世界相互交互、保持同步。每个进程的运行情况是一致的,正如我们每个人的虚拟世界都是同步的,像游戏一样,你的操作会同步到其他玩家的手机上。当进程结束后,也就是虚拟世界的你被杀死之后,你也就去了天堂回归到了真实世界。进程怎么去kill另一个进程呢?提升自己的权限!这就是弱肉强食的丛林法则。那么怎么提高自己的权限呢?获得财富!财富不仅仅是金钱,而是一切可以支配别人的资源。那么植物人失去自己的意识是不是就相当于进程被阻塞挂起?患病是因为出现了bug?另外,我们专注的能力有限,我们思考的时间有限,我们活着的大部分时间其实都是在进行无意识的活动,这相当于是硬件进行工作而不是CPU在运转?有人的权限天生就高,他们天生就有更多的财富,他们可以更多更好的活在自己的世界,因为他们有更多的时间去调用CPU!然而上天某种程度上也是公平的,每个进程都会被照顾到,正如所谓的天赋每个人都有只是高低而已。那人类身上迸发出来的激情和欲望到底有没有被纳入权限计算指标当中呢?或许有也或许没有,可能你专注于自身世界的时间总体是有限的,不能提高;也可能当你每天都充分利用自己的时间后,算法会提高一点你的权限?这就是”越努力越幸运”这句鸡汤的合理解释?幸运是什么呢?上帝偶尔注意到你这个进程,修改一些你的参数,这是幸运?

不完备的思考,但很有意思。

乱花钱的借口

消费一定程度上有助于我的学习

之前一直想学CS却只是单纯做了各种计划而没有实施,充满了幻想却没有任何行动力,在买了ipad后我看了很多很多相关视频,从基础的C++ 到数据结构 计算机网络 操作系统 C++侯捷进阶视频,当CS体系初步建立起来后,专业书籍读起来也变得不那么枯燥。CSAPP、计算机网络自顶向下、现代操作系统、算法笔记等等,而这个良性循环的建立始于ipad。

今天买的显示屏和机械键盘到手了,更加广阔的视觉体验和良好的打字手感让我突然升腾起来了刷力扣的想法,自从一个多月前刷完一百多道题后,被一个题卡着也不想看答案的时候,我再也没有碰过算法题目了,连带着代码量都下降了不少。购买显示屏和机械键盘带来的好处由于时间的短暂还不能体现出来,不过仅仅是想刷力扣的欲望便让我惊喜不已了。

那就继续前进。

对话

对话是需要时间和身心的投入的,人们却总是把自己无意识的回应和未经思考的答复当作对话。

表情包是表达自己情感的途径,而不是代替文字的手段和无话可说时候的遮羞布。

关于爱而不是爱情

爱不是Love,发出Love读音的时候,好似一个想要糖果的小孩在贪婪在索取;爱是Charity,是清冷高贵却又基础到无处不在的。

这是看过的一段话后我能记住的感悟(并不是大意,掺杂了很多我的私货,和原文有相当大的出入),我一直不怎么理解这句话,直到今天看了一人的朋友圈随笔。

“一人”是一位比我大了五六岁的人,实在想不出来什么词语来描述他,和他的交流让我成长了许多,他身上蕴含的精神力量不能用年龄来衡量。机缘巧合在网络上遇到他,加了qq,加了微信,读了他写的书,看他的每日随笔。

他说

情和义是可以分开的,关羽对刘备有情有义、对曹操无情有义。情总是动态变化,会衰亡也会重生,但义,破镜难重圆。义是基础而情是自由多变的上层建筑。忘恩负义,打破了一个生物和另一个生物互利共赢的基础。感情浓淡或转换都藕断丝连,弃义是生物层面的断交,利益相悖互为敌,皮之不存毛将焉附。没诞生义气的两性感情,终会败给七年之痒。人是生物,渴望情的是激素,对于义的渴望则来源于基因。感情或许会周而复始但不会永葆青春。

义是基础情是上层建筑,我不怎么认同这句话,义和情应为平行成长的东西,只是义在情可能会周而复始,义亡情最终也将不存。

真爱是哪怕我不爱你了,我也一样爱你。用不着海誓山盟多少遍,欲望散了就散了,感情淡就淡了。义在人就在,天涯明月,亘古不变。

我不爱你是Love,我也一样爱你是Charity,Love是情,Charity是义。情短暂而义长存。

正如圣经所说 爱无野心,爱永不止息。 这里的爱大概就是义吧。

友情、亲情、爱情皆是如此。

守道义者,义永不止息。

意义

看过一段话,如下。

人是活在意义这个名词下的动物,至于这个意义正确与否,对于他们而言,没有意义。

是我们赋予了节日意义并挑选特定的日期来过节日,而不是特定的日期赋予了节日意义。

朋友说

华说这个网站是一本关于我的杂志,我很开心,他这句话很cool。

谦卑和自卑

突然想起来过去曾和好友在河边漫步,他说他很自卑,那是我只知道单纯安慰,现在想来,他的自我画像中谦卑更多一点。

看见美好的东西,从心底感觉自己不配简单的拥有他们,感到些许落寞但假如想十分得到就愿意为之努力,不想得到就只会感到一些落寞和空虚而无其他,这是谦卑。

因自身财富不足,不能占有那些美好的东西从而感到落寞、愤怒、不解、不甘、疑惑、无力。从来不担心自己配不配的上,生来便感觉自己应该拥有一切,这是自卑。

被强奸的我们为何独特

想起来好友的自卑,思绪便不由自主的散发到了和他聊过的其他东西。

绝大多数人只是各种信息的容器,我们从来没有自己产生过信息,我们的思想都是被环境/别人 或主动或被动的灌输进来。我们总以为自己是在独立思考,其实不过是在把过去接受到的别人的观点进行整合而已。我们仅仅是搬运工,仅仅是容器,仅仅是母体。

阅读好像自己选择被自己选择的信息传播者强行性交,我们是母体,有选择性交模式的权力。你专心致志、乐在其中,那就是美妙的做爱。你心浮气躁、囫囵吞枣,那就是暴力的强奸。

当时我冒出来这个想法的时候,立刻看了看几位漂亮女明星的微博,选择她们当我那一刻的信息传播者,美貌的对象谁不喜欢呢?

好友说人的独特性在于记忆

有点道理。但记忆也是周围环境给你的信息、被周围环境强奸后留下来的产物。

假如能做实验的话

我会让自己经历各种不同的经历,给自己塑造不同的记忆,观察我会变化的是什么,不变的又是什么。那些亘古不变的底色,是我真正独特的地方。或许和基因有关,或许和更深层面的东西有关。你问我:“基因不也是别人给你的信息吗”,朋友,要知道物理不研究最根本的原因

可惜我做不了实验。 理性告诉我我没有真正独特的地方,感性说,老子天下第一

从SM到返祖

提起强奸这个词,便想到SM。一直好奇M在生活中会不会多了很多乐趣?我不敢问 不能问 也不知道问谁。

牙龈肿大的时候我会拿牙刷用力去刷,痛但快乐;嘴唇起泡的时候我会反复舔泡,痛但快乐;我并不是控制不住自己不由自主的去干这些事情,我是经过无意义的思考后仍然选择这样干的。深究行为的原动力是这些东西我不去碰也会给我带来持续性的痛苦,我选择先快速经历大量痛苦,提高自己对于痛苦的耐受性,从而让接下来的日子好过一些。

鼻子很灵敏但适应性很强,闻到难闻的气味时过一段时间你就会适应,感谢鼻子。千万别以为我会在厕所深吸几口气,以便让自己接下来好过一些,我一般都选择憋气或者换个干净的厕所。我想过那么做但没有实操过,好吧,我实践过那么几次。

聊起实践,我最近几个月一直有种想要脱光衣服去裸奔的冲动,看见树会萌生爬上去的想法。前者因有人而不能实践,后者因能力而难以实现。好友说,我返祖了。 2022.5

惜命

抛开道德 深夜无人的十字路口,红灯亮着,你会选择无视红灯走过去吗?

我不会,因为我惜命。深夜的飙车党在心情勃发之时不会关注是否有人闯红灯,所以即使在深夜无人之时我也不会选择闯红灯。

可爱

忘记谁问我漂不漂亮了,我说:“每个人都很可爱”。

活在和平年代,身边人都能吃饱穿暖,没有遭遇饥荒,没有遭遇战争,每个人身上没有战争和饥荒留下来的痕迹,每个人都很可爱。

混乱才是常态,和平很珍贵,所以你不可爱吗?

孤独

看见很多言论,分不清孤独和寂寞。

寂寞是在广阔的平原上找不到人取暖,最终必定会因忍受不了而去努力寻找人报团取暖。

而孤独是自己在平原上筑起仅可容纳自己的高台,在高台上散发思绪、咀嚼万物。你看见人们在平地上欢声笑语,想跳下去却又不舍得放弃在高台上那种手可摘星辰的美妙,最终只能自己忍受孤苦,无论愿不愿意,只能自己忍受。

孤独有门槛而寂寞没有。

孤独是自己的选择、不会被他人影响、是长久难以改变的。寂寞是被动的、会因他人的加入而消失。

自我的有趣

和别人交流的时候,我总会格外注重自己的有趣,谈天说地、谈古论今,生怕自己的“有趣”不能被对方看见。

这仅仅是哄骗,只是他人看见的、定义的有趣,至少不是我眼中的自我的有趣。

真正的有趣从不会让旁人着迷。有趣是我在看树上的枝叶,呆呆的看了许久,有趣是我在看路上蹲着的小猫咪,陪它一起蹲着,旁人只会对我视而不见,或是认为我有些许毛病,有趣是属于自己的,难以被他人感知。有趣的是独属于自己的内心和思考,这些东西别人又能怎么去理解?身体凝固,内心却思绪千万,一个个想法涌现、消失、又带动其他想法出现。

胸有激雷而面如平湖者,可拜为上将军。

这是自我的有趣。

一直被关怀

学校在上海疫情期间发了周年校庆的衣服,我的是藏蓝色L号短袖。大概是刚刚看完热学教材,心里除了喜悦后还有一些复杂的惆怅和不知所措。

热学课本编写的很好,通篇读下来宛如一位老师带着你一同在历史长河中经历热学体系的建立过程,那种长辈对于后学者的亲切感让我内心感到温暖。

想到了人类、想到了历史、想到了伟大先辈们对于我们的一些期望,学校的校庆礼物是导火索,点燃了内心积压许久的不知所措。

倘若我读过的书、看过的文章都可以人格化,那么他们帮了我许多,教会了我许多、也让我心情好了许多。我很幸运,能遇见他们。我很感激他们,可除了感恩还有无力和不知所措。

一饮一啄,皆有定数。无力的是自己如此普通,不知所措的是如此普通的自己能怎么偿还他们的教诲之情?

他们背后的作者我尚且可以通过购买正版书籍来表达我的感激之情,可是尚未被人格化的他们呢?只能透过一行行文字去看看他们的内心,去将感恩之情化为绵延不绝的动力。

或许不该将书本和作者割裂开来,可我以为 两者不同,虽是作者创造了他们,但他们有自己的灵魂和内在。

写到这里忽然想明白了,我感激的是人类的文明,是文明的载体,是知识。

希望

形策课上有人提了个问题,忘记了具体表达的语句,不过潜藏的意思是,未来会如何?老师有一句话说的很好,“在座的各位都是交大的学生,你们对未来的看法也是你们对身边同学的看法,相信他们,也是相信自己”。

类似的红课,我混了两年,这节线上课是我唯一一次听完整的。

被这句话触动

对于不幸运的普通人来说,你想发财也好,想有个满意的配偶也好,都不是随随便便的态度就能得到的。如果不是每晚彻夜痛哭痛感自己的弱小,是没有那么强大的执念熬过过程中的苦痛的。痛感自己废物的当下,痛感过去荒废的时间,所以不管别人怎么说都要钻研量化,就是这样。我希望各位不要跟我一样某天后悔自己选的安逸。

刚看上去有种迟式卖弱的感觉,读了之后却感到颤抖。

我荒废的时间很多很多,多到现在我想起来就会感到悲哀 害怕 和羞愧,我一直在刻意回避这个事实,我不敢“痛感过去荒废的时间”,我不敢承认自己因为自己的自大在高中、在大学浪费了多少时间。

想起来自己高中时候周末不写作业,在去学校的路上,我告诉自己,“这是你自找的,你自己选择了不写作业就要承担这时候的惶恐和到学校后的匆忙抄写甚至被请家长的后果”。高三的时候,潘ww老师打电话给我家长,让他们领我回家补作业,我没钥匙自然不可能回家,于是自己跑去还没有开学的高二教学楼,坐在楼梯上 看着缓缓落下的太阳写完了那次作业。之后,我还是没有改变自己不写作业的习惯。大概是感觉自己可以承担不写作业的后果,自己明白不写作业对于成绩的影响没有那么大。

现在看来,当时的我其实并不知道。

不是一直回首往事,只是难以直面自己过去本应努力却虚度了的时光。

应无所住而生其心

不害怕失去自己在乎的东西,对于失去并不会感到恐惧。

很在乎,但无所住,你就没有任何挂碍。

无心可住,自然不可得其心。

浮躁

浮躁,对我而言不是懒也不是无聊 而是在做事情的过程中,遇到困难 我会下意识的选择逃避,选择寻找捷径。

但对于有着相当复杂性的任务来说,你只能一步一步的慢慢来,碰个灰头土脸,耐心的寻找资料,一步一步分析,寻找着可能的答案,试错,重新修改思路,精疲力尽… 如此反复。这个经历无法避免,你想要完成它,就需要低下头,静下心,即便郁闷 沮丧 疲惫,也要去直面它,解决它。

痛苦无法逃避,它终究需要被解决。

选择了终点,选择了一条路,你也同样选择了路上的困难。

1

每当我学习一些新的物理理论知识,深入了解后发现,它们和之前的许多东西竟然形成了完整的闭环,我就会不由得赞叹物理的神奇和前辈们的伟大。

2

忘记了什么时候看见的一句话,大概意思如下

选择物理专业意味着什么呢,对你来说这意味着在大学四年里,不论主动去探索自己感兴趣的领域还是被动的跟着老师去上那些严谨厚重的课程,你总会在不经意间为一个方程、一段历史感到震撼,你总会在做作业时想明白一些亘古不变的道理,你总会在四年后收获一个完整的物理框架–一个认识世界的开端。

每每想起这些,总会获得莫名的力量

3

麦克斯韦方程组刚提出的时候,物理学家不接受这个理论,因为

这么复杂的东西,它要对才怪呢!

电磁学课上听到这个,笑个不停。

信息的表示和处理

信息存储

二进制表示法、十六进制表示法

十六进制下每个数位上的数字可单独展开为4个二进制的数,从而快速转换成二进制数字

字数据大小

位/比特——>字节——>字

每台计算机都有一个字长,指明指针数据的标称大小,字长决定的最重要的系统参数就是虚拟地址空间最大大小,对于字长32位机器来说,虚拟地址空间最大大小为 2^32(0–2^32-1)byte,也就是4GB。(字长32位,最多对应2^32个地址,计算机存储数据的最小可寻址内存单位是字节,内存(虚拟内存)中每个字节都有唯一的数字来标识-地址,也就是说1个地址对应空间大小为1字节)

关于char,C的数据类型char表示一个单独的字节,尽管char由于它可以存储文本串中的单个字符而得名,但它也能用来存储整数值。

寻址和字节数据

多字节对象被存储为连续的字节序列,对象的地址就是所用字节中最小的地址(开头的地址),排列对象内容有大端法和小端法两种方法。

大多数intel兼容机型一般采用小端法存储,比如 int num=0x01234567,要用四个字节存储,假设67放在地址0x100处,那么45->0x101,23->0x102,01->0x103。大端法存储反过来。

运算

布尔代数 非 ~ , 且 & , 或 | , 异或 ^ 。C语言支持按位进行布尔运算也就是位级运算。

逻辑运算 C语言单独提供逻辑运算符号 || , && , !,默认非零的参数表示true,0表示false。

移位运算 左移 右移,右移又分为逻辑右移和算术右移。有符号数一般使用算术右移,无符号数必须使用逻辑右移。

整数表示

无符号整数表示

无符号整数不包括负数,正常二进制编码表示即可

有符号整数表示

一般有反码 原码 补码三种表示方法,补码表示最常见。原码一般用来表示浮点数。

补码表示,最高位(w位)的权重为-2^w,而不是正的,其他位的权重不变。

强制转换

将有符号整数和无符号整数强制互相转换时,底层源码也就是位模式不变,只是解释的方式变了。

对于C来说,如果一个运算数是有符号的而另外一个是无符号的,那么C会隐式将有符号参数转换为无符号参数。 除非特别指明 比如 unsigned int 或者 0x123u (末尾的u表示无符号,这是个无符号常量),否则大多数整数数字默认有符号。

下面是对于32位机器上最大int类型整数和最小int类型整数的写法(比较奇怪

1
2
#define INT_MAX  2147483647 //  2^31-1,底层编码为 0x7FFFFFFF,除了第三十二位为0 其他位均为1
#define INT_MIN (-INT_MAX - 1)

整数的扩展和截断

书上的内容易于理解,不在赘述。

整数运算

我的理解,本质都是正常运算(十进制正常运算)后用二进制编码表示,溢出的位进行截断处理

唯一值得一提的是

  1. 两个相同的位级编码,分别经过无符号乘法和补码乘法(有符号)后,不论是否溢出进行截断处理后,得到结果的位级编码仍然一样。这就是 无符号和补码乘法的位级等价性。
  2. 乘以2的n次幂用左移n位实现,除以2的n次幂,无符号数逻辑右移n位实现,有符号数算术右移n位实现。

浮点数

在学习数值分析中了解的很深入了,在阅读时略过了这部分内容。

计算机系统漫游

信息就是位+上下文

系统中的信息都是由一串比特表示的,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

此处的上下文在我的理解中就是数据的类型 int char float等

程序被其他程序翻译成不同的格式

一段简单的程序 hello.c

1
2
3
4
5
6
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}

在linux系统上被GCC翻译时经历以下四个阶段

  1. 预处理器根据头文件将程序修改为另一个C程序 此时文件为hello.i
  2. 编译器将程序编译成汇编语言 此时文件为hello.s
  3. 汇编器将汇编程序翻译成机器语言指令并打包成可重定位目标程序的格式,保存在hello.o二进制文件中此时程序为01二进制表示的一串数字序列 此时文件为hello.o
  4. 链接器将printf函数(各种库函数)的可重定位目标程序文件printf.o合并到该原始文件hello.o中 最终得到hello 文件 此时文件为hello

系统的硬件组成

CPU I/O设备(磁盘、鼠标、显示器、键盘等) 内存(主存) 总线

CPU由 PC(程序计数器 指向要操作的指令的地址) 寄存器文件(由寄存器组成 寄存器为大小为一个字的存储设备) ALU(用于计算) 等其他设备(比如cache)组成,CPU可执行这些操作

  1. 加载:从内存复制一个字节/一个字到寄存器,覆盖寄存器原来内容
  2. 操作:把两个寄存器内容复制到ALU,ALU进行运算后把内容存放到一个寄存器中,覆盖寄存器中的原内容
  3. 存储:从寄存器中复制内容到内存中
  4. 跳转:从指令中复制内容到PC中,覆盖PC的原来内容

高速缓存(cache)和存储设备

以下存储器层次结构 左方可以看成是右方的高速缓存

寄存器-L1高速缓存-L2高速缓存-L3高速缓存-主存(也就是常说的内存)-磁盘-远程存储
L1 L2 L3高速缓存是因为CPU访问主存太慢依据局部性原理而诞生的(用SRAM制造)

进程和线程

以普通单核CPU为例子,进程为程序加上程序运行所需要的资源空间,线程为进程中程序的子部分,同一进程的线程共享该进程的所有数据。
CPU中实际运行的是线程 但用户看见的只有进程

四个抽象

  1. I/O设备抽象成文件,用户看来操作系统通过操作设备对应的文件(鼠标文件 显示器文件等)来控制I/O设备,网络也可以看成一种I/O设备即文件。
  2. 文件和主存抽象成虚拟内存

虚拟地址空间:(和虚拟内存不是一个概念)在每个进程看来自己独占整个操作系统,实际上每个进程所看到的都是虚拟地址空间,虚拟地址经过映射指向实际的地址空间.编写代码的指针的数值实际上是虚拟地址,并没有指向实际的地址空间

虚拟内存:将所有存储设备(磁盘、网络文件等)都看成内存的一部分,对用户进程来说它们都是内存,是一个非常大的连续的字节数组,但实际上是虚拟内存。当进程要使用不在内存的内容时操作系统会把这些内容调进内存中。

虚拟内存作为一个概念是内存可以有不同的支持。进程的一些内存可以在磁盘上,一些在主内存中,有些甚至可以在远程网络上。这是由操作系统管理的,对正在运行的用户进程是透明的。对于用户进程来说,它只是内存。虚拟地址空间意味着映射到用户进程的内存地址。两个不同的用户进程访问(对它们)内存中的相同地址,但它们将包含完全不同的数据。如果用户地址空间很小(如 32 位),这一点尤其重要。这意味着每个进程都可以访问地址空间允许的尽可能多的内存,无论进程如何存在。在操作系统中,它们中的每一个都可以在没有另一个的情况下存在。但是它们结合起来是最有用的,因此通常由操作系统以紧密耦合的方式实现。

  1. 虚拟内存+处理器抽象成进程(一个正在运行的程序的抽象)
  2. 进程+操作系统抽象成虚拟机

并发和并行

  1. 并发

CPU只能同时运转一个进程,当进程需要处理一些耗费时间较长且不需要CPU操作的事情时,CPU会去执行下一个进程,此时操作系统会保存被切换进程运行所需要的所有状态信息,也就是上下文信息。这被称为进程切换
并发就是CPU不断切换执行的进程来提高CPU的利用率,好比一个单人跑道上面 A跑累了切换成B去跑,B跑累了切换成C去跑,每个人都记住自己被切换时停止的位置信息(即上下文信息),轮到他跑步时从原来位置接着跑

  1. 并行

线程级并发

这是并发并不是并行,早期操作系统没有线程这个概念,进行进程切换更新上下文信息代价过大(切换指令以及切换资源空间),切换线程只需要切换指令,速度很快。

用户级线程和核心级线程:用户级线程并不涉及内核中,当用户级线程堵塞时候,操作系统会以为整个进程堵塞从而切换进程。核心级线程分为内核部分和用户部分,所以核心级线程堵塞时候操作系统可以“看到”从而切换到另一个核心级线程(不一定是同一个进程下),该切换操作在内核部分完成,之后可以返回到用户部分。

线程级并行

超线程技术(Hyper-Threading) 一个物理核心同时运行两个线程,称为虚拟内核;

多核技术(物理上多个核心),即多个CPU

指令集并行

CPU采用流水线技术同时执行多条指令,举个例子:两双鞋子需要加工 鞋底 鞋带,一个机器上只能同时加工一个鞋底和一个鞋带,那么就先加工A鞋子的鞋底和B鞋子的鞋带然后在加工B鞋子的鞋底和A鞋子的鞋带,即为流水线技术。

多数据并行

一个指令对应一个操作,多数据并行运用SIMD技术可以一个指令执行更多操作数提供更快的运行速度。

1

王小波在黄金时代中说过

每个人的本性都是好吃懒做,好色贪淫,假如你克勤克俭,守身如玉,这就犯了矫饰之罪,比好吃懒做好色贪淫更可恶。

其中的反讽意味如今读来越发透彻。

2

之前的我网上冲浪时看见各种令人心痛、愤怒的消息时候常常会告诉自己

互联网放大了局部的悲惨,让你以为这就是世界的全部,你不用闭上眼睛假装看不见但也不用过多沉溺于怀疑之中,多着眼于身边人,多感受世界的美好。

现在却越发觉得,我或许一开始就理解错了世界,世界或许也很委屈,自己一直就是这样子,只是我理解错了而已。越发能体会到什么是

天地不仁,以万物为刍狗。

终于,我开始慢慢接受这个真实的世界,它本来就是这个样子,漫长岁月里从未改变,我总是以为光明是多于黑暗的,事实上,正邪、光暗、善恶从来都是成对出现互相纠缠成螺旋态存在于这个世界上的。

3

越发敬佩教员的伟大,遵从世界的规则 顺势而为,从未放弃人民,带着更多的人民抵御着黑暗向着光明迈了出去。面对黑暗,他想着承认它团结它改变它,而我仅仅只会愤怒。

4

我的愤怒其实是极其狭隘的

当你试图轻易批评一个人时,要想想,对方或许根本不具备你那样的条件。

5

向绝对光明要求,外面一片漆黑。站在幽暗深渊中,万物之中都有光明。

如果说恃强凌弱和好色贪淫是人身为动物的天性,那么文明和同理心或许就是人身上最珍贵的品质的反击。