編寫前的基礎知識html
C/S結構:數據庫
C/S是Client/Server,即客戶端/服務器端架構,一種典型的兩層架構。客戶端包含一個或多個在用戶的電腦上運行的程序服務器端有兩種,一種是數據庫服務器端,客戶端經過數據庫鏈接訪問服務器端的數據;另外一種是Socket服務器端,服務器端的程序經過Socket與客戶端的程序通訊。咱們在本次的搭建就是利用的是Socket服務器端,其架構以下圖所示:編程
ps:若是想對其進行進一步的瞭解能夠看看這篇文章:https://blog.csdn.net/qq_26399665/article/details/52421723socket技術分爲阻塞和非阻塞兩種,兩種的區別是是否馬上的返回,非阻塞的方式資源的利用率會更高。設計模式
https://www.cnblogs.com/onepixel/p/7092302.html(TCP/IP協議)緩存
服務器端:服務器
客戶端:網絡
有關於eproll:http://www.javashuo.com/article/p-aljzskag-m.html ,這裏咱們不詳細介紹,咱們主要來介紹一下Socket通訊,Socket是一個編程接口(API),TCP/IP協議須要向開發者提供作網絡開發用的接口,這就是Socket接口,它是對TCP/IP協議網絡通訊的封裝,首先咱們來介紹一下TCP/IP協議族:架構
可是呢在此以前咱們先介紹一個基礎的知識,就是IP地址和MAC地址的區別,首先麼一個上網的設備都會有一個網卡的東西(又叫作網絡適配器),每臺上網的電腦的都有一個不一樣的MAC地址就像是一個身份證同樣的東西,而IP地址是設備地址同樣的存在,IP地址分爲內網IP地址和外網Ip地址,再外網中每一個路由都有不一樣的IP地址,而鏈接路由的設備都有相同的外網IP,可是在這個局域網中每一個設備的內網IP都各不相同,其實就像每個人都有屬於本身的身份證件,若是咱們根據身份證向某人發快遞那麼將很是的困難,而外網的IP地址就像省市小區同樣具備惟一性,可能幾號樓幾單元(內網)在不一樣的局域網中可能相同,可是加上外網的IP後基本就不會搞錯了,並且咱們發送快遞的效率將大大的提高。socket
兩個主機通訊三個條件:MAC,IP,端口(pid)spa
好了接下來咱們來介紹TCP/IP
整個數據幀由首部、數據和尾部三部分組成,首部固定爲14個字節,包含了目標MAC地址、源MAC地址和類型;數據最短爲46個字節,最長爲1500個字節,若是須要傳輸的數據很長,就必須分割成多個幀進行發送;尾部固定爲4個字節,表示數據幀校驗序列,用於肯定數據包在傳輸過程當中是否損壞。所以,以太網協議經過對電信號進行分組並造成數據幀,而後經過物理介質把數據幀發送給接收方。因此鏈路層的主要工做就是對電信號進行分組並造成具備特定意義的數據幀,而後以廣播的形式經過物理介質發送給接收方。
對於上面的過程,有幾個細節問題值得咱們思考:
發送者如何知道接收者的MAC地址?
發送者如何知道接收者和本身同屬一個子網?
若是接收者和本身不在同一個子網,數據包如何發給對方?
爲了解決這些問題,網絡層引入了三個協議,分別是IP協議、ARP協議、路由協議。
經過前面的介紹咱們知道,MAC地址只與廠商有關,與所處的網絡無關,因此沒法經過MAC地址來判斷兩臺主機是否屬於同一個子網。
所以,網絡層引入了IP協議,制定了一套新地址,使得咱們可以區分兩臺主機是否同屬一個網絡,這套地址就是網絡地址,也就是所謂的IP地址。
IP地址目前有兩個版本,分別是IPv4和IPv6,IPv4是一個32位的地址,常採用4個十進制數字表示。IP協議將這個32位的地址分爲兩部分,前面部分表明網絡地址,後面部分表示該主機在局域網中的地址。因爲各種地址的分法不盡相同,以C類地址192.168.24.1爲例,其中前24位就是網絡地址,後8位就是主機地址。所以, 若是兩個IP地址在同一個子網內,則網絡地址必定相同。爲了判斷IP地址中的網絡地址,IP協議還引入了子網掩碼, IP地址和子網掩碼經過按位與運算後就能夠獲得網絡地址。
因爲發送者和接收者的IP地址是已知的(應用層的協議會傳入), 所以咱們只要經過子網掩碼對兩個IP地址進行AND運算後就可以判斷雙方是否在同一個子網了。
即地址解析協議,是根據IP地址獲取MAC地址的一個網絡層協議。其工做原理以下:
ARP首先會發起一個請求數據包,數據包的首部包含了目標主機的IP地址,而後這個數據包會在鏈路層進行再次包裝,生成以太網數據包,最終由以太網廣播給子網內的全部主機,每一臺主機都會接收到這個數據包,並取出標頭裏的IP地址,而後和本身的IP地址進行比較,若是相同就返回本身的MAC地址,若是不一樣就丟棄該數據包。ARP接收返回消息,以此肯定目標機的MAC地址;與此同時,ARP還會將返回的MAC地址與對應的IP地址存入本機ARP緩存中並保留必定時間,下次請求時直接查詢ARP緩存以節約資源。cmd輸入 arp -a 就能夠查詢本機緩存的ARP數據。
經過ARP協議的工做原理能夠發現,ARP的MAC尋址仍是侷限在同一個子網中,所以網絡層引入了路由協議,首先經過IP協議來判斷兩臺主機是否在同一個子網中,若是在同一個子網,就經過ARP協議查詢對應的MAC地址,而後以廣播的形式向該子網內的主機發送數據包;若是不在同一個子網,以太網會將該數據包轉發給本子網的網關進行路由。網關是互聯網上子網與子網之間的橋樑,因此網關會進行屢次轉發,最終將該數據包轉發到目標IP所在的子網中,而後再經過ARP獲取目標機MAC,最終也是經過廣播形式將數據包發送給接收方。
而完成這個路由協議的物理設備就是路由器,在錯綜複雜的網絡世界裏,路由器扮演者交通樞紐的角色,它會根據信道狀況,選擇並設定路由,以最佳路徑來轉發數據包。
在網絡層被包裝的數據包就叫IP數據包,IPv4數據包的結構以下圖所示:
IP數據包由首部和數據兩部分組成,首部長度爲20個字節,主要包含了目標IP地址和源IP地址,目標IP地址是網關路由的線索和依據;數據部分的最大長度爲65515字節,理論上一個IP數據包的總長度能夠達到65535個字節,而以太網數據包的最大長度是1500個字符,若是超過這個大小,就須要對IP數據包進行分割,分紅多幀發送。
因此,網絡層的主要工做是定義網絡地址,區分網段,子網內MAC尋址,對於不一樣子網的數據包進行路由。
傳輸層其實就是TCP(又稱確認版UDP,主要傳送控制指令)或是UDP層(傳送數據指令),將每一個應用程序分配端口,將數據傳送到具體的應用程序。
應用層就很少講了,其實總結起來就是當你輸入一個網址並按下回車鍵的時候,首先,應用層協議對該請求包作了格式定義;緊接着傳輸層協議加上了雙方的端口號,確認了雙方通訊的應用程序;而後網絡協議加上了雙方的IP地址,確認了雙方的網絡位置;最後鏈路層協議加上了雙方的MAC地址,確認了雙方的物理位置,同時將數據進行分組,造成數據幀,採用廣播方式,經過傳輸介質發送給對方主機。而對於不一樣網段,該數據包首先會轉發給網關路由器,通過屢次轉發後,最終被髮送到目標主機。目標機接收到數據包後,採用對應的協議,對幀數據進行組裝,而後再經過一層一層的協議進行解析,最終被應用層的協議解析並交給服務器處理。
而Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。