網絡-深入理解TCP/IP協議

深入理解TCP/IP協議

1、TCP/IP協議的概念

先看看百度的定義:

TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協議/網際協議)是指能夠在多個不同網絡間實現信息傳輸的協議簇。TCP/IP協議不僅僅指的是TCP 和IP兩個協議,而是指一個由FTP、SMTP、TCP、UDP、IP等協議構成的協議簇, 只是因爲在TCP/IP協議中TCP協議和IP協議最具代表性,所以被稱爲TCP/IP協議
在這裏插入圖片描述

TCP/IP 協議是互聯網相關各類協議族的總稱。那麼TCP/IP 協議具體包括了哪些協議呢?

協議名 全名 含義
TCP 傳輸控制協議(Transmission Control Protocol) TCP 用於從應用程序到網絡的數據傳輸控制。TCP 負責在數據傳送之前將它們分割爲 IP 包,然後在它們到達的時候將它們重組。(分割、重組)
IP 網際協議(Internet Protocol) IP 負責計算機之間的通信。IP 負責在因特網上發送和接收數據包。
HTTP 超文本傳輸協議(Hyper Text Transfer Protocol) HTTP 負責 web 服務器與 web 瀏覽器之間的通信。HTTP 用於從 web 客戶端(瀏覽器)向 web 服務器發送請求,並從 web 服務器向 web 客戶端返回內容(網頁)。
HTTPS 安全的 HTTP(Secure HTTP) HTTPS 負責在 web 服務器和 web 瀏覽器之間的安全通信。作爲有代表性的應用,HTTPS 會用於處理信用卡交易和其他的敏感數據。
SSL 安全套接字層(Secure Sockets Layer) SSL 協議用於爲安全數據傳輸加密數據。
SMTP 簡易郵件傳輸協議(Simple Mail Transfer Protocol) SMTP 用於電子郵件的傳輸。
MIME 多用途因特網郵件擴展(Multi-purpose Internet Mail Extensions) MIME 協議使 SMTP 有能力通過 TCP/IP 網絡傳輸多媒體文件,包括聲音、視頻和二進制數據。
IMAP 因特網消息訪問協議(Internet Message Access Protocol) IMAP 用於存儲和取回電子郵件。
POP 郵局協議(Post Office Protocol) POP 用於從電子郵件服務器向個人電腦下載電子郵件。
FTP 文件傳輸協議(File Transfer Protocol) FTP 負責計算機之間的文件傳輸。
NTP 網絡時間協議(Network Time Protocol) NTP 用於在計算機之間同步時間(鍾)。
DHCP 簡單網絡管理協議(Simple Network Management Protocol) DHCP 用於向網絡中的計算機分配動態 IP 地址。
SNMP 簡單網絡管理協議(Simple Network Management Protocol) SNMP 用於計算機網絡的管理。
LDAP 輕量級的目錄訪問協議(Lightweight Directory Access Protocol) LDAP 用於從因特網蒐集關於用戶和電子郵件地址的信息。
ICMP 因特網消息控制協議(Internet Control Message Protocol) ICMP 負責網絡中的錯誤處理。
ARP 地址解析協議(Address Resolution Protocol) ARP - 用於通過 IP 來查找基於 IP 地址的計算機網卡的硬件地址。(IP-MAC)
RARP 反向地址轉換協議(Reverse Address Resolution Protocol) RARP 用於通過 IP 查找基於硬件地址的計算機網卡的 IP 地址。(MAC-IP)
BOOTP 自舉協議(Boot Protocol) BOOTP 用於從網絡啓動計算機。
PPTP 點對點隧道協議(Point to Point Tunneling Protocol) PPTP 用於私人網絡之間的連接(隧道)。

2、TCP/IP的分層管理

TCP/IP協議裏最重要的一點就是分層。TCP/IP協議族按層次分別爲 ,物理層、數據鏈路層、網絡層、傳輸層、應用層(從下到上)。當然也有按不同的模型分爲4層或者7層的。採用分層結構,有利於對應用程序的設計和修改。

在這裏插入圖片描述

1. 物理層

電腦要組網,就必須通過光纜、電纜、雙絞線、無線電波等方式將電腦連起來。這一操作就是物理層的主要任務。它主要規定了網絡的一些電氣特性,作用是負責傳送0和1的電信號

在這裏插入圖片描述

2. 數據鏈路層

物理層是負責傳送0和1的電信號,那電信號要怎麼傳呢?總不能一個一個傳吧,各個廠家都有自己的一套方法,而其中佔據主導的是以太網電信號分組方式

以太網規定,一組電信號構成一個數據包,叫做"幀"(Frame)。每一幀分成兩個部分:標頭(Head)和數據(Data)。

在這裏插入圖片描述

