10 分鐘讀懂計算機網絡

ShadBrowne 8年前發布 | 9K 次閱讀 計算機網絡 網絡技術

當 我們決定要談談網絡的時候,我想在談之前,有必要了解一下“協議”這個詞。協議,定義了在倆個或者多個通信實體之間交換報文的格式和次序,以及報文發送、接收報文或者其他的事件所采取的動作。定義都比較晦澀,那就讓我們來個例子吧。

假設我要向你(互不相識)詢問一下當前的時間;

我首先和你說:你好,以示我想要和你交流(發出報文,請求通信)。而你回應我(收到報文,通信建立):你好,表明能夠繼續詢問你了。我發出詢問(發出報文,包含事件處理):幾點了?你看了看表(采取動作),然后回答我(收到報文,包含結果),2:00了。之后我說,謝謝(請求結束通信)。你說,不客氣(通信結束)。

以上就是我們日常生活中所使用的協議。相類比計算機,其實也是相差不多的。不同的是,計算機畢竟不是人,所以得指定很多的協議,以保障它們正常的通信。比如以下幾個常見的傳輸協議,當然不了解也沒有關系,之后會詳細的提及。

  • 超文本傳輸協議(HTTP,HyperText Transfer Protocol)

  • 傳輸控制協議(TCP,Transmission Control Protocol)

  • 因特網協議(IP,Internet Protocol)

  • 地址解析協議(ARP,Address Resolution Protocol)

一、網絡模型

既然存在多種協議,那么總需要一種結構把它們合理的組織在一起。而現如今的倆種模型,都是采用的層次結構。每一層通過在該層中執行某些動作或者使用直接下層的服務來提供服務。下面就先來看看這倆類分層結構:五層因特網模型(應用層,運輸層,網絡層,鏈路層,物理層)、七層SOI模型(應用層,表示層,會話層,運輸層,網絡層,鏈路層,物理層)。下面我們以五層模型為例,談談計算機網絡。不過由于物理層涉及比較廣,所以我們實際討論的只有四層:應用層,運輸層,網絡層,鏈路層。

  • 應用層:就是網絡應用程序及它們的應用層協議存在的地方,我們常把位于應用層要傳遞的信息稱為報文(message)。

  • 運輸層:因特網的運輸層負責在倆個應用程序端點之間傳遞應用層報文。在因特網中,有倆種運輸協議,TCP和UDP,使用其中的任何一個都能傳遞應用層報文,值得注意的是,在這一層,TCP/UDP會把上層報文包裝成一個新的結構,我們稱為報文段(segment)。

  • 網絡層:在這一層,網絡層也會把上一層的報文段包裝成一個被稱作數據報(datagram)的結構。然后把這個數據報從一臺主機移動到另外一臺主機上。在這一層就包括著名的IP協議。

  • 鏈路層:同理,在這一層,又在數據報的外面加了個殼,我們把加殼之后的這個東西叫做幀(frame)。然后通過這一層把幀從當前的一個節點移動到下一個節點,網絡層必須依靠鏈路層的服務。如下圖,從源主機到鏈路交換機。

在網絡中,我們經常會忽略具體的設備,而統一稱為主機(host),或者端系統(end system)。比如智能手機,平板電腦,電視,游戲機,web相機等等......而主機與主機之間通過通信鏈路(communication link)和分組交換機(packet switch)連接在一起。分組交換機各式各樣,但當今最著名的類型是路由器(Router)和鏈路層交換機(Link-layer switch),分別也稱為,三層交換機,或者倆層交換機。由上圖可以看出。

最后,來說一個小程序,tracert。通過它,可以確定從你當前的主機到目的主機之間經過了那些交換機。

二、應用層

對于應用層,我想絕大多數人,應該是最熟悉的了。尤其是從事軟件開發的人。這類應用程序體系結構是由應用程序研發者設計,不過多是利用的現代所流行的倆種主流體系結構之一:C/S結構(客戶 - 服務器),P2P結構(對等體系)。

  • C/S結構:在這種體系中,總有一個需要一直打開的主機,我們稱為服務器(server),它服務于其他稱為客戶(client)主機的請求。服務器總是具有一個固定的地址,大家都知道的地址,稱為IP地址。比如baidu.com的IP地址之一為180.149.132.47。啥?你不知道baidu.com的地址,但是你知道baidu.com這個名字吧,又因為存在DNS服務(后面說),所以想當于了解。在這種結構下,值得注意的是,其他客戶主機之間是不可以之間進行通信的。

  • P2P結構:在對等(Peer-to-peer)體系中,每臺計算機之間都處于對等的地位,各臺計算機有相同的功能,無主從之分,一臺計算機既可作為服務器,設定共享資源供網絡中其他計算機所使用,又可以作為工作站。網絡中的每一臺計算機既能充當網絡服務的請求者,又對其它計算機的請求做出響應,提供資源、服務和內容。通常這些資源和服務包括:信息的共享和交換、計算資源(如CPU計算能力共享)、存儲共享(如緩存和磁盤空間的使用)、網絡共享、打印機共享等。

