tcp 和http 網絡知識

1. 請簡述TCP和HTTP的定義與基本概念

  • TCP:即傳輸控制協議(Transmission Control Protocol),是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。它為互聯網中的數據通信提供穩定的傳輸機制,在不可靠的IP層之上,通過確認、重傳和錯誤檢測等技術確保數據正確到達。比如在文件傳輸場景中,TCP保證文件的每個字節都能準確無誤地從源端傳輸到目的端。
  • HTTP:超文本傳輸協議(HyperText Transfer Protocol),是一個在計算機世界里專門在兩點之間傳輸文字、圖片、音頻、視頻等超文本數據的約定和規范。常見的網頁瀏覽就是基于HTTP協議,瀏覽器向服務器發送HTTP請求獲取網頁資源,服務器返回對應的HTTP響應。

2. TCP是如何保證數據的可靠性的

TCP通過多種機制保證數據可靠性:

  • 序列號與確認應答:TCP為每個發送的字節編號,接收方收到數據后,會發送ACK確認包給發送方,ACK包中包含確認號,告知發送方下一個期望接收的數據字節序號。通過這種方式,發送方可以確認數據是否被正確接收。
  • 超時重傳:發送方發送數據后會啟動一個定時器,如果在規定時間內沒有收到對應的ACK確認,就會認為數據丟失,重新發送該數據。例如,在網絡不穩定時,數據包可能丟失,超時重傳機制確保數據最終能被送達。
  • 流量控制:利用滑動窗口機制,接收方通過在ACK包中告知發送方自己的接收窗口大小(即還能接收的數據量),發送方根據接收窗口大小控制發送速率,避免發送過快導致接收方緩沖區溢出。
  • 擁塞控制:包括慢啟動、擁塞避免、快速重傳和快速恢復等算法。發送方維護一個擁塞窗口,根據網絡擁塞情況動態調整。如在網絡擁塞時,減少數據發送量,防止網絡進一步惡化。

3. 說一說TCP的三次握手過程,為什么是三次握手

三次握手是建立TCP連接的過程:

  1. 第一次握手:客戶端向服務器發送SYN(同步序列編號)包,該包中包含客戶端的初始序列號(例如x),此時客戶端進入SYN_SENT狀態,表明客戶端希望與服務器建立連接。
  2. 第二次握手:服務器接收到客戶端的SYN包后,向客戶端發送SYN - ACK包。這個包包含兩部分,一是對客戶端SYN的確認(ACK = x + 1),二是服務器自己的初始序列號(例如y),此時服務器進入SYN_RCVD狀態。
  3. 第三次握手:客戶端收到服務器的SYN - ACK包后,向服務器發送ACK包,確認收到服務器的SYN - ACK(ACK = y + 1),此時客戶端和服務器都進入ESTABLISHED狀態,連接建立成功。

TCP需要三次握手主要有兩個原因:

  • 防止舊的重復連接引起混亂:在網絡狀況復雜或較差時,發送方可能會連續發送多次建立連接請求。若只有兩次握手,接收方無法判斷請求是正常的還是過期的,可能導致錯誤連接。三次握手能讓雙方確認對方收到了自己的初始序列號,避免這種情況。
  • 同步初始化序列號:TCP需要初始化序列號保證消息順序。兩次握手無法確認序列號是否正常,四次握手則會浪費系統資源,三次握手是最優解。

4. 請闡述HTTP常見的請求方法及其區別,比如GET和POST

