1. 程式人生 > >網路協議概述(網路層次結構、TCP、UDP)

網路協議概述(網路層次結構、TCP、UDP)

1.網路協議縱覽

參考文章:http://www.cnblogs.com/syfwhu/p/5237652.html

網路協議

網路協議是網路上所有裝置(網路伺服器、計算機及交換機、路由器、防火牆等)之間通訊規則的集合,它規定了通訊時資訊必須採用的格式和這些格式的意義。大多數網路都採用分層的體系結構,每一層都建立在它的下層之上,向它的上一層提供一定的服務,而把如何實現這一服務的細節對上一層加以遮蔽。

層次結構

由於網路節點之間聯絡的複雜性,在制定協議時,通常把複雜成分分解成一些簡單成分,然後再將它們複合起來。最常用的複合技術就是層次方式,網路協議的層次結構如下:
(1)結構中的每一層都規定有明確的服務及介面標準。
(2)把使用者的應用程式作為最高層
(3)除了最高層外,中間的每一層都向上一層提供服務,同時又是下一層的使用者。
(4)把物理通訊線路作為最低層,它使用從最高層傳送來的引數,是提供服務的基礎。

在這裡插入圖片描述

計算機網路體系結構的通訊協議劃分為七層,自下而上依次為:物理層(Physics Layer)、資料鏈路層(Data Link Layer)、網路層(Network Layer)、傳輸層(Transport Layer)、會話層(Session Layer)、表示層(Presentation Layer)、應用層(Application Layer)。

更加詳細的各層網路協議:

在這裡插入圖片描述

資料封裝

在這裡插入圖片描述

資料解封

在這裡插入圖片描述

2.網路協議之TCP

參考文章:http://www.cnblogs.com/syfwhu/p/5143437.html

TCP

TCP作用:

當應用層向TCP層傳送用於網間傳輸的、用8位位元組表示的資料流,TCP則把資料流分割成適當長度的報文段,最大傳輸段大小(MSS)通常受該計算機連線的網路的資料鏈路層的最大傳送單元(MTU)限制。之後TCP把資料包傳給IP層,由它來通過網路將包傳送給接收端實體的TCP層。

因特網有兩個核心協議:IP和TCP。IP(Internet Protocol)負責聯網主機之間的路由選擇和定址;TCP(Transmission Control Protocol)負責在不可靠的傳輸通道之上提供可靠的抽象層。TCP嚮應用層隱藏了大多數網路通訊的複雜細節,比如丟包重發、按序傳送、擁塞控制、資料完整等。正如任何一種技術它越完善和強大,其效能損耗也就越大,TCP為了給資訊傳輸提供可靠的方式做了很多工作,也就造成了一定的效能瓶頸,下面就具體的講解一下TCP的原理及思想。

一個完整的TCP資料包的結構如下所示:

在這裡插入圖片描述

連線建立和斷開

所有TCP連線的建立都要進行三次握手,因為在交換應用資料之前,客戶端和伺服器需要約定分組序列號及協商其他相關資訊。出於安全考慮,序列號由兩端隨機生成。三次握手過程如下圖:

在這裡插入圖片描述

TCP快速開啟:在某些條件下,允許第一個SYN分組中帶有應用程式資料。這就使得在傳輸小檔案時,減少了新建TCP連線帶來的效能損失,因為它在第一次傳送分組時攜帶了應用資料,可以一定程度上降低HTPP事物網路延時。

雖然建立一個連線需要三次握手,而斷開一個連線需要四次握手才可以完成,這是由TCP的半關閉造成的。其大致過程入下所示:

在這裡插入圖片描述

(1) 某個應用程序首先呼叫close,稱該端執行“主動關閉”(active close)。該端的TCP於是傳送一個FIN分節,表示資料傳送完畢。
(2) 接收到這個FIN的對端執行 “被動關閉”(passive close),這個FIN由TCP確認。
注意:FIN的接收也作為一個檔案結束符(end-of-file)傳遞給接收端應用程序,放在已排隊等候該應用程序接收的任何其他資料之後,因為,FIN的接收意味著接收端應用程序在相應連線上再無額外資料可接收。
(3) 一段時間後,接收到這個檔案結束符的應用程序將呼叫close關閉它的套接字。這導致它的TCP也傳送一個FIN。
(4) 接收這個最終FIN的原發送端TCP(即執行主動關閉的那一端)確認這個FIN。

擁塞預防及控制:

TCP在不可靠的網路環境上提供了可靠的資訊傳輸方式,為此它加入了很多機制,如流量控制、擁塞控制和擁塞預防等。

選擇性應答:

TCP通訊時,如果傳送序列中間某個資料包丟失,TCP會通過重傳最後確認的包開始的後續包,這樣原先已經正確傳輸的包也可能重複傳送,急劇降低了TCP效能。為改善這種情況,發展出SACK(Selective Acknowledgment, 選擇性確認)技術,使TCP只重新發送丟失的包,不用傳送後續所有的包,而且提供相應機制使接收方能告訴傳送方哪些資料丟失,哪些資料重發了,哪些資料已經提前收到等。SACK是TCP中的一個可選特性,要想啟用需要自己開啟設定。

TCP的不足——隊首阻塞:

