什麼C/S架構:git
C指的是client(客戶端軟件),S指的是Server(服務端軟件),本章的重點就是教你們寫一個C/S架構的軟件,實現服務端軟件與客戶端軟件基於網絡通訊.程序員
計算機基礎知識:編程
做爲應用開發程序員,咱們開發的軟件都是應用軟件,而應用軟件必須運行於操做系統之上,操做系統則運行於硬件之上,應用軟件是沒法直接操做硬件的,應用軟件對硬件的操做必須調用操做系統的接口,由操做系統操控硬件。安全
客戶端軟件想要基於網絡發送一條消息給服務端軟件,流程是:服務器
網絡的定義:網絡
硬件之上安裝好操做系統,而後裝上軟件你就能夠正常使用了,但此時你也只能本身使用,像下圖這樣,每一個人都擁有一臺本身的機器,然而彼此孤立.架構
如何能你們一塊兒玩耍,那就是聯網了,即internet.tcp
按照功能不一樣,人們將互聯網協議分爲osi七層或tcp/ip五層或tcp/ip四層(咱們只須要掌握tcp/ip五層協議便可),這種分層就比如是學習英語的幾個階段,每一個階段應該掌握專門的技能或者說完成特定的任務,好比:一、學音標 二、學單詞 三、學語法 四、寫做文。工具
每層運行常見物理設備(瞭解)oop
TCP/IP定義:
Transmission Control Protocol/Internet Protocol的簡寫,中譯名爲傳輸控制協議/因特網互聯協議,又名網絡通信協議,是Internet最基本的協議、Internet國際互聯網絡的基礎.
TCP/IP的起源:
20世紀50年代末,正處於冷戰時期。當時美國軍方爲了本身的計算機網絡在受到襲擊時,即便部分網絡被摧毀,其他部分仍能保持通訊聯繫,便由美國國防部的高級研究計劃局(ARPA)建設了一個軍用網,叫作「阿帕網」(ARPAnet)。阿帕網於1969年正式啓用,當時僅鏈接了4臺計算機,供科學家們進行計算機聯網實驗用,這就是因特網的前身。
到70年代,ARPAnet已經有了好幾十個計算機網絡,可是每一個網絡只能在網絡內部的計算機之間互聯通訊,不一樣計算機網絡之間仍然不能互通。爲此, ARPA又設立了新的研究項目,支持學術界和工業界進行有關的研究,研究的主要內容就是想用一種新的方法將不一樣的計算機局域網互聯,造成「互聯網」。研究人員稱之爲「internetwork」,簡稱「Internet」,這個名詞就一直沿用到如今。
終於到1974年,TCP/IP誕生啦,TCP/IP有一個很是重要的特色,就是開放性,即TCP/IP的規範和Internet的技術都是公開的。目的就是使任何廠家生產的計算機都能相互通訊,使Internet成爲一個開放的系統,這正是後來Internet獲得飛速發展的重要緣由。
OSI模型
美國國防部在開發tcp/ip的同時,還有一些其它大廠商也開發出了本身的網絡體系,實際上世界上第一個網絡體系結構由IBM公司提出(也是74年,比TCP/IP略早,SNA),之後其餘公司也相繼提出本身的網絡體系結構如:Digital公司的DNA,美國國防部的TCP/IP等,多種網絡體系結構並存,其結果是若採用IBM的結構,只能選用IBM的產品,只能與同種結構的網絡互聯。
這就像中國人說中文,美國人說英語,日本人說日本話同樣,同一國家的人溝通沒問題,但不一樣國家之間的人無法通訊。爲了解決網絡通訊中這樣不互通的問題,國際標準化組織ISO於1977年成立了一個委員會,在現有網絡的基礎上,提出了不基於具體機型、操做系統或公司的網絡體系結構,稱爲開放系統互聯模型。
OSI/RM模型(Open System Interconnection / Reference Model)的設計目的是成爲一個全部計算機廠商都能實現的開放網絡模型,來克服使用衆多私有網絡模型所帶來的困難和低效性。
TCP/IP五層模型詳解:
咱們將應用層,表示層,會話層並做應用層,從tcp/ip五層協議的角度來闡述每層的由來與功能,搞清楚了每層的主要協議
就理解了整個互聯網通訊的原理。
首先,用戶感知到的只是最上面一層應用層,自上而下每層都依賴於下一層,因此咱們從最下一層開始切入,比較好理解
每層都運行特定的協議,越往上越靠近用戶,越往下越靠近硬件
1.物理層:
物理層由來:上面提到,孤立的計算機之間要想一塊兒玩,就必須接入internet,言外之意就是計算機之間必須完成組網
物理層功能:主要是基於電器特性發送高低電壓(電信號),高電壓對應數字1,低電壓對應數字0
2.數據鏈路層:
數據鏈路層由來:單純的電信號0和1沒有任何意義,必須規定電信號多少位一組,每組什麼意思
數據鏈路層的功能:定義了電信號的分組方式
以太網協議:
早期的時候各個公司都有本身的分組方式,後來造成了統一的標準,即以太網協議ethernet
ethernet規定
head包含:(固定18個字節)
data包含:(最短46字節,最長1500字節)
head長度+data長度=最短64字節,最長1518字節,超過最大限制就分片發送
mac地址:
head中包含的源和目標地址由來:ethernet規定接入internet的設備都必須具有網卡,發送端和接收端的地址即是指網卡的地址,即mac地址
mac地址:每塊網卡出廠時都被燒製上一個世界惟一的mac地址,長度爲48位2進制,一般由12位16進制數表示(前六位是廠商編號,後六位是流水線號)
廣播:
有了mac地址,同一網絡內的兩臺主機就能夠通訊了(一臺主機經過arp協議獲取另一臺主機的mac地址)
ethernet採用最原始的方式,廣播的方式進行通訊,即計算機通訊基本靠吼
網絡層:
網絡層由來:有了ethernet、mac地址、廣播的發送方式,世界上的計算機就能夠彼此通訊了,問題是世界範圍的互聯網是由
一個個彼此隔離的小的局域網組成的,那麼若是全部的通訊都採用以太網的廣播方式,那麼一臺機器發送的包全世界都會收到,
這就不只僅是效率低的問題了,這會是一種災難
上圖結論:必須找出一種方法來區分哪些計算機屬於同一廣播域,哪些不是,若是是就採用廣播的方式發送,若是不是,
就採用路由的方式(向不一樣廣播域/子網分發數據包),mac地址是沒法區分的,它只跟廠商有關
網絡層功能:引入一套新的地址用來區分不一樣的廣播域/子網,這套地址即網絡地址
IP地址:
子網掩碼:
所謂」子網掩碼」,就是表示子網絡特徵的一個參數。它在形式上等同於IP地址,也是一個32位二進制數字,它的網絡部分所有爲1,主機部分所有爲0。好比,IP地址172.16.10.1,若是已知網絡部分是前24位,主機部分是後8位,那麼子網絡掩碼就是11111111.11111111.11111111.00000000,寫成十進制就是255.255.255.0。
子網掩碼是用來標識一個IP地址的哪些位是表明網絡位,以及哪些位是表明主機位。子網掩碼不能單獨存在,它必須結合IP地址一塊兒使用。子網掩碼只有一個做用,就是將某個IP地址劃分紅網絡地址和主機地址兩部分。
區分網絡位和主機位是爲了劃分子網,就是把一個大網絡分紅多個小網絡,爲何要分子網呢?
劃分子網本質上就是借主機位到給網絡位,每借一位主機位,這個網段的可分配主機就會越少,好比192.168.1.0/24可用主機255個,借一位變成192.168.1.0/25,那可用主機就從255-128=127個了(從最大的值開始借),再借一位192.168.1.0/26,那可用主機數就變成了255-(128+64)=63個啦
IP地址分類:
IP地址根據網絡ID的不一樣分爲5種類型,A類地址、B類地址、C類地址、D類地址和E類地址。 A類IP地址:一個A類IP地址由1字節的網絡地址和3字節主機地址組成,網絡地址的最高位必須是「0」, 地址範圍從1.0.0.0 到126.0.0.0。可用的A類網絡有126個,每一個網絡能容納1億多個主機。 B類IP地址 :一個B類IP地址由2個字節的網絡地址和2個字節的主機地址組成,網絡地址的最高位必須是「10」,地址範圍從128.0.0.0到191.255.255.255。可用的B類網絡有16382個,每一個網絡能容納6萬多個主機 。 C類IP地址:一個C類IP地址由3字節的網絡地址和1字節的主機地址組成,網絡地址的最高位必須是「110」。範圍從192.0.0.0到223.255.255.255。C類網絡可達209萬餘個,每一個網絡能容納254個主機。 D類地址用於多點廣播(Multicast): D類IP地址第一個字節以「lll0」開始,它是一個專門保留的地址。它並不指向特定的網絡,目前這一類地址被用在多點廣播(Multicast)中。多點廣播地址用來一次尋址一組計算機,它標識共享同一協議的一組計算機。 E類IP地址 以「llll0」開始,爲未來使用保留。
環回接口(loopback)。平時咱們用127.0.0.1來嘗試本身的機器服務器好使很差使。走的就是這個loopback接口。對於環回接口,有以下三點值得注意:
IP協議是TCP/IP協議的核心,全部的TCP,UDP,IMCP,IGCP的數據都以IP數據格式傳輸,要注意的是,IP不是可靠的協議,這是說,IP協議沒有提供一種數據未傳達之後的處理機制--這被認爲是上層協議--TCP或UDP要作的事情。因此這也就出現了TCP是一個可靠的協議,而UDP就沒有那麼可靠的區別。這是後話,暫且不提。
IP協議頭:
arp協議由來:計算機通訊基本靠吼,即廣播的方式,全部上層的包到最後都要封裝上以太網頭,而後經過以太網協議發送,在談及以太網協議時候,我門瞭解到
通訊是基於mac的廣播方式實現,計算機在發包時,獲取自身的mac是容易的,如何獲取目標主機的mac,就須要經過arp協議
arp協議功能:廣播的方式發送數據包,獲取目標主機的mac地址
協議工做方式:每臺主機ip都是已知的
例如:主機172.16.10.10/24訪問172.16.10.11/24
一:首先經過ip地址和子網掩碼區分出本身所處的子網
二:分析172.16.10.10/24與172.16.10.11/24處於同一網絡(若是不是同一網絡,那麼下表中目標ip爲172.16.10.1,經過arp獲取的是網關的mac)
三:這個包會以廣播的方式在發送端所處的子網內傳輸,全部主機接收後拆開包,發現目標ip爲本身的,就響應,返回本身的mac
查看本機arp表的命令
ICMP:
前面講到了,IP協議並非一個可靠的協議,它不保證數據被送達,那麼,天然的,保證數據送達的工做應該由其餘的模塊來完成。其中一個重要的模塊就是ICMP(網絡控制報文)協議。
當傳送IP數據包發生錯誤--好比主機不可達,路由不可達等等,ICMP協議將會把錯誤信息封包,而後傳送回給主機。給主機一個處理錯誤的機會.
咱們通常主要用ICMP協議檢測網絡是否通暢,基於ICMP協議的工具主要有ping 和traceroute
傳輸層:
傳輸層的由來:網絡層的ip幫咱們區分子網,以太網層的mac幫咱們找到主機,而後你們使用的都是應用程序,你的電腦上可能同時開啓qq,暴風影音,迅雷等多個應用程序,
那麼咱們經過ip和mac找到了一臺特定的主機,如何標識這臺主機上的應用程序呢?答案就是端口,端口即應用程序與網卡關聯的編號。
傳輸層功能:創建端口到端口的通訊
補充:端口範圍0-65535,0-1023爲系統佔用端口
傳輸層有兩種協議,TCP和UDP,見下圖:
TCP協議:
可靠傳輸,TCP數據包沒有長度限制,理論上能夠無限長,可是爲了保證網絡的效率,一般TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包沒必要再分割。
![](http://static.javashuo.com/static/loading.gif)
爲何tcp是可靠的數據傳輸呢?
最可靠的方式就是隻要不獲得確認,就從新發送數據報,直到獲得對方的確認爲止。
TCP報頭
UDP協議:
不可靠傳輸,」報頭」部分一共只有8個字節,總長度不超過65,535字節,正好放進一個IP數據包。
總結:TCP協議雖然安全性很高,可是網絡開銷大,而UDP協議雖然沒有提供安全機制,可是網絡開銷小,在如今這個網絡安全已經相對較高的狀況下,爲了保證傳輸的速率,咱們通常仍是會優先考慮UDP協議!