TCP, UDP区别和各自优缺
- TCP提供一种面向连接的、可靠的字节流服务 在一个 TCP 连接中,仅有两方进行彼此通信。广播和多播不能用于 TCP
- TCP使用校验和,确认和重传机制来保证可靠传输
- TCP 给数据分节进行排序,并使用累积确认保证数据的顺序不变和非重复
- TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制
注意:TCP 并不能保证数据一定会被对方接收到,因为这是不可能的。TCP 能够做到的是,如果有可能,就把数据递送到接收方,否则就(通过放弃重传并且中断连接这一手段)通知用户。因此准确说 TCP 也不是 100% 可靠的协议,它所能提供的是数据的可靠递送或故障的可靠通知。
UDP 是一个简单的传输层协议。和 TCP 相比,UDP 有下面几个显著特性:
- UDP 缺乏可靠性。UDP 本身不提供确认,序列号,超时重传等机制。UDP 数据报可能在网络中被复制,被重新排序。即 UDP 不保证数据报会到达其最终目的地,也不保证各个数据报的先后顺序,也不保证每个数据报只到达一次
- UDP 数据报是有长度的。每个 UDP 数据报都有长度,如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一起传递给接收方。而 TCP 是一个字节流协议,没有任何(协议上的)记录边界。
- UDP 是无连接的。UDP 客户和服务器之前不必存在长期的关系。UDP 发送数据报之前也不需要经过握手创建连接的过程。
总结: 基于连接vs无连接,可靠性不同,有序性,数据边界,速度,重量级vs轻量级
什么情况下用UDP?
UDP更适用于对速度比较敏感的应用,例如:在线视频媒体,电视广播和多人在线游戏。
基于TCP协议的最好例子是HTTP协议和HTTPS协议,他们几乎存在于互联网的任何地方,实际上,绝大多数你所熟悉的通常协议,都是基于TCP的,例如:Telnet,FTP以及SMTP协议。UDP协议没有TCP协议那么受欢迎,但是也被广泛应用,比如DHCP以及DNS协议,其他还有一些基于UDP的协议如SNMP,TFTP,BOOTP以及NFS(早期版本)
多线程和多进程的区别,优缺点
多进程
- 数据共享复杂,需要IPC(进程间通讯,如管道,文件,Socket),数据是分开的,同步简单
- 占用内存多,CPU切换复杂,创建销毁简单,利用率低
- 进程间不会互相影响
多线程
- 因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂
- 占用内存少,切换简单,CPU利用率高,创建销毁,速度很快
- 一个线程挂掉将导致整个进程挂掉
同步与异步:在计算机领域,同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。举个例子,打电话时就是同步通信,发短息时就是异步通信。
进程和线程的关系:
进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。进程是cpu资源分配的最小单位,线程是cpu调度的最小单位
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
- 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
- CPU分给线程,即真正在CPU上运行的是线程。
并行和并发:并行处理(Parallel Processing)是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。并发处理(concurrency Processing):指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行。并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集
Thread和Runnable的区别
Thread是类,Runnable是接口,继承Thread类和实现Runnable接口都能实现多线程。由于Java不支持多继承,因此继承Thread类就代表这个子类就不能继承其他类,而实现Runnable接口没有这个限制。其实Thread类本身也是实现了Runnable接口。
当使用Runnable接口时,我们还是需要实例化一个Thread类并传入Runnable的实例来调用start()方法
public class RunnableExample implements Runnable{
public void run(){
...
}
}
public class ThreadExample