TCP在不可靠的通道上進行可靠地傳輸,隱藏了很多網路底層的細節,極大的方便了工程人員的使用。任何事物都有其利弊,TCP也不例外,在某些場景下也是有極大限制的,

由於TCP是有序交付的,每個分組都會有一個唯一的序列號,需要按照順序傳遞到接收端,接收端也需要接受到所有分組後才能處理所受到的資訊。如果中間某一個分組沒能被接收到,其他分組需要儲存在緩衝區,需要等待接收到重發的分組後才能處理。

TCP的按序交付和分組重排使得應用程式不再關心底層細節,使得開發更為方便。但在實時性要求較高的場景下,可能有些應用對有序交付和可靠性要求並不高,使用TCP就會造成很大的延時。而且由於分組到達接收端會存在一定的不確定性,使得傳輸時間也變得不確定,這個時間變化稱之為抖動。

能夠容忍和自行處理包的亂序或者丟包的應用,或者對延遲和抖動敏感的應用,可以考慮另外一個選擇:UDP。

3.網路協議之UDP

參考文章:http://www.cnblogs.com/syfwhu/p/5226483.html

TCP協議在不可靠的網路環境上提供了可靠的通訊通道,隱藏了大量的底層細節,使應用程式更加簡潔。但有些應用並不需要這麼高的可靠性,並不需要按序交付,而且TCP為了提高可靠性也增加了延時,在某些對延時或抖動要求很高的情景下並不適用。為此,UDP(User Datagram Protocol,使用者資料報協議)被提出。UDP雖然應用較為廣泛,比如DNS查詢等,但一直不是重要的角色。自從WebRTC被提出以來,它可以使瀏覽器在UDP的基礎上實現原生的語音和視訊實時通訊及其他形式的P2P通訊,UDP在這種境況下顯得更加重要。本文大致介紹UDP的原理及應用,以求加深對其理解。

UDP

TCP是面向連線的,需要三次握手建立連線之後再傳輸資料,而是UDP面向無連線的,它並不能保證資訊交付,也不能保證按序互動,也不跟蹤連線狀態,也不需要擁塞控制。

要了解UDP和為什麼它通常被稱為“空協議”,我們首先需要了解一下網際網路協議(IP),它位於TCP和UDP協議層下面。IP層主要任務就是基於地址將資料報從源主機發送到目的主機。要做到這一點,訊息都封裝在一個IP包,標識源和目的地址,以及一些其他路由引數。

IPv4的首部結構如下:

在這裡插入圖片描述

UDP協議會用自己的分組結構封裝使用者資訊,其資料格式如下:

在這裡插入圖片描述

如上圖所示,我們在UDP資料報裡增加了源埠和目標埠,這樣就使得當IP分組被送到接收端後,接收端就可以拆開UDP分組,根據目標埠找到對應的應用程式,然後再把資料傳遞給應用程式。

從IP和UDP的資料格式可以看到,它們的首部都帶有校驗和,都可以用來校驗資料,那麼應用程式即使忽略UDP的校驗和也不影響資料完整性,校驗和欄位是可選的。這意味著UDP層所有的錯誤檢測和糾錯,可以委託給上述應用層校驗。說到底,UDP僅僅是在IP層上通過嵌入應用程式的源埠和目標埠,提供了一個“應用程式多路複用”機制。由此可以得到UDP的特徵如下:

  • 不保證訊息交付:不確認,不重傳,無超時;
  • 不保證交付順序:不設定包序號,不重排,不發生隊首阻塞;
  • 不跟蹤連線狀態:不必建立連線或重啟狀態機;
  • 不需要擁塞控制:不內建客戶端或網路反饋機。

TCP是一個面向位元組流的協議,能夠通過多個分組的形式傳送應用程式的訊息資料,包內本身沒有任何明確的訊息邊界。為了實現這一目標,連線兩端都分配了連線狀態,並且資料包被排序,重發丟包,按順序傳送。相反UDP資料報有明確的界限:每一個數據報都被打包到一個IP包中,應用層讀到的每一個UDP包都是完整的資訊 - 資料報不能被分割。

關於資料報(Datagram)詳細定義如下:

資料報:一個自包含的,獨立的資料實體,其承載了足夠的資訊,使其可以從源路由到達目標路由,而不依賴於在網路節點前的資料交換和傳輸網路沒有任何依賴。

資料報文(Datagram)和資料包(Packet)兩個術語往交替使用,但其實二者有一些細微差別。資料包(packet)一般用來描述任何格式的資料塊,而資料報(Datagram)往往被保留用來描述通過一個不可靠的服務傳輸的資料包(Packet) - 沒有傳輸保障,沒有失敗通知。所以UDP包一般或者說更準確的被稱為資料報(Datagram)。

UDP是一個簡單的,無狀態的協議,適合於引導上層的其他應用層協議 - 幾乎所有的協議決策都留給它上面的應用層。然而,在你想實現自己的協議來取代TCP,你應該仔細考慮有關的複雜性,如UDP與其它層的互動(比如NAT穿越),以及網路協議一些最佳實踐。沒有仔細的規劃和設計,設計一個新的協議不是一個好主意,最終也許實現成一個的簡陋的TCP版本。關於傳輸UDP時遇到的NAT穿透問題,將在下篇文章中講述。

4.網路協議之NAT穿透

詳情可以參考:http://www.cnblogs.com/syfwhu/p/5229020.html