【學習筆記】TCP 與 UDP

????????TCP(Transmission Control Protocol)與UDP(User Datagram Protocol)是 網絡通訊 中最基礎也最常用的兩種 傳輸層 協議。

文章目錄

      • 1. 簡介
      • 2. OSI 與 TCP/IP 模型中的定位
      • 3. 協議原理與關鍵機制
        • 3.1 UDP
        • 3.2 TCP
      • 5. 實踐:Socket 接口示例
        • C語言
        • Go語言
        • Python語言
      • 6. 調優


1. 簡介

????????TCP 是1974年由早期的NCP(Network Control Protocol)逐漸演化出來的概念。它在1980年被拆分成了現在常見的TCP與IP協議,形成經典的 TCP/IP 協議簇。后來,UDP 在 RFC 768(互聯網工程任務協會,Internet Engineering Task Force, IETF,發布的一個標準文件)中發布,用于減少延遲、適應簡單的請求或應答環境,如DNS(域名系統)。
????????90年代后,TCP 持續優化擁塞控制算法(如Tahoe、Reno、CUBIC),在萬兆與云計算場景中處于核心地位。而UDP則在實時音視頻、VoIP(基于IP的語音傳輸,一種語音通話技術)、在線游戲等領域被廣泛使用。

2. OSI 與 TCP/IP 模型中的定位

在這里插入圖片描述
TCP/IP模型將傳統的OSI理論模型簡化為4層結構,傳輸層分為TCP/UDP兩種機制。

3. 協議原理與關鍵機制

3.1 UDP

在這里插入圖片描述
【注】

  • 源/目的端口: 標識進程級別的通信端點
  • 長度: 頭部與數據總長度,最小8字節
  • 校驗和: 包含偽首部,檢驗UDP頭與數據的完整性

【機制】

  • 無握手: 發送即完成,無三次握手
  • 無重傳: 丟包不重發、無擁塞控制,由上層應用決定策略。
  • 場景: 實時音視頻、DNS查詢等。實時性要求高,應用自有可靠機制或可忽略丟包。
3.2 TCP

在這里插入圖片描述

【注】

  • 序列號 / 確認號: 實現可靠傳輸的核心,按字節計數流
  • Flags: URG,ACK,PSH,RST,SYN,FIN等,控制連接的建立,終止與數據推送。
  • 窗口大小: 流量控制的關鍵,接收方通告自己緩存區的剩余空間
  • 選項: 常見有最大報文段MSS、時間戳、窗口縮放等,用于性能優化。

【機制】

  • 三次握手(3-way Handshake):
    ? ?1. 客戶端發送SYN,選擇輸出序列號x
    ? ?2. 服務端回應 SYN+ACK,確認號 x+1,并發送自己序列號 y
    ? ?3. 客戶端再發 ACK 確認號 y+1,一切就緒

  • 四次揮手(4-way Teardown):
    ? ?1. 發起方發送 FIN。
    ? ?2. 對方 ACK。
    ? ?3. 對方再發 FIN。
    ? ?4. 原方 ACK,等待 TIME-WAIT 結束后真正釋放。

  • 重傳
    超時重傳(RTO): 基于往返時間(RTT)估算,動態調整超時重傳定時器。
    快速重傳: 連續收到 3 個相同的ACK時,立即重傳疑似丟失的報文段,而無需等待超時。

  • 擁塞控制算法
    ? ?1. 慢啟動: 指數增長擁塞窗口(cwnd),直到達到閾值
    ? ?2. 擁塞避免: 加法增大,線性增長cwnd
    ? ?3. 快速重傳與快速恢復: 檢測到丟包后,一方面減小閾值,一方面快速恢復到閾值區。
    ? ?4. CUBIC(linux默認),BBR(Google提出)等

5. 實踐:Socket 接口示例

下面以編程語言示例基礎的TCP和UDP的服務端與客戶端。

C語言
// UDP 客戶端示例:初始化并發送
int sock = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in serv;
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_port = htons(9000);
serv.sin_addr.s_addr = inet_addr("127.0.0.1");
char *msg = "Hello UDP";
sendto(sock, msg, strlen(msg), 0, (struct sockaddr*)&serv, sizeof(serv));// TCP 服務器示例:接受連接并回復
int sock = socket(AF_INET, SOCK_STREAM, 0);
bind(sock, (struct sockaddr*)&serv, sizeof(serv));
listen(sock, 5);
int conn = accept(sock, NULL, NULL);
char buf[1024];
int len = recv(conn, buf, sizeof(buf), 0);
send(conn, "Hello TCP", 9, 0);
close(conn);
Go語言
// UDP Echo 服務器
addr, _ := net.ResolveUDPAddr("udp", ":9000")
conn, _ := net.ListenUDP("udp", addr)
buf := make([]byte, 1024)
for {n, remote, _ := conn.ReadFromUDP(buf)conn.WriteToUDP(buf[:n], remote)
}// TCP 客戶端
conn, _ := net.Dial("tcp", "localhost:8000")
fmt.Fprintln(conn, "Hello TCP")
response, _ := bufio.NewReader(conn).ReadString('\n')
fmt.Println("Server replied:", response)
Python語言
# UDP 客戶端
import socket
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.sendto(b"Ping", ("localhost", 9000))
msg, _ = udp.recvfrom(1024)
print(msg)# TCP 服務器
import socket
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind(("0.0.0.0", 8000))
srv.listen(1)
conn, addr = srv.accept()
data = conn.recv(1024)
conn.sendall(b"Hello TCP")
conn.close()

