目录

理论

基础操作

在Ubuntu上配置Docker

踩坑

理论

1.容器的概念:容器是对应用程序及其依赖关系的封装,可以看成是一个轻量级的虚拟机环境。

  • 容器能与主机的操作系统共享资源
  • 运行容器开销小,可以大数量多开
  • 容器具有强可移植性,换个电脑也能跑
  • 虚拟机的目的是要完整地模拟另一个环
    境;而容器的目的则是使应用程序能够移植,并把所有依赖关系包含进去(这一点有点像yum)

2.Docker利用的是Linux的容器技术,Docker 平台拥有两个不同部分

  • 负责创建与运行容器的Docker引擎
  • 用来发布容器的云服务Docker Hub

3.Docker工具:

  • 集群管理工具Swarm
  • 用于处理容器的图形用户界面Kitematic,
  • 部署Docker主机的命令行工具Machine。

4.容器使软件应用程序与操作系统脱钩,从而为用户提供了一个干净而最小的Linux环境,同时在一个或多个隔离的“容器”中运行其他所有内容。容器的目的是启动一组有限的应用程序或服务(通常称为微服务),并使它们在独立的沙盒环境中运行

5.docker的组成

  • image(镜像)相当于可执行程序
    • 一个程序需要代码经过编译来生成,dockerfile就是源代码,docker本体起到编译器的作用
    • 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层
    • 删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像
  • container(容器)相当于一个进程
  • Docker Registry就是docker的代码仓库
    • 分为官方的公有库和自己搭建的私有库

6.docker的流程

  • 例如运行一条docker run -p 3306:3306 –name mysql -d mysql的命令
    • docker客户端执行docker run命令
    • docker daemon通过graphdriver去Graph中拉取最新的mysql镜像
    • docker daemon通过networkdriver建立端口映射
    • docker daemon通过execdriver启动容器
  • 注:docker对系统调用的操作由libcontainer实现,可以单独借此来操作防火墙、namespace等

基础操作

1.运行第一个镜像

1
2
3
4
5
docker run debian echo "Hello World"

# docker run是启动容器命令
# 意为docker运行名叫debian的镜像并执行echo "Hello World"操作
# 若本地找不到debian镜像,docker会在Docker Hub自动下载

2.在镜像中使用shell

1
2
3
docker run -i -t debian /bin/bash

# 退出容器中的shell直接运行exit即可

3.用指定主机名“CONTAINER”启动镜像

1
docker run -h CONTAINER -i -t debian /bin/bash

4.查看正在运行的容器信息,会出现容器id和名称(这两个字段都可以用作inspect的参数)

1
2
3
doker ps

# docker ps -a 会显示所有容器

5.显示某容器的详细信息

1
2
3
docker inspect xx

# docker inspect xx1 | grep xx2 会显示容器xx1含有xx2字段的属性

6.显示某容器哪些文件被改动过

1
docker diff xx

7.显示容器中发生的一切操作记录

1
docker logs xx

8.删除容器

1
2
3
docker rm xx

# 常用命令docker rm -v $(docker ps -aq -f status=exited)删除所有已停止的容器

9.从远程服务器拉取镜像

1
docker pull nginx

在Ubuntu上配置Docker

1.安装Docker

  • 更新apt源索引
1
sudo apt-get update
  • 允许apt通过HTTPS使用仓库
1
2
3
4
5
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
  • 添加Docker官方的GPG密钥
    1
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 设置Docker稳定版仓库
    1
    2
    3
    4
    sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
  • 再一次更新apt源索引
    1
    sudo apt-get update
  • 下载安装Docker社区版
    1
    sudo apt-get install docker-ce

2.检查Docker是否配置正确

  • 检查Docker CE是否安装正确
    1
    sudo docker run hello-world
    若出现下述内容则表示安装正确
    1
    2
    3
    4
    5
    6
    7
    8
    Hello from Docker!
    This message shows that your installation appears to be working correctly.

    To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    ......
    For more examples and ideas, visit:
    https://docs.docker.com/get-started/
  • 检查Docker是否可用
    1
    docker version
    若只出现Client配置,则表示权限不正确
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Client: Docker Engine - Community
    Version: 20.10.7
    API version: 1.41
    Go version: go1.13.15
    Git commit: f0df350
    Built: Wed Jun 2 11:56:38 2021
    OS/Arch: linux/amd64
    Context: default
    Experimental: true
    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version: dial unix /var/run/docker.sock: connect: permission denied
    需输入
    1
    sudo chmod a+rw /var/run/docker.sock
    之后显示以下内容,则表示Docker安装正确并可用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Client: Docker Engine - Community
    Version: 20.10.7
    API version: 1.41
    Go version: go1.13.15
    Git commit: f0df350
    Built: Wed Jun 2 11:56:38 2021
    OS/Arch: linux/amd64
    Context: default
    Experimental: true

    Server: Docker Engine - Community
    Engine:
    Version: 20.10.7
    API version: 1.41 (minimum version 1.12)
    Go version: go1.13.15
    Git commit: b0f5bc3
    Built: Wed Jun 2 11:54:50 2021
    OS/Arch: linux/amd64
    Experimental: false
    containerd:
    Version: 1.4.6
    GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
    runc:
    Version: 1.0.0-rc95
    GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
    docker-init:
    Version: 0.19.0
    GitCommit: de40ad0

踩坑

1.win系统启动docker桌面版失败就去把AppData里面的docker文件夹重命名为docker_backup,再重新启动即可

目录

全局配置

Github部分

clone线上项目

一个git仓库的建立

全局配置

1.配置每次提交你的默认名字和邮箱,若某个项目想改此项则在该项目git中去掉–global即可

1
2
git config --global user.name "Kenway"
git config --global user.email "universeeddy@outlook.com"

2.将color.ui设为auto让命令输出具有更高可读性

1
git config --global color.ui auto

3.查看当前git的全局配置

1
git config --list
阅读全文 »

目录

基础部分

进阶部分

基础部分

1.进程与线程的区别

  • 构成上:进程内部含有线程和和逻辑内存;线程内部含有栈、包含程序计数器PC(保存下一条指令的地址)在内的CPU寄存器
  • 功能上:进程是操作系统资源(全局变量、打开的文件等)分配的基本单位,同一进程内共享资源;线程是操作系统CPU任务执行的基本单位
    • 即运行一个进程需要一核CPU,而这个CPU会在这个进程的线程之间来回切换执行不同的线程
  • 开销上:每个进程有独立代码和数据空间(堆和静态变量),切换开销大;每个线程只有运行栈、PC是独立的,切换开销小

