電腦網路知識總結

来源:https://www.cnblogs.com/maxdofo/archive/2020/05/20/12927053.html
-Advertisement-
Play Games

"TCP/IP" "TCP/IP模型" "TCP三次握手與四次握手" "TCP 如何保證可靠傳輸" "HTTP協議" "基本介紹" "工作原理" "HTTP特性" "請求方法" "HTTP 狀態碼" "URL" "HTTP與HTTPS的區別" "RESTful" TCP/IP TCP/IP模型 TC ...


TCP/IP

TCP/IP模型

TCP/IP不是一個協議,而是一個協議族模型,裡面包括4個層:應用層,傳輸層,網路層與數據層(被視為OSI七層模型的簡化版)
"tcpip

HTTP,TCP,IP在網路中分屬不同的層。
應用層:HTTP,FTP,POP,SMTP等就屬於這個層。應用層主要主要向用戶提供一組應用程式,比如郵件發送,遠程登錄等

  • DNS(功能變數名稱系統)是一個將功能變數名稱和IP地址相互映射的分散式資料庫,它可以使人更方便的訪問互聯網(使用功能變數名稱),而不用記住IP數串。
  • HTTP(超文本傳輸協議)是互聯網上應用最廣泛的協議,所有萬維網的文件必須遵守該協議。設計HTTP最初的目的是為了傳輸和接收HTML頁面。


傳輸層:TCP和UDP屬於這個層,該層用於提供兩個節點間的數據傳輸。

  • TCP:
    • 面向連接(需要手動建立連接,確保連接通暢才會傳輸,網路設備會預留資源以確保連接通暢,通信完成後釋放連接)
    • TCP連接只能有兩個端點,因此TCP連接只能一對一。
    • TCP提供可靠傳輸:不重覆,不丟失,無錯序。(面向連接協議中發送端和接收端都會記錄發送和接收的狀態)
  • UDP:
    • 無連接(不需要事先建立連接,接收方也不會確認,無法提供可靠傳輸)
    • UDP沒有阻塞控制,因此網路儘管出現阻塞也不會降低傳輸速率。
    • UDP支持一對多,多對多,一對一,多對一的傳輸。
    • UDP提供最大努力傳輸:不保證數據可以成功傳送(無連接的數據包每次發送的狀態彼此之間獨立,不記錄)

無連接的優點:速度快(沒有阻塞控制,也省了許多保證可靠傳輸的機制);可以實現多對一,一對多,多對多(面向連接的需要多個獨立連接才能做到);且無連接是實現面向連接的基礎(IP是無連接的,它是構建TCP/IP的基礎)

網路層:IP屬於這個層。網路層包括地址管理與路由選擇,它決定數據通過什麼路徑來到達另一端。在這層數據被稱為數據包。

網路介面層:通常包括操作系統中的設備驅動程式和電腦中對應的網路介面卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理介面細節。

TCP三次握手與四次握手

三次握手目的是建立可靠的連接。這三次是確認雙方都能正確發送並接收對方信息的最小次數。
"three"
第一次握手:客戶端發送帶有SYN標誌的數據包到服務端,服務端可以由此確認自己正常接收了數據,也可以確認客戶端正確發送了數據。但客戶端無法確認任何事。
第二次握手,服務端發送帶有SYN/ACK標誌的數據包到客戶端,證明瞭自己發送數據功能正常。客戶端知道了自己接收發送功能都正常,也知道了服務端接收發送都正常,但服務端不知道客戶端的接收功能是否正常,也不知道自己的發送功能是否正常
第三次握手,客戶端發送帶有ACK標誌給服務端,至此雙方都確認了自己和對方接收、發送功能正常,連接正式建立。

SYN是客戶端到服務端的確認標誌;而ACK是反過來的確認標誌。在TCP連接中,兩者互相發送信息必須都無誤才行。

之所以是三次握手而不是兩次握手,主要原因是:如果客戶端之前發了一個SYN,但是滯留在網路中沒有傳到服務端。如果只有兩次握手,那麼服務端之後如果收到這個過時請求不會再向客戶端確認,而是直接建立連接,那麼會白白浪費資源。

斷開一個TCP連接需要四次揮手
"four"
第一次揮手:客戶端發送帶FIN標誌的數據包給服務端,告訴服務端客戶端已停止傳送數據。
第二次揮手:服務端發回客戶端ACK,併進入CLOSE_WAIT狀態,表示知道了。此時從客戶端到服務端的傳輸通道關閉。(但反向通道沒有關閉,於是此時連接處於半關閉狀態)
第三次揮手:等到服務端的數據發送完畢後,它會再給客戶端發一個FIN。
第四次揮手:客戶端收到後返給服務端ACK,服務端收到後正式關閉通道。而客戶端需要等待一段時間後再進入CLOSE狀態。

之所以服務端不能在接收到ACK後立刻返回FIN,是因為終止數據傳輸的指令是上層應用層下達的,客戶端只能終結自己這邊的傳輸通道,而服務端的數據可能還沒有傳完。

