TCP協議(20250304)

1. TCP

TCP: 傳輸控制協議(Transmission Control Protocol),傳輸層協議之一(TCP,UDP)

2. TCP與UDP

UDP(用戶數據報協議)

  • 面向數據報
  • 無連接
  • 不安全不可靠(盡最大努力交付)
  • 機制簡單,傳輸效率高

TCP(傳輸控制協議)

  1. 需要建立連接
  2. 安全、可靠
  3. 面向字節流
  4. 占用資源開銷大?

3. 三次握手

? ? ? ? 指建立tcp連接時,需要客戶端和服務端總共發送三次報文確認連接

4. 四次揮手

? ? ? ? 斷開一個tcp連接,需要客戶端和服務端發送四個報文以確認斷開?

TCP編程:基于C/S模型的socket文件進行通信

5. TCP框架設計

  • client: socket--->connect--->send/write--->close
  • server:?? ?socket--->bind--->listen--->accept---> recv/read--->close

6. 函數接口

6.1 socket

????????socket(AF_INET, SOCK_STREAM, 0);

6.2 connect

????????int connect(int sockfd, const struct sockaddr *addr,
? ? ? ? ? ? ? ? ? ?socklen_t addrlen);
功能:
????????發送三次握手鏈接請求
參數:
?? ??? ?sockfd:套接字文件描述符
?? ??? ?addr:存放目的地址空間首地址
?? ??? ?addrlen:目的地址長度
返回值:
?? ??? ?成功返回0?
?? ??? ?失敗返回-1???

6.3 send

????????ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
????????發送數據
參數:
?? ??? ?sockfd:套接字文件描述符
?? ??? ?buf:存放數據空間首地址
?? ??? ?len:數據長度
?? ??? ?flag:屬性默認為0?
返回值:
?? ??? ?成功返回發送字節數
?? ??? ?失敗返回-1???

6.4 recv

????????ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
?? ??? ?接收數據?
參數:
?? ??? ?sockfd:套接字文件描述符
?? ??? ?buf:存放數據空間首地址?
?? ??? ?len:最多接收數據長度?
?? ??? ?flags:接收屬性默認為0?
返回值:
?? ??? ?成功返回實際接收字節數
?? ??? ?失敗返回-1?
?? ??? ?連接斷開返回0?

6.5 bind

? ? ? ? int bind(int sockfd, const struct sockaddr *addr,
? ? ? ? ? ? ? ? socklen_t addrlen);

6.6 listen

? ? ? ? int listen(int sockfd, int backlog);
?? ? ?功能:
?? ??? ?監聽三次握手鏈接請求
?? ? ?參數:
?? ??? ?sockfd:套接字文件描述符
?? ??? ?backlog:最多允許等待尚未處理的三次握手鏈接個數
?? ? ?返回值:
?? ??? ?成功返回0?
?? ??? ?失敗返回-1?

6.7 accept

? ? ? ? int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
????????處理三次握手等待隊列中的第一個請求并建立一個用來通信的新套接字
參數:
????????sockfd:套接字文件描述符
????????addr:存放發送端IP地址空間首地址?
????????addrlen:想要接收的IP地址的長度?
返回值:
????????成功返回新文件描述符
????????失敗返回-1?

7. TCP粘包

TCP協議是面向字節流的協議,接收方不知道消息的界限,不知道一次提取多少數據,這就造成了粘包問題

產生原因

  • TCP發送數據時,沒有及時發走,會根據緩沖區數據的情況進行重新組包
  • TCP接收方,沒有及時讀走緩沖區數據,導致緩沖區大量數據緩存

解決方案

  • 消息定長法:對于定長的包,保證每次都按固定大小讀取即可????????// ?結構體
  • 添加消息頭:在每個數據包前添加固定長度的消息頭,消息頭中記錄數據包的長度等信息。發送方發送數據時,先發送消息頭,再發送實際數據。接收方先讀取消息頭,獲取數據包長度信息,再根據該長度讀取后續的實際數據
  • 特殊字符分隔法:在數據包之間添加特殊的分隔字符(‘\n’),發送方發送數據時,在每個數據包后加上分隔字符,接收方按分隔字符來分割數據包

8. TCP報文頭