2x01.是什么在通信

對于學習過操作系統,或閱讀過unix網絡編程的人,對Tcp echo服務器應該不會陌生。當前進程通過fork()生成另外一個進程,一個進程發送一句話,然后另外一個接收到,并且顯示在屏幕上。所以,我們可以想得到,在應用層而言,忽略下層數據傳輸細節,那么通信的其實就是進程。然而我們不怎么關注同一臺主機上進程間的通信,而關注不同端系統上的進程間的通信。那么就不得不一個新東西:套接字,主機上應用層與運輸層的接口,但是應用程序開發者對于運輸層的控制僅限于:

  • 選擇運輸層的協議

  • 也許能設定幾個運輸層的參數,比如最大換成數,和最大報文段長度等。

2x02.網絡應用

互聯網從誕生到現在不過短短百年,但是對于人類社會的影響確實翻天覆地。試想,一百年前的時候,你能身處中華,卻知道美國現在發生著選舉大會嗎?你能通過一個東西隨身攜帶萬卷書嗎?你能實時與你遠在他鄉的好友實時通訊嗎?不能,都不能。但是現在可以。那么接下來,就介紹幾個極為流行的應用以及它的應用層協議吧。

  • HTTP:Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫。常有倆個程序實現,客戶機-服務器,并且分別運行在不同的端系統上。其下的支撐運輸協議是使用的TCP,而且由于http服務器并不保存關于客戶的任何信息,所以http也被稱為是一個無狀態協議。但是為了跟蹤用戶的輸入(比如用戶的購物車商品),網站會提供一個用戶身份的識別碼,存放在cookie中,每次再訪問網站則自動將cookie加入到HTTP報文頭部,實現身份的識別。

  • FTP:File Transfer Protocol(文件傳輸協議)的英文簡稱,而中文簡稱為“文傳協議”。同時,它也是一個應用程序。通過使用倆個并行的TCP鏈接來傳輸文件,一個是控制鏈接,一個是數據鏈接,控制鏈接用于在倆個主機之間傳輸控制信息,如用戶標識,口令,命令。數據鏈接用于實際發送一個。

  • DNS:Domain Name System(域名系統)的縮寫,運行在UDP協議之上。就像我們上面提到的baidu.com怎么轉換成ip地址,這個就是DNS的服務。下面來介紹一下。首先,總的來說,DNS采用了分布式的設計方案。如下。

每個組織,如一個大學,一個院系,一個公司都會有一臺本地DNS服務器,當一臺主機想要訪問baidu.com的ip地址時,會先發送她的查詢請求到本地DNS服務器,里面查找是否有baidu.com的ip地址。沒有的話,本地DNS服務器就把這個請求轉發到根DNS服務器,然后根DNS服務器把comDNS服務器地址發送給本地DNS服務器,然后本地DNS服務器發送查詢請求到comDNS服務器,完成名字與ip地址的轉換。

如果你想在你的主機上發送一個DNS查詢報文,那么就使用nslookup程序吧,它可以幫助你完成,前倆行是你的主機的DNS服務器的名字,以及ip地址。

三、運輸層

運輸層協議為運行在不同的主機上的應用進程之間提供了邏輯通信,不需要考慮下層的實現細節,即使是相隔很遠,也可以通過運用運輸層的接口彼此發送報文。所以運輸層協議是在端系統上而不是在路由器上。我們通過應用層,都知道,倆個主機之間通信就是倆個進程在通信。但是我們的電腦經常運行著很多的軟件,QQ、網易云音樂、chrome.......那么怎么保證它們正常接收到自己的數據包呢?這里就要提出一個叫做端口的東西。端口,是一個16比特的數,其大小在0-65535之間,但是0-1023范圍的端口稱為公認端口,它們緊密綁定于一些服務。通常這些端口的通訊明確表明了某種服務的協議。例如:80端口實際上總是HTTP通訊,FTP一般使用端口(20,21),53為DNS服務的端口等等。

