【Java ee初階】網絡原理

TCP協議

1.確認應答 實現可靠傳輸的核心機制

2.超時重傳 實現可靠傳輸的核心機制

3.連接管理 網絡部分最高頻的面試題

4.滑動窗口 提高傳輸效率的機制

5.流量控制 依據接收方的處理能力,限制發送方的發送速度。

6.擁塞控制 依據傳輸鏈路的處理能力,限制發送方的發送速度。

做實驗

1.先從比較小的窗口開始 慢啟動

2.指數增長

3.達到閾值,線性增長

4.遇到丟包,重新設定閾值,把窗口大小設為閾值的大小,繼續線性增長

TCP核心機制

核心機制七:延時應答

為了提高傳輸效率。

承接滑動窗口,讓傳輸效率提高一些。讓窗口盡量大一些(在可靠性的前提下)

不立即返回 ack,而是稍微等一等。接收方應用程序,就是消費者。 為了給接收方留出一些時間 好能夠多消費一些,接收緩沖區的剩余空間更大一點。

核心機制八 捎帶應答

網絡通信中,經常是“一問一答”的模型

客戶端發起request,服務器返回response (不是ack.....)

核心機制九:面向字節流

讀取/寫入的時候,讀寫操作有很多種方式,非常靈活。

讀100字節,

1. 一次讀10字節,10次完成

2. 一次讀20字節,5次完成

3. 一次讀50字節,2次完成 ……

因此引起了粘包問題

接收方用的時候 去掉報頭,把載荷內容放到一個 接收緩沖區中

接收方的應用程序,read的時候,就有很多種read的可能性

read的可能性:

1) a a a b b b c c c

2) aa ab bb cc c

3) aaa bbb ccc

4) aaab bbcc c

5) aa abb bcc c ......

取決于應用程序的代碼是咋寫的

具體怎樣來讀,才能確保讀到的是一個“完整的應用層數據包”?

粘包,粘的是應用層的數據包。

TCP字節流的特性,收到多個TCP數據報的時候把所有的載荷都給混到一起 放到接收緩沖區里?

包的邊界比較模糊,就好像“粘上了”一樣

解決粘包,從應用層入手,合理的設計應用層協議,讓包之間的邊界,能夠比較清晰

1. 通過特殊的分隔符,來作為包邊界的區分

比如,約定,每個應用層數據包,都以;為結尾

包的數據里面,不能包含分隔符

需要找合適的符號,確保這個符號在正文中不會重復出現

再比如,之前寫的回顯服務器當時是使用 \n 作為分隔符的(空白符)

讀到空白符就結束了。 空白符是統稱,包括不限于: 空格,換行,回車,制表符,分頁符,垂直制表符……

發請求的時候,使用 \n 作為結束標記的

由于是通過控制臺來進行輸入請求內容的

控制臺里輸入的內容本來就不會包含 \n

即使ascii碼表中,也有不少的字符,可以用來作為分隔符

有一些特殊的“不可見字符” 歷史遺留

2. 在應用層數據包開頭的地方,通過固定長度,約定整個應用層數據包的長度

應用程序read的時候,先固定read 2字節,看看2字節里的內容是啥 => 發現是3

接下來再read 3字節,讀到的aaa就是完整的應用層數據包

粘包問題只針對字節流的傳輸。對于文件操作,(使用文件存儲多個結構化數據...也是可能涉及到粘包的)

比如,通過文件,保存若干個學生信息。

class Student { name id age classId ... }

比如約定成,每個學生信息占一行(使用 \n 作為結束標記,作為分隔符)

對于UDP來說,不存在粘包問題,UDP的接收緩沖區和TCP的不太一樣

應用層不需要做區分

應用程序每次調用 recv 得到但就是一個完整的 DatagramPacket

也就對應一個完整的應用層數據包了。

未來實際開發中,很多時候是基于一些現成的框架/庫進行開發的

(很可能粘包問題已經被框架/庫幫我們解決了)

知名的框架和庫,都是“通用的”

核心機制十 異常情況

1. 進程崩潰 [正常的流程]

進程崩潰,意味著對應的文件描述符就被關閉了(調用close,干掉進程)。

只要是進程退出,都會釋放PCB,釋放文件描述符表

TCP的連接并沒有因為進程的結束立即結束,保留一會

觸發FIN

2. 主機關機 (正常流程)

正常流程下的主機關機,就會先殺死所有的進程

此時也會觸發FIN,進而進入四次揮手

有可能揮不完

如果關機的速度比較慢,有很大可能四次揮手揮完了

如果關機的速度比較快,剛發FIN,機器就關了

對端可以正常返回ack,也會繼續正常發送FIN,這里的FIN就沒有收到ack,嘗試重傳幾次FIN. 還是沒有ack,對端就直接放棄連接(刪除之前保存的對端信息)

四次揮手,如果揮完了, 雙方可以確認,雙方都能順利把保存的信息刪掉, 如果揮不完,至少自己可以把保存的信息刪掉, 對端就不管了 此時對端關機了,內存的數據全沒了

