網絡傳輸之TCP/IP協議族

我們現實網絡無處不在,我們被龐大的虛擬網絡包圍,但我們卻對它是怎樣把我們的信息傳遞并實現通信的,我們并沒有了解過,那么當我們在瀏覽器中出入一段地址,按下回車這背后都會發生什么? 比如說一般場景下,客戶機和服務器不在一個局域網,輸入的是一個域名而不是IP地址。那么當按下回車后,首先瀏覽器會通過DNS解析找到我們對應的IP地址,將http報文發送給目標IP地址對應的服務器,之后服務器做出響應,將請求的資源發送給瀏覽器。 TIP/IP在這當中扮演著重要的作用。

TCP/IP歷史

在計算機發展的早期階段,很多不同的廠商生產各種不同的計算型號,他們運行完全不同的操作系統,為了讓他們之間能夠相互通信,TCP/IP協議族誕生了。

那么為什么我們叫它協議族呢? 因為實際上TCP/IP是一組不同層次上的多個協議的組合。 那么協議組合是什么?——TCP/IP模型

TCP/IP模型

TCP/IP模型是一個四層結構,從上往下依次是應用層,運輸層(傳輸層),網絡層,網絡接口層(數據鏈路層)。 通過開頭我們輸入一個url的例子,自上而下進行介紹TIP/IP參考模型

應用層

為用戶提供各種服務,比如我們瀏覽網頁時用到的HTTP,收發郵件時用的SMTP,登錄遠程主機用的SSH或者FTP協議,DNS等協議。 假設我們對 www.xxx.com發送請求

  • 瀏覽器看到這個域名的時候,就好像去一家從沒去過的餐廳吃飯,只知道餐廳名字,卻不知道具體地址,域名就像是一個餐廳的名字,而IP地址相當于一個具體的地址。 瀏覽器必須知道要請求服務器的IP地址,發出的請求才有目的地。DNS可以將IP轉換成地址。
  • http 會生成報文 ,這個請求里面包含了請求的方法,請求的路徑“/”,請求的主機名,客戶機的類型以及一些其他的信息。

傳輸層

傳輸層位于應用層下層,網絡借口層的上層,主要有TCP和UDP兩種協議。 UDP是用戶數據報協議,不關心是否收到,不需要建立連接就可以通信,傳輸效率高,比如說微信。 而TCP是一種可靠的面向連接的協議,就是在交互數據前先建立一個TCP連接,如同打電話,首先要撥號,然后等待對方響應后才能彼此交流 TCP提供全雙工服務,即數據可在同一時間雙向傳播 TCP將若干個字節構成一個分組,此分組稱為報文段(Segment)

TCP連接的建立過程如下圖所示。

  • 三次握手
    • 主機A通過一個標識為SYN標識位的數據段發送給主機B請求連接,告訴主機B“我想和你創建一條TCP連接”。
    • 當主機B收到SYN請求后,如果其所請求的端口號正在等待連接,則會為這一條TCP連接分配資源,并主機A發送確認應答ACK和同步序列號SYNC標志位的數據段來響應主機。
    • 主機A確認收到了主機B的數據段并可以開始傳輸實際數據。
  • 四次揮手
    • 主機A發送FIN控制位發出斷開連接的請求 。
    • 主機B進行響應,確認收到斷開連接請求。
    • 主機B發送FIN控制,隨后關閉了連接。
    • 主機A收到之后,又向主機B回復一個ACK應答。過了一段計時等待,主機A也關閉了連接,釋放資源。這一段計時等待的時間是為了主機B重傳最后的ACK防止其丟失。

網絡層

在這一層中主要是 IP 協議處理數據傳輸。用于把數據從源主機經過若干個中間節點傳送到目標主機,并向傳輸層提供最基礎的數據傳輸服務。

在網絡中,每臺計算機都有一個唯一的地址,方便別人找到它,這個地址稱為IP地址。 IP協議處理過的數據擁有自己的名字:IP數據報,讓我們從下圖來了解一下IP數據報的格式:

  • 版本
    • 一個4位二進制數的標識,用來標識IP協議的版本,目前大部分的協議版本號為4,因此IP有時也稱為IPv4。
  • 首部長部
  • 優先級與服務類型
  • 總長度
    • 該字段用以指示整個IP數據包的長度,最長為65535字節,包括頭和數據 標識符
    • 唯一標識主機發送的每一份數據報
  • 標志
    • 分為3個字段,依次為保留位、不分片位和更多片位,保留位:一般被置為0 不分片位:表示該數據報是否被分片,如果被置為1,則不能對數據報進行分片,如果要對其進行分片處理,就應將其置為0 更多片位:除了最后一個分片,其他每個組成數據報的片都要將該位置設置為1.
  • 段偏移量
    • 該分片相對于原始數據報開始處位置的偏移量
  • TTL(Time to Live生存時間)
    • 該字段用于表示IP數據包的生命周期,可以防止一個數據包在網絡中無限循環地發下去。TTL的意思是一個數據包在被丟棄之前在網絡中的最大周轉時間。該數據包經過的每一個路由器都會檢查該字段中的值,當TTL的值為0時此數據包會被丟棄。TTL對應于一個數據包通過路由器的數目,一個數據包每經過一個路由器,TTL將減去1。
  • 協議號
    • 用以指示IP數據包中封裝的是哪個協議
  • 首部校驗和
    • 檢驗和是16位的錯誤檢測字段。目的主機和網絡中的每個網關都要重新計算報頭的校驗和,一樣表示沒有改動過。
  • 源IP地址
    • 該字段用于表示數據包的源地址,指的是發送該數據包的設備的網絡地址
  • 目標IP地址
    • 該字段用于表示數據包的目標的地址,指的是接收節點的網絡地址

