1. 程式人生 > >day 26 C/S架構, 網路通訊流程, 初識socket

day 26 C/S架構, 網路通訊流程, 初識socket

   1.  C/S 架構 : client 客戶端/ sever 服務端

  軟體c/s架構:  QQ, 微信, 瀏覽器等, 其中中瀏覽器又比較特殊,很多網站是基於瀏覽器來進行訪問的,瀏覽器和各個網站服務端進行的通訊方式又常被成為B\S架構(瀏覽器英文名稱:Browser)

  硬體c/s架構: 印表機 

 

  2. 網路通訊流程:

  以本地的電腦瀏覽器訪問京東網站為例

  (1) 網絡卡和mac地址

  • 電腦插網線的地方就叫做網絡卡,網絡卡提供了網路的介面,這是硬體上面的,關於電腦的網絡卡,並不是Ip地址,而是全球唯一的mac地址,專門給網路裝置設定,電腦出廠的時候給定的
  • head中包含的源和目標地址由來:ethernet規定接入internet的裝置都必須具備網絡卡,傳送端和接收端的地址便是指網絡卡的地址,即mac地址。   
  • mac地址:每塊網絡卡出廠時都被燒製上一個世界唯一的mac地址,長度為48位2進位制,通常由12位16進位制數表示(前六位是廠商編號,後六位是流水線號)

  (2) IP地址

  編碼的回顧: 一個位元組等於8位,8個2進位制的數可以表示256個位元組此處IP地址是由點分割的四個十進位制的數,而十進位制的數在計算機中是由二進位制表示的,即

  • 0.0.0.0--255.255.255.255                   (十進位制)
  • 0000000.00000000.00000000.00000000 -- 11111111.11111111.11111111.11111111   (二進位制)

   (3) 網路通訊流程

   arp協議功能:廣播的方式傳送資料包,獲取目標主機的mac地址 

  流程:

  第一步:開啟瀏覽器,想要請求訪問京東,在位址列輸入了網址:www.jd.com。(www.jd.com是域名就是一個IP地址的名稱,IP地址不好記,所有有了域名。)

  第二步:先將請求資訊發給了交換機,然後交給了路由器,路由發給DNS伺服器,通過DNS協議去找我們要訪問的京東的IP地址:

  第三步:查到的京東伺服器對應的IP地址之後,路由器通過路由協議找到一個路由轉發的最優路徑,將你的請求資訊還送給這個IP地址的京東的路由器

  第四步:京東的路由器發給了京東網站的伺服器上

  第五步:京東網站伺服器按照來的時候的路徑,在返回給你他自己的網站

  第六步:當你開啟瀏覽器的時候,你的電腦給你的瀏覽器這個執行起來的程式給了一個編號,叫做埠號,當你的電腦收到京東傳送過來的訊息的時候,你的電腦通過埠號找到你的瀏覽器,你的瀏覽器拿到了京東的網站資訊,然後將網站呈現在了自己的瀏覽器上

  (4) 內網和外網

  • 所謂內網就是我們平常說的區域網。區域網就是在固定的一個地理區域內由2臺以上的電腦用網線和其他網路裝置搭建而成的一個封閉的計算機組,它可以是鄰居之間的2臺電腦,也可以是一幢100層大樓裡的1000臺電腦。區域網可以是獨立封閉執行的,也可以是和外網相連線的。
  • 所謂外網,也就是廣域網。是一種地域跨度非常大的網路集合。它是由無數個區域網+獨立伺服器構成的。注意,此處所說的區域網既可以是小型的廣域網,也可以是區域網。

  實際上,從規模上來看我們很難分辨區域網與廣域網,因為大小都是相對的。所以。真正區域網與廣域網的分別是通過IP地址來實現的。