3. 主機掉電(直接拔電源)

直接啥都沒了

來不及發起FIN 臺式機

1) 如果掉電的一方是接收方,對方是發送方。

對方繼續發送數據,沒有ack=> 超時重傳 => 仍然沒有ack => 繼續超時重傳

達到一定程度,掉電方仍然沒有ack,發送方發送一個復位報文,就是表示要重置連接

放棄當前的連接

2) 如果掉電的一方是發送方,對方是接收方。

接收方感受到的是,發送方,突然停下了

接收方會繼續阻塞等待,等待發送方發來新的數據

心跳包。

接收方會周期性的和發送方交換“心跳包”

A給B發一個無業務數據的報文

B給A返回一個ack 如果對方有應答,就可以認為對方是正常工作的。

如果心跳包也沒有應答,就可以認為,對方掛了

如果發現心跳包沒有,就可以單方面的釋放連接了

這個機制非常重要,尤其是分布式系統中

分布式系統中,知道某個節點存活,非常重要的

4. 網線斷開

本質上和主機掉電是一樣的.

網線斷開的兩端,一個是發送方,一個是接收方 對于發送方來說,沒有ack => 超時重傳 => 仍然沒有ack => 超時重傳 => 達到一定程度,放棄連接

對于接收方來說,周期性觸發心跳包 => 發現對端下線 => 放棄連接

1. 確認應答 2. 超時重傳 3. 連接管理(三次握手,四次揮手) 4. 滑動窗口(快速重傳) 5. 流量控制 6. 擁塞控制 7. 延時應答 8. 捎帶應答 9. 面向字節流(粘包問題) 10. 異常情況(心跳包)

TCP有連接,可靠傳輸,面向字節流

還有一系列的機制……十個機制?

大部分情況優先考慮TCP

UDP無連接,不可靠傳輸,面向數據報 UDP傳輸效率高

機房內部的傳輸,不太會丟包,效率要求更高 還有的場景,既需要可靠性(不需要那么嚴格的可靠性),又需要效率(比TCP更高)

用UDP實現可靠傳輸(經典面試)

其實是在考察 TCP 基于UDP,在應用層,自己寫代碼,實現可靠傳輸.... 參考TCP的做法。

1) 確認應答 序號/確認序號 2) 超時重傳 3) 滑動窗口 4) 流量控制,擁塞控制 ……?

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

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

相關文章

B站取關腳本

個人的賬號可能被盜了,發現關注數量蹦到3000多,然后b站沒有一鍵取關的按鈕,并且對api的訪問有速度限制,然后網上的腳本很多都已經失效了,所以自己稍微寫個簡陋的 測試時間: 2025.05.11 使用步驟: 進入b站的關注頁面…

PyGame游戲開發(含源碼+演示視頻+開結題報告+設計文檔)

前言: 大二小學期python課上基于pygame做的一個游戲小demo,當時老師花了一天講解了下python基礎語法后(也是整個大學四年唯一學習python的時間),便讓我們自學網課一周然后交項目,所以做的非常倉促&#xff…

使用 React 實現語音識別并轉換功能

在現代 Web 開發中,語音識別技術的應用越來越廣泛。它為用戶提供了更加便捷、自然的交互方式,例如語音輸入、語音指令等。本文將介紹如何使用 React 實現一個簡單的語音識別并轉換的功能。 功能概述 我們要實現的功能是一個語音識別測試頁面&#xff0…

C++ 雙峰高斯函數擬合

C 雙峰高斯函數擬合 一維高斯函數二維高斯函數多維高斯函數一維雙峰高斯函數代碼實現 二維雙峰高斯函數代碼實現 多維多峰高斯函數 在數據分析與清洗中經常遇到這樣的數據:數據不僅僅向單個中心靠攏,而是類似分段的向兩個甚至多個中心靠攏。數據向單個中…

【RP2350】香瓜樹莓派RP2350之LED

本文最后修改時間:2025年05月10日 01:57 一、本節簡介 本節以樹莓派pico2開發板為例,舉例如何寫一個LED驅動加進工程里。 二、實驗平臺 1、硬件平臺 1)樹莓派pico2開發板 ①樹莓派pico2開發板(作為仿真器) ②micr…

機器人運動控制原理淺析-UC Berkeley超視覺模態模型

加州伯克利發布的超視覺多感知模態融合(FuSe, Fuse Heterogeneous Sensory Data)模型,基于視覺、觸覺、聽覺、本體及語言等模態,利用自然語言跨模態對齊(Cross-Modal Grounding)優調視覺語言動作等通用模型,提高模型任務成功率。 總體框架 …

【Bootstrap V4系列】學習入門教程之 組件-媒體對象(Media object)

Bootstrap V4系列 學習入門教程之 組件-媒體對象(Media object) 媒體對象(Media object)一、Example二、Nesting 嵌套三、Alignment 對齊四、Order 順序五、Media list 媒體列表 媒體對象(Media object) B…