HTTP常見的請求方法有GET、POST、PUT、DELETE、HEAD等,其中GET和POST區別如下:

  • 語義用途
    • GET:從服務器獲取指定資源,是只讀操作。例如在瀏覽器中輸入網址訪問網頁,就是使用GET方法獲取網頁資源。
    • POST:根據請求負荷(報文body)對指定資源做出處理,通常用于新增或提交數據,如用戶注冊、表單提交數據等場景。
  • 安全性與冪等性
    • GET:從RFC規范定義看,GET方法安全且冪等。安全指不會破壞服務器資源,冪等指多次執行操作結果相同。實際開發中若用GET實現新增或刪除數據,則不具備安全和冪等性。
    • POST:因為會修改服務器資源,所以不安全,且多次提交可能創建多個資源,不冪等。但實際若用POST實現查詢數據,則安全且冪等。
  • 數據傳輸位置與可見性
    • GET:數據通過URL的查詢參數傳遞,在瀏覽器地址欄可見。例如:https://example.com/search?q=apple,其中q=apple就是查詢參數。
    • POST:數據放在請求體(body)中傳輸,瀏覽器地址欄不可見,但抓包工具可查看。
  • 緩存性
    • GET:可被緩存,瀏覽器和代理服務器(如Nginx)都能對GET請求的數據做緩存,且瀏覽器中GET請求可保存為書簽。
    • POST:大部分實現中不可緩存,瀏覽器一般不會緩存POST請求,也不能保存為書簽。

5. 當在瀏覽器中輸入一個URL并回車后,從網絡層面描述計算機做了哪些工作步驟

  1. DNS解析:瀏覽器首先檢查自身緩存,看是否有該URL對應的IP地址。若沒有,則向本地DNS服務器發送查詢請求。本地DNS服務器若緩存中有記錄,直接返回IP;沒有則向根DNS服務器、頂級域名服務器等依次查詢,最終獲取到目標URL對應的IP地址。
  2. TCP連接建立:瀏覽器獲取IP地址后,與目標服務器建立TCP連接,通過三次握手過程(客戶端發送SYN包、服務器返回SYN - ACK包、客戶端再發送ACK包),成功建立可靠連接。
  3. HTTP請求發送:TCP連接建立后,瀏覽器構建HTTP請求報文,包括請求行(如GET /index.html HTTP/1.1)、請求頭(如User - Agent、Accept等),若為POST請求還會有請求體。然后將請求報文通過TCP連接發送給服務器。
  4. 服務器處理請求與響應:服務器接收到HTTP請求后,根據請求的URL和方法,找到對應的資源或執行相應的業務邏輯。處理完成后,構建HTTP響應報文,包含狀態行(如HTTP/1.1 200 OK)、響應頭(如Content - Type、Content - Length等)和響應體(如網頁的HTML內容),并通過TCP連接返回給瀏覽器。
  5. TCP連接關閉:瀏覽器接收完響應數據后,若不需要再與服務器通信,會通過四次揮手過程關閉TCP連接(客戶端發送FIN包、服務器返回ACK包、服務器再發送FIN包、客戶端返回ACK包)。
  6. 瀏覽器渲染頁面:瀏覽器根據HTTP響應中的Content - Type等信息,對響應體中的數據進行解析和渲染。若響應內容是HTML頁面,瀏覽器會解析HTML、CSS和JavaScript,構建DOM樹,渲染頁面并展示給用戶。

6. 簡述HTTP協議的無狀態性及其帶來的問題與解決方案

  • 無狀態性定義:HTTP協議的無狀態性指服務器不保留關于客戶端的任何狀態信息。每個HTTP請求都是獨立的,服務器無法區分這是同一個客戶端的連續請求還是不同客戶端的請求。例如,用戶在一個頁面登錄后,再訪問該網站的其他頁面,服務器無法直接知道該用戶已登錄。
  • 帶來的問題:在需要跟蹤用戶狀態的應用場景中,如電商購物車、用戶登錄狀態保持等,無狀態性使得服務器難以處理。每次請求都需額外機制來識別用戶身份和狀態,增加開發復雜度。
  • 解決方案
    • Cookie:服務器在HTTP響應頭中添加Set - Cookie字段,將一些狀態信息(如用戶ID、登錄狀態標識等)發送給客戶端。客戶端收到后,在后續的HTTP請求頭中帶上Cookie字段,服務器通過解析Cookie來識別用戶狀態。
    • Session:服務器為每個客戶端分配一個唯一的Session ID,通常通過Cookie將Session ID發送給客戶端。服務器在內存或存儲中維護Session數據,客戶端每次請求時,服務器根據Session ID找到對應的Session數據,獲取用戶狀態等信息。
    • Token:常用于前后端分離的應用中。服務器驗證用戶身份后,生成一個Token(如JWT,JSON Web Token),包含用戶身份等信息,返回給客戶端。客戶端在后續請求中,將Token放在請求頭或其他位置發送給服務器,服務器通過驗證Token來確認用戶身份和權限。