最後,當客戶端最終發給服務端ACK之後並不是馬上CLOSE,而是等一段時間(通常是報文最大壽命時間),有兩個原因:

  • 第一,因為它需要確認服務端收到了ACK之後才會正式關閉。如果服務端沒有收到ACK的話會重新發送給客戶端FIN,然後客戶端會再發一次ACK,並重新計時。
  • 第二,它可以消滅所有殘留的報文。這也是規避掉可能有滯留在網路的過時報文進入新的請求的情況。

TCP 如何保證可靠傳輸

  1. 應用數據被分割成TCP認為最適合發送的數據塊。
  2. TCP給發送的每一個包進行編號,接收方對數據包進行排序,把有序數據傳送給應用層。
  3. 校驗和:TCP 將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP 將丟棄這個報文段和不確認收到此報文段。
    TCP 的接收端會丟棄重覆的數據。
  4. 流量控制:TCP連接的每一方都有固定大小的緩衝空間,TCP的接收端只允許發送端發送接收端緩衝區能接納的數據。當接收方來不及處理髮送方的數據,能提示發送方降低發送的速率,防止包丟失。TCP 使用的流量控制協議是可變大小的滑動視窗協議。 (TCP 利用滑動視窗實現流量控制)
  5. 擁塞控制:當網路擁塞時,減少數據的發送。
  6. 停止等待協議:也是為了實現可靠傳輸的,它的基本原理就是每發完一個分組就停止發送,等待對方確認。在收到確認後再發下一個分組。
  7. 超時重傳: 當TCP發出一個報文段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。

HTTP協議

基本介紹

HTTP 是一個客戶端終端和伺服器端請求和應答的標準,是基於TCP/IP之上的應用層協議。通過使用瀏覽器、網路爬蟲等工具,客戶端發起了一個請求到伺服器上指定埠,我們稱這個客戶端為用戶代理程式。應答的伺服器上會存儲一些資源,我們稱這個應答伺服器為源伺服器。在用戶代理和源伺服器之間有很多中間層,比如代理伺服器、網關、隧道等。

工作原理

  1. 客戶端(通常是瀏覽器)通過DNS查找到功能變數名稱對應的IP地址。
  2. 根據IP地址,HTTP客戶端與Web伺服器的HTTP埠(預設為80)建立一個TCP連接。
  3. 通過TCP連接,客戶端發送一個HTTP請求報文。
  4. 伺服器接收請求,根據提供的參數,cookies等信息再生成HTTP響應,並將資源副本(通常是HTML)寫到TCP套接字,由客戶端讀取。
  5. 釋放TCP連接
  6. 客戶端瀏覽器解析HTML內容。

例如:在瀏覽器地址欄輸入一個url,回車後所經歷的流程如下:

  1. 瀏覽器向DNS伺服器請求解析該url中對應的IP地址。
  2. 解析到IP地址後,根據IP地址和埠號,和對應伺服器建立TCP連接。
  3. 瀏覽器發出讀取文件(URL中功能變數名稱後面部分)的HTTP請求。該請求報文作為TCP三次握手的第三個報文的數據發送給伺服器。
  4. 伺服器對瀏覽器請求做出響應,並把對應的html文本發送給瀏覽器。
  5. 釋放TCP連接
  6. 瀏覽器解析並顯示html內容。

HTTP特性

  1. 基於請求-響應模式
    HTTP協議規定,請求由客戶端發出,然後伺服器端進行響應。如果客戶端沒有請求,伺服器端也不會響應。
  2. 無狀態
    HTTP協議自身不對請求和響應之間的通信狀態進行保存。也就是說,如果該事務後續處理要求前邊的信息,則必須要重新傳輸。這樣的好處時當每個事務是獨立的時,它的響應速度會很快,但也意味著如果事務間有聯繫的話則需要傳入重覆的數據。對此引入cookies技術,該技術可以保持一個狀態(比如用戶登錄了網站,但是他跳轉的同時需要保持登錄狀態)。
  3. 無連接
    無連接意味著伺服器一次鏈接處理一個請求,當完成響應並且得到客戶端應答後即斷開。採用這種方式可以節省傳輸時間,並且提高併發性能。

請求方法

HTTP定義了八種方法來操作指定的資源:

  1. GET:請求指定的資源,並返回實體本體。
  2. HEAD:也是請求指定資源,但不會返回具體內容,用於獲取報頭。
  3. POST:向指定資源提交數據。(這個請求可能會導致新資源的創建或者舊資源的修改)
  4. PUT:向指定資源位置上傳其最新內容。
  5. DELETE:請求伺服器刪除指定的數據。
  6. TRACE:回顯服務請求,用於測試診斷。
  7. OPTION: 這個方法可使伺服器傳回該資源所支持的所有HTTP請求方法,允許客戶端查看伺服器是否正常運行。
  8. HTTP/1.1協議中預留給能夠將連接改為管道方式的代理伺服器。

HTTP 狀態碼

1xxx(信息):請求已伺服器接收,繼續處理。
2xxx(成功):請求已被伺服器成功接收,理解。
3xxx(重定向):需要後續操作。
4xxx(客戶端錯誤):請求無法實現。
5xxx(伺服器錯誤):伺服器在實現某個正常請求時出現問題