標志位:

  • URG: 緊急指針標志, 為1時表示緊急指針有效, 該報文應該優先傳送。
  • ACK: 確認應答標志
  • PSH: ?表示發送數據,提示接收端從TCP接收緩沖區中讀走數據,為接收后續數據騰出空間
  • RST: 重置連接標志
  • SYN: 表示請求建立一個連接
  • FIN: finish標志, 表示釋放連接

滑動窗口大小:是TCP流量控制得一個手段。目的是告訴對方,本端的TCP接受緩沖區還能容納多少字節得數據,這樣對方就可以控制發送數據的速度,從而達到流量控制,16bit,因而窗口最大65535

9. TCP機制

保證可靠性的同時又要盡可能的提高性能

可靠性:

  • 三次握手和四次揮手機制
  • 應答機制:TCP將每個字節的數據都進行了編號,即為序列號。每一個ACK都帶有對應的確認序列號,保證數據不丟失的按序到達
  • 超時重傳:當發送端發送的數據在網絡中丟失時,在一定時間內沒有收到接收端的ACK,則發送端會重新發送丟失數據。
  • 流量控制:按照ACK中“窗口大小”字段控制發送端的發送速度

提高性能:

  • 滑動窗口:可以按照“窗口大小”, 一次發送多條后, 再等待應答
  • 延遲應答:當接收方處理速度很快時,可以延遲發送ACK,此時"窗口大小"會自動增大
  • 捎帶應答:搭載應用層的響應報文發送ACK

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

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

相關文章

NModbus 連接到Modbus服務器(Modbus TCP)

1、在項目中通過NuGet添加NModbus,在界面中添加一個Button。 using NModbus.Device; using NModbus; using System.Net.Sockets; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Docu…

【零基礎到精通Java合集】第十八集:多線程與并發編程-線程池與Callable/Future應用

課程標題:線程池與Callable/Future應用(15分鐘) 目標:掌握線程池的創建與管理,理解Callable任務與Future異步結果處理機制 0-1分鐘:課程引入與線程池意義 以“銀行窗口服務”類比線程池:復用固定資源(柜員)處理多任務(客戶)。說明線程池的核心價值——避免頻繁創建…

【leetcode hot 100 238】除自身以外數組的乘積

