編寫前的基礎知識
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協議)
服務器端:
- socket()創建監聽Socket,創建TCP套接字
- bind()綁定服務器端口,將套接字綁定到本地的地址和端口上
- listen()監聽客戶端連接accept()接受連接
- recv/send接收及發送數據
- close()關閉socket
客戶端:
- socket()創建監聽Socket
- connect()連接服務器
- recv/send接收及發送數據
- close()關閉socket
有關於eproll:https://www.cnblogs.com/fnlingnzb-learner/p/5835573.html ,這里我們不詳細介紹,我們主要來介紹一下Socket通信,Socket是一個編程接口(API),TCP/IP協議需要向開發者提供做網絡開發用的接口,這就是Socket接口,它是對TCP/IP協議網絡通信的封裝,首先我們來介紹一下TCP/IP協議族:
但是呢在此之前我們先介紹一個基礎的知識,就是IP地址和MAC地址的區別,首先么一個上網的設備都會有一個網卡的東西(又叫做網絡適配器),每台上網的電腦的都有一個不同的MAC地址就像是一個身份證一樣的東西,而IP地址是設備地址一樣的存在,IP地址分為內網IP地址和外網Ip地址,再外網中每個路由都有不同的IP地址,而連接路由的設備都有相同的外網IP,但是在這個局域網中每個設備的內網IP都各不相同,其實就像每一個人都有屬於自己的身份證件,如果我們根據身份證向某人發快遞那么將非常的困難,而外網的IP地址就像省市小區一樣具有唯一性,可能幾號樓幾單元(內網)在不同的局域網中可能相同,但是加上外網的IP后基本就不會搞錯了,而且我們發送快遞的效率將大大的提升。
兩個主機通信三個條件:MAC,IP,端口(pid)
好了接下來我們來介紹TCP/IP
鏈路層:
整個數據幀由首部、數據和尾部三部分組成,首部固定為14個字節,包含了目標MAC地址、源MAC地址和類型;數據最短為46個字節,最長為1500個字節,如果需要傳輸的數據很長,就必須分割成多個幀進行發送;尾部固定為4個字節,表示數據幀校驗序列,用於確定數據包在傳輸過程中是否損壞。因此,以太網協議通過對電信號進行分組並形成數據幀,然后通過物理介質把數據幀發送給接收方。所以鏈路層的主要工作就是對電信號進行分組並形成具有特定意義的數據幀,然后以廣播的形式通過物理介質發送給接收方。
網絡層:
對於上面的過程,有幾個細節問題值得我們思考:
發送者如何知道接收者的MAC地址?
發送者如何知道接收者和自己同屬一個子網?
如果接收者和自己不在同一個子網,數據包如何發給對方?
為了解決這些問題,網絡層引入了三個協議,分別是IP協議、ARP協議、路由協議。
【1】IP協議
通過前面的介紹我們知道,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運算后就能夠判斷雙方是否在同一個子網了。
【2】ARP協議
即地址解析協議,是根據IP地址獲取MAC地址的一個網絡層協議。其工作原理如下:
ARP首先會發起一個請求數據包,數據包的首部包含了目標主機的IP地址,然后這個數據包會在鏈路層進行再次包裝,生成以太網數據包,最終由以太網廣播給子網內的所有主機,每一台主機都會接收到這個數據包,並取出標頭里的IP地址,然后和自己的IP地址進行比較,如果相同就返回自己的MAC地址,如果不同就丟棄該數據包。ARP接收返回消息,以此確定目標機的MAC地址;與此同時,ARP還會將返回的MAC地址與對應的IP地址存入本機ARP緩存中並保留一定時間,下次請求時直接查詢ARP緩存以節約資源。cmd輸入 arp -a 就可以查詢本機緩存的ARP數據。
【3】路由協議
通過ARP協議的工作原理可以發現,ARP的MAC尋址還是局限在同一個子網中,因此網絡層引入了路由協議,首先通過IP協議來判斷兩台主機是否在同一個子網中,如果在同一個子網,就通過ARP協議查詢對應的MAC地址,然后以廣播的形式向該子網內的主機發送數據包;如果不在同一個子網,以太網會將該數據包轉發給本子網的網關進行路由。網關是互聯網上子網與子網之間的橋梁,所以網關會進行多次轉發,最終將該數據包轉發到目標IP所在的子網中,然后再通過ARP獲取目標機MAC,最終也是通過廣播形式將數據包發送給接收方。
而完成這個路由協議的物理設備就是路由器,在錯綜復雜的網絡世界里,路由器扮演者交通樞紐的角色,它會根據信道情況,選擇並設定路由,以最佳路徑來轉發數據包。
【4】IP數據包
在網絡層被包裝的數據包就叫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去組織數據,以符合指定的協議。