#TCP与UDP
---
**面向报文的传输方式**是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。
**面向字节流**的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。
TCP协议
-----
----------
- Transmission Control Protocol,传输控制协议
- 面向连接的协议
- 需要三次握手建立连接
- 需要四次挥手断开连接
- TCP报头最小长度:20字节
三次握手的过程:
--------
----------
1. 客户端发送:SYN = 1, SEQ = X, 端口号
2. 服务器回复:SYN = 1, ACK = X + 1, SEQ = Y
3. 客户端发送:ACK = Y + 1, SEQ = X + 1
> 确认应答信号ACK = 收到的SEQ + 1。
连接建立中,同步信号SYN始终为1。连接建立后,同步信号SYN=0。
四次挥手过程
------
----------
1. A向B提出停止连接请求,FIN = 1
2. B收到,ACK = 1
3. B向A提出停止连接请求,FIN = 1
4. A收到,ACK = 1
**优点:**
----------
- 可靠,稳定
1、传递数据前,会有三次握手建立连接
2、传递数据时,有确认、窗口、重传、拥塞控制
3、传递数据后,会断开连接节省系统资源
**缺点:**
----------
- 传输慢,效率低,占用系统资源高
1、传递数据前,建立连接需要耗时
2、传递数据时,确认、重传、拥塞等会消耗大量时间以及CPU和内存等硬件资源
- 易被攻击
1、因为有确认机制,三次握手等机制,容易被人利用,实现DOS 、DDOS攻击
**如何保证接收的顺序性:**
----------
TCP协议使用SEQ和ACK机制保证了顺序性
TCP的每个报文都是有序号的。确认应答信号ACK=收到的SEQ+1
UDP协议
-----
----------
- User Data Protocol,用户数据包协议
- 面向无连接的协议
- UDP报头只有8字节
**简介:**
----------
- 传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快的把它扔到网络上
- 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制
- 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段
- 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息
- UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小
- 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制
- UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表。
- UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
> 使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
**优点:**
----------
- 传输速率快
1、传输数据前,不需要像TCP一样建立连接
2、传输数据时,没有确认、窗口、重传、拥塞控制等机制
- 较安全
1、由于没有了TCP的一些机制,被攻击者利用的漏洞就少了
**缺点:**
----------
- 不可靠,不稳定
1、由于没有了TCP的机制,在数据传输时如果网络不好,很可能丢包
**用UDP协议通讯时怎样得知目标机是否获得了数据包**
----------
仿造TCP的做法,每发一个UDP包,都在里面加一个SEQ序号,接收方收到包后,将SEQ序号回复给发送方。如果发送方在指定时间以内没有收到回应,说明丢包了。
TCP与UDP的区别
----------
----------
<table class="table table-bordered table-striped table-condensed">
<tr>
<td>TCP面向<strong>有链接</strong>的通信服务</td>
<td>UDP面向<strong>无连接</strong>的通信服务</td>
</tr>
<tr>
<td>TCP提供可靠的通信传输</td>
<td>UDP不可靠,会丢包</td>
</tr>
<tr>
<td>TCP保证数据顺序</td>
<td>UDP不保证</td>
</tr>
<tr>
<td>TCP数据无边界</td>
<td>UDP有边界</td>
</tr>
<tr>
<td>TCP速度快</td>
<td>UDP速度慢</td>
</tr>
<tr>
<td>TCP面向字节流</td>
<td>UDP面向报文</td>
</tr>
<tr>
<td>TCP一对一</td>
<td>UDP可以一对一,一对多</td>
</tr>
<tr>
<td>TCP报头至少20字节</td>
<td>UDP报头8字节</td>
</tr>
<tr>
<td>TCP有流量控制,拥塞控制</td>
<td>UDP没有</td>
</tr>
</table>
**为什么UDP比TCP快**
----------
1. TCP需要三次握手
2. TCP有拥塞控制,控制流量等机制
**为什么TCP比UDP可靠**
----------
1. TCP是面向有连接的,建立连接之后才发送数据;而UDP则不管对方存不存在都会发送数据。
2. TCP有确认机制,接收端每收到一个正确包都会回应给发送端。超时或者数据包不完整的话发送端会重传。UDP没有。因此可能丢包。
**什么时候使用TCP**
----------
当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。
在日常生活中,常见使用TCP协议的应用如下:
浏览器,用的HTTP
FlashFXP,用的FTP
Outlook,用的POP、SMTP
Putty,用的Telnet、SSH
QQ文件传输
**什么时候应该使用UDP:**
----------
当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。
比如,日常生活中,常见使用UDP协议的应用如下:
QQ语音
QQ视频
TFTP
**TCP无边界,UDP有边界**
----------
**TCP无边界**
客户端分多次发送数据给服务器,若服务器的缓冲区够大,那么服务器端会在客户端发送完之后一次性接收过来,所以是无边界的;
**UDP有边界**
客户端每发送一次,服务器端就会接收一次,也就是说发送多少次就会接收多少次,因此是有边界的。
- JavaSE(Java基础)
- Java基础知识
- Java中的内存泄漏
- String源码分析
- Java集合结构
- ArrayList源码剖析
- HashMap源码剖析
- Hashtable简介
- Vector源码剖析
- LinkedHashMap简介
- LinkedList简介
- JVM(Java虚拟机)
- JVM基础知识
- JVM类加载机制
- Java内存区域与内存溢出
- 垃圾回收算法
- Java并发(JavaConcurrent)
- Java并发基础知识
- 生产者和消费者问题
- Thread和Runnable实现多线程的区别
- 线程中断
- 守护线程与阻塞线程的情况
- Synchronized
- 多线程环境中安全使用集合API
- 实现内存可见的两种方法比较:加锁和volatile变量
- 死锁
- 可重入内置锁
- 使用wait/notify/notifyAll实现线程间通信
- NIO
- 数据结构(DataStructure)
- 数组
- 栈和队列
- Algorithm(算法)
- 排序
- 选择排序
- 冒泡排序
- 快速排序
- 归并排序
- 查找
- 顺序查找
- 折半查找
- Network(网络)
- TCP/UDP
- HTTP
- Socket
- OperatingSystem(操作系统)
- Linux系统的IPC
- android中常用设计模式
- 面向对象六大原则
- 单例模式
- Builder模式
- 原型模式
- 简单工厂
- 策略模式
- 责任链模式
- 观察者模式
- 代理模式
- 适配器模式
- 外观模式
- Android(安卓面试点)
- Android基础知识
- Android内存泄漏总结
- Handler内存泄漏分析及解决
- Android性能优化
- ListView详解
- RecyclerView和ListView的异同
- AsyncTask源码分析
- 插件化技术
- 自定义控件
- ANR问题
- Art和Dalvik的区别
- Android关于OOM的解决方案
- Fragment
- SurfaceView
- Android几种进程
- APP启动过程
- 图片三级缓存
- Bitmap的分析与使用
- 热修复的原理
- AIDL
- Binder机制
- Zygote和System进程的启动过程
- Android中的MVC,MVP和MVVM
- MVP
- Android开机过程
- EventBus用法详解
- 查漏补缺
- Git操作