1.TCP/IP 四层模型:
(图来源于网络)
IP层(网络层)主要协议:
ARP(地址解析协议):负责将一个已知的ip地址解析成MAC地址,以便在交换机上进行通信、
ICMP(Internet控制消息协议):返回错误信息
DHCP(动态主机配置协议):由DHCP服务器动态分配ip
和RARP(反向地址转换协议)
2.TCP/UDP区别以及拥塞控制
TCP(Transmission Control Protocol,参数控制协议)和UDP(User Datagram Protocol,用户数据报协议)
TCP是面向连接的,保证可靠传输 ,传输效率低,利用滑动窗口拥塞控制
UDP无明确的连接,也不提供传输序列号确认和重传,传输效率高,无拥塞控制
3.https协议
HTTP+ 加密 + 认证 + 完整性保护 =HTTPS
与 SSL (Secure Socket Layer,安全套接层)组合使用的 HTTP 被称为 HTTPS
优点:安全
缺点:花费更多时间,解密等过程占用更多内存,消耗更多资源
4.奈奎斯特定理
W带宽 V波形个数,码元数
奈氏定理:理想低通信道下的极限数据传输率=(单位:b/s)
香农定理:有噪声的信道的极限数据传输速率= (单位:b/s) S/N成为信噪比
5.TCP三次握手四次挥手过程【重点】
(图来源于https://blog.csdn.net/qq_38950316/article/details/81087809)
握手:1.(状态SYN_SENT)client——>发送SYN=1,seq=x
2.SYN=1,ACK=1,seq=y,ack=x+1<——server发送(状态:由listen转换成SYN_RCVD)
3.(状态变为Established)client发送——>ACK=1,seq=x+1,ack=y+1
发送数据
挥手:1.client——>发送FIN=1,seq=u
2.ACK=1,seq=v,ack=u+1<——sever端
3.FIN=1,ACK=1,seq=w,ack=u+1<——sever端
4.client——>ACK=1,seq=u+1,ack=w+1
====================================================
进一步提问:TIME_WAIT有什么作用,为什么会等2MSL的时间,MSL具体是什么
MSL=Maximum Segment Lifetime报文最大生存时间,就是报文在端到端传递所需的最长传输时间。
为了能保证客户传输的最后一个ACK报文能够到达服务端,服务端如果收不到会重传它上一次所发的报文,此时客户端已关闭不会收到所以不会重传,致使服务端不能正常close
2MSL是为了保证在服务器没有收到客户端最后一个ACK报文段而需要重传的情况时,客户端能知道这一情况而再次重传。
6.进程和线程区别
- ·进程是分配资源的最小单位,线程是分配处理机的最小单位
- ·一个进程可以有多个线程,进程有自己的独立地址空间,线程共享进程的资源空间(代码和数据空间),线程切换的开销比进程切换的开销小很多,线程也称作轻量级进程
- ·线程间的通信通过共享全局变量,静态变量等,而进程间通信需要通过通信的方式
- 进程之间一般没有影响,多线程进程中的线程有影响
7.进程间通信
- 管道
半双工,只适用于父子进程或兄弟进程
- 消息队列
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取
- 信号量
PV操作,用于进程间的同步互斥
- 共享内存
共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
因为多个进程可以同时操作,所以需要进行同步。
信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问
8.Socket编程
服务器端:(1)创建socket对象——>绑定指定地址和端口
(2)监听(3)接受客户端的请求连接消息(4)传输服务(5)关闭socket
socket()->bind()->listen()->accept()->recv()->close()
用户端:(1)创建socket对象
(2)连接到服务器指定地址和端口
(3)send()传输消息
(4)关闭socket
socket()->connect()->send()->close()
9.设计模式(举几个例子而已)
(1)单例模式(最常见要手撕)
单例模式的类只允许一个实例存在
实现步骤:1.将该类的构造方法设置为私有的2.此类添加静态成员变量,并为其实例化 3.类内提供静态方法返回静态成员变量 就是唯一实例化的该类
代码有很多种写法-饿汉式,懒汉式,双重检查式,静态内部类,枚举式
1.饿汉式【静态变量】
//优点:简单,类装载的时候就完成实例化,避免了线程同步问题
//缺点:从始至终从未使用过这个实例,则会造成内存的浪费
public class singleton{
private final static singleton INSTANCE=new singleton();
private singleton(){}
public static singleton getInstance{
return INSTANCE;
}
饿汉式【静态代码块】
//类似上一种
public class Singleton{
private static Singleton INSTANCE;
static{
INSTANCE=new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}
2、懒汉式
//线程不安全,不可用,只能在单线程下使用,不然容易产生多个实例对象
public class Singleton(){
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
//线程安全,但加锁影响效率
public class Singleton(){
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
3、双重检查锁 double-checking locking
//增加了volatile,synchronized,进行了两次if检查
//优点:线程安全;延迟加载;效率较高
public class Singleton(){
private static volatile Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
静态内部类
//优点:避免了线程不安全,延迟加载,效率高
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
还有枚举类(比较新颖不常用)
(2)观察者模式:又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式
(3)工厂模式:实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例
(4)策略模式
10.linux基本命令
- cd 进入目录
cd ~返回home
cd ./x 进入当前目录的x文件夹 “.”表示当前目录
cd ../x “..”表示上一层目录
cd - 返回上一级
- ls 罗列文件列表
- ll=ls -l 罗列所有文件详细
- cp 复制
- mv 移动文件move
- rm 删除文件夹 remove
- rmdir
- tar 解压缩
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名【必须的】
例:tar –xvf file.tar 解压 tar包
tar –cvf jpg.tar *.jpg 将目录里所有jpg文件打包成tar.jpg
- cat 查看文本内容
- chmod 改变文件读写权限
u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行
r=4,w=2,x=1
chmod 777 file=user group other都有权限
chmod xxx file,xxx分别代表user group other的权限
- vim 文本编辑
- gcc /g++ 编译c,c++程序成可执行程序
- pwd 查看当前路径
- mkdir 创建文件夹
- grep 搜索
11.协程
协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CUP进行分时,协程可以访问和使用unity的所有方法和component
线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。