2.程序、进程、线程、协程

  • 程序和进程的概念
    • 程序是一组指令的集合,是一个静态实体;
    • 进程则是某个数据集上的程序执行,是一个动态实体;
    • 运行的程序至少会有一个进程
  • 协程比线程轻量级的原因
    • 线程切换时会出现“CPU执行线程1变成CPU执行线程2”这个操作,而要对CPU进行调度,需要系统从用户态切换成内核态,而OS切换状态是非常耗费资源的,因为要去保存用户态的工作,后面切回来还得去恢复工作状态
    • 而协程的切换只是让同一个线程来执行不同协程,不会去涉及CPU的调度,并且协程的切换可以由程序代码控制,而线程的切换是有系统的策略的

3.操作系统的储存:

  • 容量从大到小:硬盘、内存、缓存、寄存器
  • 速度从快到慢:寄存器、缓存、内存、硬盘

即容量越小速度越快

4.操作系统的寻址操作

  • 首先根据指针访问进程中的逻辑地址(逻辑地址是虚拟的)
  • 由逻辑地址解析得到物理内存中的地址(但这个地址也可能是系统虚拟处理的内存,以分页的形式存放在物理内存中)
  • 将该地址拿给CPU的寄存器处理

5.进程间的通信方式

  • 共享内存:两进程共享一块内存,该内存上数据可以共同修改和读取
  • 管道通信:实现进程间通信的一种共享文件,用于连接一个读进程和一个写进程
  • 消息队列:是消息的链表,有标识符标记并存在内核中
  • 套接字(socket):是网络编程的api,通过它可实现不同机器、不同进程之间的通信
  • 信号:操作系统通过信号来通知进程系统中发生某种预先规定好的事件

6.线程同步的方式

  • 互斥量:针对一个共享资源的单独访问设计,采用互斥对象机制,只有拥有互斥对象的线程才被允许访问公共资源,因为互斥对象只有一个所以保证了同一时间只有一个线程访问
  • 信号量:针对一个使用用户数量有限制的资源设计,允许同一时刻多个线程访问同一资源,只要不达到最大数就行
  • 事件(信号):针对具有后继任务的事件设计,通过通知操作的方式来保持多线程同步,还可以方便实现多线程优先级的比较
  • 临界区:针对公共资源或一段代码设计,通过对多线程的串行化来访问公共资源,速度快

7.进程的三种状态(调度方法有抢占式和非抢占式)

  • 运行状态
  • 就绪状态(等待被调度使用CPU的运行权)
  • 阻塞状态

8.线程的六种状态

  • 初始:还没有调用start()方法
  • 运行
  • 阻塞:线程阻塞于锁
  • 等待:等待其他线程做出一些特定动作
  • 超时等待:在超过时间后会自动返回
  • 终止:表示该线程已执行完毕

9.CPU的调度算法

  • 先来先服务:先来的先执行
  • 短作业优先:运行完成当前作业会去找最短的作业执行(这个短的由用户定义,实际不一定短)
  • 时间片轮转:设定一个时间片大小,把任务分割成n部分,选取等待时间最长的先执行

10.死锁:指两个或两个以上的进程在执行过程中,由于竞争资源或由于彼此通信而造成的阻塞,若无外力作用无法推进下去

产生条件

  • 互斥条件:一段时间内某资源只能由一个进程占有
  • 请求和保持:进程已经占有至少一个资源,但又对其他进程占有的资源提出要求,此时进程阻塞,但又对已经获得的资源保持不放
  • 不可抢占:进程已获得的资源,在它使用完之前不能剥夺
  • 环路条件:在一个环形链中,每个进程都在等待一个被占用的资源

死锁处理方法

  • 鸵鸟策略(大部分采用):直接忽略死锁
  • 预防死锁
    • 破坏互斥,让资源静态分配可以共享使用(一般无法破坏)
    • 破坏请求与保持,规定所有进程在它们执行之前要请求所有它们需要的资源
    • 破坏不可抢占,让高优先级可以剥夺低优先级的资源
    • 破坏环路:给资源编号,按顺序申请资源
  • 避免死锁:安全序列、银行家算法
  • 检测和接触死锁
    • 一次消除与不阻塞进程相连的边,最后剩下的就是出现死锁的进程(也叫资源分配图)
    • 资源剥夺、终止进程、进程回退

11.什么是内存?

答:内存是一种高速存储设备,仅次于寄存器和缓存。因为CPU处理速度与外存读取程序速度存在差异,所以程序执行前要先放入内存后再被CPU处理,内存用于缓和CPU与外存的速度矛盾,提高CPU利用率

12.虚拟内存时为了防止不同进程同一时刻在物理内存中运行而产生对物理内存的争夺,每个进程看到自己独占了内存空间,但实际只是把目前自己需要的内存空间映射并存储到物理内存上

13.缺页中断:每当要访问的页面不在内存中,会产生一次缺页中断,然后系统再根据页表中的外存地址找到该页并调入内存

  • 与一般中断步骤一样:保护CPU现场-分析中断原因-转入中断处理程序-回复现场
  • 不同点在于:缺页中断返回后会继续执行该指令,其他中断返回后会执行下一条指令

14.并发:宏观上两程序同时运行,例如单核CPU的多任务,但微观上还是你一条指令、我一条指令交替运行的。并不能提高计算机性能,只能提高效率

并行:严格意义上的同时运行,例如多核CPU,两程序同时分别运行在两个核上,提高了计算机性能

15.单核机器上写多线程程序,为什么仍需要考虑加锁?

答:因为线程锁用于实现线程的同步和通信,在抢占式操作系统中,当某线程时间片耗尽被挂起时,为保证运行的下一个线程不会出错(两线程共享同一数据的情形),要使用线程锁

16.线程切换

  • 要保存当前线程id、线程状态、堆栈、寄存器状态
  • 主要寄存器有:
    • 堆栈指针sp,指向当前栈的栈顶地址
    • 程序计数器PC,存储下一条将要执行的指令
    • 累加寄存器EAX,用于加法乘法的缺省寄存器

17.内存溢出:程序申请内存时,没有足够的内存供申请者使用

内存泄漏:出于某种原因没有释放掉不再使用的内存的情况,失去了对该部分内存的控制,造成浪费

18.源码到可执行文件的过程:

  • 预编译:主要处理源码中以#开头的预编译指令,生成xx.i或xx.ii文件
  • 编译:进行语法分析和优化后,生成汇编代码文件
  • 汇编:将汇编代码转变成机器可以执行的指令,按照对照表翻译即可,生成xx.o或xx.obj文件
  • 链接:形成可以执行的程序
    • 动态只在程序运行时才把个模块链接起来
    • 静态是预先就全部链接起来