解決VirtualBox中虛擬機(ubuntu)與主機(windows)之間互相復制粘貼(文本)

一.開始的設置 1.在VirtualBox中打開設置,常規中修改主機與虛擬機交互設置 2.虛擬機關閉狀態下,存儲中選中控制器SATA,勾選‘使用主機輸入輸出’ 3.選中操作系統對應的虛擬文件,.vdi文件,勾選右邊的固態驅動器。 4.啟…

java 多核,多線程,分布式 并發編程的現狀 :從本身的jdk ,到 spring ,到其它第三方。

Java 在多核、多線程和高性能編程領域提供了豐富的現成框架和工具,既有標準庫中的并發組件,也有第三方框架。以下是一些關鍵框架及其應用場景的總結:便于后面我們站在巨人的肩膀上,繼續前行 一、Java 標準庫中的多線程框架 Execut…

Nodejs核心機制

文章目錄 前言 前言 結合 Node.js 的核心機制進行說明: 解釋事件循環的各個階段。 答案 Node.js 事件循環分為 6 個階段,按順序執行: Timers:執行 setTimeout 和 setInterval 的回調。 Pending I/O Callbacks:處理系…

C++筆記6:數字字面量后綴和前綴總結

在C中,可以在數字字面量后面添加字母后綴(或前綴)來表示特定的數據類型。這些后綴能夠明確指定字面量的類型,避免類型轉換帶來的潛在問題。以下是常見的幾種類型后綴及其含義: 1. 整數后綴 u 或 U:表示 u…

50.輻射抗擾RS和傳導抗擾CS測試環境和干擾特征分析

輻射抗擾RS和傳到抗擾CS測試環境和干擾特征分析 1. 輻射抗擾RS2. 傳導抗擾CS 1. 輻射抗擾RS 輻射抗擾RS考察對外界電磁場干擾得抗擾能力,測試頻段為80MHz~2000MHz,用1KHz得正弦波進行調幅,在電波暗室內進行。測試標準:IEC 61000-…

Java多態詳解

Java多態詳解 什么是多態? 比如我們說:“駕駛一輛車”,有人開的是自行車,有人開的是摩托車,有人開的是汽車。雖然我們都說“開車”,但“怎么開”是由具體的車類型決定的:“開”是統一的動作&a…

問題及解決01-面板無法隨著窗口的放大而放大

在MATLAB的App Designer中,默認情況下,組件的位置是固定的,不會隨著父容器的大小變化而改變。問題圖如下圖所示。 解決: 為了讓Panel面板能夠隨著UIFigure父容器一起縮放,需要使用布局管理器,我利用 MATLA…

【GESP真題解析】第 20 集 GESP 二級 2025 年 3 月編程題 2:時間跨越

大家好,我是莫小特。 這篇文章給大家分享 GESP 二級 2025 年 3 月編程題第 2 題:時間跨越。 題目鏈接 洛谷鏈接:B4260 時間跨越 一、完成輸入 根據題意,輸入包含五行,每行一個正整數,分別代表 y,m,d,h,k。 注意到數據范圍:對于全部數據,保證有 2000≤y≤3000,1≤m≤…

GTS-400 系列運動控制器板卡介紹(二十一)---電子齒輪跟隨

運動控制器函數庫的使用 運動控制器驅動程序、dll 文件、例程、Demo 等相關文件請通過固高科技官網下載,網 址為:www.googoltech.com.cn/pro_view-3.html 1 Windows 系統下動態鏈接庫的使用 在 Windows 系統下使用運動控制器,首先要安裝驅動程序。在安裝前需要提前下載運動…

軟件工程之需求分析涉及的圖與工具

需求分析與規格說明書是一項十分艱巨復雜的工作。用戶與分析員之間需要溝通的內容非常的多,在雙方交流信息的過程中很容易出現誤解或遺漏,也可能存在二義性。如何才能更加準確的表達雙方的意思,且清楚明了,繪制各類圖形就顯得非常…

藍橋杯14屆 數三角

問題描述 小明在二維坐標系中放置了 n 個點,他想在其中選出一個包含三個點的子集,這三個點能組成三角形。然而這樣的方案太多了,他決定只選擇那些可以組成等腰三角形的方案。請幫他計算出一共有多少種選法可以組成等腰三角形? 輸…

在Fiddler中添加自定義HTTP方法列并高亮顯示

在Fiddler中添加自定義HTTP方法列并高亮顯示 Fiddler 是一款強大的 Web 調試代理工具,允許開發者檢查和操作 HTTP 流量。一個常見需求是自定義 Web Sessions 列表,添加顯示 HTTP 方法(GET、POST 等)的列,并通過顏色區…

數據庫分庫分表實戰指南:從原理到落地

1. 為什么要分庫分表? 1.1 單庫瓶頸表現 存儲瓶頸:單表數據超過5000萬行,查詢性能急劇下降性能瓶頸:單庫QPS超過5000后響應延遲顯著增加可用性風險:單點故障導致全系統不可用 1.2 突破性優勢 --------------------…