# TCP vs UDP 目標是在傳輸層做通訊協定傳輸數據,數據可能是文字、圖片、音檔等等。 `TCP` 跟 `UDP` 傳送資料都是採用二進制。 ### TCP (連結性) TCP (Transmission Control Protocol) 是好個雙向協定的連結,確保資料的傳輸可以在不可靠的環境建立一個可靠的連結,確保資料不會丟失。  1. 三次握手 ( 建立連結 ) 因為過程發送三次封包所以叫 三次握手。 * client 端發送 SYN 包給 server 請求連結 * server 端發送 SYN+ACK 給 client 確認建立連結 * client 端發送 ACK 給 server 連結建立  2. 傳輸確認 * 傳輸資料可能會有多個封包組成 * 如何處理資料丟包的問題 * 如何解決資料的亂序問題 * TCP 有個資料緩衝區去接收所有封包,根據資料內容與長度編排序列號,並拿取封包中的部分資料當作 SYN+ACK 的 payload 給 client端,因為 server 發送 SYN+ACK 包後 client 會回傳 ACK 包確認是否收到資料,解決資料包亂序問題。 * 如果 SYN+ACK 在傳輸過程中失敗,這時因為 server 端沒有收到 client 回傳的 ACK 包,因為緩衝區有保留資料,這時 server 就會根據序列號和長度重組序列,並重新發送 SYN+ACK 包,解決資料丟包問題。 *  3. 四次揮手 ( 關閉連結 ) * server 跟 client 端都可以關閉連結 * 假設 client 端想關閉連結 * client 端先發送 fin 包根 server 請求關閉連結,client 端此時處於 FIN-wait-1 狀態。 (第一次揮手) * server 發送 ACK 包此時 client 端變成 FIN-wait-1 狀態 , server 變成 close wait 狀態, server 這時還可以發送未發送的數據, client 還可以接收數據。 (第二次揮手) * server 端發送 FIN 包,client 發送 ACK 包,此時 client 端進入超時等待時間,等到時間過後 client 端立即關閉。(第三次揮手 + 第四次揮手) * 當 server 收到 client 端的 ACK 後就歷時關閉連結。 補充 : client 端為什麼會需要超時等待時間,原因是要確保 (第四次揮手) , `client` 端發送 `ACK` 包給 `server` 確認關閉連結,否則當 `ACK` 包丟失 `server` 就會一直在 `last-ACK` 狀態也就不會關閉連結了。  ### TCP (UDP) UDP (User Datagram Protoc) 是一種非連結的通訊協定,他不能保證資料的丟失性,但因為沒有 `TCP` 瑣碎的協定,所以傳輸速度相對快速,使用場景會是用在串流服務,`server` 端不需要確認 `client` 是否有收到資料。 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up