19.进程种类:

  • 正常进程:父进程用wait()或waitpi()系统调用获知子进程是否终止
  • 孤儿进程:一个父进程退出,它的还在运行的子进程就成为了孤儿进程,有init进程(进程号为1)收养,并有init进程负责他们完成状态的收集工作
  • 僵尸进程:被fork()创建的子进程退出后,父进程没有使用wait()或waitpi()获知,该子进程的进程描述符仍保存在系统中(一直占据进程号),成为僵尸进程

20.五种IO模型(前四种都是同步IO):

  • 阻塞IO:调用socket后,会一直卡在这里直到socket有数据为止
  • 非阻塞IO:自旋轮询去问每一个socket是否有数据,有就接受,没有就问下一个
  • 信号驱动IO:进程继续运行不阻塞,当IO事件就绪时,进程收到SIGIO信号,然后处理IO事件,即该水龙头有水了就通知
  • IO复用(转接IO):系统select或epoll去监听各个socket,每当确定有数据可读或可写时才去进行IO操作,select只告诉有事件发生,去操作的时候还要遍历一遍确认一下是哪里的事件;而epoll直接把发生的事件列表发过来,可以直接去操作
    • 即同一个操作里同时监听多个输入输出源,在其中一个源可用时返回,并开始对其进行读写操作
  • 异步IO:linux中,调用aio_read告知内核描述字缓冲区指针和缓冲区大小、文件偏移等,当内核将数据拷贝到缓冲区后,再通知程序,即该水龙头下的杯子接满水了再通知

21.多线程、线程池、IO复用可以使server接受多个client的请求

22.怎么实现线程池

  • 设置一个生产者消费者队列作为临界资源
  • 初始化n个线程并让其运行
  • 当任务队列为空时,所有线程阻塞
  • 当生产者队列生产出一个任务后,先对生产者队列加锁,然后把任务挂到任务队列上,最后再用条件变量区通知阻塞中的一个线程

23.立即寻址不用访问内存

24.用来实现线程间的通知和唤醒的两种方法

  • Object.wait/notify/notifyALL
  • Condition.await/signal/signalALL

25.微机一般是16位或32位机,“微”指的是机器的字长

26.建立符号链接时,引用计数值直接复制,删除两个文件的任一个不影响值,而是直接删除链接

建立硬链接时,双方的引用值+1,删除文件时将与之硬链接的文件引用值减1,若某文件引用值为0则会删除该文件

27.若系统有m个进程,则就绪队列的进程数就为0 ~ m-1个

28.文件属性有:系统、只读、隐藏、存档

29.进程在运行中不能自行修改PCB(进程管理块)

30.挂起就绪状态(也叫静止就绪)的进程只能转换为就绪状态(活动就绪)

31.处于同一进程的多个线程,CPU寄存器对每个线程来说都是私有的

32.用户态和内核态

  • 每个进程都有一个4G大小的虚拟地址空间,前3G为用户空间,每个进程的用户空间之间是相互独立的,互不相干。而3G~4G为内核空间,因为每个进程都可以从用户态切换到内核态。内核空间对于所有进程来说可以说是共享的
  • 系统从用户态切换到内核态,需要中断操作
    • 发生系统调用时:用户态的进程通过系统调用申请使用操作系统提供的系统调用服务例程来处理任务,而系统调用的机制使用了操作系统特别开发的一个中断机制来实现的,即软中断
    • 产生异常时
    • 外设产生中断时
  • 切换到内核态开销大来源于:中断的工作以及处理恢复工作非常耗时

33.用户使用计算机的方式

  • 命令接口:联机命令接口和脱机命令接口
  • 程序接口:系统调用
  • GUI接口:图形接口

34.DOS是磁盘操作系统

35.文件管理系统管理的对象(最小磁盘空间单位是扇区)

  • 文件
  • 目录
  • 磁盘存储空间

