10. 游戲開發中的TCP與UDP

1.TCP和UDP

2.TCP為什么慢于UDP

3.可靠UDP


1.TCP和UDP

1).通過打電話的方式說明TCP和UDPa.TCP(傳輸控制協議), 就像打電話- 需要先撥號, 接通, 問候(建立連接)- 你一句, 我一句, 對方沒有聽清會要求你重復(確認與重傳)- 保證對話有條不紊, 內容準確無誤(可靠, 有序)- 如果信號不好, 你們會下意識地慢點說(擁塞控制)- 最后會禮貌道別(斷開連接)b.UDP(用戶數據報), 就像學校廣播站發公告- 拿起麥克風就直接說, 不管下面有沒有聽(無連接) - 只管自己念完, 不關心學生聽沒聽清, 記沒記住(無確認, 不可靠)- 念得飛快, 一口氣念完所有內容(高效, 速度塊)- 各個班級聽到的順序可能不同(無序)- 即使有學生喊"沒有聽清", 廣播站也不會重復(不重傳) 

2).TCP(傳輸控制協議)a.連接性面向連接, 傳輸數據前必須通過三次握手建立一條邏輯連接通道; 傳輸結束后通過四次揮手斷開連接b.可靠性高可靠性, 確保數據無差錯, 不丟失, 不重復, 按次序到達c.流量控制有, 由接收方控制發送方的速率, 防止發送過快導致接收方緩沖區溢出d.擁塞控制有, 根據網絡狀況動態調整發送速率, 避免網絡癱瘓e.有序性有序, 對每個數據字節進行編號, 接收端會重新排序, 保證應用程序收到的數據和發送順序一致f.數據模式面向字節流, 將數據看作一連串無結構的字節流, 沒有邊界; 所以會出現黏包問題, 需要應用層自行解決g.首部開銷首部結構復雜, 包含序列號, 確認號, 窗口大小, 校驗等控制信息h.傳輸效率速度相對慢, 延遲較高; 因為需要建立連接, 確認, 重傳, 流量控制和擁塞控制, 帶來了額外的延遲i.雙工性在一條TCP連接上, 雙方可以同時進行數據的發送和接收j.應用場景要求數據絕對準確, 完整性大于速度的場景, 比如: 電子郵件(SMRTP, POP3, IMAP), 文件傳輸(FTP)

3).UDP(用戶數據報)a.連接性無連接, 無需建立和斷開連接, 想發數據就直接發b.可靠性盡最大努力交付, 不保證數據一定到達終點, 可能丟失, 亂序或重復c.流量控制無, 發送速率不受接收方控制, 可能因發送過快導致接收方丟包d.擁塞控制沒有擁塞控制, 即使網絡擁堵, 也以恒定速率發送數據, 可能會加劇網絡擁堵e.有序性每個數據報都是獨立的, 不保證先后順序, 接收端收到的是什么順序就是什么順序f.數據模式面向報文的, 發送和接收的都是完整的, 有邊界的數據; 應用層交付的數據包不會合并也不會拆分g.首部開銷首部非常簡單, 僅包含源/目標端口, 長度, 校驗等基本信息h.傳輸效率沒有復雜的控制機制, 傳輸效率高, 延遲低i.雙工性支持一對一, 一對多, 多對多j.應用場景要求傳輸速度和實時性, 速度大于完整性的場景; 比如: 音視頻直播, 語音通話等

2.TCP為什么慢于UDP

