網絡協議UDP、TCP

  • 一、網絡協議 UDP
    • UDP用戶數據報協議:傳輸層
    • 網絡編程模型
      • B/S模型:browser/server(瀏覽器/服務器)
        • 客戶端是通用的客戶端(瀏覽器)
        • 一般只做服務器開發
        • 客戶端要加載的數據均來自服務器
      • C/S模型:client/server(客戶端/服務端)
        • 客戶端是一個專用的客戶端
        • 服務器和客戶端都需要開發
        • 客戶端可保存資源,本地加載,無需所有數據都請求服務器
    • UDP編程流程
      • 套接字:文件描述符(網絡通信時,應用層可操作的端口)
      • 發送端
        • socket:int socket(int domain, int type, int protocol
          • 功能:創建通信的套接字
          • 參數:
            • domain:網絡層使用什么協議族
              • AF_INET: IPv4
              • AF_INET6:IPv6
            • type:規定傳輸層的協議
              • SOCK_DGRAM:UDP協議
              • SOCKSTREAM:TCP協議
              • SOCKRAW:原始套接字
            • protocol:0 按照默認協議方式創建
          • 返回值:成功:套接字;失敗:-1
        • sendto:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen)
          • 功能:向網絡套接字發送數據
          • 參數:sockfd:套接字;buf:要發送的數據的首地址;len:要發送的字節數;flags:0:按照默認方式發送;dest_addr:接收方的地址信息(IP+端口號);addrlen:接收方地址的大小
          • man 7 ip
          • 返回值:成功:實際發送的字節數;失敗:-1
        • 網絡字節序:大段
        • 主機字節序:小段
        • uint3 2_t htonl(uint32_t hostlong);主機轉網絡
        • uint1 6_t htons(uint16_t hostshort);主機轉網絡
        • uint3 2_t ntohl(uint32_t hostlong);網絡轉主機
        • uint1 6_t ntohs(uint16_t hostshort);網絡轉主機
        • in_addr_t inet _addr(const char *cp);
          • 功能:將字符串IP地址轉換成二進制IP地址形式
        • char *inet _ntoa(struct in_addr in);
          • 功能:將二進制ip轉換成字符串
      • 接收端
        • bind:int bind(int sockfd, const struct sockaddr *addr.socklen_t addrlen);
          • 功能:綁定自己的IP地址和端口號
          • 參數:sockfd:套接字;addr:需要綁定的地址;adlrlen:地址大小
          • 返回值:成功:0;失敗:-1
        • recvfrom:ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen)
          • 功能:從套接字上接收數據
          • 參數:sockfd:套接字;buf:存放接收數據的內存首地址;len:希望接收的字節數;flags:0:按照默認方式接收(阻塞);src_addr:發送方的地址信息;addrlen:發送發地址的指針
          • 返回值:成功:實際接收到的字節數;失敗:-1
    • UDP特點
      • 面向數據包
      • 無需建立連接
      • 盡最大努力交付,不安全、不可靠(數據丟包、亂序)
      • 可實現一對一、一對多的傳輸
      • 機制簡單,資源開銷小,數據傳輸實時性高(VNC、直播)
    • 如何避免UDP丟包
      • 發送方以較慢的速度發送數據,讓接收端有足夠的時間處理數據
      • 模仿TCP的機制:應答機制
    • 抓包工具 wireshark
      • 網絡抓包:抓取通過設備網卡的網絡數據,從而調試和分析網絡程序
      • 使用:
        • sudo wireshark啟動抓包工具
        • 選取要抓取的網卡---》any
        • 選擇一個過濾條件
        • 開始抓取
        • 進行一次網絡通信
    • UDP報文頭部 共8字節

  • 源端口號:發送方網絡進程端口號
  • 目標端口號:接收方網絡進程端口號
  • 長度:UDP發送的報文的整體長度(UDP頭部
  • 二、網絡協議 TCP
    • TCP特點
      • 面向數據流
      • 有鏈接(通信之前必須建立鏈接)
      • 安全可靠的傳輸機制
      • 機制復雜、網絡資源開銷大
      • 本質只能實現一對一的通信(使用TCP并發方式可實現一對多通信)
    • TCP三次握手和四次揮手機制
      • 三次握手
        • TCP建立連接時,需要進行三次握手,為了確保收發雙方通信之前都已準備就緒
        • SYN:請求建立鏈接標志位
        • ACK:相應報文標志位
      • 四次揮手
        • TCP斷開連接時,需要進行四次揮手,確保斷開連接前雙方都已通信結束
        • FIN:請求斷開連接標志位
        • ACK:相應報文標志位
        • 服務端在發送ACK、FIN之間依然可以傳輸數據
    • TCP的編程流程
      • 發送端
        • connect :int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen)
          • 功能:請求與服務端建立連接
          • 參數:sockfd:套接字;addr:要連接的服務端的地址信息;addrleqn:服務端地址大小
          • 返回值:成功:0;失敗:-1
        • send :ssize_t send(int sockfd, const void *buf, size_t len, int flags)
          • 功能:發送網絡數據
          • 參數:sockfd:網絡套接字;buf:要發送的數據首地址;len:發送的字節數;flags:0:按照默認方式發送
          • 返回值:成功:實際發送的字節數;失敗:-1
      • 接收端
        • listen :int listen(int sockfd, int backlog);
          • 功能:監聽建立三次握手的客戶端
          • 參數:sockfd:監聽套接字;backlog:最大允許監聽的客戶端個數
          • 返回值:成功:0;失敗:-1
        • accept :int accept(int socket, struct sockaddr *restrict address,socklen_t *restrict address_len);
          • 功能:接收建立三次握手的客戶端,并產生一個通訊套接字
          • 參數:socket:監聽套接字;address:客戶端的地址信息;addresslen:客戶端地址長的指針
          • 返回值:成功:通訊套接字;失敗:-1
        • recv :ssize _t recv(int sockfd, void *buf, size_t len, int flags);
          • 功能:從網絡套接字上接收數據
          • 參數:sockfd:通訊套接字;buf:存放接收數據的首地址;len:期望接收到的字節數;flag:0:默認方式接收(阻塞)
          • 返回值:成功:實際接收到的字節數;失敗:-1;對方斷開連接時:0
    • TCP粘包問題
      • 發送方應用層發送的多包數據,將來在接收方可能一次讀到,多包數據產生了粘連
      • 原因:
        • 發送方速度較快,TCP底層可能對多包數據進行重新組幀
        • 接收方數據處理速度較慢,導致多包數據在接收緩沖區緩存,應用層讀時,一次將多包數據讀出
      • 解決方法
        • 調整發送速率
        • 發送指定大小,接收方接收指定大小(結構體)
          • 注意:跨平臺之間的數據傳輸時,注意結構體對齊問題
        • 應用層為發送的數據增加分隔符,利用分隔符解析
        • 封裝自定義數據幀格式進行發送(協議)

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

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