36.物理地址的计算

  • 先已知逻辑地址(16进制换成逻辑地址(10进制) / 每页大小(1k就是1024) = 商 + 余数
  • 商就是页号,根据页号和物理块号的关系得到物理块号,余数就是页内偏移
  • 物理地址(10进制) = 物理块号 - 每页大小 + 页内偏移

37.线程共享堆和静态变量,不共享寄存器、栈、PCB、状态

38.页的计算

  • 页面大小就是每一页的容量
  • 页表项大小是每一页对应目录的一个项,页表项之和就是目录大小
  • 逻辑空间大小就是整本书的页数

39.实模式下的算法就是CS往左移1位十进制 + ip

例如:地址位2330H:5041H,实际地址为23300+5041=28341H

40.几核CPU就表示可同时运行几个进程,但因为CPU运转速度极快我们会感觉所有进程都是同时运行的

41.几个名词的解释

  • 物理层面:磁盘组合->单个磁盘->某一盘面->某一磁道->某一扇区,簇就是包含几个相邻扇区的集合(方便调用),Linux下叫做块
  • 虚拟层面:页
  • BIOS:用于在电脑启动初期检测基本的硬件的程序,随后加载grub,grub之后会把操作系统内核加载进来,并运行内核,最后就是内核启动,并将最终界面展示在你面前了
  • 引导文件:是一个具有隐藏和只读属性的系统文件,它的主要职责是解析INI的文件,在预引导阶段里计算机所做的工作,运行POST程序,POST将检测系统的总内存以及其他硬件设备的状况,将磁盘第一个物理扇区加载到内存,加载硬盘主引导记录并运行,主引导记录会查找活动分区的起始位置,接着活动分区的引导扇区被加载并执行,最后从引导扇区加载并初始化NTLDR文件

42.操作系统的地址映射使用段页式实现

43.操作系统的内存管理

  • 虚拟内存,来实现内存抽象,每个进程都以为自己拥有全部内存,操作虚拟地址的操作都会被转换为操作物理地址
  • 页面替换算法:当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存

44.一个进程占用什么资源

  • (1)地址空间
  • (2)全局变量
  • (3)打开的文件
  • (4)子进程
  • (5)信号量
  • (6)账户信息

进阶部分

1.操作系统的四个特性

  • 并发:同一段时间内多个程序执行(并行指的是同一时刻)
  • 共享:系统中资源可以被内存中多个并发执行的进程共同使用
  • 虚拟:通过时分复用(分时系统)以及空分复用(虚拟内存)实现把一个物理实体虚拟成多个虚拟实体
  • 异步:系统中的进程以走走停停方式执行,且以一种不可预知的速度推进

2.操作系统主要功能

  • 处理机管理
  • 存储器管理(又叫内存管理)
  • 设备管理
  • 文件管理
  • 提供用户接口

3.采用段页式存储,将进程按逻辑模块分段,再将各段分页,将内存空间分为大小相同的页框,将程序按页装入页框,分页分段都是为虚拟内存服务的。

  • 分页:指将内存空间分为一个个大小相等的分区,每个分区叫页框(一般为1kb),将用户进程的地址空间分为与页框相等的一个个称为页的区域。
    • 进程的每一个页都要放入一个页框里
    • 程序使用的仍是逻辑地址,通过页表地址加页内偏移才能得到物理地址
  • 分段:指程序按自身逻辑关系划分为若干段,例如代码段、数据段、堆栈段
  • 分页和分段区别
    • 分页是系统为利用内存空间,将程序按页装入内存,是系统行为;分段是按程序逻辑意义划分,要用户来划分每个段
    • 页的大小是固定的,段的大小则取决于用户编写的程序
    • 分页是一维地址空间,分段是二维地址空间(即第0页最后一个地址与第1页第一个地址是连续的,而段号0最后一个地址与段号1第一个地址不是连续的)
  • 缺页中断:当前指令想要访问的页面没有调入内存,而发生的中断

4.页面置换算法

  • 最佳置换算法(OPT):每次淘汰的页面都是最长时间内不再被访问的页面,保证最低缺页率(但因为一般无法预知页面访问序列,因此无法实现)
  • 先进先出算法(FIFO):每次淘汰的页面都是最早进入内存的页面(较简单,性能较差)
  • 最近最久未使用置换算法(LRU):每次淘汰的页面都是最近最久未使用的页面
    • 数组实现:用一个数组来存数据,每个数据有一个时间戳t,插入时将新数据t设为0,旧数据t加1,访问时将被访问数据t设为0,满内存时删除t最大的数据
    • 链表实现:插入时放在首部,访问时放在首部,满内存时删除最末尾的数据
  • 时钟置换算法(CLOCK):为每个页面加一个访问位(0为最近未访问,1为最近访问),淘汰时先淘汰访问位为0的,遇到1就把它改为0,下一次循环遍历到再淘汰(淘汰一个页面最多两次扫描)
    • 改进型:再多加一个修改位,即每个页面有(访问位,修改位),淘汰顺序(0,0)>(0,1)>(1,0)>(1,1),没有一个(0,0)时才淘汰一个(0,1)以此类推(淘汰一个页面最多四次扫描)

5.磁盘寻址

  • 根据“柱面号”移动磁壁,让磁头指向指定柱面
  • 激活指定盘面对应的磁头
  • 磁盘旋转过程中,指定的扇区会从磁头下面划过,完成对其的读写

磁盘调度算法

  • 先来先服务:按磁盘请求顺序进行调度
  • 最短寻找时间优先:优先处理与当前磁头最近的磁道,易出现饥饿现象(最后两个磁道相距极远)
  • 电梯算法:优先处理与当前磁头最近的磁道,但磁头移动方向固定,只能一直往外侧磁道移,移到最外后只能一直往内侧磁道移,降低饥饿现象

6.Linux进程的内存结构分为:用户空间和内核空间,内核空间在系统调用时才可访问,内核映射是固定的,分用户态和内核态是为了安全,因为内核一旦出错就会使整个系统崩溃

用户空间分为

  • 只读段:把含程序代码(.init和.text)和只读数据(.rodata)
  • 数据段:存放全局变量和静态变量,可读可写数据段(.data)存放已初始化的,BSS数据段存放未初始化的
  • 栈:由系统自动分配释放。存放函数的参数值、局部变量、返回地址
  • 堆:存放动态分配的数据,一般由程序员分配释放
  • 共享库的内存映射区域:Linux动态连接器和其他共享库代码的映射区域

7.fork()和vfork()都是拷贝进程,vfork()较快因为不用复制页表

  • fork()子进程拷贝父进程的数据段和代码段,子进程执行顺序不确定
  • vfork()子进程与父进程共享,保证子进程先运行

8.Linux的四种锁机制(获取锁失败后,线程会睡眠,等待锁释放的时候再被唤醒)

  • 互斥锁mutex:任何时刻,只要一个线程访问该对象
  • 读写锁rwlock:分读锁和写锁,写优先于读,一旦有写者,则后续读者都得等待
    • 读操作时,允许多个线程同时获得
    • 写操作时,只允许一个线程获得
  • 自旋锁spinlock:与互斥锁一样,但线程获取自旋锁失败后会进入自旋(保持唤醒,消耗CPU),直到锁被释放
  • RCU:即read-copy-update,在改数据时先读,然后生成一个副本,对副本修改后再将老数据更新为新数据

9.判断大端和小端用联合体变量,因为联合体变量总是从低地址(小端)到高地址存储的

  • 大端:低字节存在高地址
  • 小端:低字节存在低地址(主流intelCPU采用的方式)
  • 例如0x12345678中,0x12是最高字节,0x78是最低字节,而在操作系统中地址从左往右从小往大
    • 大端0x12、0x34、0x56、0x78
    • 小端0x78、0x56、0x34、0x12

10.常用线程模型

  • Future模型:把结果放在将来获取,当前主线程并不急于获取处理结果,允许子线程先进行处理一段时间,处理结束后把结果保存,当主线程需要时再向子线程索取
  • fork与join模型:把一个大任务分成多个子任务,然后分别再子线程中执行,每个子线程执行结束之后逐级回溯,返回结果进行合并计算
  • actor模型:基于消息传递机制并行任务处理,以消息的形式来进行线程间数据传输,避免了全局变量的使用,每个actor接受消息后可以自己处理也可以传递给其它actor处理
  • 生产消费者模型:分为生产者线程和消费者线程,其核心时使用一个缓存来保存任务。生产者不处理任务,只负责生成任务然后保存到缓存中,消费者只负责从缓存中取出任务并处理
  • master-worker模型:有一个master线程负责接受和分发任务,worker子线程负责处理任务并在需要时返回处理结果给master

11.协程的暂停完全由程序控制,开销远小于线程,一个线程可拥有多个协程

12.宏内核:内核执行大部分操作,包括调度、内存管理、文件系统、驱动、网络协议,例如linux内核,效率高但稳定性差

微内核:内核只执行调度、内存管理,其他功能用用户态的守护进程去实现,出错也只会导致对应进程死掉,效率低但稳定性好

13.异步编程的事件循环:在单个的线程中,如果某事件绑定了两个处理器,那它也会先去第一个处理器处理再去第二个处理器处理,在这个事件的所有处理器执行完毕前,事件循环不会去检查是否有新事件触发

14.Unix的文件系统按物理结构划分,采用索引文件;Unix时分时系统

15.银行家算法中:需求矩阵 = 最大需求矩阵 - 分配矩阵

16.内存屏障用于使CPU有序,在高级语言的体现就是锁

17.二层交换机(层指的是OSI模型前几层):不同VLAN(广播域)之间的通信必须通过三层设备;交换机仅根据MAC地址进行帧的转发

18.若进程P一旦被唤醒就能投入运行,则系统是抢占调度式,P的优先级高于正在运行的进程

19.实时系统中的进程调度采用抢占式的优先级高者优先执行的算法

20.原语有不可中断性,它是通过在执行过程中关闭中断实现的,且一般由系统进程调用

21.最佳适应算法时按空闲区大小递增顺序形成空闲分区链

22.逻辑设备表(LUT)作用:在物理设备和逻辑设备之间建立对应关系

23.信号量初值为2,表示为有两个可用资源;当前值为-1,表示两个可用资源都在忙且还有一个等待进程

24.一次I/O请求对应一个I/O请求包;每次I/O操作都会有对应的I/O请求包

25.进程

  • 阻塞->就绪:靠“合作”进程的唤醒
  • 就绪->执行:靠下一个时间片的到来

26.守护进程最重要的特性是后台运行,并且守护进程必须与其运行前的环境隔离开来。创建方法:

  • 在父进程使用fork()创建子进程,然后关闭父进程
  • 在子进程中用系统函数setsid创建新会话
  • 改变当前工作目录
  • 重设文件创建掩码为0,umask(0)
  • 关闭从父进程继承而来的文件描述符(隔离性)

27.指令流水线

  • 例如一条指令要执行要经过3个阶段:取指令、译码、执行,每个阶段都要花费一个机器周期,如果没有采用流水线技术,那么这条指令执行需要3个机器周期;如果采用了指令流水线技术,那么当这条指令完成“取指”后进入“译码”的同时,下一条指令就可以进行“取指”了
  • 常见的六级流水线将指令流的处理过程划分为取指(FI)、译码(DI)、计算操作数地址(CO)、取操作数(FO)、执行指令(EI)、写操作数(WO)等几个并行处理的过程段。这就是指令6级流水时序。在这个流水线中,处理器有六个操作部件,同时对这六条指令进行加工,加快了程序的执行速度。几乎所有的高性能计算机都采用了指令流水线

28.内核同步

  • 避免由于对共享数据的不安全访问导致的数据崩溃
  • 原子操作
  • 自旋锁
  • 读写锁
  • 信号量(计数信号量、二值信号量)
  • 屏障
    • 优化屏障,原语保证编译程序不会混淆放在原语操作之前的汇编语言指令和放在原语操作之后的汇编语言指令,这些汇编语言指令在C中都由对应的语句。在Linux中,优化屏障就是barrier()宏
    • 内存屏障,原语确保,在原语之后的操作开始执行之前,原语之前的操作已经完成。因此,内存屏障类似于防火墙,让任何汇编语言指令都不能通过

29.如果把一个较大的数据放入内存该怎么做

  • 用到虚拟内存,匀出一部分硬盘空间来充当内存使用,但计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因此一般扩增RAM容量(加内存条)
    • 1.中央处理器访问主存的逻辑地址分解成组号a和组内地址b,并对组号a进行地址变换,即将逻辑组号a作为索引,查地址变换表,以确定该组信息是否存放在主存内
    • 2.如该组号已在主存内,则转而执行4;如果该组号不在主存内,则检查主存中是否有空闲区,如果没有,便将某个暂时不用的组调出送往辅存,以便将这组信息调入主存
    • 3.从辅存读出所要的组,并送到主存空闲区,然后将那个空闲的物理组号a和逻辑组号a登录在地址变换表中
    • 4.从地址变换表读出与逻辑组号a对应的物理组号a
    • 5.从物理组号a和组内字节地址b得到物理地址
    • 6.根据物理地址从主存中存取必要的信息
  • 用到分块

目录

基础部分

进阶部分

基础部分

1.OSI七层模型(从下数起,物理层是第一层)

  • 应用层:
    • 提供网络服务接口
    • FTP、Telnet、DNS、SMTP、POP、HTTP协议
  • 表示层:规范数据格式
  • 会话层:管理会话,socket在这一层
  • 传输层:
    • 数据单位为段
    • 网关
    • TCP、UDP协议
  • 网络层:
    • 数据单位为IP数据包
    • 寻址、选路由、连接的建立保持与终止
    • IP、ICMP、ARP、RARP协议
  • 数据链路层:
    • 数据单位为帧
    • 网桥、交换机、网卡
    • 以太网协议
  • 物理层(在终端设备间传输比特流):提供物理媒体中继器、集线器(不具备寻址功能,会把信息发送给所有主机)

TCP/IP 5层模型:应用层、传输层、网络层、数据链路层、物理层

TCP/IP 4层模型:应用层、传输层、网络层、网络接口层

2.ARP/RARP协议:是一个根据IP地址获取物理地址的协议,ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系或进行修改

  • ARP缓存中会保存当前网络上所有主机IP地址与物理地址的对应信息,有生存期
  • ARP解析会先检查ARP缓存,缓存中没有再去访问IP地址对应的硬件地址并广播ARP请求帧,找到后还会更新缓存
  • RARP与ARP相反:将局域网某个主机的物理地址转换为IP地址

3.TCP负责发现传输问题,一旦有异常就发信号要求重新传输,还采用滑动窗口的方式进行流量限制

  • 三次握手
    • Client发送请求报文SYN,还会传初始序列号seq1
    • Server接受后发送SYN+ACK,这会传初始序列号seq2和确认字段ack为seq1,表示上一个初始序列号已收到
    • Client接受后发送ACK,seq=x+1,ack=y+1

为什么是三次握手?

答:三次握手是为了确保双方都知道彼此都已经准备好。若改为两次握手的话,在Server发送SYN+ACK出去时就已经满足,但这个SYN+ACK可能会在中途丢失,导致Client不知道Server是否准备好,从而一直在等待形成死锁。而三次握手的话,即使最后一次Client发送的ACK丢失也不受影响

  • 四次挥手
    • Client发送中断连接请求报文FIN并进入FIN_WAIT状态
    • Server接受后发送ACK(此时仍在传数据),Client进入FIN_WAIT状态(第二次)
    • Server发送中断报文FIN
    • Client收到后发送ACK,并进入TIME_WAIT状态(进入该状态后2msl默认4分钟后会中断连接)
  • msl是报文最大生存时间,默认2分钟,但实际其实一般用30s代替

为什么是四次挥手?
答:因为发送端提出FIN报文后,接收端很有可能还有数据未传完,因此先回一个ACK,然后传完数据后再回FIN,因此比三次握手额外多一步操作

TIME_WAIT状态的意义是什么?

答:TIME_WAIT是以防第四次挥手的ACK中途丢失而导致Server不知道要关闭连接,所以Client会在此状态多等2msl,在此期间若没有收到Server发送过来的回复则表明Server收到了ACK,明白此时关闭连接是安全的再关闭连接

(ps:在连接建立与关闭的过程中,TCP具有超时重传机制,即若该端规定时间内没有收到预期报文,它会默认上一次自己发送的报文丢失从而再重新发一次)

4.一个电子邮件程序使用的TCP/IP协议:

  • 使用SMTP来发送邮件(包括发送方发给发送方邮件服务器,和发送方服务器发给接受方邮件服务器)
    • SMTP只能传ASII码数据,如果非ASII码,需要用MIME转化成ASII码再用SMTP传(接收方也要用MIME进行解析)
  • 使用POP从邮件服务器下载邮件
    • IMAP也可以
  • ps:用浏览器去登录邮箱并不涉及以上协议,用户只用http协议即可,SMTP和POP等由邮件服务器内部处理

5.TCP靠什么保证数据传输可靠?

  • 校验和:数据段当做整数加起来,进位补在末尾,最后取反
  • 序列号seq:每个字节的数据都有编号
  • 确认应答ack:有ACK报文机制
  • 超时重传
  • 连接管理:三次握手、四次挥手
  • 流量控制:滑动窗口,根据接受端能力决定发送速度
    • 滑动窗口是接受端buffer的大小,用来告诉发送端的
  • 拥塞控制
    • 拥塞窗口是发送端的窗口

6.TCP如何解决粘包、拆包问题?

  • 给数据包添加包首部,首部至少包括包的长度
  • 将数据包封装为固定长度,不够长的用0填充
  • 在数据包之间设置边界,如添加特殊符号

7.DNS原理(以www.tmall.com为例):树状结构、迭代递归查询

  • 先在本机DNS缓存查
  • 再到根服务器查
  • 再到com域DNS服务器查
  • 再到tmall.com域DNS服务器查
  • 最后到www.tmall.com域DNS服务器查
    (DNS使用别名CNAME是为了方便cdn配置,用于实现CDN加速效果)

8.HTTP状态码

  • 1开头表示信息
  • 2开头表示成功(200-请求成功)
  • 3开头表示发生了重定向(301-网页被永久转移到其他URL)
  • 4开头表示客户端错误(404-请求的网页不存在)
  • 5开头表示服务端错误(500-内部服务器错误)

9.HTTPS加密过程(七次握手)

  • 前三次就是TCP建立连接的三次握手
  • 第四次:client发送TLS版本号+支持加密套件列表+希望使用的TLS选项(TLS是安全的传输层协议)
  • 第五次:server发送一个选择的加密套件+选择的TLS选项+自己的证书(证书包含公钥)+
  • 第六次:client发送公钥加密出的对称密钥+自己的证书
  • 第七次:server使用对应私钥解出对称的密钥后,发送Finish,之后就可以用这个对称秘钥进行传递了
  • 总而言之就是先非对称加密传递,最后再对称加密传递(优点计算量小、加密速度快、加密效率高),加密套件就是密钥生成遵循的算法

10.HTTP与HTTPS主要区别

11.常见端口

  • 20-FTP文件传输协议数据端口
  • 21-FTP文件传输协议控制端口
  • 25-SMTP简单邮件传输协议
  • 53-DNS域名服务器
  • 80-HTTP超文本传输协议
  • 110-POP3邮件协议
  • 443-HTTPS超文本传输协议
  • 1080-sockets
  • 3306-MySQL

12.五类IP地址范围

  • A类:1.0.0.1到127.255.255.255(第一段为网络,剩下三段为本地计算机号码)
  • B类:128.0.0.1到191.255.255.255(前两段为网络,后两段为本机计算机号码)
  • C类:192.0.0.1到223.255.255.255(前三段为网络,最后一段为本地计算机号码)
  • D类:224.0.0.0到239.255.255.255(又叫多播地址,组播地址,最高位为“1110”)
  • E类:以“1111”开头,留作未来使用

13.在浏览器中键入URL并回车会发生什么?

  • 1.DNS解析获得目标IP地址:浏览器缓存-操作系统缓存-host文件查找-路由器缓存-IPS DNS缓存-顶级/根DNS服务器查找
  • 2.通过对IP地址ARP解析获得物理MAC地址
  • 3.TCP连接和TLS握手
  • 4.client发送HTTP请求
  • 5.server收到并响应HTTP请求,处理请求并生成html代码,返回给浏览器
  • 6.浏览器解析并渲染页面显示

14.TCP/IP数据链路的交互过程

  • 网络层等到满足以下两个条件时,会去自己的ARP缓存表中查找
    • 数据链路层得到mac地址
    • 数据包到达网络层,准备发往数据链路层
  • 若查到,则将目标ip的mac地址封装到发往数据链路层的数据包的包头
  • 若查不到,则发起一个广播,让具有该ip的机器回复其mac地址,并重复上述操作

15.http中的GET请求、POST请求和PUT请求

  • GET请求
    • 参数通过url明文传递,只能用ASCII码,有长度限制,这个长度是浏览器限制的,实际上http别未有这种限制
    • 浏览器会主动缓存(包括传的参数)
    • 按RFC规范来是只读操作,是安全幂等的(幂等指的是多次执行相同操作,结果都是相同的)
  • POST请求
    • 参数放在request body里,有多种编码方式(get只能url编码)
    • 不会被浏览器主动缓存
    • 按RFC规范来说是新增操作,不是安全幂等的(实际上开发者可以不遵循规范,让get也去修改服务器数据)
  • PUT请求(其他和POST相似)
    • 按RFC规范来说是更新操作,是安全幂等的
  • RFC规范并没有规定GET请求不能带body的,任何请求都可以带body的。只是因为RFC规范定义的GET请求是获取资源,所以根据这个语义不需要用到body。
  • URL 中的查询参数也不是GET所独有的,POST请求的URL中也可以有参数的。

16.互联网主要硬件有中继器、网桥(用于局域网)和路由器

17.网络发送数据的原则是:先发大的,再发小的

18.根据CSMA/CD原理

传输速度-最短帧长度 = 网络传输速率-最大距离-2

19.路由器总是具有两个或两个以上的IP地址,并且路由器接口可以自动获取IP地址

20.信息帧头部包括:标志字段、地址字段、控制字段和协议字段(0021H表示网络层使用IP协议)

21.发送窗口一定要小于接受窗口

22.协议是水平的,用于控制同一地位的实体间的通信规则;服务是垂直的,是下层向上层通过层间接口提供的功能

23.以太网MAC协议时无连接不可靠的,因为局域网通道质量好,它只负责高效率地交付,纠错由高层来完成

24.网络延迟:报文进入网络到它离开网络的时间,可以看成是发送端到接受端的时间

往返延迟:报文从客户端发出到客户端收到服务端响应的时间

25.192.168.0.234/26是C类,所以前三段是网络地址,子网掩码默认为255.255.255.0,但由于有个/26,所以子网掩码实际上是255.255.255.26,ip地址与子网掩码与运算得到网络地址

26.路由器和交换机的区别

  • 交换机主要工作在数据链路层;路由器工作在网络层
  • 交换机转发所依据的对象时:MAC地址;路由转发所依据的对象是:IP地址
  • 交换机主要用于组建局域网,而路由主要功能是将由交换机组好的局域网相互连接起来,或者接入Internet。
  • 交换机能做的,路由都能做。交换机不能分割广播域,路由可以。路由还可以提供防火墙的功能。路由配置比交换机复杂
  • 总而言之路由器是快递分拣中心,交换机是区域快递员

27.DNS主要靠UDP协议传输,只有请求超过512字节时才会去用TCP协议,可以分割成多个片段

28.TCP/IP报文

  • Ethemet帧头
  • IP头部
    • 版本:占4比特,用来表明IP协议实现的版本号,当前一般为IPv4,即0100
  • TCP头部
    • 确认号:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节
    • 标志位字段:占6比特。各比特的含义如下:
         - URG:紧急指针(urgent pointer)有效
         - ACK:确认序号有效
         - PSH:接收方应该尽快将这个报文段交给应用层
         - RST:重建连接
         - SYN:发起一个连接
         - FIN:释放一个连接
  • 上层数据
  • FCS

29.HTTPS和HTTP的区别主要如下:

  • https协议需要到ca申请证书
  • http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
  • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  • http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全

30.DNS在进行区域传输的时候使用TCP,普通的查询使用UDP

  • 因为UDP快,开销小但是基于UDP传输的DNS为了限制报文不超过576(历史原因),所以将DNS报文限制在512字节

31.网络请求说明

  • 200,成功访问
  • 500,服务器错误
  • 304,服务器告知本次访问的资源自上次访问以来没有变化,此时浏览器可以直接使用上一次缓存的本地资源

32.http和tcp的关系

  • http在应用层,tcp在传输层
  • http是建立在tcp基础之上的,当发起一个http请求时,http会通过tcp建立一个与服务器的链接通道,但是一旦得到自己要的数据就会断开(相当于把tcp长连接当短连接使用),所以也叫无状态链接
    • 无状态连接就是每次传输数据就新建一个连接,而有状态连接是固定一个连接传多次数据,服务器在这个过程中能记录下数据的一些信息,所以叫有状态连接
  • http用建立tcp通道传输数据,tcp通过套接字socket传输数据
  • http1.1后默认开启keep-alive,即一直持续到客户端或服务器端提出断开连接

33.浏览器的缓存机制

  • 概念:优先用上次访问接受到的数据来渲染,除非有变化
  • 实现方式:
    • 强制缓存:正常发起请求,只要之前这个请求的响应头里的相对时间Cache-Control或绝对时间Expires没过期,就一定要去使用浏览器的本地缓存
      • 同时存在时,Cache-Control优先级大于Expires
    • 协商缓存:发起一个带协商缓存字段的请求,响应码为304,表示可以使用本地缓存。有两种实现
      • 请求头If-None-Match本地缓存的资源的id,响应头Etag表示资源的id
        • 如果服务器判断If-None-Match == 当前资源的id,那么就会返回200和资源,否则返回304
      • 请求头If-Modified-Since表示本地缓存的该资源的最后修改时间,响应头Last-Modified表示该资源的最后修改时间
        • 如果服务器判断If-Modified-Since时间早于当前修改时间,那么就会返回200和资源,否则返回304
  • 一般都是先判断是否能强制缓存,强制缓存未命中才发起待协商缓存字段的请求

34.cookie

  • 是为了让服务器能够记住用户而引入的一个字段
  • 当用户访问站点的时候,站点会为该用户分配一个Cookie值,站点使用该 Cookie 值来标记用户
  • 当浏览器接受到包含 Cookie 值的数据包后,会将Cookie 值取出,存放到浏览器中,随后浏览器会在发往该站点的数据包中就会自动为用户填充该值。

进阶部分

1.TCP/IP中包含一系列通信协议

  • TCP传输控制协议:应用程序之间通信
  • UDP用户数据包协议:应用程序之间简单通信
  • IP网际协议:计算机之间通信
  • ICMP因特网消息控制协议:针对错误和状态
  • DHCP动态主机配置协议:针对动态寻址

2.TCP使用固定连接

  • 某应用程序发送一个通信请求,该请求必须被送到一个确定的地址
  • 双方“握手”
  • TCP在两个应用程序之间建立一个全双工的通信(半双工是双发可以互发,但同一时间只能有一个互发),这个通信将占用两个计算机之间的通信线路

(UDP与TCP相似,但更简单,可靠性也更低,它俩相比就是UDP缺少像TCP这样的流控制)

3.IP是无连接的:

  • IP不会占用计算机之间的通信线路;
  • 通过IP,数据被分割为小的独立的包,并通过因特网在计算机之间传送;

4.IP路由器:

  • 当一个IP包从一台计算机被发送,它会到达一个IP路由器,然后由IP路由器负责将这个包路由至它的目的地,过程中还可能会经过其他的路由器
  • 在一个相同的通信中,一个包所经由的路径可能会和其他的包不同,而路由器负责根据通信量、网络中的错误或其他参数来进行正确寻址

5.TCP/IP工作协同:

  • TCP负责应用软件和网络软件之间的通信,IP负责计算机之间的通信
  • TCP负责将数据分割成IP包,在它们到达时再重新组合,IP负责将包发送到接受者

6.TCP/IP用4个数字来作为计算机编址:XXX.XXX.XXX.XXX(每个XXX在0~255之间,因为每个XXX用8位二进制表示)

  • 每个计算机必须有一个IP地址才能连入因特网
  • 每个IP包必须有一个地址才能发送到另一台计算机

7.域名的存在是为了方便记忆,域名要经过DNS程序翻译成数字形式的TCP/IP地址

当一个新的域名连同TCP/IP地址一起注册后,全世界的DNS服务器都会对此信息进行更新

8.TCP长连接

  • Client与Server先建立连接,建立后不断开,再进行报文传递,适用于操作频繁的通讯,可节省资源
  • 缺点是连接不关闭,随着Client数量增多,Server的负载承受不住

TCP短连接

  • 每进行一次报文收发交易才通讯连接,交易完毕后立即断开,即存在的连接都是有效连接
  • 缺点是若操作频繁则会浪费时间、带宽

9.TCP的拥塞控制

  • 发送方维护cwnd变量用来表示拥塞窗口
    • 没有出现拥塞,cwnd增大
    • 出现拥塞,cwnd减小
  • 发送方将当前拥塞窗口大小作为发送窗口大小,即swnd = cwnd
  • 发送方维护一个慢开始门限ssthresh
    • cwnd < ssthresh时,采用慢开始算法
    • cwnd = ssthresh时,采用两种算法都可以
    • cwnd > ssthresh时,采用拥塞避免算法
  • 拥塞控制的四种特性
    • 慢开始算法:先发1,确认后发2,再确认后发4…(乘2)
    • 拥塞避免算法:先发1,确认后发2,再确认后发3…(线性加1)
    • 快速重传:收到连续3个重复确认后,立即重传(避免等RTO超时重传)
    • 快速恢复:收到连续3个重复确认后,将当前ssthresh和cwnd减半,并执行拥塞避免算法

10.UDP协议是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号,由于通讯不需要连接,所以可以实现广播发送

  • 使用UDP协议的有:TFTP、SNMP、DNS、NFS、BOOTP
  • TCP与UDP区别
    • TCP面向连接,是可靠的字节流服务
    • UDP面向无连接,是不可靠的数据报服务
  • 如何用UDP实现TCP可靠传输(已有的UDP可靠传输RUDP、RTP、UDT)
    • 添加seq/ack机制(seq是序号)
    • 添加发送和接受缓冲区,实现超时重传

11.ip地址是ip协议提供的统一地址格式,为互联网上每个网络、每台主机分配的一个逻辑地址,由网络号和主机号组成(主机号为0的ip地址表示网络地址)

12.什么是子网掩码?

答:子网掩码用来识别两个IP地址是否同属于一个子网,1表示网络位,0表示主机位。若两IP地址与子网掩码经过位与计算后结果相同,则表明它们在同一子网。“0”地址和“1”地址一般不用来计算子网掩码,因为一个是网络地址、一个是广播地址。(ip地址与掩码取反再相与就是主机地址,ip地址与掩码直接相与就是网络地址)

13.HTTP各版本特点

  • HTTP1.0:无状态、无连接(即无法复用连接)
  • HTTP1.1:
    • 长连接:默认开启kepp-alive
    • 支持请求管道化:使请求能够看起来像是并行发送,实际上仍是有顺序的,并且请求发出去后不用等待其回来就可以发二个请求出去
    • 缓存处理
    • 断电传输
    • 增加Host字段:使一个服务器能创建多个Web站点
  • HTTP2.0:
    • 二进制分帧:在应用层和传输层之间
    • 头部压缩:重复的请求头只需要发一次
    • 服务器推送:无需用户发出请求)
  • HTTP2.0:
    • 无队头阻塞
    • 更快的连接建立
    • 连接迁移