TCP慢于UDP, 是因為TCP為了保證可靠性而犧牲部分速度1).確認應答(ACK)和超時重傳- UDP, 發送方發送完數據就結束了, 不管對方是否收到, 就像仍紙團, 扔出去就不管了- TCP, 發送方每發送一個數據包, 都必須收到接收方的確認回復(ACK), 才會發送下一個; 如果一段時間內沒有收到ACK, 發送方就認為數據包丟了, 會重新發送由于TCP每次發送和等待ACK都需要等待時間(即RTT - 往返時間), 網絡延遲本身就高的環境下(如衛星鏈路), 這種一來一回的等待就會非常明顯; 重傳更是增加了額外的時間成本2).按序交付- UDP, 接收方收到什么就立刻上交什么, 不管順序; 后發的包可能先到- TCP, 必須保證接收方應用程序讀到的數據順序和發送方發出的順序完全一致; 如果中間某個數據包丟失或延遲了, 即使后面的數據包已經到達, 接收方也必須將它們緩存起來, 等待丟失的那個包重傳成功并組裝順序后, 才交給應用層由于TCP需要按序交付, 這造成了隊頭阻塞, 一個包的丟失或延遲就會拖累后面所有已到達但無序的數據無法及時處理3).流量控制- 目的, 防止發送方發送的過快, 導致接收方的緩沖區溢出- 機制, 主要通過TCP首部的窗口大小來實現, 接收方告訴發送方"我目前還能接收多少數據"; 發送方發送的數據量不能超過這個窗口- 帶來的延遲, 如果接收方處理速度慢(比如應用程序讀取數據慢), 窗口會變小, 設置為0; 發送方就必須暫停發送, 等待接收方騰出緩沖區并告知新的窗口大小; 這個等待就引入了延遲4).擁塞控制- 目的, 防止發送方發送的過快, 導致網絡中間設備過載, 它感知網絡的承載能力- 核心機制, 一套復雜的算法(慢啟動, 遇到擁塞等), 通過動態調整一個擁塞窗口的值來控制發送速率慢啟動: 連接剛建立時, 發送速率會從很低的值開始, 然后像指數增長一樣迅速增加, 直到遇到閾值或發現丟包(網絡擁塞的信號)遇到擁塞: 一旦檢測到丟包(超時), TCP會認為網絡堵了, 會劇烈地減小發送速率, 然后再開始緩慢增長- 帶來的延遲/速度變化, 擁塞控制使得TCP的速度不是穩定的, 而是像一個鋸齒波一樣上下波動, 它永遠在試探網絡的極限帶寬, 一旦碰壁后就后退; UDP一直以恒定的速率發送, 擠占其他連接帶寬, 直到把網絡塞滿

3.可靠UDP

游戲開發中的可靠UDP是有選擇地實現部分TCP的功能, 只會實現當前業務最需要的那部分; 必須實現的功能1).序列號a.判斷丟包, 沒有序列號, 根本無從知道包2和包3之間是不是丟了一個包b.判斷重復包, 網絡抖動可能讓我們收到兩個一樣的包, 序列號可以幫我們去重c.對于需要按順序執行的指令, 接收方可以依據序列號進行排序后提交給游戲邏輯處理注: 在接收方, 序列號用于判斷和排序, 不一定要像TCP那樣阻塞等待; 比如包3到了但包2沒到, 對于非關鍵數據可以直接處理包3, 對于關鍵指令則可以等待包2重傳后再按順序處理2).丟包檢測a.為什么實現UDP本身不告訴你數據是否到達, 如果槍擊指令的包丟了, 玩家會覺得自己開了空槍, 體驗極差; 所以你必須自己能檢測到哪個包可能丟了b.如何實現- 確認應答(ACK), 接收方收到包后, 會發送一個ACK消息回去, 告訴發送方法我收到了X號包- 否定確認(NACK), 接收方發現序列號不連續(比如收到了包1和包3, 沒有收到包2), 會主動發送一個NACK的消息, 請求發送方重傳包2- 超時計時器, 發送方為每個已發送的包啟動一個計時器, 如果在一定的時間內沒有收到對應的ACK, 就認為丟了, 觸發重傳3).重傳機制a.為什么必須檢測到丟包是為了補救, 重傳是保證關鍵數據可靠的最終手段b.關鍵: 選擇性重傳, 不是所有數據都值得重傳- 需要重傳的: 關鍵的指令, 比如玩家釋放技能- 不需要重傳的: 比如玩家的位置和朝向, 對于這種數據, 最新的數據永遠比舊數據更有價值4).擁塞控制(強烈建議實現)a.為什么如果我們的游戲不顧網絡擁堵情況瘋狂發送和重傳數據, 會拖垮整個局域網或路由器的性能, 最終所有人的連接質量下降b.我們不需要實現TCP那樣復雜的擁塞控制算法, 可以實現一個輕量級, 對游戲友好的版本- 監測往返時間(RTT)的變化, 如果RTT持續變大, 說明網絡可能擁堵了, 應適當降低發送速率- 監測丟包率, 丟包率上升也是網絡擁堵的標志  

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922026.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CMap常用函數