相關文章

STM32 TIM_SelectInputTrigger()函數

一、函數功能與定位?TIM_SelectInputTrigger()是STM32定時器外設的關鍵配置函數,用于設置從模式定時器的觸發源(Trigger Source)?。其核心作用是將定時器的內部事件或外部信號映射為觸發信號(TRGI),進而控…

Lecture 6 Kernels, Triton 課程筆記

本講座:基準測試/分析 編寫內核 總結 編程模型(PyTorch、Triton、PTX)與硬件之間的差距 > 性能奧秘 理解擴展的基準測試 用于理解 PyTorch 函數內部結構的分析(用內核觸底) 看 PTX 匯編,了解 CUDA 內核…

Spring Boot 整合網易163郵箱發送郵件實現找回密碼功能

在開發用戶系統時,發送郵件是一項常見需求,例如用戶忘記密碼時,通過郵箱發送驗證碼來驗證身份并重置密碼。本文將結合 Spring Boot 和 163 郵箱,演示如何實現郵件發送功能。 一、前提條件 普通用戶的 163 郵箱可以在 Spring Boot…

如何在mac玩windows游戲?3個工具推薦,不用換電腦!

Mac電腦雖然很流暢,但它也存在局限性,其中一點游戲玩家應該深有體會,那就是無法直接玩Windows專屬游戲,只能對著琳瑯滿目的游戲望眼欲穿。別急,我有辦法讓你在mac玩windows游戲,下面就來分享我的經驗。一、…

自回歸(Auto-Regressive, AR),自回歸圖像生成過程

根據論文中“**T2I Generation via Next-Token Prediction**”一節,自回歸(Auto-Regressive, AR)文本到圖像(T2I)模型的圖像生成過程可分為三個主要步驟,其原理和損失函數如下:---### &#x1f…

在mysql中,modify ,change ,rename to的作用是什么

在 MySQL 中,MODIFY、CHANGE 和 RENAME TO 都是 ALTER TABLE 語句的一部分,用于修改表的結構,但它們的作用和使用場景有所不同。1. MODIFY作用:用于修改表中現有列的定義,但不能修改列名。你可以使用 MODIFY 來更改列的…

【JVM】JVM的內存結構是怎樣的?

JVM的內存結構是Java程序運行時內存管理的核心,不同區域有明確的職責。 一、整體劃分 包括兩大部分,分為線程私有區域(隨線程創建/銷毀,無需垃圾回收)和線程共享區域(所有線程共用,需要垃圾回收管理)。 線程私有區域:程…

青少年軟件編程(python五級)等級考試試卷-客觀題(2023年12月)