①"標頭"包含數據包的一些說明項,比如發送者接收者、數據類型等等;"標頭"的長度,固定爲18字節。

②"數據"則是數據包的具體內容。"數據"的長度,最短爲46字節,最長爲1500字節。

因此,整個"幀"最短爲64字節,最長爲1518字節。如果數據很長,就必須分割成多個幀進行發送。

MAC地址

發送者和接收者是如何知道對方就是對的人?難道也確認過眼神?

以太網規定,連入網絡的所有設備,都必須具有"網卡"接口。數據包必須是從一塊網卡,傳送到另一塊網卡。網卡的地址,就是數據包的發送地址和接收地址,這叫做MAC地址。

在這裏插入圖片描述

每塊網卡出廠的時候,都有一個全世界獨一無二的MAC地址,長度是48個二進制位,通常用12個十六進制數表示。

在這裏插入圖片描述

前6個十六進制數是廠商編號,後6個是該廠商的網卡流水號。有了MAC地址,就可以定位網卡和數據包的路徑了。

有了網卡地址,那發送者也不知道接收者的網卡地址是多少,那要怎麼發送呢?這就要用到廣播的方式了。

廣播

一塊網卡是不知道另一塊網卡的MAC地址的,但是以太網數據包必須知道接收方的MAC地址,然後才能發送。

有了MAC地址,系統怎樣才能把數據包準確送到接收方?

以太網採用了一種很"原始"的方式,它不是把數據包準確送到接收方,而是向本網絡內(子網內)所有計算機發送,讓每臺計算機自己判斷,是否爲接收方。
在這裏插入圖片描述

1號計算機向2號計算機發送一個數據包,同一個子網絡的3號、4號、5號計算機都會收到這個包。它們讀取這個包的"標頭",找到接收方的MAC地址,然後與自身的MAC地址相比較,如果兩者相同,就接受這個包,做進一步處理,否則就丟棄這個包。這種發送方式就叫做"廣播"(broadcasting)。

有了數據包的定義網卡的MAC地址廣播的發送方式,數據包就可以準確的在鏈路層上進行多臺計算機之間的傳輸了。

3. 網絡層

廣播的對象是同一個子網內的所有主機。如果兩臺計算機不在同一個子網絡,廣播是傳不過去的。但是互聯網是無數子網絡共同組成的一個巨型網絡,必須找到一種方法,能夠區分哪些MAC地址屬於同一個子網絡,哪些不是。如果是同一個子網絡,就採用廣播方式發送,否則就採用"路由"方式發送。

在這裏插入圖片描述

網絡層的作用是引進一套新的地址,使得我們能夠區分不同的計算機是否屬於同一個子網絡。這套地址就叫做"網絡地址",簡稱"網址"。

"網絡層"出現以後,每臺計算機有了兩種地址,一種是MAC地址,另一種是網絡地址(IP地址)。

網絡地址幫助我們確定計算機所在的子網絡,MAC地址則將數據包送到該子網絡中的目標網卡。

必定是先處理網絡地址,然後再處理MAC地址。【先判斷是不是同一個子網絡,是的話再發送廣播數據包】

IP協議

規定網絡地址的協議,叫做IP協議。它所定義的地址,就被稱爲IP地址

目前,廣泛採用的是IP協議第四版,簡稱IPv4。這個版本規定,網絡地址由32個二進制位(8個二進制轉成一個十進制(0~255),即4個十進制數)組成。

4. 傳輸層

IP地址能判斷兩臺主機是不是處於同一個子網,MAC地址能保證處於同一子網的不同主機進行數據傳輸。也就是有了MAC地址和IP地址,我們就可以在互聯網上任意兩臺主機上建立通信。

同一臺主機上有許多程序都需要用到網絡,比如,你一邊瀏覽網頁,一邊與朋友在線聊天。當一個數據包從互聯網上發來的時候,你怎麼知道,它是表示網頁的內容,還是表示在線聊天的內容?

這時,就需要加入一位小夥伴,即端口(port)表示這個數據包到底供哪個程序(進程)使用

每個數據包都發到主機的特定端口,所以不同的程序就能取到自己所需要的數據。

端口065535之間的一個整數,正好16個二進制位。**0到1023的端口被系統佔用,用戶只能選用大於1023的端口。**不管是瀏覽網頁還是在線聊天,應用程序會隨機選用一個端口,用來接收從互聯網上發來的包。

傳輸層的功能,就是建立"端口到端口"的通信。網絡層的功能是建立"主機到主機"的通信。只要確定主機和端口,我們就能實現程序之間的交流。

Unix系統把主機+端口,叫做"套接字"(socket)

UDP協議

爲了在數據包中加入端口信息,就需要新的協議,制定關於端口的協議。

