TCP的相關性質

文章目錄

  • 流量控制
  • 擁塞控制
    • 擁塞窗口
  • 延遲應答
  • 捎帶應答
  • 面向字節流
  • 粘包問題
  • TCP的異常

流量控制

由于接收端處理數據的速度是有限的,如果發送端發的太快,那么接收端的緩沖區就可能會滿。此時如果發送端還發數據,就會出現丟包現象,并且可能出現一系列連鎖反應。

所以TCP支持根據接收端的處理能力去決定發送端的發送速度,這種機制就叫做流量控制

  1. 接收端會將自己的緩沖區大小,也就是報頭中的窗口大小告知給發送端,發送端根據情況改變發送速度
  2. 窗口大小越大,說明網絡的吞吐量就越高

擁塞控制

雖然TCP有滑動窗口這個機制可以高效可靠的發送大量數據,但是如果在剛開始的時候就發送了大量的數據就仍然可能出現問題

因此TCP在防止出現擁塞問題上加入了慢啟動機制

顧名思義就是先發送少量的數據區探探路,摸清當前的網絡擁堵情況,再決定應該按照多快的速度去傳輸數據

少量的丟包, TCP僅僅是觸發超時重傳; 大量的丟包, TCP就認為網絡擁塞。

TCP通信開始后, 網絡吞吐量會逐漸上升; 隨著網絡發生擁堵, 吞吐量會立刻下降.

所以擁塞控制, 歸根結底是TCP協議想盡可能快的把數據傳輸給對方, 但是又要避免給網絡造成太大壓力的折中方案

擁塞窗口

此處就又引入一個概念—擁塞窗口

  1. 在通信開始前,擁塞窗口設為1
  2. 每收到一個ACK應答時,擁塞窗口加1
  3. 每次發送數據包時,都將擁塞窗口和報頭中的窗口大小做比較,之后取較小的值作為實際發送的窗口大小

這樣做就可以很符合慢啟動機制,一開始的窗口大小就會呈指數型的增長,到后面就會慢下來呈線性增長,這種就相當于給了一個閾值,沒超過這個值時就可以增長的快一點,一旦超過就慢下來

因此可以將這個閾值一開始啟動時候就設為窗口大小的最大值,每次超過這個值那么TCP就會觸發重發機制,這時候每一次觸發重發都將這個閾值減少一半,同時擁塞窗口置為1

這樣就可以很好的控制住擁塞

延遲應答

如果接收數據的主機立刻返回ACK應答,這時候返回的窗口可能比較小。因為可能會出現應答一發出就有數據被讀取了,那緩沖區就又大一點了,但是應答沒有能夠及時知道

又因為窗口越大,網絡吞吐量就越大,傳輸效率就越高。最終的目標是在保證網絡不擁塞的情況下盡量提高傳輸效率。因此就可以引入延遲應答的機制。

另外還有利用到TCP的應答機制原理,只要將該序號的數據應答回去,那么就說明該序號前的所有數據都已經收到了。所以延遲的時間就可以取在超時重發的時間前。

捎帶應答

在很多情況下,兩端主機都是一發一收的模式在通信,也就是說客戶端給服務端發送數據,服務端也會回一個數據給客戶端。那這個時候搭配著延遲應答,服務端可以在這段時間內將之前處理完的數據。等到服務端發送應答了,一并這數據帶走發送,這樣就可以省下一步,這就是捎帶應答

面向字節流

TCP是以字節流的方式去讀寫的。

在創建TCP的套接字時,操作系統內核會同時創建一個發送緩沖區和一個接收緩沖區

  1. 調用write時, 數據會先寫入發送緩沖區中;
  2. 如果發送的字節數太長, 會被拆分成多個TCP的數據包發出;
  3. 如果發送的字節數太短, 就會先在緩沖區里等待, 等到緩沖區長度差不多了, 或者其他合適的時機發送出去;接收數據的時候, 數據也是從網卡驅動程序到達內核的接收緩沖區;
  4. 然后應用程序可以調用read從接收緩沖區拿數據;

另外TCP的一個連接, 既有發送緩沖區, 也有接收緩沖區, 那么對于這一個連接, 既可以讀數據, 也可以寫數據. 這個概念叫做 全雙工