常見狀態碼:
200 OK: 請求成功
301 Moved permanently:永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。今後任何新的請求都應使用新的URI代替
400 Bad request:請求有語法錯誤,伺服器無法理解
402 Unauthorized:請求要求用戶的身份認證
403 Forbidden:伺服器理解請求客戶端的請求,但是拒絕執行此請求
404 Not Found:伺服器無法根據客戶端的請求找到資源(網頁)。
500 Internal Server Error:伺服器內部錯誤,無法完成請求

URL

URL,全稱是Uniform Resource Locator, 中文叫統一資源定位符,是互聯網上用來標識某一處資源的地址。
以下是一個url應有的格式:
http://www.mmm.com:80/max?name=max&age=26#first

  1. http表示協議;
  2. www.mmm.com表示功能變數名稱部分(也可以直接使用IP地址)
  3. :80是一個埠部分,如果省略的話則使用預設埠。
  4. /max表示虛擬路徑部分,從第一個/開始到?為止,包括目錄與文件名。
  5. ?開始之後表示參數部分,有兩種方法設置參數:
  6. 到最後是錨部分(不是必須的)

HTTP與HTTPS的區別

HTTP以明文形式在瀏覽器和伺服器之間傳遞信息,不提供加密。如果攻擊者截取了報文,則可以直接竊取信息。

HTTPS則在HTTP的基礎上添加了SSL加密協議。SSL依靠證書來驗證伺服器的身份,並且為客戶端與服務端的通信提供加密。HTTPS協議更安全,但是在握手時也更耗時。

RESTful

什麼是REST?
Representation State Transfer:表現層狀態轉化。
表現層意思是“資源的表現方法”,比如文本的表現方法是txt文件,圖片的表現方法是jpg等。而狀態轉化的意思是“通過某種手段讓伺服器發生變化”。這種手段就是HTTP協議操作。綜上所述,REST的意思是:

  1. Resources:使用URL定位資源。
  2. Representation:在客戶端與服務端,傳遞資源的表現層
  3. State Transfer:使用4個HTTP動詞(GET,POST,PUT,DELETE)對伺服器進行操作。

REST是網路中client與server之間的交互風格,REST本身不實用,實用的是如何寫出RESTful的API。

  1. URI使用名詞而不是動詞,且名詞最好是複數。
  2. 具體動詞使用HTTP的操作符GET,POST等
  3. 使用HTTP status code 來傳遞狀態信息,比如404什麼的。
  4. 傳遞資源的某種表現形式(比如json,html,jpg等)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 仿阿裡雲的錯誤提示 dialog - 您當前的會話已超時,請重新登錄。 ...
  • 輸出Map 申請單號<span>[[${listMain.REQ_CODE}]]</span> 輸出List<Map> <tr th:each="listD, listDStat : ${listDetail}"> <td th:text="${listDStat.count}"></td> <td ...
  • 使用 akka 實現,服務註冊、發現、心跳 消息類: package org.examplecase class RegisterWorkerInfo(id: String, cpu: Int, ram: Int);case class WorkerInfo(val id: String, val ...
  • 3.字元型 字元型常見的方法如下所示: capitalize():字元串第一個英文單詞首字母大寫 title():如字元串有多個英文單詞,則每個單詞首字母大寫 split():對字元串指定的分隔符進行拆分,預設為空格符 find():返回匹配到的字元第一次出現的位置索引,找不到返回 1 replac ...
  • 簡介 最近花了兩天時間研究使用Flutter開發一個抖音國際版. 先上圖,個人感覺使用Flutter開發app快得不要不要的額. 兩天就基本可以開發個大概出來. 最主要是熱更新,太方便實時調整UI佈局了. 相應速度極快. 功能介紹 Flutter開發安卓、IOS app確實方便,還有熱更新可以實時查 ...
  • 2.Python數據類型 對於任何一種編程語言的學習,需要打好入門的基礎知識,在Python中常見的基礎知識有 基本數據類型 、 條件語句 、 迴圈語句 和 函數 ,更深層次需要掌握面向對象的知識。今天我們先來瞭解學習一下基礎知識,在Python常見的基本數據類型如下所示: 2.1 基本數據類型 2 ...
  • 從今天開始,我們開始溫習Python吧。 1.變數 1.1 變數定義 變數是編程中最基本的存儲單位,將會暫時存儲你放進去的數據。示意圖如下所示: 在Python中,定義一個變數並完成賦值非常簡單,如下所示: Python中的變數無需事先聲明變數數據類型,在運行時會自動根據變數值進行自行推斷 1.2 ...
  • 1 簡介 單元測試是保證代碼質量的重要一環,而如何衡量單元測試寫得好不好呢? 是一個重要指標。而 則是專門為 提供的用於檢測測試覆蓋率的工具,英文全稱為 。 本文將講解如何在 項目中整合 ,併在 中展示。 的安裝可以參考這篇文章: 《 "Docker搭建代碼檢測平臺SonarQube並檢測maven ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...