多路復用/分解:一個進程可以有一個或者多個套接字,就像FTP,但是一般一個套接字值綁定只一個端口號,那么在同一個時刻,一定存在著多個套接字,所以每個套接字都有自己唯一的標識符。用來區別于其他套接字。這樣運輸層就可以把不同的報文數據交付到正確的套接字上面,稱為多路分解。而不同的套接字加上各種的殼,從而生成報文段,然后將報文段傳遞到網絡層,稱為多路復用。

3x01.UDP

為了說清楚UDP(User Datagram Protocol)協議,我想有必要簡單的說明一下網絡層的IP協議。IP協議的服務模型為盡力而為交付服務,這就意味著IP盡它“最大的努力”在通信的主機之間交付報文,但它不會做任何的保證。不保證報文段的交付,不保證報文段的按序交付,不保證報文段中數據的完整性。所以IP協議也被稱為是不可靠服務。

就像IP協議是不可靠協議一般,UDP也是如此。但是盡管如此,有一些場合,還是很適合UDP的,比如交談式音頻/視頻,這些應用能夠承受一定程度的數據損失,因為那丟失的數據對于播放出現的干擾,并不是很致命。如果說應用程序開發人員在開發時選擇了UDP,那么這個應用差不多就是直接與IP協議打交道了。我知道,你想說,既然UDP這么不好,為什么編程有時還選擇這個。那是因為UDP在傳輸的速度上要很大的優于TCP協議。TCP提供很多的保障,但是保障的背后就是時間的代價。就像在相同算法下,C語言與其他高級語言運行時間明顯有差別。

上圖為UDP報文段結構,我們可以看出,相比較上層(應用層)傳來的報文,多了四個字節,分別為,源端口號,目的端口號,長度(報文),校驗和。通過后倆個傳輸數據,確定是否在移動中,其中的比特發生了改變。比如鏈路中的噪音干擾,或者存儲在路由器時引入問題。有人可能會說怎么這個報文段里面沒有對方或者自己的IP地址,那時因為IP地址是在下一層包裝進去的。

3x02.TCP

tcp(Transmission Control Protocol)協議相比叫UDP協議,最為重要的就是比UDP多了倆項功能。

  • 可靠傳輸。保證數據正確、按序到達。雖然UDP不能保證,但是可以在上層應用程序里建立自己的可靠機制來完成。

  • 擁堵控制。由于UDP沒有限制發送報文段,所以導致UDP發送方和接受方之間的高丟包率,并擠跨了TCP的會話。

三次握手:

  • 在報文段的首部中的一個標志位SYN被置為1,所以,有時也稱其為SYN報文段,另外,客戶會隨機的選擇一個初始序號(client_isn)并放到序號(Sequence number) 。然后發送給服務器。

  • 服務器會從該數據報中提取SYN報文段,并且為TCP連接分配TCP緩存和變量,并向該TCP發送允許連接的報文段。其具體為:首先,SYN置為1;其次,首部的確認字段(Acknowledgment number)被置為(client_isn + 1),最后會選擇自己的初始序號(server_isn)放到序號(Sequence number) 。然后發送給客戶機。有時也稱這個報文段為SYN報文段(SYNACK segment)。

  • 在客戶機收到SYN報文段后,客戶機也要給該連接分配緩存和變量,然后給服務器發送一個確認報文段。對服務器的允許連接的報文段進行確認。連接建立之后,該SYN被置為0。

四次揮手:

  • 客戶機想服務器發送一個特殊的報文段,這個報文段讓其首部的標志位FIN被置為1,然后發送給服務器。

  • 當服務器接受到該報文的時候,就向客戶機發送一個確定報文。

  • 服務器發送自己的終止報文段,其FIN被置為1。

  • 客戶機對這個服務器終止報文段進行確認。

由于TCP并沒有提供任何的加密機制,所以現在研制了TCP的加強版本,稱為安全套接字(Secure Sockets Layer,SSL)。用SSL加強后的TCP不僅能夠完成傳統TCP所能做的一切,而且提供了關鍵的進程到進程的安全性服務。

四、網絡層

網絡層的作用從表面上看極為簡單,就是把數據報從一臺主機移動到另外一臺主機上,為此,需要倆種重要的功能。當然,這一層有上面提到的IP(Internet Protocol)協議。

  • 轉發。數據報從單一的路由器中從一條入鏈路到出鏈路的傳送。

  • 路由選擇。一個網絡中所有的路由器,它們經路由選擇協議共同交互,以決定數據報從源到目的地所采用的路徑。