14.对称加密和非对称加密

  • 对称加密:明文+密钥=密文; 密文+密钥=明文
  • 非对称加密:明文+公钥=密文; 密文+私钥=明文
  • HTTPS先采用非对称加密传输密钥,传完后数据就都可以使用对称加密要传输了

15.两个机制(注意它俩不能同时使用,否则会造成互相等待)

  • 延时确认:发送ack后
    • 有segment,立即发送
    • 没有segment。等待下一个200ms超时时再发送一个ack
  • Nagle算法:一个TCP连接上只能有一个没有被确认的数据包,在这个确认没有被收到前不发送任何数据段,此时会收集小的报文段以便确认到达时一起发送

16.早期拨号上网用SLIP协议,现在用的时PPP点到点协议

17.计网系统的基本组成时通信子网和资源子网

18.CSRF通过伪装来自受信任用户的请求来进入网址,XSS时实现CSRF的一条途径,在Client端增加伪随机数可以阻挡CSRF

19.Websocker至少需要一次握手,模型与node类似

20.IP、UDP和TCP传送数据的协议

  • OSPF网络层协议用IP数据报发送数据
  • RIP应用层协议使用UDP传送数据
  • BGP应用层协议使用TCP传送数据

21.多级页表更好时因为有助于减少实现进程的虚拟空间所需的页表大小