UDP協議,它的格式幾乎就是在數據前面,加上端口號。

UDP數據包,也是由"標頭"和"數據"兩部分組成。

在這裏插入圖片描述

"標頭"部分主要定義了發送端口和接收端口,"數據"部分就是具體的內容。

把整個UDP數據包放入IP數據包的"數據"部分,再把IP數據包放在以太網數據包之中的,所以整個以太網數據包現在變成了下面這樣:

在這裏插入圖片描述

UDP數據包非常簡單,"標頭"部分一共只有8個字節,總長度不超過65535字節,正好放進一個IP數據包。

TCP協議

UDP協議的優點是比較簡單,容易實現。缺點是可靠性較差,一旦數據包發出,無法知道對方是否收到。而TCP協議可以看作是有確認機制的UDP協議

每發出一個數據包都要求確認,如果有一個數據包遺失,就收不到確認,發出方就知道有必要重發這個數據包了。(沒說收到就再發一次)

TCP協議能夠確保數據不會遺失。它的缺點是過程複雜、實現困難、消耗較多的資源。

5. 應用層(會話層、表示層、應用層)

在7層模型中,應用層包括會話層、表示層、應用層。

應用程序收到傳輸層的數據,就要對其解讀。應用層的作用,就是規定應用程序的數據格式。

TCP協議可以爲各種各樣的程序傳遞數據,比如Email、WWW、FTP等等。那麼,必須有不同協議規定電子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了應用層。

這是最高的一層,直接面對用戶。它的數據就放在TCP數據包的數據部分。

在這裏插入圖片描述

3、從用戶角度理解TCP/IP的分層管理

**總的來說,網絡通信就是交換數據包。**電腦A向電腦B發送一個數據包,後者收到了,回覆一個數據包,從而實現兩臺電腦之間的通信。

在這裏插入圖片描述
發送一個數據包,必須要對方的MAC地址、 對方的IP地址,有了這兩個地址,數據包才能準確送到接收者手中。

MAC地址有侷限性,如果兩臺電腦不在同一個子網絡,就無法知道對方的MAC地址,必須通過網關(gateway)轉發。

在這裏插入圖片描述

1號電腦要向4號電腦發送一個數據包,它先判斷4號電腦是否在同一個子網絡,結果發現不是,於是就把這個數據包發到網關A。網關A通過路由協議,發現4號電腦位於子網絡B,又把數據包發給網關B,網關B再轉發到4號電腦。而1號電腦把數據包發到網關A,必須知道網關A的MAC地址,由於1號電腦和網關A是屬於同一個子網的,故可以通過廣播的方式將數據包準確發送到網關A。

發送數據包之前,電腦必須根據IP地址判斷對方是否在同一個子網絡,然後選擇相應的MAC地址。

1. 配置靜態IP地址(專業用戶)

在這裏插入圖片描述

配置靜態IP地址必須要知道:本機IP地址、子網掩碼、網關地址的IP地址、DNS的IP地址,缺一不可。

2. 配置動態IP地址(普通用戶)

動態IP地址,指計算機開機後,會自動分配到一個IP地址,不用人爲設定。它使用的協議叫做DHCP協議。

這個協議規定,每一個子網絡中,有一臺計算機負責管理本網絡的所有IP地址,它叫做"DHCP服務器"。新的計算機加入網絡,必須向"DHCP服務器"發送一個"DHCP請求"數據包,申請IP地址和相關的網絡參數。

如果兩臺計算機在同一個子網絡,必須知道對方的MAC地址和IP地址,才能發送數據包。但是,新加入的計算機不知道這兩個地址,怎麼發送數據包呢?

DHCP協議

DHCP協議是一種應用層協議,建立在UDP協議之上。

在這裏插入圖片描述