由于緩沖區的存在,TCP的讀和寫就不需要一一匹配了,只需要讀寫到指定的字節數就可以

粘包問題

因為字節流的原因,就可能會出現讀取一個數據沒讀完或者讀多了讀了別的數據

因此為了解決這種粘包問題可以采用幾種方案

  1. 定長讀寫,指定字節數
  2. 利用分隔符分隔數據
  3. 約定報頭的位置,在報頭里加上有效載荷的字節數

TCP的異常

  1. 進程終止:進程終止會釋放文件描述符,仍然可以發送FIN和正常關閉沒有什么區別。
  2. 機器重啟:和進程終止的情況相同。
  3. 機器掉電/網線斷開:接收端認為連接還在,一旦接收端有寫入操作,接收端發現連接已經不在了,就會進行reset(重置連接)。即使沒有寫入操作,TCP自己也內置了一個保活定時器,會定期詢問對方是否還在,如果對方不在也會把連接釋放

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

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

相關文章

輕量級自動化測試框架WebZ

一、什么是WebZ WebZ是我用Python寫的“關鍵字驅動”的自動化測試框架,基于WebDriver。 設計該框架的初衷是:用自動化測試讓測試人員從一些簡單卻重復的測試中解放出來。之所以用“關鍵字驅動”模式是因為我覺得這樣能讓測試人員(測試執行人員…

【Sklearn】基于線性判別法的數據分類預測(Excel可直接替換數據)

【Sklearn】基于線性判別法的數據分類預測(Excel可直接替換數據) 1.模型原理2.模型參數3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果1.模型原理 線性判別分析(Linear Discriminant Analysis,簡稱LDA)是一種經典的模式識別和分類方法,它的目標是找到一個投影,將…

Linux系列講解 —— FTP協議的應用

簡單介紹一下FTP文件傳輸協議在linux系統中的應用。 目錄 0. 基本概念1. FTP Server1.1 安裝FTP Server1.2 FTP Server開啟和關閉1.3 查看FTP Server是否開啟1.4 FTP服務器配置 2. FTP Client2.1 lftp2.2 ftp2.3 sftp2.4 文件資源管理器集成的ftp和sftp 3. ftp常用命令 0. 基本…

IDE的下載和使用

IDE 文章目錄 IDEJETBRAIN JETBRAIN 官網下載對應的ide 激活方式 dxm的電腦已經把這個腳本下載下來了,腳本是macjihuo 以后就不用買了

Neo4j之SET基礎

在 Neo4j 中,SET 語句用于更新節點或關系的屬性。它允許你修改節點或關系的屬性值,可以單獨使用,也可以與其他查詢語句(如 MATCH、CREATE、MERGE 等)一起使用。以下是一些使用 SET 語句的常見例子,以及它們…

深入源碼分析kubernetes informer機制(四)DeltaFIFO

[閱讀指南] 這是該系列第四篇 基于kubernetes 1.27 stage版本 為了方便閱讀,后續所有代碼均省略了錯誤處理及與關注邏輯無關的部分。 文章目錄 client-go中的存儲結構DeltaFIFOdelta索引 keyqueue push操作delta push 去重 queue pop操作 總結 client-go中的存儲結構…

設計模式

本文主要介紹設計模式的主要設計原則和常用設計模式。 一、UML畫圖 1.類圖 2.時序圖 二、設計模式原則 1.單一職責原則 就是一個方法、一個類只做一件事; 2.開閉原則 就是軟件的設計應該對拓展開放,對修改關閉,這在java中體現最明顯的就…

什么是A股交易接口_(股票交易c接口)開發原理

A股交易接口是指用于與國內的證券交易所(上海證券交易所和深圳證券交易所)進行股票買賣交易的電子接口或軟件系統。A股交易接口是金融機構、券商以及個人投資者的必備掌握操作技能之一,它提供了實時的股票行情、交易下單、撤單、查詢賬戶信息…

基于Hadoop的表級監管

現狀 大數據平臺中,采用hadoop的方式存儲數據,hdfs本質上是文件系統,而文件系統對數據的監管能力有限,但是數據安全領域問題日漸凸顯,現目前,大數據平臺一般以分層結構進行授權,但是對于一線開發人員而言,是能夠接觸到整個大數據平臺中的所有表的,那么如何實現這樣一…

yum install/update排除特定/某些包方式

1 什么是 yum? yum 代表 “Yellowdog Updater, Modified”。Yum 是用于 rpm 系統的自動更新程序和包安裝/卸載器。 它在安裝包時自動解決依賴關系。 2 什么是 rpm? rpm 代表 “Red Hat Package Manager”,它是一款用于 Red Hat 系統的功能…

PB:庫管理函數

庫管理函數 1、LibraryCreate() 功 能:創建一個空的PowerBuilder應用庫,并可根據需要在創建應用庫的同時添加庫注解。 語 法:LibraryCreate ( libraryname{, comments } ) 參 數:libraryname:string類型,指定要創建應用庫的名稱,可以帶上路徑,不帶路徑時在當前目…

Docker本地鏡像發布到阿里云

1. 本地鏡像發布到阿里云 2. 鏡像的生成方法 OPTIONS說明: -a :提交的鏡像作者; -m :提交時的說明文字; 本次案例centosubuntu兩個,當堂講解一個,家庭作業一個,請大家務必動手,親自實操。 docke…

Gradio部署應用到服務器不能正常訪問

用Gradio部署一個基于ChatGLM-6B的應用,發布到團隊的服務器上(局域網,公網不能訪問),我將gradio應用發布到服務器的9001端口 import gradio as gr with gr.Blocks() as demo:......demo.queue().launch(server_port90…

ad+硬件每日學習十個知識點(34)23.8.14 (DCDC詳細設計,續流二極管的選擇,COMP引腳的環路設計)

文章目錄 1.二極管的rrm電壓和rms電壓有什么不同2.DCDC續流二極管的選擇3.充電電容4.COMP引腳的環路設計5.DCDC設計總結6.多路并聯7.相位匹配8.工作模式9.低溫輸出偏離10.電源負載與效率11.降壓升壓模塊 1.二極管的rrm電壓和rms電壓有什么不同 答: 二極管的 RRM &a…

redis主從復制、哨兵服務、持久化、數據類型

Top NSD DBA DAY10 案例1:配置主從復制案例2:配置帶驗證的主從復制案例3:哨兵服務案例4:使用RDB文件恢復數據案例5:AOF案例6:字符類型案例7:列表類型案例8:散列類型案例9&#xff…

Linux交叉編譯opencv并移植ARM端

Linux交叉編譯opencv并移植ARM端 - 知乎 一、安裝交叉編譯器 目標平臺為arm7l,此為32位ARM架構,要安裝合適的編譯器 sudo apt install arm-linux-gnueabihf-gcc sudo apt install arm-linux-gnueabihf-g注意:64位ARM架構的編譯器與32位ARM架…

【MyBatis】查詢數據庫

目錄 一、什么是MyBatis 二、MyBatis框架的搭建 1、搭建MyBatis框架 2、設置MyBaits項目的配置 三、使用MyBatis完成數據庫的操作 1、MyBatis程序中sql語句的即時執行和預編譯 1.1、即時執行(${}) 1.2、預編譯(#{}) 1.3、即…

tomcat設置PermSize

最近tomcat老是報錯,查看了日志出現PermGen 內存不夠用,重啟tomcat后查詢使用情況 通過啟動參數發現沒有設置 PermGen,繼續通過jmap查看 jmap -heap 21179 發現99%已使用,而且默認是30.5M,太小了,這里設置成256M 1. 創建setenv.sh文件 在/usr/local/tomcat/bin目錄下創建一個…

解鎖編程的新契機:深入探討Kotlin Symbol Processor (KSP)的編寫

解鎖編程的新契機:深入探討Kotlin Symbol Processor (KSP)的編寫 1. 引言 隨著軟件開發領域的不斷發展,新的工具和技術不斷涌現,以滿足開發者在構建高效、可維護和創新性的代碼方面的需求。Kotlin Symbol Processor(KSP&#xf…

從零開始,快速打造租車服務小程序的分享

隨著移動互聯網的發展,小程序成為了企業推廣和服務的重要手段之一。租車服務行業也不例外,通過打造一款租車服務小程序,企業可以更好地與用戶進行互動和交流,提供更方便快捷的租車服務。本文將介紹如何利用第三方制作平臺/工具快速…