解法一:(左右乘積列表)利用索引左側所有數字的乘積和右側所有數字的乘積(即前綴與后綴)相乘得到答案。 class Solution {public int[] productExceptSelf(int[] nums) {int len nums.length;int[] L new int[len]; …

BUU44 [BJDCTF2020]ZJCTF,不過如此1 [php://filter][正則表達式get輸入數據][捕獲組反向引用][php中單雙引號]

題目: 我仿佛見到了一位故人。。。也難怪,題目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后: ......不太行,好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶?那 f…

[Web 安全] PHP 反序列化漏洞 —— POP 鏈構造思路

關注這個專欄的其他相關筆記:[Web 安全] 反序列化漏洞 - 學習筆記-CSDN博客 0x01:什么是 POP 鏈? POP 鏈(Payload On Purpose Chain)是一種利用 PHP 中的魔法方法進行多次跳轉以獲取敏感數據的技術。它通常出現在 CTF…

擴散語言模型:從圖像生成到文本創造的范式躍遷

近年來,擴散模型(Diffusion Models)在人工智能領域異軍突起,尤其在圖像生成任務中取得了令人矚目的成就,如 Stable Diffusion 等模型已成為生成高質量圖像的標桿。這種成功激發了研究者們的好奇心:擴散模型的魔力能否從視覺領域延伸至自然語言處理(NLP),為文本生成帶來…

大模型工程師學習日記(十):基于 LangChain 構建向量存儲和查詢 Qdrant

Qdrant介紹 Qdrant(讀作:quadrant /kwɑdr?nt/ n. 象限;象限儀;四分之一圓)是一個向量相似度搜索引擎。它提供了一個生產就緒的服務,具有方便的 API 來存儲、搜索和管理點 - 帶有附加載荷的向量。Qdrant專…

DeepSeek 助力 Vue3 開發:打造絲滑的網格布局(Grid Layout)

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏關注哦 💕 目錄 Deep…

deepseek、騰訊元寶deepseek R1、百度deepseekR1關系

分析與結論 區別與聯系 技術基礎與定制方向: DeepSeek官網R1版本:作為基礎版本,通常保留通用性設計,適用于廣泛的AI應用場景(如自然語言處理、數據分析等)。其優勢在于技術原生性和官方直接支持。騰訊元寶…

外貿獨立站使用wordpress模板與定制哪個SEO效果好

使用WordPress模板搭建的外貿獨立站與定制站的SEO效果,可以從以下幾個方面進行分析: 1. 內容質量是SEO的核心 內容質量確實是SEO的關鍵,無論使用模板還是定制開發,優質、相關、原創的內容都是提升排名的基礎。內容能夠解決用戶問…

Golang語法特性總結

1.認識Golang代碼特性 package main //1.包含main函數的文件就是一個main包--當前程序的包名// import "fmt" // import "time" import("fmt""time" )//3.同時包含多個包 4.強制代碼風格:函數的 { 一定和函數名在同一行,否…

AI賦能校園安全:科技助力預防與應對校園霸凌

校園本應是學生快樂學習、健康成長的地方,然而,校園霸凌卻成為威脅學生身心健康的隱形“毒瘤”。近年來,隨著人工智能(AI)技術的快速發展,AI在校園安全領域的應用逐漸成為解決校園霸凌問題的新突破口。通過…

易語言模擬真人鼠標軌跡算法 - 防止游戲檢測

一.簡介 鼠標軌跡算法是一種模擬人類鼠標操作的程序,它能夠模擬出自然而真實的鼠標移動路徑。 鼠標軌跡算法的底層實現采用C/C語言,原因在于C/C提供了高性能的執行能力和直接訪問操作系統底層資源的能力。 鼠標軌跡算法具有以下優勢: 模擬…

運營商三要素API:構建安全信任的橋梁

引言 在數字經濟時代,身份驗證已成為各類業務場景的基礎需求。運營商三要素API作為一種高效的身份核驗工具,通過對接運營商數據,實現對用戶姓名、身份證號碼、手機號碼三項關鍵信息的實時校驗,為各行業提供可靠的身份認證解決方案…

Spring Boot 與 MyBatis 版本兼容性

初接觸Spring Boot,本次使用Spring Boot版本為3.4.3,mybatis的起步依賴版本為3.0.0,在啟動時報錯,報錯代碼如下 org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name userMapper…

GCN從理論到實踐——基于PyTorch的圖卷積網絡層實現

Hi,大家好,我是半畝花海。圖卷積網絡(Graph Convolutional Network, GCN)是一種處理圖結構數據的深度學習模型。它通過聚合鄰居節點的信息來更新每個節點的特征表示,廣泛應用于社交網絡分析、推薦系統和生物信息學等領…

MyBatis-Plus 邏輯刪除實現

在很多企業級應用中,數據刪除操作通常采用 邏輯刪除 的方式,而不是物理刪除。邏輯刪除指的是通過更新字段(例如 is_deleted 或 status)來標記數據為刪除狀態,而不是真的從數據庫中刪除記錄。這樣做的好處是保留數據的歷…

STM32_IIC外設工作流程

STM32 IC 外設工作流程(基于寄存器) 在 STM32 中,IC 通信主要通過一系列寄存器控制。理解這些寄存器的作用,能夠幫助我們掌握 IC 硬件的運行機制,實現高效的數據傳輸。本文以 STM32F1(如 STM32F103&#x…

集合遍歷的多種方式

目錄 1.增強for 2.迭代器(在遍歷的過程中需要刪除元素,請使用迭代器) 3.雙列集合 4.Lambda表達式(forEach方法) 1.單列集合: 2.雙列集合: 4.Stream 流 5.普通for循環 6.列表迭代器 7.總結 1.增強for 注&…

DeepSeek在MATLAB上的部署與應用

在科技飛速發展的當下,人工智能與編程語言的融合不斷拓展著創新邊界。DeepSeek作為一款備受矚目的大語言模型,其在自然語言處理領域展現出強大的能力。而MATLAB,作為科學計算和工程領域廣泛應用的專業軟件,擁有豐富的工具包和高效…