CMap 是 MFC 中用于存儲鍵值對(key-value)的關聯容器類,類似于 C 標準庫中的 std::map,但依賴 MFC 框架實現。它采用哈希表(Hash Table)作為底層數據結構,支持高效的鍵值查找、插入和刪除操作。…

Rocky9.0去堆疊雙發arp(支持“ARP 廣播雙發”)

摘要 在去堆疊/MLAG 場景下,默認 bonding 只會以單口回復 ARP,另一臺交換機收不到 ARP Reply。本文在 Linux bonding 驅動中增加參數 arp_broadcast_mode,當開啟時對 ARP 包臨時切換到 廣播模式,實現雙口同時發 ARP Reply。文內提…

網頁連接攝像頭

攝像機處理 <!-- camera_solve.html --> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

FPGA雷達信號處理之:自適應門限閾值

一、原理 參考這個博主&#xff0c;講的很仔細&#xff1a;基于脈沖功率的雷達脈沖參數檢測原理詳解 二、FPGA實現 使用system generator搭建算法模型如下&#xff1a; 在這里&#xff0c;濾波器窗長度為8&#xff0c;原博主設置為50效果更好&#xff0c;門限公式如下&#xf…

Vue 中實現選中文本彈出彈窗的完整指南

在現代 Web 應用中&#xff0c;選中文本后顯示相關操作或信息是一種常見的交互模式。本文將詳細介紹如何在 Vue 中實現選中文本后彈出彈窗的功能&#xff0c;包括其工作原理、多種實現方式以及實際項目中的應用示例。 一、實現原理 1. 文本選中檢測機制 瀏覽器提供了 Select…

第4節-排序和限制-FETCH

摘要: 在本教程中&#xff0c;你將學習如何使用 PostgreSQL 的 FETCH 子句從查詢中檢索部分行。 PostgreSQL FETCH 簡介 在 PostgreSQL 中&#xff0c;OFFSET 子句的作用類似于 LIMIT 子句。FETCH 子句允許你限制查詢返回的行數。 LIMIT 子句并非 SQL 標準的一部分。不過&#…

洛谷 P2680 [NOIP 2015 提高組] 運輸計劃(二分答案 + 樹上差分)

題目鏈接題目概括與評價 很經典&#xff0c;突破口藏的很深&#xff0c;求最小值這里&#xff0c;是問題切入點&#xff0c;想到用二分答案&#xff0c;然后思考怎么寫 f_check 函數。二分答案樹上差分。代碼 #include <iostream> #include <vector> #include <…

接力鄧承浩,姜海榮能講好深藍汽車新故事嗎?

出品 | 何璽排版 | 葉媛深藍汽車迎來新話事人。9月5日&#xff0c;新央企長安汽車旗下品牌深藍汽車傳出新的人事調整。多家業內媒體報道稱&#xff0c;榮耀前中國區CMO姜海榮已正式加入長安汽車&#xff0c;并出任旗下深藍汽車CEO一職。原CEO鄧承浩則升任深藍汽車董事長&#x…

esp32-c3寫一個收集附近 WiFi 和藍牙信號通過

下面給你一個基于 ESP-IDF(v5.x) 的完整示例&#xff1a;在 ESP32-C3 上同時掃描附近 Wi-Fi 與藍牙&#xff08;BLE&#xff09;廣播&#xff0c;把結果以 JSON 結構統一輸出到串口&#xff0c;并且可可選通過 MQTT 上報到服務器&#xff08;打開一個宏即可&#xff09;。日志默…

文心大模型 X1.1:百度交出的“新深度思考”答卷

