計算機網絡的發展及基礎網絡概念
問題:網絡究竟是什麼?計算機之間是如何通訊的?javascript
早期 : 聯機
以太網 : 局域網與交換機
廣播
主機之間「一對全部」的通信模式,網絡對其中每一臺主機發出的信號都進行無條件複製並轉發,全部主機均可以接收到全部信息(無論你是否須要),因爲其不用路徑選擇,因此其網絡成本能夠很低廉。有線電視網就是典型的廣播型網絡,咱們的電視機其實是接受到全部頻道的信號,但只將一個頻道的信號還原成畫面。在數據網絡中也容許廣播的存在,但其被限制在二層交換機的局域網範圍內,禁止廣播數據穿過路由器,防止廣播數據影響大面積的主機。html
ip地址與ip協議
- 規定網絡地址的協議叫ip協議,它定義的地址稱之爲ip地址,普遍採用的v4版本即ipv4,它規定網絡地址由32位2進製表示
- 範圍0.0.0.0-255.255.255.255
- 一個ip地址一般寫成四段十進制數,例:172.16.10.1
mac地址
head中包含的源和目標地址由來:ethernet規定接入internet的設備都必須具有網卡,發送端和接收端的地址即是指網卡的地址,即mac地址。java
mac地址:每塊網卡出廠時都被燒製上一個世界惟一的mac地址,長度爲48位2進制,一般由12位16進制數表示(前六位是廠商編號,後六位是流水線號)緩存
arp協議 ——查詢IP地址和MAC地址的對應關係
廣域網與路由器
路由器
局域網
局域網(Local Area Network,LAN)是指在某一區域內由多臺計算機互聯成的計算機組。通常是方圓幾公里之內。局域網能夠實現文件管理、應用軟件共享、打印機共享、工做組內的日程安排、電子郵件和傳真通訊服務等功能。局域網是封閉型的,能夠由辦公室內的兩臺計算機組成,也能夠由一個公司內的上千臺計算機組成。 服務器
子網掩碼
所謂」子網掩碼」,就是表示子網絡特徵的一個參數。它在形式上等同於IP地址,也是一個32位二進制數字,它的網絡部分所有爲1,主機部分所有爲0。好比,IP地址172.16.10.1,若是已知網絡部分是前24位,主機部分是後8位,那麼子網絡掩碼就是11111111.11111111.11111111.00000000,寫成十進制就是255.255.255.0。網絡
知道」子網掩碼」,咱們就能判斷,任意兩個IP地址是否處在同一個子網絡。方法是將兩個IP地址與子網掩碼分別進行AND運算(兩個數位都爲1,運算結果爲1,不然爲0),而後比較結果是否相同,若是是的話,就代表它們在同一個子網絡中,不然就不是。 tcp
好比,已知IP地址172.16.10.1和172.16.10.2的子網掩碼都是255.255.255.0,請問它們是否在同一個子網絡?二者與子網掩碼分別進行AND運算, 172.16.10.1:10101100.00010000.00001010.000000001 255255.255.255.0:11111111.11111111.11111111.00000000 AND運算得網絡地址結果:10101100.00010000.00001010.000000001->172.16.10.0 172.16.10.2:10101100.00010000.00001010.00000010 255255.255.255.0:11111111.11111111.11111111.00000000 AND運算得網絡地址結果:10101100.00010000.00001010.000000001->172.16.10.0 結果都是172.16.10.0,所以它們在同一個子網絡。
總結一下,IP協議的做用主要有兩個,一個是爲每一臺計算機分配IP地址,另外一個是肯定哪些地址在同一個子網絡。ide
tcp協議和udp協議
用於應用程序之間的通訊。若是說ip地址和mac地址幫咱們肯定惟一的一臺機器,那麼咱們怎麼找到一臺機器上的一個軟件呢?函數
端口
咱們知道,一臺擁有IP地址的主機能夠提供許多服務,好比Web服務、FTP服務、SMTP服務等,這些服務徹底能夠經過1個IP地址來實現。那麼,主機是怎樣區分不一樣的網絡服務呢?顯然不能只靠IP地址,由於IP 地址與網絡服務的關係是一對多的關係。其實是經過「IP地址+端口號」來區分不一樣的服務的。post
TCP協議
當應用程序但願經過 TCP 與另外一個應用程序通訊時,它會發送一個通訊請求。這個請求必須被送到一個確切的地址。在雙方「握手」以後,TCP 將在兩個應用程序之間創建一個全雙工 (full-duplex) 的通訊。
這個全雙工的通訊將佔用兩個計算機之間的通訊線路,直到它被一方或雙方關閉爲止。
TCP是因特網中的傳輸層協議,使用三次握手協議創建鏈接。當主動方發出SYN鏈接請求後,等待對方回答SYN+ACK[1],並最終對對方的 SYN 執行 ACK 確認。這種創建鏈接的方法能夠防止產生錯誤的鏈接。[1] TCP三次握手的過程以下: 客戶端發送SYN(SEQ=x)報文給服務器端,進入SYN_SEND狀態。 服務器端收到SYN報文,迴應一個SYN (SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態。 客戶端收到服務器端的SYN報文,迴應一個ACK(ACK=y+1)報文,進入Established狀態。 三次握手完成,TCP客戶端和服務器端成功地創建鏈接,能夠開始傳輸數據了。
TCP是因特網中的傳輸層協議,使用三次握手協議創建鏈接。當主動方發出SYN鏈接請求後,等待對方回答SYN+ACK[1],並最終對對方的 SYN 執行 ACK 確認。這種創建鏈接的方法能夠防止產生錯誤的鏈接。[1]
TCP三次握手的過程以下:
客戶端發送SYN(SEQ=x)報文給服務器端,進入SYN_SEND狀態。
服務器端收到SYN報文,迴應一個SYN (SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態。
客戶端收到服務器端的SYN報文,迴應一個ACK(ACK=y+1)報文,進入Established狀態。
三次握手完成,TCP客戶端和服務器端成功地創建鏈接,能夠開始傳輸數據了。
創建一個鏈接須要三次握手,而終止一個鏈接要通過四次握手,這是由TCP的半關閉(half-close)形成的。 (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。[1] 既然每一個方向都須要一個FIN和一個ACK,所以一般須要4個分節。 注意: (1) 「一般」是指,某些狀況下,步驟1的FIN隨數據一塊兒發送,另外,步驟2和步驟3發送的分節都出自執行被動關閉那一端,有可能被合併成一個分節。[2] (2) 在步驟2與步驟3之間,從執行被動關閉一端到執行主動關閉一端流動數據是可能的,這稱爲「半關閉」(half-close)。 (3) 當一個Unix進程不管自願地(調用exit或從main函數返回)仍是非自願地(收到一個終止本進程的信號)終止時,全部打開的描述符都被關閉,這也致使仍然打開的任何TCP鏈接上也發出一個FIN。 不管是客戶仍是服務器,任何一端均可以執行主動關閉。一般狀況是,客戶執行主動關閉,可是某些協議,例如,HTTP/1.0卻由服務器執行主動關閉。[2]
創建一個鏈接須要三次握手,而終止一個鏈接要通過四次握手,這是由TCP的半關閉(half-close)形成的。 (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。[1] 既然每一個方向都須要一個FIN和一個ACK,所以一般須要4個分節。 注意: (1) 「一般」是指,某些狀況下,步驟1的FIN隨數據一塊兒發送,另外,步驟2和步驟3發送的分節都出自執行被動關閉那一端,有可能被合併成一個分節。[2] (2) 在步驟2與步驟3之間,從執行被動關閉一端到執行主動關閉一端流動數據是可能的,這稱爲「半關閉」(half-close)。 (3) 當一個Unix進程不管自願地(調用exit或從main函數返回)仍是非自願地(收到一個終止本進程的信號)終止時,全部打開的描述符都被關閉,這也致使仍然打開的任何TCP鏈接上也發出一個FIN。 不管是客戶仍是服務器,任何一端均可以執行主動關閉。一般狀況是,客戶執行主動關閉,可是某些協議,例如,HTTP/1.0卻由服務器執行主動關閉。[2]
UDP協議
當應用程序但願經過UDP與一個應用程序通訊時,傳輸數據以前源端和終端不創建鏈接。
當它想傳送時就簡單地去抓取來自應用程序的數據,並儘量快地把它扔到網絡上。
tcp和udp的對比
TCP---傳輸控制協議,提供的是面向鏈接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間創建一個TCP鏈接,以後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另外一端。
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,可是並不能保證它們能到達目的地。因爲UDP在傳輸數據報前不用在客戶和服務器之間創建一個鏈接,且沒有超時重發等機制,故而傳輸速度很快
如今Internet上流行的協議是TCP/IP協議,該協議中對低於1024的端口都有確切的定義,他們對應着Internet上一些常見的服務。這些常見的服務能夠分爲使用TCP端口(面向鏈接)和使用UDP端口(面向無鏈接)兩種。 說到TCP和UDP,首先要明白「鏈接」和「無鏈接」的含義,他們的關係能夠用一個形象地比喻來講明,就是打電話和寫信。兩我的若是要通話,首先要創建鏈接——即打電話時的撥號,等待響應後——即接聽電話後,才能相互傳遞信息,最後還要斷開鏈接——即掛電話。寫信就比較簡單了,填寫好收信人的地址後將信投入郵筒,收信人就能夠收到了。從這個分析能夠看出,創建鏈接能夠在須要痛心地雙方創建一個傳遞信息的通道,在發送方發送請求鏈接信息接收方響應後,因爲是在接受方響應後纔開始傳遞信息,並且是在一個通道中傳送,所以接受方能比較完整地收到發送方發出的信息,即信息傳遞的可靠性比較高。但也正由於須要創建鏈接,使資源開銷加大(在創建鏈接前必須等待接受方響應,傳輸信息過程當中必須確認信息是否傳到及斷開鏈接時發出相應的信號等),獨佔一個通道,在斷開鏈接錢不能創建另外一個鏈接,即兩人在通話過程當中第三方不能打入電話。而無鏈接是一開始就發送信息(嚴格說來,這是沒有開始、結束的),只是一次性的傳遞,是先不須要接受方的響應,於是在必定程度上也沒法保證信息傳遞的可靠性了,就像寫信同樣,咱們只是將信寄出去,卻不能保證收信人必定能夠收到。 TCP是面向鏈接的,有比較高的可靠性, 一些要求比較高的服務通常使用這個協議,如FTP、Telnet、SMTP、HTTP、POP3等。 而UDP是面向無鏈接的,使用這個協議的常見服務有DNS、SNMP、QQ等。對於QQ必須另外說明一下,QQ2003之前是隻使用UDP協議的,其服務器使用8000端口,偵聽是否有信息傳來,客戶端使用4000端口,向外發送信息(這也就不難理解在通常的顯IP的QQ版本中顯示好友的IP地址信息中端口常爲4000或其後續端口的緣由了),即QQ程序既接受服務又提供服務,在之後的QQ版本中也支持使用TCP協議了。
互聯網協議與osi模型
互聯網協議按照功能不一樣分爲osi七層或tcp/ip五層或tcp/ip四層
每層運行常見物理設備