7. 講講HTTP1.0和HTTP1.1的主要區別

  • 連接方式
    • HTTP1.0:只支持短連接,瀏覽器每次請求都需與服務器建立一個TCP連接,服務器完成請求處理后立即斷開TCP連接。這意味著對于包含多個資源(如多個圖片)的網頁,會頻繁建立和斷開TCP連接,增加開銷和延遲。
    • HTTP1.1:支持持久連接(默認開啟),在一個TCP連接上可傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲。一個包含許多圖像的網頁文件的多個請求和應答可在一個連接中傳輸,但每個單獨的網頁文件的請求和應答仍需使用各自的連接。通過設置Connection: Keep - Alive頭字段開啟持久連接。
  • Host字段
    • HTTP1.0:請求消息中的URL沒有傳遞主機名(hostname),因為當時認為每臺服務器都綁定一個唯一的IP地址。
    • HTTP1.1:增加了Host字段,隨著虛擬主機技術發展,一臺物理服務器上可能存在多個共享一個IP地址的虛擬主機。通過Host字段,服務器能知道客戶端請求的具體虛擬主機,如Host: www.example.com
  • 緩存處理
    • HTTP1.0:緩存功能有限,對緩存的控制不夠精細。
    • HTTP1.1:引入了更多緩存相關的字段和機制,如Cache - Control頭字段,可設置多種緩存策略,包括緩存過期時間、是否可緩存等,比HTTP1.0中簡單的Expires字段更靈活和強大。
  • 錯誤處理
    • HTTP1.0:錯誤狀態碼相對較少,對一些錯誤情況的描述不夠細致。
    • HTTP1.1:定義了更多詳細的錯誤狀態碼,如409 Conflict(表示請求與資源當前狀態沖突)、410 Gone(表示資源已永久刪除)等,能更準確地反饋服務器處理請求時遇到的問題。

8. 描述一下HTTP請求和響應的報文格式

  • HTTP請求報文格式
    • 請求行:由請求方法(如GET、POST)、請求URL和HTTP協議版本組成,例如GET /index.html HTTP/1.1
    • 請求頭:包含一系列鍵值對,用于傳遞關于客戶端環境、請求內容等信息。常見的請求頭有User - Agent(用于標識客戶端類型,如瀏覽器名稱和版本)、Accept(聲明客戶端可接受的數據類型)、Accept - Encoding(聲明可接受的壓縮方法)、Cookie(用于傳遞客戶端存儲的Cookie信息)等。每個請求頭占一行,格式為Header - Name: Header - Value
    • 空行:請求頭和請求體之間用一個空行分隔,標識請求頭結束。
    • 請求體:GET請求一般沒有請求體,POST請求時,請求體包含要提交給服務器的數據,如表單數據、JSON格式數據等。數據格式根據Content - Type頭字段指定,例如application/x - www - form - urlencoded表示表單數據,application/json表示JSON格式數據。
  • HTTP響應報文格式
    • 狀態行:由HTTP協議版本、狀態碼和狀態描述組成,例如HTTP/1.1 200 OK。狀態碼表示請求處理的結果,如200表示成功,404表示資源未找到。
    • 響應頭:同樣是一系列鍵值對,用于傳遞關于服務器環境、響應內容等信息。常見的響應頭有Content - Type(表示響應內容的數據類型,如text/html表示HTML頁面)、Content - Length(表示響應內容的長度)、Set - Cookie(用于在客戶端設置Cookie)、Cache - Control(控制緩存策略)等。
    • 空行:響應頭和響應體之間用空行分隔。
    • 響應體:包含服務器返回給客戶端的數據,如HTML頁面內容、圖片二進制數據、JSON格式的API響應數據等,具體內容根據請求的資源和服務器處理結果而定。

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

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