6. 調優

  1. TIME_WAIT消耗: 大量短連接會產生大量的TIME_WAIT,建議啟動連接復用、長連接或HTTP/2多路復用。
  2. MTU與分片: 超大UDP報文易被分片丟棄,建議應用層自行分片與重組。
  3. Nagle算法: TCP默認啟用Nagle,合并小包,可能會增加延遲,需要根據場景選擇是否禁用。
  4. 內核緩沖區調整: 高帶寬-時延環境下,增大send/recv緩沖區以避免吞吐瓶頸。
  5. 擁塞算法: Linux默認CUBIC,若要更低時延可使用BBR。

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

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

相關文章

HikariCP 可觀測性最佳實踐

HikariCP 介紹 HikariCP 是一個高性能、輕量級的 JDBC 連接池,由 Brett Wooldridge 開發。它以“光”命名,象征快速高效。它支持多種數據庫,配置簡單,通過字節碼優化和智能管理,實現低延遲和高并發處理。它還具備自動…

Java SpringBoot 調用大模型 AI 構建智能應用實戰指南

一、基礎知識 (一)Java基礎 Java是一種廣泛使用的高級編程語言,具有簡單、面向對象、分布式、解釋型、健壯、安全、架構中立、可移植、高性能、多線程和動態等特點。在構建基于Spring Boot的AI應用之前,您需要具備扎實的Java基礎…

電路圖識圖基礎知識-降壓啟動(十五)

降壓啟動電動機控制電路 降壓啟動,是指啟動時降低加在電動機定子繞組上的電壓,待電動機啟動起來后再將電壓 恢復到額定值,使之運行在額定電壓下。降壓啟動可以減小啟動電流,從而減小線路電壓降。 傳統的降壓啟動包括定子串電阻或…

2025年大模型平臺落地實踐研究報告|附75頁PDF文件下載

本報告旨在為各行業企業在建設落地大模型平臺的過程中,提供有效的參考和指引,助力大模型更高效更有價值地規模化落地。本報告系統性梳理了大模型平臺的發展背景、歷程和現狀,結合大模型平臺的特點提出了具體的落地策略與路徑,同時…

Docker慢慢學

1、Docker DeskTop 2、N8N下載 3、Kafka docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID1 -e KAFKA_ZOOKEEPER_CONNECTzookeeper:2181 -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://localhost:9092 -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR1 con…

Java 中創建線程主要有三種方式

在 Java 中,創建線程主要有三種方式,每種方式各有特點和適用場景。以下是詳細說明和代碼示例: 1. 繼承 Thread 類 原理:自定義類繼承 Thread 并重寫 run() 方法,通過調用 start() 啟動新線程。 特點:簡單直…

ck-editor5的研究 (5):優化-頁面離開時提醒保存,順便了解一下 Editor的生命周期 和 6大編輯器類型

前言 經過前面的 4 篇內容,我們已經慢慢對 CKEditor5 熟悉起來了。這篇文章,我們就來做一個優化,順便再補幾個知識點: 當用戶離開時頁面時,提醒他保存數據了解一下 CKEditor5 的 六大編輯器類型了解一下 editor 實例對…

第42節:模型優化與部署:Web服務部署(Flask, FastAPI)

1. 引言 在現代人工智能和機器學習應用中,模型的開發只是整個流程的一部分。 將訓練好的模型有效地部署為可訪問的Web服務,使其能夠處理實際請求并返回預測結果,是模型價值實現的關鍵環節。Python生態系統提供了多種輕量級Web框架,其中Flask和FastAPI是目前最受歡迎的選擇…

LabVIEW超寬帶緊湊場測量系統

采用 LabVIEW 開發超寬帶緊湊場測量系統,實現天線方向圖、目標雷達散射截面(RCS)及天線增益的自動化測量。通過品牌硬件設備,優化系統架構,解決傳統測量系統在兼容性、數據處理效率及操作便捷性等方面的問題&#xff0…

