网络模型
OSI:
应用层:主要是一些终端应用
表示层:对接受的数据进行解释,加密,压缩与解压缩
会话层:通过传输层数据传输的通路
传输层:定义了传输数据的协议与端口号
网络层:设备是路由器,主要将从下层接收到的数据进行IP地址的封装与解封
数据链路层:设备是交换机
物理层:定义物理设备标准,如:网线的接口类型,光纤的接口类型,各种传输介质的传输速率
TCP/IP:应用层,传输层,网际层,主机至网络层
网络通信的三要素:
IP地址:主机的唯一标识
端口号:正在运行程序的标识
传输协议:TCP,UDP
Socket
1.什么是 Socket?
(IP地址与端口号组合在一起)Socket 主要是用来网络中两个进程的通信,我们需要考虑 2 个问题,第一是在网络中如何定位到一台主机并且能找到相应的服务(因为一台主机上可能运行多个服务或者进程),第二是如何可靠高效的传输数据。在本地可以通过进程 PID 来唯一标识一个进程,但是在网络中这是行不通的。其实 TCP/IP 协议族已经帮我们解决了这个问题,网络层的“ip 地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip 地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 socket。Socket 本质是编程接口(API),对 TCP/IP 的封装,Socket通常用来实现客户方和服务方的连接。Socket 是 TCP/IP 协议的一个十分流行的编程实现,一个 Socket 由一个 IP 地址和一个端口号唯一确定。但是,Socket所支持的协议种类也不光 TCP/IP 一种,因此两者之间是没有必然联系的。
2 socket 的通信过程
Server 端 Listener(监听)某个端口是否有连接请求,Client 端向 Server 端发出Connect(连接)请求,Server 端向 Client 端发回 Accept(接受)消息。一个连接就建立起来了。Server 端和 Client 端都可以通过 Send,Write 等方法与对方通信。最后关闭 Socket。
3.TCP,UDP
UDP ,用户数据报协议,计算机之间不必建立连接,数据打包发送,每包最多发送64K数据,因为不需要建立连接,所以不安全,效率高,是不可靠协议。
TCP,传输控制协议,通过三次握手建立连接,通过IO流传输数据,对数据大小没有限制,因为建立好了连接,数据传输过程是安全的,是一个可靠协议,传输速度慢,效率低
区别
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;
UDP尽最大努力交付,即不保证可靠交付
Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。
如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP对系统资源要求较多,UDP对系统资源要求较少。
线程
1.实现线程的方法:
a.继承Thread类,实现run方法
b.继承runnable接口
2.简单方法:
sleep:线程休眠
join:线程抢占
yield:线程礼让,暂停片刻,让CPU先执行其他线程
setDaemon:守护线程
stop:终止线程
interrupt:中断线程
2、Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复
wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lockpool),如果线程重新获得对象的锁就可以进入就绪状态
3、线程的sleep()方法和yield()方法有什么区别?
① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。
4、请说出与线程同步以及线程调度相关的方法?
wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;
notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;
线程池:
1.优点:
1)避免线程的创建和销毁带来性能消耗
2)避免大量的线程间因互相抢占系统资源导致的阻塞现象
3)能够对线程进行简单的管理并提供定时执行,间隔执行等功能
2.线程池包括
corePoolSize:线程池核心线程数量maximumPoolSize:线程池最大线程数量
keepAliverTime:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间
unit:存活时间的单位
workQueue:存放任务的队列
handler:超出线程范围和队列容量的任务的处理程序
3.线程池的实现原理
a、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。
b、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
c、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。