相關文章

MySQL安裝的多個組件中無用組件卸載

在決定卸載MySQL的哪些組件前,需根據你的實際使用場景判斷。以下是各組件的主要功能及卸載建議: 1. 核心組件卸載建議 組件名稱作用是否可卸載MySQL Server數據庫服務核心,存儲數據、處理SQL請求的核心程序。不可卸載 (卸載會導致…

CosyVoice 技術全景解析:下一代語音生成模型的革命性突破

目錄 一、CosyVoice 模型概述 1. 背景與定位 二、技術架構與創新 1. 核心架構設計 2. 關鍵技術亮點 三、行業地位與競品對比 1. 市場定位分析 2. 競爭優勢 四、部署方案與硬件成本 1. 硬件需求 2. 優化技巧 五、優勢與挑戰 1. 核心優勢 2. 主要挑戰 六、開源生態…

rabbitmq-集群部署

場景:單個pod,部署在主節點,基礎版沒有插件,進階版多了一個插件 基礎版本: --- apiVersion: v1 kind: PersistentVolume metadata:name: rabbitmq-pv spec:capacity:storage: 5GiaccessModes:- ReadWriteOncestorage…

[密碼學實戰]商用密碼產品密鑰體系架構:從服務器密碼機到動態口令系統

[密碼學實戰]商用密碼產品密鑰體系架構:從服務器密碼機到動態口令系統 關鍵詞:商用密碼、密鑰體系、服務器密碼機、金融數據密碼機、動態口令、智能密碼鑰匙 摘要:本文深度解讀商用密碼產品的核心密鑰體系架構,涵蓋服務器密碼機、金融數據密碼機、VPN產品、動態口令系統及…

【unity游戲開發入門到精通——UGUI】UI事件監聽接口

注意:考慮到UGUI的內容比較多,我將UGUI的內容分開,并全部整合放在【unity游戲開發——UGUI】專欄里,感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言1、什么是UGUI事件接口?2、想要監聽事件步驟 一、事件接口1、U…

Spark知識總結

寬窄依賴:父RDD的分區只對應下面子RDD的一個分區,為窄依賴。其余為寬依賴 維度??窄依賴??寬依賴?數據傳輸無shuffle,本地處理14需shuffle,跨節點傳輸14并行度高(允許流水線并行)57低(需等…

銘記之日(3)——4.28

銘記之日(3)——4.28 25.4.28,絕對是繼20.12.19與24.6.26之后,又一個被釘在恥辱柱上的日子。 4.28本質上為12.19的嚴重惡劣版。 道德敗壞、惡劣的大騙子終于在今日穿幫落馬。 斯文面孔下,竟藏匿了如此罪惡幽暗混沌的內心。 24.10.20&…

第16節:傳統分類模型-支持向量機(SVM)在圖像分類中的應用

一、引言 支持向量機(Support Vector Machine, SVM)作為一種經典的機器學習算法,自20世紀90年代由Vapnik等人提出以來,在模式識別和分類任務中表現出卓越的性能。 在深度學習興起之前,SVM長期占據著圖像分類領域的主導地位,即使…

《系統分析師-第三階段—總結(六)》

背景 采用三遍讀書法進行閱讀,此階段是第三遍。 過程 本篇總結第11章第12章的內容 第11章 第12章 總結 軟件架構設計是宏觀,基本架構確定之后,開始了系統化設計, 系統設計中對應的基本部分的知識較多,基礎知識是第…

new的使用

上次堆區的介紹中,我們提到了一個關鍵字new,那今天我們就詳細講講它 今天我們主要將兩個內容 1.new的基本語法 2.用new創建數組 1.new的基本語法 new,可以在堆區中創建空間,來存放數據,就比如像下面這樣 int* p new int(29);//n…

使用python實現自動化拉取壓縮包并處理流程

使用python實現自動化拉取壓縮包并處理流程 實現成果展示使用說明 實現成果展示 使用說明 執行./run.sh 腳本中的內容主要功能是: 1、從遠程服務器上下拉制定時間更新的數據 2、將數據中的zip拷貝到指定文件夾內 3、解壓后刪除所有除了lcm之外的文件 4、新建一個ou…

香橙派打包qt文件報錯“xcb 插件無法加載”與“QObject::moveToThread”線程錯誤的解決方案

PyQt 報錯總結:打包文件過程,“xcb 插件無法加載”與“QObject::moveToThread”線程錯誤的解決方案全解析 在使用 PyQt5 搭建圖形界面時,打包文件的過程中出現的問題,真難繃,搞了半天。 Qt 平臺插件 xcb 無法加載QOb…

Missashe考研日記-day29

Missashe考研日記-day29 1 專業課408 學習時間:3h學習內容: 今天先是把虛擬存儲剩余的課聽完了,然后就是做課后選擇題,57道,已經接受了OS課后題尤其多的事實了。解決并且理解完習題之后就開始預習文件管理的內容&…

【Linux】第十二章 安裝和更新軟件包

目錄 1. 什么是RPM? 2. dnf是什么,它和rpm有什么聯系和區別? 3. RHEL 中如何做才能啟用對第三方存儲庫的支持? 4. 怎么理解RHEL9中的應用流(Application Streams)和模塊(Modules)? 5. RHEL9 有兩個必要的軟件存儲…

新時代下的存儲過程開發實踐與優化

隨著現代應用系統的復雜度不斷增加,數據庫作為核心的數據存儲和處理引擎,其性能和可靠性顯得尤為重要。存儲過程(Stored Procedure)作為一種封裝在數據庫中的應用邏輯,使得開發者能夠在數據庫層面實現數據操作、數據校…

從梯度消失到百層網絡:ResNet 是如何改變深度學習成為經典的?

自AlexNet贏得2012年ImageNet競賽以來,每個新的獲勝架構通常都會增加更多層數以降低錯誤率。一段時間內,增加層數確實有效,但隨著網絡深度的增加,深度學習中一個常見的問題——梯度消失或梯度爆炸開始出現。 梯度消失問題會導致梯…

JVM——引入

什么是JVM?它與JDK、JRE的關系? JVM、JRE 和 JDK 是 Java 平臺的三個核心組件,各自承擔著不同的職責,它們之間的關系密不可分。理解它們的區別和聯系有助于更好地開發、部署和運行 Java 應用程序。對于 Java 開發者來說&#xff…

PyCharm 2023升級2024 版本

windows下把老版本卸載之后,需要把環境變量,注冊表信息刪除。 并且把C:\Users\用戶\AppData 文件夾下的 Local\JetBrains和Roaming\JetBrains 都刪除,再重新安裝 原舊項目升級的方式: 1.2023虛擬機的文件夾是venv 改為.venv…

從外賣大戰看O2O新趨勢:上門私廚平臺系統架構設計解析

京東高調進軍外賣市場,美團全力防守,兩大巨頭的競爭讓整個行業風起云涌。但在這場外賣大戰之外,一個更具潛力的細分市場正在悄然興起——上門私廚服務。 與標準化外賣不同,上門私廚提供的是個性化定制服務。廚師帶著新鮮食材上門現…

驅動開發系列53 - 一個OpenGL應用程序是如何調用到驅動廠商GL庫的

一:概述 一個 OpenGL 應用程序調用 GPU 驅動的過程,主要是通過動態鏈接庫(libGL.so)來完成的。本文從上到下梳理一下整個調用鏈,包含 GLVND、Mesa 或廠商驅動之間的關系。 二:調用關系 1. 首先一個 OpenGL 應用程序(比如游戲或圖形渲染軟件)在運行時會調用 OpenGL 提供…