vue2使用筆記、vue2和vue3的區別

文章目錄 vue2和vue3的區別1. 實現數據響應式的原理不同2. 生命周期不同3. vue 2.0 采用了 option 選項式 API,vue 3.0 采用了 composition 組合式 API4. 新特性編譯宏5. 父子組件間雙向數據綁定 v-model 不同6. v-for 和 v-if 優先級不同7. 使用的 diff 算法不同8.…

CSS3美化頁面元素

1. 字體 <span>標簽 字體樣式? 字體類型&#xff08;font-family&#xff09; 字體大小&#xff08;font-size&#xff09; 字體風格&#xff08;font-style&#xff09; 字體粗細&#xff08;font-weight&#xff09; 字體屬性&#xff08;font&#xff09; 2. 文本 文…

【筆記】Windows 下載并安裝 ChromeDriver

以下是 在 Windows 上下載并安裝 ChromeDriver 的筆記&#xff1a; ? Windows 下載并安裝 ChromeDriver 1?? 確認 Chrome 瀏覽器版本 打開 Chrome 瀏覽器 點擊右上角 ? → 幫助 → 關于 Google Chrome 記下版本號&#xff0c;例如&#xff1a;114.0.5735.199 2?? 下載…

工廠模式 vs 策略模式:設計模式中的 “創建者” 與 “決策者”

在日常工作里&#xff0c;需求變動或者新增功能是再常見不過的事情了。而面對這種情況時&#xff0c;那些耦合度較高的代碼就會給我們帶來不少麻煩&#xff0c;因為在這樣的代碼基礎上添加新需求往往困難重重。為了保證系統的穩定性&#xff0c;我們在添加新需求時&#xff0c;…

Java web學習路徑預覽

Java web學習路徑預覽 &#xff08;圖源&#xff1a;黑馬程序員&#xff09; 目錄 Java web學習路徑預覽 一、HTML、CSS、JS 1. HTML (HyperText Markup Language): 網頁的骨架 2. CSS (Cascading Style Sheets): 網頁的皮膚 3. JavaScript (JS): 網頁的行為 二、Ajax、…

linux、docker、git相關操作

1 linux 1.1解壓縮 1.1.1 zip zip xxx.zip file 把名為fle的文件壓縮成xxx.zip -r 遞歸壓縮&#xff1a;加上該選項才能壓縮文件夾 zip -r example_new.zip 示例集 # 新建壓縮包并命名為 example_new.zip zip -r xxx.zip file1 file2 dir1 將多個文件目錄壓成zip包 unzip fi…

Attention Is All You Need (Transformer) 以及Transformer pytorch實現

參考https://zhuanlan.zhihu.com/p/569527564 Attention Is All You Need (Transformer) 是當今深度學習初學者必讀的一篇論文。 一. Attention Is All You Need (Transformer) 論文精讀 1. 知識準備 機器翻譯&#xff0c;就是將某種語言的一段文字翻譯成另一段文字。 由…

深入淺出:Oracle 數據庫 SQL 執行計劃查看詳解(1)——基礎概念與查看方式

背景 在當今的軟件開發領域&#xff0c;盡管主流開發模式往往傾向于采用單表模式&#xff0c;力圖盡可能地減少表之間的連接操作&#xff0c;以期達到提高數據處理效率、簡化應用邏輯等目的。然而&#xff0c;對于那些已經上線運行多年的運維老系統而言&#xff0c;它們內部往…

每天掌握一個Linux命令 - fail2ban

Linux 命令工具 fail2ban 使用指南 目錄 Linux 命令工具 fail2ban 使用指南一、工具概述二、安裝方式1. 包管理器安裝&#xff08;推薦&#xff09;Debian/Ubuntu 系統CentOS/RHEL 系統Arch Linux 系統 2. 手動編譯安裝&#xff08;適用于自定義需求&#xff09; 三、核心功能四…

互聯網大廠智能體平臺體驗筆記字節扣子羅盤、阿里云百煉、百度千帆 、騰訊元器、TI-ONE平臺、云智能體開發平臺

互聯網大廠 字節扣子、阿里云百煉、百度千帆 、騰訊元器、TI-ONE平臺、云智能體開發平臺 體驗 開始動手 了解 智能體&#xff0c;發現已經落后時代太遠 光頭部互聯網大廠對開 公開的平臺就已經這么多&#xff0c;可以學習和了解&#xff0c;相關的信息 整理了對應的平臺地址…

ansible-playbook 進階 接上一章內容

1.異常中斷 做法1&#xff1a;強制正常 編寫 nginx 的 playbook 文件 01-zuofa .yml - hosts : web remote_user : root tasks : - name : create new user user : name nginx-test system yes uid 82 shell / sbin / nologin - name : test new user shell : gete…