更多內容和歷年真題請查看網站:【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 五級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 青少年軟件編程(python五級)等級考試試卷-客觀題(2023年12月&#xff0…

網絡編程-創建TCP協議服務器

int socket(int domain, int type, int protocol);頭文件&#xff1a; #include <sys/socket.h>#include <netinet/in.h> #include <netinet/ip.h>int skt_tcpfd;int domain;skt_tcpfdsocket(AF_INET,SOCK_STREAM,0);int bind(int sockfd, const struct soc…

ruoyi框架角色分配用戶

分配用戶&#xff0c;不要將當前正在登錄的用戶綁定。否則&#xff0c;在加入當前用戶之后&#xff0c;取消或者添加其他用戶時會被注銷當前登錄。

Java Stream常見函數與應用案例

1. Java Stream核心概念與基礎函數 1.1 Stream API的設計哲學與核心特性 Java Stream API的設計哲學源于函數式編程范式&#xff0c;其核心特性體現在數據處理模式的轉變上。與傳統集合操作相比&#xff0c;Stream API采用聲明式編程風格&#xff0c;支持鏈式調用&#xff0c;顯…

【Canvas與徽章】中國制造金色玻璃光徽章

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>中國制造金色玻璃光徽章 Draft1</title><style type"tex…

終結系統裸奔:Debian老舊版本安全加固終極指南

核心警示:Debian 8與10已結束官方支持,暴露于0day漏洞風險中。本文提供的加固方案僅為遷移前的臨時防護措施,非長久之計。 一、老舊Debian系統的致命隱患 支持狀態: Debian 8(Jessie):2018年終止安全更新 Debian 10(Buster):2024年7月結束主流支持 風險清單: 無補…

Ape.Volo項目源碼學習(1:源碼下載及運行)

Ape.Volo項目是基于 .Net 8 、SqlSugar、Vue2.x、RBAC、前后端分離開箱則用的中后臺快速開發框架&#xff0c;其使用Async/Await異步編程&#xff0c;支持CodeFirst模式、RabbitMQ/RedisMQ消息隊列、CORS 跨域配置、數據庫操作&#xff08;讀寫分離、多庫、分表&#xff09;、支…

2-4.Python 編碼基礎 - 流程控制(判斷語句、循環語句、break 語句與 continue 語句)

一、判斷語句 1、if 語句 &#xff08;1&#xff09;基本格式 if 【判斷條件】:【滿足條件時執行的代碼塊】&#xff08;2&#xff09;演示 number 10if number > 0:print("這個數是正數")# 輸出結果這個數是正數2、if - else 語句 &#xff08;1&#xff09;基本…

大模型自我進化框架SE-Agent:開啟軟件工程自動化新時代

一、引言&#xff1a;當大模型學會“自我進化” 在軟件開發領域&#xff0c;傳統模式下人類工程師面對復雜任務時&#xff0c;往往需要經歷反復調試、多輪迭代才能產出高質量代碼。而隨著大語言模型&#xff08;LLM&#xff09;的興起&#xff0c;一種名為**SE-Agent&#xff…

UE官方文檔學習 C++ TAarry 查詢(四)多種查詢方式

一.IndexofByKey 返回索引通過值&#xff0c;返回來查找鍵。二IndexOfByPredicate通過定義二元謂詞&#xff0c;來判定是否有符合謂詞判定的元素。符合條件True的&#xff0c;才返回Index。這里所謂Lamda,函數就是 把函數當作參數輸入&#xff0c;里面的參數值傳遞前加個[]。這…

根據Wireshark捕獲數據包時間和長度繪制電腦發射信號波形

下一期&#xff1a; 根據Wireshark捕獲數據包時間和長度繪制路由器發送給電腦數據的信號波形-CSDN博客 一、Wireshark采集數據 數據格式&#xff1a; 在我的另一篇博客中詳細介紹了怎么導出數據&#xff1a; Wireshark導出數據包時間和長度-CSDN博客 通過MATLAB加載數據&a…

Suno API 接入指南:快速上手與高效集成

隨著 AI 技術的發展&#xff0c;音樂生成已經逐漸成為開發者和創作者探索的新方向。Suno API 提供了一套簡潔的接口&#xff0c;讓我們能夠通過代碼快速生成音樂、歌詞&#xff0c;甚至旋律。本文將帶你從零開始&#xff0c;完成 Suno API 的接入與調用&#xff0c;并分享一些高…

React Hooks原理深潛:從「黑魔法」到「可觀測」的蛻變之旅

文章目錄【技術棧深潛計劃】React Hooks原理深潛&#xff1a;從「黑魔法」到「可觀測」的蛻變之旅一、引言&#xff1a;為什么我們需要“深潛”Hooks&#xff1f;二、基石&#xff1a;沒有JavaScript閉包&#xff0c;就沒有Hooks2.1 閉包的精簡回顧2.2 Hooks與閉包的關聯三、核…