在實際的網絡中,每一個路由器,都會有多個輸入端,就像(A,B),和多個輸出端。并且在輸入端使用了存儲轉發傳輸機制,這種機制是指在每個路由器能夠開始向輸出端傳輸該數據報的第一個比特之前,必須接受整個數據報。而在每一個輸出端,都具有一個輸出隊列,它用于存儲路由器準備發送到這個輸出端的數據報。當然,既然是隊列,還是在實際情況下,那么總會有輸出隊列被充滿的時候,這個時候就會出現丟包(packet lost),到達的數據報或者已經在排隊的數據報之一會被丟棄。

4x01.IPv4編址

我們知道,主機,路由器是通過一條條的物理鏈路鏈接在一起,而主機/路由器與物理鏈路的邊界,我們常稱其為接口。在ip協議中,要求每臺主機/路由器的每個接口都擁有自己的ip地址,也就是說,一個路由器可能有多個ip地址。在IPv4中,規定IP地址長度為32比特,等價于四個字節。每字節最大255,所以ip最大為255.255.255.255。這些地址一般使用所謂的點分十進制記法書寫,即地址中的每個字節用它的十進制書寫,各字節之間以句點隔開。例如127.0.0.1。

用ip的術語來說,互聯的三個主機和一個路由器接口形成一個子網。ip編址為這個子網分配了一個地址:233.1.1.0/24,其中/24記法,有時也被稱為子網掩碼,指示了32比特中的最左24比特定義了子網地址。其他要連接在這個233.1.1.0/24網絡的主機,其地址要求具有233.1.1.xxx的形式。ip地址通過限制特定長度的比特,對ip進行分類編址。如下。

類型 范圍
A 0.0.0.0 - 127.255.255.255
B 128.0.0.0 - 191.255.255.255
C 192.0.0.0 - 223.255.255.255
D 224.0.0.0 - 239.255.255.255
E 240.0.0.0 - 255.255.255.255

4x02.DHCP

試想,如果一個組織一旦獲得一塊地址,那么它就可以為本組織內的主機與路由器接口逐個分配ip地址。那么就不得不提出DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)協議了。DHCP具有將主機連接進一個網絡的網絡相關方面的自動能力,在早期,對于網絡管理員,不得不手動執行這些認為任務,所以它的出現對于網絡管理員非常吸引。

DHCP建立過程:

  • DHCP客戶端發送DHCP discover消息(IP地址租用申請),這個消息是通過廣播方式發送出去的,所有網絡中的DHCP服務器都將接收到這個消息。

  • 網絡中的DHCP服務器會回應一個DHCP offer消息(IP地址租用提供),由于這個時候客戶端還沒有網絡地址,所以DHCP offer也是通過廣播的方式發送出去的。需要注意的是,由于網絡中可能存在不止一臺的DHCP服務器,所以,如果不考慮網絡丟包的話,客戶端將接收到不止一條的DHCP offer消息。那么客戶端會選擇它接收到的第一條DHCP offer作為獲取配置的服務器。

  • 客戶機向該服務器發送DHCP request消息。雖然這個時候客戶端已經明確知道選擇的DHCP服務器的地址所在,但仍將采用廣播的方式發送DHCP request消息,這樣做不僅可以通知選中的服務器向客戶端分配IP地址,同時也可以通知其他沒有選中的DHCP服務器不需要再響應它的請求。在DHCP request消息中將包含客戶端申請的IP地址。

  • DHCP服務器將回送DHCP ACK的響應消息對請求報文進行響應。

五、鏈路層

對于一個主機體系結構,鏈路層的主題部分是在網絡適配器中實現的(有時也被稱為網絡接口卡)。而在網絡適配器也具有自己的鏈路層地址。鏈路層的地址有各種不同的叫法: LAN地址(LAN address),物理地址(physical address),MAC地址(MAC 地址) 。

既然有了網絡層ip地址,為什么還要鏈路層的mac地址?那是因為要保證每層的獨立性,假如在鏈路層的上層不是網絡層,那么鏈路層該如何尋址?所以引入mac 地址。

那么在網絡層和鏈路層之間適合轉化的呢。這就是地址解析協議(ARP,Address Resolution Protocol)的功勞。ARP將一個ip地址解析為MAC地址的時候,很多方面與DNS類似。雖然DNS是將主機名解析成ip地址。

 

 

來自:http://mp.weixin.qq.com/s/rIu99RTX1oMfb7DgGNf6xg

 

 本文由用戶 ShadBrowne 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!