數據鏈路層

在這一層中,上層傳來的數據經過協議處理后的一份數據,我們稱之為一幀(Frame) 在鏈路層中的地址指的的是計算機中網卡的硬件地址,即mac地址。我們知道,每一個網卡在出廠時,其內部都存有一個全世界獨一無二的硬件標識,稱為mac地址,它是的長度為6個字節。在網絡中,兩個計算機之間的通信實際上就是計算機中的兩張網卡之間的通信。如果沒有mac地址,就無法得知通信的具體位置,因此獲取mac地址是計算機通信的基礎保障。

但是實際上,計算機程序在發送連接請求時,一般只知道目的主機的IP地址,那么mac地址是如何獲取的呢?這就要靠ARP協議來實現。

ARP協議(地址解析協議)可以看做是鏈路層的一個協議,它的作用是為IP地址與對應的mac地址之間提供動態的映射,這個過程是自動完成的,因此無需用戶或管理員關心。ARP協議將IP映射為mac地址的過程大致如下:

如果目的主機與源主機位于同一網段,那么ARP協議會向本網段發送一個廣播,網段中的所有主機都會受到一條消息,這條消息詢問哪臺主機的IP地址與目的主機地址相同。當目的主機接受到這條消息,就做出應答,將自己的mac地址發送過去。其他主機則將這條消息忽略。

如果目的主機與源主機位于不同網段,那么ARP協議會將消息發送給本地的路由,路由經過IP尋址找到目的主機所在網段的路由,再由目的路由將消息廣播出去,獲得目的主機響應后再返回給源主機。

一般來說, 每臺機器都維護的有一個ARP緩存表, 存儲了近期的IP地址和硬件地址的映射關系, 可以用 arp -a 命令來查看緩存表中內容。

總結

事實上當我們http訪問一個地址的時候,從應用層開始向下傳遞,沒經過一層,該層的協議會把上層傳遞的數據在這個基礎上加一個首部,該首部包含了該層協議管理的信息,比如說網絡層會打包IP信息,數據鏈路層打包mac地址。 通過這種層層打包的方式,最后由物理層傳遞出去,再有路由器,代理服務器等設備,交給目標計算機。 目標計算機得到傳遞過來的數據后,從物理層向上傳遞,每一層會將該層對應協議負責的首部摘除后再傳給上層。最后抵達應用層對應的某個應用程序。

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

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

相關文章

(58)PHP開發

LAMP0、使用include和require命令來包含外部PHP文件。使用include_once命令,但是include和include_once命令相比的不足就是這兩個命令并不關心請求的文件是否實際存在,如果不存在,PHP解釋器就會直接忽略這個命令并且顯示一個錯誤消息&#xf…

css flexbox模型_如何將Flexbox后備添加到CSS網格

css flexbox模型I shared how to build a calendar with CSS Grid in the previous article. Today, I want to share how to build a Flexbox fallback for the same calendar. 在上一篇文章中,我分享了如何使用CSS Grid構建日歷。 今天,我想分享如何為…

python:封裝連接數據庫方法

config.py # 數據庫測試環境 name *** password ****** host_port_sid 10.**.*.**:1521/bidbuat OracleOperation.py import cx_Oracle import configclass OracleOperation(object):# 執行下面的execute_sql方法時會自動執行該初始化方法進行連接數據庫def __init__(self):…

貝塞爾修正_貝塞爾修正背后的推理:n-1

貝塞爾修正A standard deviation seems like a simple enough concept. It’s a measure of dispersion of data, and is the root of the summed differences between the mean and its data points, divided by the number of data points…minus one to correct for bias.標…

RESET MASTER和RESET SLAVE使用場景和說明【轉】

【前言】在配置主從的時候經常會用到這兩個語句,剛開始的時候還不清楚這兩個語句的使用特性和使用場景。 經過測試整理了以下文檔,希望能對大家有所幫助; 【一】RESET MASTER參數 功能說明:刪除所有的binglog日志文件,…

Kubernetes 入門(1)基本概念

