Network 【TCP/IP 四层模型】
?????? 信號的傳輸總要符合一定的協議(protocol)。比如說長城上放狼煙,是因為人們已經預先設定好狼煙這個物理信號代表了“敵人入侵”這一抽象信號。這樣一個“狼煙=敵人入侵”就是一個簡單的協議。
?????? 計算機之間的通信也要遵循不同層次的協議,來實現計算機的通信。
II. TCP/IP 四層模型
?????? TCP/IP是一組協議的代名詞,它還包括許多協議,組成了TCP/IP協議簇。TCP/IP協議簇分為四層,IP協議位于協議簇的第二層(網絡層),對應OSI的第三層,TCP協議位于協議簇的第三層(傳輸層),對應OSI的第四層。
? ?
?????? TCP/IP通訊協議采用了4層的層級結構,每一層都呼叫它的下一層所提供的網絡來完成自己的需求。這4層分別為:
?????? 網絡互聯層:該層負責相同(連接層,局域網內)或不同網絡(網絡層,不同的局域網間)中計算機之間的通信,包括提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收)。
?????? 傳輸層:在此層中,它提供了節點間的數據傳送服務,如傳輸控制協議(TCP)、用戶數據報協議(UDP)等,TCP和UDP給數據包加入傳輸數據并把它傳輸到下一層中,這一層負責傳送數據。并且確定數據已被送達并接收(TCP/UDP協議所做的)。通俗來講,計算機接收到的包(信息),使用端口號來識別究竟是哪個進程需要接收這個信息。
?????? 應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP)、網絡遠程訪問協議(Telnet)等。通俗來講,數據包確定傳遞給了該進程,但該進程需要進一步的進行識別,要讀懂數據需要滿足應用層的協議。
參考如下圖示:
III. 連接層 & 網絡層(link layer & network layer)
?????? 在上面介紹網絡互聯層的時候曾說過,網絡互聯層負責相同(連接層,局域網內)或不同網絡(網絡層,不同的局域網間)中計算機之間的通信。那么就不得不介紹一下連接層和網絡層的區別了。
?????? 下面暗藍色部分有比喻說明,易于大家理解。
一、連接層(link layer)
?????? 同一個局域網內的兩臺計算機進行通信。
?????? 在連接層,信息以幀(frame)為單位傳輸。所謂的幀,是一段有限的0/1序列。連接層協議的功能就是識別0/1序列中所包含的幀。比如說,根據一定的0/1組合識別出幀的起始和結束。在幀中,打個比喻來介紹的話,有送信地址(Source, SRC,表示來源) 和收信地址(Destination, DST,表示目的地),還有能夠探測錯誤的校驗序列(Frame Check Sequence,FCS,幀校驗)。當然,幀中最重要的最重要是所要傳輸的數據 (payload)。這些數據往往符合更高層協議,供網絡的上層使用。與數據相配套,幀中也有數據的類型(Type)信息。連接層協議不關心數據中到底包含什么。幀就像是一個信封,把數據包裹起來。
?????? 以太網(Ethernet)和WiFi是現在最常見的連接層協議。通過連接層協議,我們可以建立局域的以太網或者WiFi局域網,并讓位于同一局域網絡中的兩臺計算機通信。
?????? 連接層就像是一個社區(局域網)的郵差,他認識社區中的每一戶人(計算機)。社區中的每個人都可以將一封信(幀)交給他,讓他送給同一社區的另一戶人家。
二、網絡層(network layer)
?????不同局域網間的計算機進行通信。
?????? 不同的社區(局域網)之間該如何通信呢? 換句話說,如何讓WiFi上的一臺計算機和以太網上的另一臺計算機通信呢?我們需要一個“中間人”。
?????? 這個“中間人”必須有以下功能:
?????? 1. 能從物理層上在兩個網絡的接收和發送0/1序列。
?????? 2. 能同時理解兩種網絡的幀格式。
?????? 路由器(router)就是為此而產生的“翻譯”。一個路由器有多個網卡(NIC,Network Interface Controller),每個NIC可以接入多個網絡,并理解相應的連接層協議。在幀經過路由到達另一個網絡的時候,路由會讀取幀的信息,并改寫以發送到 另一個網絡。
?????? 所以路由器就像是在兩個社區都有分支的郵局。一個社區的郵差將信送到本社區的郵局分支,而郵局會通過自己在另一個地區的分支將信轉交給另一個社區的郵差手中,并由另一個社區的郵差最終送到目的地。
???????那么,讓WiFi上的一臺計算機和以太網上的另一臺計算機通信,這個過程究竟是怎樣的呢?
???????
?????? 整個通信過程如下:
?????? WiFi上的計算機1 -> 路由WiFi接口 ->? 路由以太網接口 -> 以太網上的計算機2
??????? (藍色表示WiFi網絡,綠色表示以太網絡)
????????
?????? 在連接層,我們的一個幀中只能記錄SRC(來源)和DST(目的地)兩個地址。而上面的過程在網絡層中需要經過四個地址 (計算機1,WiFi接口,以太網接口,計算機2)。顯然,僅僅靠連接層協議無法滿足我們的需要。由于連接層協議開發在先,我們無法改動連接層協議,只能 在連接層的數據(payload),也就是在信紙內部下功夫了。IP協議應運而生。
???????
??????計算機1,路由器和計算機2都要懂得IP協議。當計算機1寫信的時候,會在信紙的開頭寫 上這封信的出發地址和最終到達地址 (而不是在信封上),而在信封上寫上要送往郵局。WiFi網的郵差將信送往郵局。在郵局,信被打開,郵局工作人員看到最終地址,于是將信包裝在一個新的信 封中,寫上出發地為郵局,到達地為計算機2,并交給以太網的郵差,由以太網的郵差送往計算機2。(IP協議還要求寫如諸如校驗等信息,交通狀況等信息,以保護通信的穩定性。)
?????? 在連接層,郵差只負責在本社區送信,所以信封上的地址總是“第一條街第三座房子”或者說“中心十字路口拐角的小房子”這樣一些本地人才了解的地址描述,這給郵局的工作帶來不便。所以郵局要求,信紙上寫的地址必須是一個符合官方規定的“郵編”,也就是IP地址。這個地址為世界上的每一個房子編號(郵編)。當信件送到郵局的時候,郵局根據郵編,就能查到對應的地址描述,從而能順利改寫信封上的信息。
??????? 每個郵局一般連接多個社區,而一個社區也可以有多個郵局,分別通往不同的社區。有時候一封信要通過多個郵局轉交,才能最終到達目的地,這個過程叫做route。郵局將分離的局域網絡連接成了internet,并最終構成了覆蓋全球的互聯網。
IV. 傳輸層(transport layer)
?????? 上面的數層協議讓不同的計算機之間可以通信。但計算機中實際上有許多個進程,每個進程 都可能有通信的需求。
?????? 這就好像一所房子里住了好幾個人(進程),如何讓信精確的送到某個人手里呢?遵照之前相同的邏輯,我們需要在信紙上寫上新的信息,比如收信人的姓名,才可能讓信送到。所以,傳輸層就是在信紙的空白上寫上新的“收信人”信息。每一所房子會配備一個管理員(傳輸層協議)。管理員從郵差手中接過信,會根據“收信人”,將信送給房子中的某個人。
??????? 傳輸層協議,比如TCP和UDP,使用端口號(port number)來識別收信人(某個進程)。在寫信的時候,我們寫上目的地的端口。當信到達目的地的管理員手中,他會根據傳輸層協議,識別端口號,將信送給不同的人。
??????? TCP和UDP協議是兩種不同的傳輸層協議。TCP協議還有控制網絡交通等功能。
一、TCP(Transmission Control Protocol,傳輸控制協議)
?????? TCP是面向連接的協議,也就是說,在收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次“對話”才能建立起來,其中的過程非常復雜,只簡單的描述下這三次對話的簡單過程:
??????主機A向主機B發出連接請求數據包:“我想給你發數據,可以嗎?”,這是第一次對話;主機B向主機A發送 同意連接 和 要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工作)的數據包:“可以,你什么時候發?”,這是第二次對話;主機A再發出一個數據包確認主機B的要求同步:“我現在就發,你接著吧!”,這是第三次對話。
?????? 三次“對話”的目的是使數據包的發送和接收同步,經過三次“對話”之后,主機A才向主機B正式發送數據。
??????TCP建立連接的過程(三次握手)
??????01?? 主機A通過向主機B 發送一個含有同步序列號(SYN)的標志位的數據段給主機B ,向主機B 請求建立連接,通過這個數據段,
主機A告訴主機B 兩件事:我想要和你通信;你可以用哪個序列號作為起始數據段來回應我。
?????? 02?? 主機B 收到主機A的請求后,用一個帶有確認應答(ACK)和同步序列號(SYN)標志位的數據段響應主機A,也告訴主機A兩件事:
我已經收到你的請求了,你可以傳輸數據了;你要用哪佧序列號作為起始數據段來回應我。
?????? 03?? 主機A收到這個數據段后,再發送一個確認應答(ACK),確認已收到主機B 的數據段:"我已收到回復,我現在要開始傳輸實際數據了。
??????三次握手的特點
??????01 ? 沒有應用層的數據。
?????? 02?? SYN這個標志位只有在TCP產生連接時才會被置1,握手完成后SYN標志位被置0。
?????? TCP斷開連接的過程
??????01 ? 當主機A完成數據傳輸后,將控制位FIN置1,提出停止TCP連接的請求。
?????? 02?? 主機B收到FIN后對其作出響應,確認這一方向上的TCP連接將關閉,將ACK置1(接收端確認關閉)。
?????? 03?? 由主機B再提出反方向的關閉請求,將FIN置1。
?????? 04?? 主機A對主機B的請求進行確認,將ACK置1(發送端確認關閉)。雙方向的關閉結束。
?????? 由TCP的三次握手和四次斷開可以看出,TCP使用面向連接的通信方式,大大提高了數據通信的可靠性,使發送數據端和接收端在數據正式傳輸前就有了交互,為數據正式傳輸打下了可靠的基礎。
?????? 名詞解釋
?????? ACK??TCP報頭的控制位之一,對數據進行確認。確認由目的端發出,用它來告訴發送端這個序列號之前的數據段都收到了。比如,確認號為X,則表示前X-1個數據段都收到了,只有當ACK=1時,確認號才有效,當ACK=0時,確認號無效,這時會要求重傳數據,保證數據的完整性。
?????? SYN??同步序列號,TCP建立連接時將這個位置1。
?????? FIN??發送端完成發送任務位,當TCP完成數據傳輸需要斷開時,提出斷開連接的一方將這位置1。
二、UDP(User Data Protocol,用戶數據報協議)
?????? 01?? UDP是一個非連接的協議,傳輸數據之前源端和終端不建立連接,當它想傳送時就簡單地去抓取來自應用程序的數據,并盡可能快地把它扔到網絡上。在發送端,UDP傳送數據的速度僅僅是受應用程序生成數據的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀一個消息段。
?????? 02?? 由于傳輸數據不建立連接,因此也就不需要維護連接狀態,包括收發狀態等,因此一臺服務機可同時向多個客戶機傳輸相同的消息。
?????? 03 ? UDP信息包的標題很短,只有8個字節,相對于TCP的20個字節信息包的額外開銷很小。
?????? 04?? 吞吐量不受擁擠控制算法的調節,只受應用軟件生成數據的速率、傳輸帶寬、源端和終端主機性能的限制。
?????? 05?? UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持復雜的鏈接狀態表(這里面有許多參數)。
?????? 06?? UDP是面向報文的。發送方的UDP對應用程序交下來的報文,在添加首部后就向下交付給IP層。既不拆分,也不合并,而是保留這些報文的邊界,因此,應用程序需要選擇合適的報文大小。??
??????
?????? 我們經常使用“ping”命令來測試兩臺主機之間TCP/IP通信是否正常,其實“ping”命令的原理就是向對方主機發送UDP數據包,然后對方主機確認收到數據包,如果數據包是否到達的消息及時反饋回來,那么網絡就是通的。
三、TCP與UDP的區別
?????? 01?? 基于連接與無連接;
?????? 02?? 對系統資源的要求(TCP較多,UDP少);
?????? 03?? UDP程序結構較簡單;
?????? 04?? 流模式與數據報模式 ;
?????? 05?? TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。???
V. 應用層(application layer)
??????包(數據)確定傳遞給了該進程,但該進程需要進一步的進行識別,要讀懂數據需要滿足應用層的協議。
??????
?????? 通過上面的幾層協議,我們已經可以在任意兩個人(進程)之間進行通信。然而每個人實際上從事的是不同的行業。有的人是律師,有的人外交官。比如說律師之間的通信,會用嚴格的律師術語,以免產生糾紛。再比如外交官之間的通信,必須符合一定的外交格式,以免發生外交誤會。再比如間諜通過暗號來傳遞加密信息。應用層協議是對信件內容進一步的用語規范。應用層的協議包括用于Web瀏覽的HTTP協議,用于傳輸文件的FTP協議,用于Email的IMAP等等。
VI. Socket
?????? 我們經常把Socket翻譯為套接字,Socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用已實現進程在網絡中通信。
?????? 實際上Socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個調用接口(API)。
通過Socket,我們才能使用TCP/IP協議。
?????? 有一句比較容易理解的話:“TCP/IP只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外的操作接口。”
??????而我們平時常用的接口文檔實質上就是Socket。
??????利用Socket建立網絡連接的步驟
建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務器端,稱為ServerSocket。套接字之間的連接過程分為三個步驟:服務器監聽,客戶端請求,連接確認。
01?? 服務器監聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。
02?? 客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。
03?? 連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。
總結
以上是生活随笔為你收集整理的Network 【TCP/IP 四层模型】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ICE简介
- 下一篇: Boost.Asio使用实例