Linux
Linux基本命令: s cd pwd路径查看 rm删除 mv移动 cp复制 tar解压 Ps看进程 kill杀进程 chmod改权限(分别表示User、Group、及Other的权限。 r=4,w=2,x=1 ) useradd加用户 userdel删 sudo ping ssh cp远程拷贝 ifconfig cat 用途是连接文件或标准输入并打印, grep 命令用于查找文件里符合条件的字符串,-a可以转成二进制查找,-c显示行数,grep test *file
深拷贝
- Python中对象的赋值都是进行对象引用(内存地址)传递
- 使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
- 如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
- 对于非容器类型(如数字、字符串)没有被拷贝一说 如果元祖变量只包含原子类型对象,则不能深拷贝
重写
重写是子类对父类的的方法的实现过程进行重新编写, 返回值和形参都不能改变。
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
Vmware网络连接方式
- Bridge模式——如果物理机网络中有路由器设备,建议使用这个模式,相对于主机和虚拟机是在一个交换机中。
- 使用Vmnet8虚拟交换机,此时虚拟机可以通过主机单向网络上的其他工作站,其他工作站不能访问虚拟机。
- www.jb51.net/article/105…
- NAT:NAT是将私有IP地址通过边界路由转换成外网IP地址,在边界路由的NAT地址转换表记录下这个转换映射记录,当外部数据返回时,路由使用NAT技术查询NAT转换表,再将目标地址替换成内网用户IP地址。
- 静态NAT:静态NAT就是一对一映射,内部有多少私有地址需要和外部通信,就要配置多少外网IP地址与其对应
- 动态NAT:动态NAT是在路由器上配置一个外网IP地址池,当内部有计算机需要和外部通信时,就从地址池里动态的取出一个外网IP,并将他们的对应关系绑定到NAT表中,通信结束后,这个外网IP才被释放,可供其他内部IP地址转换使用,这个DHCP租约IP有相似之处。
ARP
ARP,地址解析协议,就是用来把IP地址转换成MAC地址,就是某个去往目的IP地址翻译成MAC地址。
交换机的工作原理就是基于源MAC地址学习,基于目的MAC地址转发的。
(1) A首先查看自己的ARP表,是否包含有B对应的ARP表。如果找到了对应的MAC地址,则A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,将数据包发给B。
(2) 如果A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。
(3) B比较自己的IP地址和ARP请求报文中的目标IP地址,当相同时:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
(4) A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。
路由器
路由器,负责将数据包发到正确的目的地,并且在这个过程中选择最佳的路径,主要是使用ARP
交换器
当交换机收到数据时,它会检查它的目的MAC地址,然后把数据从目的主机所在的接口转发出去。交换机内部有一个MAC地址表,MAC地址表记录了网络中所有MAC地址与该交换机各端口的对应信息。
- 交换机根据收到数据帧中的源MAC地址建立该地址同交换机端口的映射,并将其写入MAC地址表中。
- 交换机将数据帧中的目的MAC地址同已建立的MAC地址表进行比较,以决定由哪个端口进行转发。
- 如数据帧中的目的MAC地址不在MAC地址表中,向端口转发。
- 广播帧和组播帧向所有的端口转发。
IP/MAC
- ip处于三层MAC处于二层。ip转发是建立在MAC转发基础上,MAC地址可以通过ip地址映射,MAC地址跟ip地址没关系。
- IP地址用于跨网通信,通信设备发送的数据包需要通过网关(路由)转发,发送的数据包里封装了两边的IP地址,(路由器)上维护了一个路由表,数据包到达网关会解析里面的目的IP然后根据目的IP在路由表里找到应该转发的去向比如说端口或另外一台路由器
七层网络模型
- 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率 等。这一层的数据叫做比特。
- 数据链路层:主要将从物理层接收的数据进行 MAC 地址(网卡的地址)的封装与解封装。常把这 一层的数据叫做帧。在这一层工作的设备是交换机
- 网络层:主要将从下层接收到的数据进行 IP 地址(例 192.168.0.1)的封装与解封装。在这一层工 作的设备是路由器,常把这一层的数据叫做数据包。
- 传输层:定义了一些传输数据的协议和端口号(WWW 端口 80 等),如:TCP,udp
- 会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间 发起会话或或者接受会话请求
- 表示层:主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够 识别的东西转换成人能够能识别的东西(如图片、声音等))
- 应用层 主要是一些终端的应用
访问网站流程:
- 浏览器根据域名解析IP地址(DNS),并查DNS缓存
- 浏览器与WEB服务器建立一个TCP连接
- 浏览器给WEB服务器发送一个HTTP请求(GET/POST):一个HTTP请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求数据(request body)4个部分组成。
- 服务端响应HTTP响应报文,报文由状态行(status line)、相应头部(headers)、空行(blank line)和响应数据(response body)4个部分组成。
- 浏览器解析渲染
http状态码:
1开头通知,2开头正常,3重定向,4客户端错误,5服务器错误
http的请求(post,get,put,head(报头),delelte,trace(回显,测试)) www.cnblogs.com/jayxuan/p/1…
HTTPS和HTTP的区别主要如下:
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议,依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密
- https = http+sll
- 用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
长连接
- 因为http协议是无状态的,浏览器和服务器的请求响应一次,下一次会重新创建连接,对于交互性比较高的网页就表现不好
- 用websocket进行全双工的交互,浏览器和服务器有互相感应
get和post的区别:
- 都是http的请求方式,Get一般用于获取和查询资源信息,Post用于更新资源
- Get的数据会在地址栏显示,数据会跟在URL之后,传输数据有限,
- Post将数据放在http的包里,不会因为地址限制而数据受到限制,安全性高
Session与Cookie:
- session服务器端用户权限验证,存于服务端,在进行数据交互时使用的,登录失效这,就是因为session在中间起到了作用。
- cookie是保存在本地的数据,在页面中输入账号,自动弹出密码,这个密码之所以会弹出就是因为本地cookie的原因, 包括历史记录这些,之所以会有记录,就是因为内容存储在本地的cookie文件中。
- session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效
TCP流量控制:
滑动窗口,流量控制,本质上是动态缓冲区,接收端根据自己的能力在tcp的header中动态调整窗口大小 TCP解决网络拥塞,
- 重传的机制:慢启动,拥塞避免,快速恢复
TCP状态码
segmentfault.com/a/119000001…
(三次握手四次挥手,SYN,WAIT等等)
- 为什么三次握手:--------服务器陷入假性等待连接。问:那超时关闭不就好了? 答:超时关闭可以尽快是否但无法避免前期假性等待的时间开销
- tcp 首部核心标记字段有哪些 (源端口 目的端口 序号 确认号 数据长度 相关标志号 一些额外指针空间)
TCP UDP区别:
- TCP是传输控制协议,面向连接的,需要三次握手(SYN - ACK - ACK),比较稳定,信息包标题20个字节,保证数据顺序
- UDP是用户数据包协议,非连接协议,不建立连接,不维护连接状态,没有拥堵控制,吞吐量不受约束,信息包标题8个字节,不保证数据顺序, Ping命令就是发送udp包,
- (TCP慢?)TCP流量控制、拥塞控制,UDP没有相关限制,不会缩小对方发送缓冲区,因此速度快。加快TCP的传输 可以扩大缓冲区大小,或者减小流量控制的力度,让数据每次都刚好能完整发送一个包单位
linux查看mac地址
1、 ip addr show (ip address show 、ip addr ) 查看本机ip和额外的一些信息
2、ifconfig -a 其中 HWaddr 就是mac地址
操作系统
线程与进程:
- 进程是资源(CPU、内存等)分配的基本单位,是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,系统会为它分配CPU时间,程序开始真正运行,整个 Java 就是一个进程,比如你在里面用做调度任务就会开启线程
- 线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量
并发/并行:
- 并发和并行都可以是多线程,并行就是多线程被多个cpu执行,并发是多个线程被一个CPU轮转执行
- 并发就是指代码逻辑上可以并行,有并行的潜力,但是不一定当前是真的以物理并行的方式运行;
- 并发指的是代码的性质,并行指的是物理运行状态
父线/子线程:
- 线程分为守护线程和非守护线程,通过isDaemon()可以查看。
- Java进程在所有的非守护线程结束后,会全部结束,所有守护线程都会停止。如果只是某个父线程结束,它产生的子线程不会受到影响。
- 一个线程是否是守护线程默认和他的父线程及ThreadGroup有关,但可以在start以前通过setDaemon()自行设置。
BFS/DFS
-
深度优先遍历DFS:
使用栈(stack,pop,push),因为栈是垂直结构;
从某个顶点出发,首先访问这个顶点,然后访问该顶点的第一个未被访问的邻结点,以此邻结点为顶点继续访问,同时记录其余未访问的邻接点,当一个顶点的所有邻接点都被访问时,回退一个顶点 -
栈:按照先进后出的原则存储数据,先进入的数据被压来入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最源后一个数据被第一个读出来),跟我们浏览玩也的逻辑是一样的。(递归函数的调用和返回)
-
广度优先遍历BFS: 使用队列(PriorityQueue、LinkedList)
从某个顶点出发,首先访问这个顶点,然后找出这个结点的所有未被访问的邻接点,访问完后再访问这些结点中第一个邻接点的所有结点,重复此方法。 -
队列: 队列为一种线性表,它是水平结构的,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,先进先出(FIFO—first in first out)线性表 (列的最主要用途是异步任务,异步的思路主要用来缓解瞬间压力、耗时操作、并行任务等;)
-
堆:
堆中某个节点的值总是不大于或不小于其父节点的值; 完全二叉树;最大堆;最小堆
堆排序:当一个结点插入时,放在堆的末尾)------然后把这个结点与父节点比较,看是否大于或小于父节点(取决于大根/小根堆),判断堆序----------不满足的话,与父节点交换,再与父节点的父节点比较,直到满足堆序----------当跟节点被弹出时,尾结点到头节点位置,与子节点比较,放入合适的位置
二叉树
-
前序遍历:访问根结点 - 左子树 - 右子树
首先把root入栈
出栈的元素同时放进结果队列
先把右儿子节点入栈,再把左儿子节点入栈,这样出栈的顺序是先左后右(根节点已出)
按照这个次序继续,直到stack为空 -
层级遍历
传统的用一个队列Queue 进行 push & pop,
pop前先取一下这一层的数量,然后把这一层的结点循环一遍,结果加入到一个临时队列中