文心大模型 X1.1&#xff1a;百度交出的“新深度思考”答卷 2025年9月9日&#xff0c;WAVE SUMMIT 2025深度學習開發者大會在北京正式召開&#xff0c;由深度學習技術及應用國家工程研究中心主辦&#xff0c;百度飛槳與文心大模型聯合承辦。大會上&#xff0c;百度正式發布了基…

開始 ComfyUI 的 AI 繪圖之旅-Flux.1圖生圖(八)

文章標題一、Flux Kontext Dev1.關于 FLUX.1 Kontext Dev1.1 版本說明1.2 工作流說明1.3 模型下載2.Flux.1 Kontext Dev 工作流2.1 工作流及輸入圖片下載2.2 按步驟完成工作流的運行3.Flux Kontext 提示詞技巧3.1 基礎修改3.2 風格轉換3.3 角色一致性3.4 文本編輯4.常見問題解決…

Java 生成微信小程序二維碼

1. java 二維碼生成工具類import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.pdatao.api.controller.file.FileController; import com.pdatao.api.error.CommunityException; import org.apache.commons.io.IOUtils; import org.springframe…

智慧健康觸手可及:AI健康小屋——未來健康管理的全能守護者

AI健康小屋&#xff0c;這座融合人工智能、物聯網與醫療科技的“健康堡壘”&#xff0c;正悄然重構健康管理生態。它以科技為引擎&#xff0c;將專業醫療資源下沉至社區、企業、家庭&#xff0c;通過智能檢測、精準分析、個性化干預&#xff0c;實現從疾病治療到主動預防的健康…

[工作表控件19] 驗證規則實戰:如何用正則表達式規范業務輸入?

在企業應用中,數據準確性至關重要。工作表控件通過“驗證規則”能力,支持在文本字段和附件字段中使用正則表達式(RegEx)進行格式校驗。它能幫助開發者輕松實現郵箱、身份證號、車牌號、URL 等格式的高效驗證,大幅提升數據質量與表單使用體驗。 一、官方功能介紹與基礎能力…

uniapp分包實現

關于分包優化的說明 在對應平臺的配置下添加"optimization":{"subPackages":true}開啟分包優化 目前只支持mp-weixin、mp-qq、mp-baidu、mp-toutiao、mp-kuaishou的分包優化 分包優化具體邏輯&#xff1a; 靜態文件&#xff1a;分包下支持 static 等靜態…

ctfshow_web14------(PHP+switch case 穿透+SQL注入+文件讀取)

題目&#xff1a;解釋&#xff1a;$c intval($_GET[c]); //獲取整數值 6sleep($c);//延遲執行當前腳本若干秒。提示一下哈沒有break會接著執行下面的但是像是44444&#xff0c;555555,sleep的時間太久我們用3進入here_1s_your_f1ag.php是一個查詢頁面&#xff0c;sql注入查看源…

linux x86_64中打包qt

下載安裝 地址: Releases linuxdeploy/linuxdeploy mv linuxdeploy-x86_64.AppImage linuxdeployqtchmod 777 linuxdeployqtsudo mv linuxdeployqt /usr/local/bin/linuxdeployqt --version報錯 Applmage默認依賴FUSE&#xff0c;需要掛載自身為虛擬文件系統才能運行, ubuntu…

華為昇騰CANN開發實戰:算子自定義與模型壓縮技術指南

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 隨著人工智能技術的飛速發展&#xff0c;越來越多…

Vue3源碼reactivity響應式篇之reactive響應式對象的track與trigger

概覽 在BaseReactiveHandler類的get方法中&#xff0c;有如下代碼塊if (!isReadonly2){track(target, "get", key);}&#xff0c;這表示通過reactive、shallowReactive創建的響應式對象&#xff0c;非只讀的&#xff0c;當讀取代理對象proxyTarget的某個屬性key時&am…

VRRP 多節點工作原理

VRRP 多節點工作原理 基本概念 VRRP 的設計初衷是給一組節點提供一個 虛擬路由器&#xff0c;對外只表現出一個 VIP。協議規定&#xff1a;同一個 VRRP 實例 下始終只有 一個 Master 持有 VIP&#xff0c;其它全部是 Backup。 Master → 持有 VIP&#xff0c;負責轉發流量到Mas…