任何一臺電腦要上網,都必須在網路上有一個唯一的IP地址。在區域網內,這個IP地址是唯一的。但是在另外一個區域網,這個IP地址仍然能夠使用。(網路A裡有一臺IP地址為192.168.1.231的客戶端,網路B裡也可以有一臺同樣IP的電腦。那麼。我們就說這2臺機器分別在2個局域網裡。但是在廣域網內,所有的IP地址都是唯一的,不可重複)

       如果只有內網的ip地址你是不能上網的,你上網肯定要通過一個外網地址,這個外網地址又稱為公網地址,這個公網地址是全球唯一的,他在你的對外出口的路由器上,也就是你的外網閘道器地址

 

   (5) DNS 伺服器

  當我們請求https:\\www.JD.com的時候,首先電腦會在本地的DNS快取中找是否有這個DNS快取(DNS(Domain Name Server,域名伺服器)是進行域名(domain name)和與之相對應的IP地址 (IP address)轉換的伺服器。

  DNS中儲存了一張域名(domain name)和與之相對應的IP地址 (IP address)的表,以解析訊息的域名。

  域名是Internet上某一臺計算機或計算機組的名稱,用於在資料傳輸時標識計算機的電子方位(有時也指地理位置)。域名是由一串用點分隔的名字組成的,通常包含組織名,而且始終包括兩到三個字母的字尾,以指明組織的型別或該域所在的國家或地區。

   DNS是計算機域名系統 (Domain Name System 或Domain Name Service) 的縮寫,它是由域名解析器和域名伺服器組成的。

  域名伺服器是指儲存有該網路中所有主機的域名和對應IP地址,並具有將域名轉換為IP地址功能的伺服器。其中域名必須對應一個IP地址,一個IP地址可以有多個域名,而IP地址不一定有域名。域名系統採用類似目錄樹的等級結構。

  域名伺服器通常為客戶機/伺服器模式中的伺服器方,它主要有兩種形式:主伺服器和轉發伺服器。將域名對映為IP地址的過程就稱為“域名解析”。)

  本地的DNS快取是在我們訪問過一個網站之後,例如京東,那麼本地會儲存一個京東域名和京東伺服器IP地址的對映關係,將來再次請求的時候,就不用再到外部的DNS上查詢這個域名對應的IP地址了,提高了效率.

  

  (6) 交換機、路由器和閘道器(含DHCP)

   那麼閘道器到底是什麼呢?閘道器實質上是一個網路通向其他網路的IP地址。比如有網路A和網路B,網路A的IP地址範圍為 “192.168.1.1~192. 168.1.254”,子網掩碼為255.255.255.0;網路B的IP地址範圍為“192.168.2.1~192.168.2.254”,子網掩碼為255.255.255.0。在沒有路由器的情況下,兩個網路之間是不能進行TCP/IP通訊的,即使是兩個網路連線在同一臺交換機(或集線器)上, TCP/IP協議也會根據子網掩碼(255.255.255.0)判定兩個網路中的主機處在不同的網路裡。而要實現這兩個網路之間的通訊,則必須通過閘道器。如果網路A中的主機發現資料包的目的主機不在本地網路中,就把資料包轉發給它自己的閘道器,再由閘道器轉發給網路B的閘道器,網路B的閘道器再轉發給網路B的某個主機。網路B向網路A轉發資料包的過程也是如此。

  路由器對外部網路的通訊都是通過外網介面(wan口)去轉發出去的,也就是不管你是內網中的哪個電腦,你的請求都要通過路由的外網介面傳送出去,別人對你的請求都是通過外網介面接收進來的,至於路由器上對內的lan口是怎麼分配IP地址給內網的,要看路由器怎麼設定劃分vlan也就是子網(內部區域網),每個lan口的IP地址可以是靜態的,也可以是動態分配的(DHCP協議),而且可以劃分網段,例如:我的1號lan口對接的網段是192.168.1.0-192.168.1.255,那麼所有這個網段的電腦的資訊進出都走這個lan口到路由器上,對於連線路由器的交換機來講,主要的作用就是搭橋用的,搭橋的意思就是讓連線該交換機的所有電腦都能夠連線起來,只要是同一個網段的互相都可以進行通訊,當然這個也要看交換機怎麼配置.

  DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)是一個區域網的網路協議,使用UDP協議工作, 主要有兩個用途:給內部網路或網路服務供應商自動分配IP地址,給使用者或者內部網路管理員作為對所有計算機作中央管理的手段 交換機又分二層交換機和三層交換機,二層交換機主要就是個搭橋的作用,三層交換機還兼有路由的作用,一般現在的交換機都有DHCP功能,也就是說交換機下面連線的這些電腦的子網IP或者說是區域網IP也可以由交換機來動態生成和分配,路由器和交換機所生成的子網IP都是自己在路由器和交換機上設定的,和路由器上的外網IP沒有關係,具體的劃分又分為24位的16位的等等,舉例:24位的就是10.11.1.0-10.11.1.255這256個IP地址,0表示後面的8bit是00000000,255表示後面的8bit是11111111

  

  3. 初始socket

 

#編寫服務端
import socket
#建立一個socket物件
server = socket.socket()    #建立一個手機
ip_port =("192.168.15.51",8900)
#繫結ip地址和埠
server.bind(ip_port)
#監聽ip地址和埠
server.listen()
print("等待中...0101")
#等待客戶端的連線
conn,addr = server.accept()       #conn是連線的通道, addr是地址資訊, 阻塞中

#接受訊息
from_client_msg = conn.recv(1024)
#接收的訊息是bytes型別,需要轉換為字串
print(from_client_msg.decode("utf-8"))

conn.send("蓋澆飯".encode("utf-8"))
conn.close()
server.close()

 

 

#編寫客戶端
import socket
client = socket.socket()
server_ip_port = ("192.168.15.51",8900)

#連線服務端
client.connect(server_ip_port)

#發訊息
client.send("中午吃啥".encode("utf-8"))           #send裡的訊息必須是位元組型別

from_server_msg = client.recv(1024)
print(from_server_msg.decode("utf-8"))

#關閉連線
client.close()