請求:新加入子網的計算機向"DHCP服務器"發送一個"DHCP請求"數據包
1、最前面的"以太網標頭",設置發送方(本機)的MAC地址和接收方(DHCP服務器)的MAC地址。本機的MAC地址是已知的,DHCP服務器的MAC地址不知道,先用廣播地址:FF-FF-FF-FF-FF-FF代替。
2、後面的"IP標頭",設置發送方的IP地址和接收方的IP地址。對於本機而言,兩個都不知道,故先設置發送方的IP地址就爲0.0.0.0,接收方的IP地址爲255.255.255.255。
3、最後的"UDP標頭",設置本機的的端口和DHCP服務器的端口。這一部分是DHCP協議規定好的,本機是68端口,DHCP服務器是67端口。
由上述規則可以看出,數據包是由本機MAC地址+0.0.0.0+68發送到FF-FF-FF-FF-FF-FF+255.255.255.255+67。
由於以太網是廣播發送,同一個子網絡的每臺計算機都收到了這個包。因爲接收方的MAC地址是FF-FF-FF-FF-FF-FF`,看不出是發給誰的,所以每臺收到這個包的計算機,還必須分析這個包的IP地址,才能確定是不是發給自己的。當看到發出方IP地址是0.0.0.0,接收方是255.255.255.255,於是DHCP服務器知道"這個包是發給我的",而其他計算機就可以丟棄這個包。

應答:DHCP服務器在收到"DHCP請求"後,發送一個"DHCP響應"給新入網的計算機。
DHCP服務器讀出這個包的數據內容,分配好IP地址,發送回去一個"DHCP響應"數據包。這個響應包的結構也是類似的,以太網標頭的MAC地址是雙方的網卡地址,IP標頭的IP地址是DHCP服務器的IP地址(發送方)和255.255.255.255(接收方),UDP標頭的端口是67(發送方)和68(接收方),分配給請求端的IP地址和本網絡的具體參數則包含在Data部分。
新加入的計算機收到這個響應包,於是就知道了自己的IP地址、子網掩碼、網關地址、DNS服務器等等參數。

DNS協議

發送數據包,必須要知道對方的IP地址。若只知道網址www.baidu.com,不知道它的IP地址,DNS協議可以幫助我們,將這個網址轉換成IP地址。【域名轉換爲IP地址,也叫正向解析

4、TCP與UDP的區別

TCP和UDP 都是傳輸層協議

img

面向報文:應用層交給UDP多長的報文,UDP就發送多長的報文,即一次發送一個報文。因此,應用程序必須選擇合適大小的報文。【來多少發多少】

面向字節流:雖然應用程序和TCP的交互是一次一個數據塊(大小不等),但TCP把應用程序看成是一連串的無結構的字節流。TCP有一個緩衝,當應用程序傳送的數據塊太長,TCP就可以把它劃分短一些再傳送。【來太多,分開發】

5、TCP的三次握手與四次揮手

客戶端和服務端之間的通信

在這裏插入圖片描述

如果有大量的連接,每次在連接,關閉都要經歷三次握手、四次揮手,這顯然會造成性能低下。因此。http 有一種叫做長連接(keepalive connections)的機制。它可以在傳輸數據後仍保持連接,當客戶端需要再次獲取數據時,直接使用剛剛空閒下來的連接而無需再次握手。

img

6、常見問題解答:

在理解以下問答時,可結合三次握手和四次揮手的表格理解。

6.1爲什麼要三次握手,而不是兩次握手?

答:爲了防止失效的連接請求被服務端接收到,導致服務端回覆一個ack確認報文段,由於是兩次握手,客戶端和服務端此時已經建立連接,且客戶端確認了服務端能收到數據包,就一直髮送數據包給服務端。但是服務端未收到來自客戶端的ack確認報文段,就會忽略客戶端發送的數據包,一直等待客戶端發送ack報文段。這就浪費了服務端的連接。

通俗一點理解三次握手和兩次握手: 場景:A和B微信聊天
三次握手:
①A:你好,有空嗎?
②B:有空,你有空嘛?
③A:我也有空。
到目前爲止兩個人都確認了對方現在有空,所以就巴拉巴拉的講事情(通信)。

兩次握手:
①A:你好,有空嗎?
②B:有空。
這時,只能確定B有空,而A不一定有空。此時A和B也巴拉巴拉的講事情。

這就會存在一個問題,如果A發第一條信息,信號不好,B沒收到,然後A發第二條信息,這時B回覆收到了。由於是兩次握手,這時就已經建立了連接,然後A和B講完事情就沒聯繫了。這時,之前延遲的A的信息,終於發到B的微信上了,這時B回覆收到,那麼就會再次建立連接,但是問題來了,此時A不在線,那麼B就一直等,B的連接資源就浪費了。

6.2 爲什麼要四次揮手?三次揮手行不行?

答:在關閉連接時,若只有三次揮手,即當服務器發送fin報文段給客戶端時,服務端就關閉了連接。若該fin報文段在網絡中丟失,服務端不能重發fin報文段,而此時客戶端又處於FIN_WAIT_1狀態,客戶端沒收到服務端的關閉請求,就一直等,導致客戶端無法關閉連接。故需要四次握手,讓客戶端能確認服務端也沒數據包要發送了,確認服務端發送了關閉請求過來,這時服務端關閉後,客戶端才關閉。

6.3 爲什麼要處於TIME-WAIT狀態,等待 2MSL?

答:因爲當客戶端收到服務端發來的fin報文段,客戶端回覆了服務端後就直接進入CLOSED狀態,而不是TIME-WAIT狀態。此時若該回復丟失,那麼服務端就會再次發來fin報文段,但是由於客戶端已經關閉,那服務端就永遠都關閉不了了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章