一看就懂系列之 超級詳解TCP與UDP
前言
今天突然發現有同事反饋一個簡單的介面超時,查了xhprof發現php的gethostbyname函式竟然跑了5s,嚇了一跳,然後查相關資料查著查著就查歪了,突然想到TCP和UDP的區別,這個面試經常被問到的題目,貌似我沒有收藏,本來想撿現成的,因為這個問題很古老了,但是沒有讓我想收藏的。還是自己動手搞一篇好了。
正文
以下幾個方面來解釋TCP與UCP的區別
1.TCP協議和UCP協議與TCP/IP協議的聯絡
2.TCP的概念與其傳輸過程
3.UDP的概念與其傳輸過程
4.TCP和UCP的區別
TCP協議和UCP協議與TCP/IP協議的聯絡
說到這個問題,有的人會犯糊塗,認為TCP/IP協議與UDP協議是一個層級的。這是錯的。
TCP/IP協議是UDP和TCP的乾爹。
TCP/IP協議是一個協議簇。裡面包括很多協議。UDP只是其中的一個。之所以命名為TCP/IP協議,因為TCP,IP協議是兩個很重要的協議,就用他兩命名了。
TCP的概念與其傳輸過程
名詞解釋
TCP(Transmission Control Protocol,傳輸控制協議)是面向連線的協議。
關鍵圖
流程解釋
TCP三次握手過程
1 主機A通過向主機B 傳送一個含有同步序列號的標誌位的資料段給主機B ,向主機B 請求建立連線,通過這個資料段,
主機A告訴主機B 兩件事:我想要和你通訊;你可以用哪個序列號作為起始資料段來回應我.
2 主機B 收到主機A的請求後,用一個帶有確認應答(ACK)和同步序列號(SYN)標誌位的資料段響應主機A,也告訴主機A兩件事:
我已經收到你的請求了,你可以傳輸資料了;你要用哪佧序列號作為起始資料段來回應我
3 主機A收到這個資料段後,再傳送一個確認應答,確認已收到主機B 的資料段:”我已收到回覆,我現在要開始傳輸實際資料了
這樣3次握手就完成了,主機A和主機B 就可以傳輸資料了.
(沒有應用層的資料,SYN這個標誌位只有在TCP建產連線時才會被置1,握手完成後SYN標誌位被置0)
TCP死次揮手過程
1 當主機A完成資料傳輸後,將控制位FIN置1,提出停止TCP連線的請求
2 主機B收到FIN後對其作出響應,確認這一方向上的TCP連線將關閉,將ACK置1
3 由B 端再提出反方向的關閉請求,將FIN置1
4 主機A對主機B的請求進行確認,將ACK置1,雙方向的關閉結束.
由TCP的三次握手和四次斷開可以看出,TCP使用面向連線的通訊方式,大大提高了資料通訊的可靠性,使傳送資料端
和接收端在資料正式傳輸前就有了互動,為資料正式傳輸打下了可靠的基礎
ACK TCP報頭的控制位之一,對資料進行確認.確認由目的端發出,用它來告訴傳送端這個序列號之前的資料段都收到了.比如,確認號為X,則表示前X-1個資料段都收到了,只有當ACK=1時,確認號才有效,當ACK=0時,確認號無效,這時會要求重傳資料,保證資料的完整性.
SYN 同步序列號,TCP建立連線時將這個位置1
FIN 傳送端完成傳送任務位,當TCP完成資料傳輸需要斷開時,提出斷開連線的一方將這位置1
包頭結構
內容 | 位數 |
---|---|
源埠 | 16位 |
目標埠 | 16位 |
序列號 | 32位 |
迴應序號 | 32位 |
TCP頭長度 | 4位 |
reserved | 6位 |
控制程式碼 | 6位 |
視窗大小 | 16位 |
偏移量 | 16位 |
校驗和 | 16位 |
選項 | 32位(可選) |
得出:TCP包頭的最小長度,為20位元組
UDP的概念與其傳輸過程
名詞解釋
UDP(User Data Protocol,使用者資料包協議)是一個非連線的協議。
流程圖
流程解釋
由於不需要建立連線,所以不斷往對方主機傳送UDP資料包,然後對方主機確認收到資料包,如果資料包是否到達的訊息及時反饋回來。
(ping操作就是這個原理,中間會有丟包情況)
UDP的關鍵點
1.UDP傳送資料的速度受到以下因素影響.
a.應用程式生成資料的速度
b.源端和終端主機效能的限制
c.傳輸頻寬的限制
2.由於不需要維護連線狀態,故一臺伺服器可向多個客戶端傳輸相同資料。
一對多的關係,而TCP是一對一
3.UDP是面向報文的
傳送方的UDP對應用程式交下來的報文,在新增首部後就向下交付給IP層。既不拆分,也不合並,而是保留這些報文的邊界,因此,應用程式需要選擇合適的報文大小。
包頭結構
內容 | 位數 |
---|---|
源埠 | 16位 |
目標埠 | 16位 |
長度 | 16位 |
校驗和 | 16位 |
得出:UDP包頭的最小長度,為8位元組
TCP和UCP的區別
角度 | TCP | UCP |
---|---|---|
是否連線 | 面向連線(傳送資料前需要建立連線) | 無連線(傳送資料無需連線) |
是否丟包重試 | 實現了資料傳輸時各種控制功能,可以進行丟包的重發控制,還可以對次序亂掉的分包進行順序控制 | 不會進行丟包重試,也不會糾正到達的順序 |
模式 | 流模式(面向位元組流) | 資料包模式(面向報文) |
對應關係 | 一對一 | 支援一對一,一對多,多對一和多對多的互動通訊 |
頭部開銷 | 最小20位元組 | 只有8位元組 |
可靠性 | 全雙工非常可靠、無差錯、不丟失、不重複、且按序到達 | 不保證可靠交付,不保證順序到達 |
擁塞控制 | 有控制 更多詳情 | 有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如IP電話,實時視訊會議等) |
資源要求 | TCP程式結構較複雜,較多 | UDP程式結構簡單,少 |
相關文章
- 一看你就懂,超詳細 java 中的 ClassLoader 詳解Java
- Python爬蟲詳解(一看就懂)Python爬蟲
- TCP與UDP區別詳解TCPUDP
- 一看就懂的TCP握手和揮手TCP
- SiamBAN詳細分析,一看就懂!
- 一看就懂之webpack高階配置與優化Web優化
- 一看就懂,Python 日誌模組詳解及應用Python
- UDP與TCPUDPTCP
- TCP與UDPTCPUDP
- 一看就懂!【英雄聯盟銳雯】與 Python 詳解設計模式之門面模式Python設計模式
- 一看就懂的SpringSpring
- linux awk 一看就懂Linux
- 小姐姐用動畫圖解Git命令,一看就懂!動畫圖解Git
- MQTT是TCP還是UDP?TCP與UDP區別MQQTTCPUDP
- 《圖解TCP/IP》讀書筆記六:TCP與UDP圖解TCP筆記UDP
- 一看就懂【來自英雄聯盟蓋倫的怒吼】與 Python 詳解設計模式(二)觀察者模式Python設計模式
- 為什麼DNS使用UDP而不是TCP詳解!DNSUDPTCP
- 新手一看就懂的執行緒池!執行緒
- 一看就懂的JS抽象語法樹JS抽象語法樹
- TCP與UDP的區別TCPUDP
- UDP與TCP的區別UDPTCP
- HTTP與UDP/TCP區別HTTPUDPTCP
- 系列TCP/IP協議-UDP(009)TCP協議UDP
- 秒懂系列,超詳細Java列舉教程!!!Java
- 最全的python自學資源,一看就懂!Python
- 一看就懂的交換機基礎知識
- TCP、UDP、HTTP、SOCKET之間的區別與聯絡TCPUDPHTTP
- 看一遍就懂:MVCC原理詳解MVC
- 一看就懂的ReactJs入門教程-精華版ReactJS
- 5┃音視訊直播系統之 WebRTC 中的協議UDP、TCP、RTP、RTCP詳解Web協議UDPTCP
- TCP 和 UDPTCPUDP
- TCP和UDPTCPUDP
- TCP vs UDPTCPUDP
- UDP&TCP Linux網路應用程式設計詳解UDPTCPLinux程式設計
- 一看就懂的Android APP開發入門教程!AndroidAPP
- Java註解最全詳解(超級詳細)Java
- 超詳細的TCP、Sokcket和SuperSocket與TCP入門指導TCP
- Java多執行緒超級詳解(只看這篇就夠了)Java執行緒