22.使用RS232在两台主机之间通信时,不需要有路由选择的网络层

23.SDH设备出现帧丢失(LOF)后,应立即倒换

24.曼切斯特编码时一种同步时钟编码技术(本身具有同步信号),每个码元被调成两个电平,因此数据传输速率只有调制速率的一半

25.5类线的传播距离最大时100米

26.交换机中找不到mac就会向其它端口转发

27.提供差错控制的有传输层、网络层、数据链路层

  • 传输层
    • 目的是做到”无传输差错”。即弥补帧丢失、帧重复、帧失序
    • 校验对象是段
  • 网络层
    • 校验只用于针对网络层的头部
    • 校验对象是包
  • 数据链路层
    • 目的是为了防止网卡软硬件bug、电缆不可靠、信号干扰而造成信号失真、数据错误
    • 只保证无比特出错,检测不出帧丢失、帧重复、帧失序
    • 校验对象是帧

28.NAT协议

  • 当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但又想和因特网上的主机通信(并不需要加密)时,可使用NAT
  • 所有使用本地地址(私网IP地址)的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接

29.VPN工作原理

  • vpn通过操作系统的接口直接虚拟出一张网卡,后续整个操作系统的网络通讯都将通过这张虚拟的网卡进行收发。这和任何一个代理的实现思路都差不多,应用层并不知道网卡是虚拟的,这样vpn虚拟网卡将以中间人的身份对数据进行加工,从而实现各种神奇的效果
  • 具体来说,vpn是通过编写一套网卡驱动并注册到操作系统实现的虚拟网卡,这样数据只要经过网卡收发就可以进行拦截处理
  • 一句话,vpn在IP层工作,而ss在TCP层工作。

目录

Django框架

Echarts库

Django框架

初始文件介绍

1
2
3
4
5
6
7
templates //HTML文件安置目录
__init__.py //空文件
asgi.py //异步
settings.py //主配置文件
urls.py //主路由文件
wsgi.py //网关接口
manage.py //项目管理脚本

一个简单的Django程序

一、新建一个APP

在每个Django项目中可能会包含多个APP,APP共享项目资源

在Pycharm下方的Terminal中输入

1
python manage.py start login
阅读全文 »