1. Kubernetes簡介 作為一個目前在生產環境已經廣泛使用的開源項目 Kubernetes 被定義成一個用于自動化部署、擴容和管理容器應用的開源系統;它將一個分布式軟件的一組容器打包成一個個更容易管理和發現的邏輯單元。 Kubernetes 是希臘語『舵手』的意思&#xff0…

Python程序互斥體

Python程序互斥體 有時候我們需要程序只運行一個實例,在windows平臺下我們可以很簡單的用mutex實現這個目的。 ??在開始時,程序創建了一個命名的mutex,這個mutex可以被其他進程檢測到。 這樣如果程序已經啟動,再次運行時的進程就…

890

890 轉載于:https://www.cnblogs.com/Forever77/p/11528605.html

android 西班牙_分析西班牙足球聯賽(西甲)

android 西班牙The Spanish football league commonly known as La Liga is the first national football league in Spain, being one of the most popular professional sports leagues in the world. It was founded in 1929 and has been held every year since then with …

Goalng軟件包推薦

2019獨角獸企業重金招聘Python工程師標準>>> 前言 哈嘍大家好呀! 馬上要迎來狗年了大家是不是已經懷著過年的心情了呢? 今天筆者給大家帶來了一份禮物, Goalng的軟件包推薦, 主要總結了一下在go語言中大家開源的優秀的軟件, 大家了解之后在后續使用過程有遇到如下軟…

Kubernetes 入門(2)基本組件

1. C/S架構 Kubernetes 遵循非常傳統的客戶端服務端架構,客戶端通過 RESTful 接口或者直接使用 kubectl 與 Kubernetes 集群進行通信,這兩者在實際上并沒有太多的區別,后者也只是對 Kubernetes 提供的 RESTful API 進行封裝并提供出來。 左側…

caioj1522: [NOIP提高組2005]過河

狀態壓縮的經典題。 按照一般做法,DP一維時間O(n),顯然跑不過。考慮到石子較少,實際上有很長一段是一定可以跳到的,設兩個石頭分別在i點和j點,跳躍的路程為S到T。那么從i點可以跳到iS到iT。從j-T到j-S可以跳到J。顯然當…

Dev控件使用CheckedListBoxControl獲取items.count為0 的解決方法

CheckedListBoxControl,我使用DataSource屬性,給其綁定了一個List對象。界面顯示都挺正常的,當若干個項的復選框被選中的后,它的checkedListBoxControl1.CheckedItems也是正常的。 唯獨的問題是在代碼中得到的checkedListBoxContr…

如何啟動軟件YouTube頻道

Hi, I’m Beau and I run the freeCodeCamp.org YouTube channel. 嗨,我是Beau,我運行了freeCodeCamp.org YouTube頻道 。 For the first few years of our channel’s life, we had less than 100,000 subscribers. When we published new videos, we …

【powerdesign】從mysql數據庫導出到powerdesign,生成數據字典

使用版本powerdesign16.5,mysql 5.5,windows 64 步驟: 1.下載mysql驅動【注意 32和64的驅動都下載下來,具體原因查看第三步 依舊會報錯處】 下載地址:https://dev.mysql.com/downloads/connector/odbc/5.3.html 請下…

php amazon-s3_推薦亞馬遜電影-一種協作方法

php amazon-s3Item-based collaborative and User-based collaborative approach for recommendation system with simple coding.推薦系統的基于項目的協作和基于用戶的協作方法,編碼簡單。 推薦系統概述 (Overview of Recommendation System) There are many met…

[高精度乘法]BZOJ 1754 [Usaco2005 qua]Bull Math

模板題目&#xff0c;練練手~ #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std;int s1[2333]; int s2[2333]; int Out[2333]; string one,two;void Debug(){for(int i0;i<one.length();i){pri…

python:使用Djangorestframework編寫post和get接口

1、安裝django pip install django 2、新建一個django工程 python manage.py startproject cainiao_monitor_api 3、新建一個app python manage.py startapp monitor 4、安裝DRF pip install djangorestframework 5、編寫視圖函數 views.py from rest_framework.views import A…

Kubernetes 入門(3)集群安裝

1. kubeadm簡介 kubeadm 是 Kubernetes 官方提供的一個 CLI 工具&#xff0c;可以很方便的搭建一套符合官方最佳實踐的最小化可用集群。當我們使用 kubeadm 搭建集群時&#xff0c;集群可以通過 K8S 的一致性測試&#xff0c;并且 kubeadm 還支持其他的集群生命周期功能&#…

Angular Material 攻略 04 Icon

Icon 網頁系統中的Icon雖然說很簡單&#xff0c;但是其中的學問還是有很多的&#xff0c;我們常用的Icon庫有FontAwesome、Iconfont等&#xff0c;我們選擇了Angular Material這個組件庫&#xff0c;就介紹Material Icons吧。 對Icon感興趣的同學可以看一下這里 Material Desig…