#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操作