1. 程式人生 > >python D26 socket、網路整個通訊流程

python D26 socket、網路整個通訊流程

一、C/S架構(client server)

軟體C/S架構:客戶端\服務端構架:京東、淘寶、今日頭條、qq、微信、、、

  B/S架構:瀏覽器(browser)\服務端>>>統一介面可以訪問多個網站

硬體 C/S架構:印表機

 

二、網路通訊整個流程

網線:傳輸電訊號(低壓高壓)

集線器:將所有連線到集線器的網路裝置連通起來

交換機:升級版的集線器

網絡卡:接收電訊號

MAC地址:實體地址:‎58-20-B1-44-99-DB(前三位是生產廠商標識,後三位是生產流水編號。每一臺電腦的MAC地址是惟一的)

每個裝置的mac地址號碼是全球唯一的。 head中包含的源和目標地址由來:ethernet規定接入internet的裝置都必須具備網絡卡,傳送端和接收端的地址便是指網絡卡的地址,即mac地址。   mac地址:每塊網絡卡出廠時都被燒製上一個世界唯一的mac地址,長度為48位2進位制,通常由12位16進位制數表示(前六位是廠商編號,後六位是流水線號)

 

單播:單臺電腦資訊傳到交換機中

廣播:交換機將受到的資訊播到所有電腦中

廣播風暴:網路擁堵,資訊不安全

 

ip地址:

IPv4 地址:192.168.15.68 # 4個點分十進位制

作用:劃分廣播域

IPv4:192.168.15.0-192.168.15.255 #八位進位制 256個電腦

DHCP:自動分配IP地址(交換機中)

Arp表:儲存著ip地址和mac地址對應關係

Arp協議:通過ip地址獲取mac地址

子網掩碼:計算兩個ip地址是否屬於同一網段:

255.255.255.0

 

源ip地址:192.168.15.46

  轉為二進位制:  

  11000000.10101000.00001111.00101110(源ip)

  11111111.11111111.11111111.00000000(掩碼)

  11000000.10101000.00001111.00000000 #192.168.15.0

  目標ip:192.168.15.30  (同一個網段)

 

路由器轉發訊息

路由器協議:計算路由轉發訊息的最優路徑

埠號:0-65535,確定電腦行的應用程式(每個應用程式都有一個對應的埠號)

ip地址+埠 = 確定某個電腦上的某個應用程式

 

三、內網和外網:   

    所謂內網就是我們平常說的區域網。區域網就是在固定的一個地理區域內由2臺以上的電腦用網線和其他網路裝置搭建而成的一個封閉的計算機組。它可以是鄰居之間的2臺電腦,也可以是一幢

100層大樓裡的1000臺電腦。區域網可以是獨立封閉執行的,也可以是和外網相連線的。
所謂外網,也就是廣域網。是一種地域跨度非常大的網路集合。它是由無數個區域網+獨立伺服器構成的。注意,此處所說的區域網既可以是小型的廣域網,也可以是區域網。
    實際上,從規模上來看我們很難分辨區域網與廣域網,因為大小都是相對的。所以。真正區域網與廣域網的分別是通過IP地址來實現的。
    任何一臺電腦要上網,都必須在網路上有一個唯一的IP地址。在區域網內,這個IP地址是唯一的。但是在另外一個區域網,這個IP地址仍然能夠使用。

 

四、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地址了,提高了效率,如果是第一次請求,請看上面的DNS查詢過程

步驟

  本地查詢順序

    瀏覽器快取: 瀏覽器會按照一定的頻率快取DNS記錄。chrome://net-internals/#dns 檢視chormeDNS快取。

    作業系統快取: 如果瀏覽器快取中找不到需要的DNS記錄,那就去作業系統中找。cmd命令ipconfig /displaydns 用於檢視作業系統dns快取。

    路由快取: 路由器也有DNS快取。 找本機的hosts檔案 Windows host檔案路徑: C:\WINDOWS\system32\drivers\etc\hosts (由於直接修改之後不能儲存,可以copy一份到桌面,修改之後,在替換掉原路徑下的檔案就可以了),hosts檔案以靜態對映的方式提供IP地址與主機名的對照表。

    ISP(網路服務提供商):如果還是沒有,那麼就去檢查ISP有沒有吧~,每一個ISP(網路服務提供商),或一個大學,甚至是一個大學裡的系都會有一個自己的本地域名伺服器,他會在url第一次訪問時快取該域名的指向。下次再訪問時,他會從快取裡把這個url曾經指向的IP調出來。

  

    遞迴查詢

      第一步:在hosts靜態檔案、DNS解析器快取中查詢某主機的IP地址

      第二步:上一步無法找到,去DNS本地伺服器(即域伺服器)查詢,其本質是去區域伺服器、伺服器快取中查詢

      第三步:本地DNS伺服器查不到就向ISP(ISP是網際網路服務提供商(Internet Service Provider))的簡稱,ISP有專門的DNS伺服器應對DNS查詢請求。再找不到就根據‘根提示檔案’向負責頂級域‘.com’的DNS伺服器查詢

      第四步:'根DNS伺服器'根據查詢域名中的'xyz.com',再向xyz.com的區域伺服器查詢

      第五步:www.xyz.abc.com的DNS伺服器直接解析該域名,將查詢到的ip再原路返回給請求查詢的主機

    迭代查詢:

      第一步:在hosts靜態檔案、DNS解析器快取中查詢某主機的IP地址

      第二步:上一步無法找到,在DNS本地伺服器(即域伺服器)查詢所有本層次的區域伺服器

      第三步:本地DNS伺服器查不到就向ISP是網際網路服務提供商(Internet Service Provider)的簡稱,ISP有專門的DNS伺服器應對DNS查詢請求。再找不到就查詢上一層次的所有區域伺服器,以此類推直至根域名DNS伺服器‘.’

      第四步:到達根域名伺服器後又向下查詢,直至查到結果為止。

    迭代查詢與遞迴查詢結合

    遞迴查詢需要經過逐層查詢才能獲得查詢結果,當查詢具有許多層次的DNS結構時效率很低,所以一般採用兩者相結合的查詢方式。

      第一步:在hosts靜態檔案、DNS解析器快取中查詢某主機的ip地址

      第二步:上一步無法找到,去DNS本地伺服器(即域伺服器)查詢,其本質是去區域伺服器、伺服器快取中查詢

      第三步:本地DNS伺服器查不到就向ISP是網際網路服務提供商(Internet Service Provider)的簡稱,ISP有專門的DNS伺服器應對DNS查詢請求。再找不到就根據‘根提示檔案’向負責頂級域‘.com’的根DNS伺服器查詢

      第四步:根DNS伺服器直接將其區域DNS伺服器的ip地址返回給本地伺服器,而不用再向xyz.com的區域伺服器查詢。

      第五步:(京東有自己DNS伺服器)本地DNS伺服器將結果返回給請求的主機

 

四、閘道器 :通過NAT技術子網的ip轉換為公網ip通過公網的ip就能訪問整個網路

  然後通過路由A轉發將訊息發出去,訊息中包含目標路由D的閘道器的IP地址,閘道器分很多的型別:傳輸閘道器、應用閘道器、協議閘道器等等,我們經常說的閘道器是指的傳輸閘道器,簡稱閘道器,我們主要就看它,閘道器在路由器這裡,當請求資訊傳送到了閘道器這裡的時候,我們先到路由表裡面看看有沒有這個請求的目標地址的IP,如果沒有說明不是我們自己網路內部的IP地址,需要路由轉發出去,到internet網路中,但是網路這麼大,怎麼辦,那麼通過閘道器計算出一個最佳的傳輸路徑去找到對應的目標閘道器地址,在路由轉發的過程中(當請求被路由B接收到了之後,路由B開啟之後發現不是找自己的,就會把請求資訊包繼續轉發)然後傳輸到這個閘道器地址的路由器上,目標閘道器路由器上設定了一些IP地址+埠和各個伺服器上的對映關係,即便是所有的交換機都接收到了這個請求,但是還是能夠找到對應的伺服器。在通過交換機發送到對應的伺服器上

那麼閘道器到底是什麼呢?閘道器實質上是一個網路通向其他網路的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轉發資料包的過程也是如此。

細說二層交換機、三層交換機、四層交換機。百科:

第二層交換機,是根據第二層資料鏈路層的MAC地址和通過站表選擇路由來完成端到端的資料交換的。
二層交換機具體的工作流程如下:
(1) 當交換機從某個埠收到一個數據包,它先讀取幀頭中的源MAC地址,並將MAC地址與源埠做對應儲存在站表中。
(2) 再去讀取幀頭中的目的MAC地址,並在地址表中查詢相應的埠;
(3) 如表中有與這目的MAC地址對應的埠,把資料包直接複製到這埠上;
(4) 如表中找不到相應的埠則把資料包廣播到同一VLAN下的所有埠,當目的機器對源機器迴應時,交換機又可以學習一目的MAC地址與哪個埠對應,在下次傳送資料時就不再需要對所有埠進行廣播了。
不斷的迴圈這個過程,對於全網的MAC地址資訊都可以學習到,二層交換機就是這樣建立和維護它自己的地址表。
    因為站表的建立與維護是由交換機自動完成,而路由器又是屬於第三層裝置,其定址過程是根據IP地址定址和通過路由表與路由協議產生的。所以,第二層交換機的最大好處是資料傳輸速度快,因為它只須識別資料幀中的MAC地址,而直接根據MAC地址產生選擇轉發埠的演算法又十分簡單,非常便於採用ASIC專用晶片實現。顯然,第二層交換機的解決方案,實際上是一個“處處交換”的廉價方案,雖然該方案也能劃分子網、限制廣播、建立VLAN,但它的控制能力較小、靈活性不夠,也無法控制各資訊點的流量,缺乏方便實用的路由功能。

第三層交換機,是直接根據第三層網路層IP地址來完成端到端的資料交換的。
三層交換機的工作原理:
    使用IP的裝置A------------------------三層交換機------------------------使用IP的裝置B
    比如A要給B傳送資料,已知目的IP,那麼A就用子網掩碼取得網路地址,判斷目的IP是否與自己在同一網段。
    如果在同一網段,但不知道轉發資料所需的MAC地址,A就傳送一個ARP請求,B返回其MAC地址,A用此MAC封裝資料包併發送給交換機,交換機起用二層交換模組,查詢MAC地址表,將資料包轉發到相應的埠。
    如果目的IP地址顯示不是同一網段的,那麼A要實現和B的通訊,在流快取條目中沒有對應MAC地址條目,就將第一個正常資料包傳送向一個預設閘道器,這個預設閘道器一般在作業系統中已經設好,對應第三層路由模組,所以可見對於不是同一子網的資料,最先在MAC表中放的是預設閘道器的MAC地址;然後就由三層模組接收到此資料包,查詢路由表以確定到達B的路由,將構造一個新的幀頭,其中以預設閘道器的MAC地址為源MAC地址,以主機B的MAC地址為目的MAC地址。通過一定的識別觸發機制,確立主機A與B的MAC地址及轉發埠的對應關係,並記錄進流快取條目表,以後的A到B的資料,就直接交由二層交換模組完成。這就通常所說的一次路由多次轉發。
表面上看,第三層交換機是第二層交換器與路由器的合二而一,然而這種結合並非簡單的物理結合,而是各取所長的邏輯結合。其重要表現是,當某一資訊源的第一個資料流進行第三層交換後,其中的路由系統將會產生一個MAC地址與IP地址的對映表,並將該表儲存起來,當同一資訊源的後續資料流再次進入交換環境時,交換機將根據第一次產生並儲存的地址對映表,直接從第二層由源地址傳輸到目的地址,不再經過第三路由系統處理,從而消除了路由選擇時造成的網路延遲,提高了資料包的轉發效率,解決了網間傳輸資訊時路由產生的速率瓶頸。所以說,第三層交換機既可完成第二層交換機的埠交換功能,又可完成部分路由器的路由功能。即第三層交換機的交換機方案,實際上是一個能夠支援多層次動態整合的解決方案,雖然這種多層次動態整合功能在某些程度上也能由傳統路由器和第二層交換機搭載完成,但這種搭載方案與採用三層交換機相比,不僅需要更多的裝置配置、佔用更大的空間、設計更多的佈線和花費更高的成本,而且資料傳輸效能也要差得多,因為在海量資料傳輸中,搭載方案中的路由器無法克服路由傳輸速率瓶頸。

第四層交換機
    顯然,第二層交換機和第三層交換機都是基於埠地址的端到端的交換過程,雖然這種基於MAC地址和IP地址的交換機技術,能夠極大地提高各節點之間的資料傳輸率,但卻無法根據埠主機的應用需求來自主確定或動態限制埠的交換過程和資料流量,即缺乏第四層智慧應用交換需求。第四層交換機不僅可以完成端到端交換,還能根據埠主機的應用特點,確定或限制它的交換流量。簡單地說,第四層交換機是基於傳輸層資料包的交換過程的,是一類基於TCP/IP協議應用層的使用者應用交換需求的新型區域網交換機。第四層交換機支援TCP/UDP第四層以下的所有協議,可識別至少80個位元組的資料包包頭長度,可根據TCP/UDP埠號來區分資料包的應用型別,從而實現應用層的訪問控制和服務質量保證。所以,與其說第四層交換機是硬體網路裝置,還不如說它是軟體網路管理系統。也就是說,第四層交換機是一類以軟體技術為主,以硬體技術為輔的網路管理交換裝置。
最後值得指出的是,某些人在不同程度上還存在一些模糊概念,認為所謂第四層交換機實際上就是在第三層交換機上增加了具有通過辨別第四層協議埠的能力,僅在第三層交換機上增加了一些增值軟體罷了,因而並非工作在傳輸層,而是仍然在第三層上進行交換操作,只不過是對第三層交換更加敏感而已,從根本上否定第四層交換的關鍵技術與作用。我們知道,資料包的第二層IEEE802.1P欄位或第三層IPToS欄位可以用於區分資料包本身的優先順序,我們說第四層交換機基於第四層資料包交換,這是說它可以根據第四層TCP/UDP埠號來分析資料包應用型別,即第四層交換機不僅完全具備第三層交換機的所有交換功能和效能,還能支援第三層交換機不可能擁有的網路流量和服務質量控制的智慧型功能。
重要技術
    如上所述,第二層交換裝置是依賴於MAC地址和802.1Q協議的VLAN標籤資訊來完成鏈路層交換過程的,第三層交換/路由裝置則是將IP地址資訊用於網路路徑選擇來完成交換過程的,第四層交換裝置則是用傳輸層資料包的包頭資訊來幫助資訊交換和傳輸處理的。也就是說,第四層交換機的交換資訊所描述的具體內容,實質上是一個包含在每個IP包中的所有協議或程序,如用於Web傳輸的HTTP,用於檔案傳輸的FTP,用於終端通訊的Telnet,用於安全通訊的SSL等協議。這樣,在一個IP網路裡,普遍使用的第四層交換協議,其實就是TCP(用於基於連線的對話,例如FTP)和UDP(用基於無連線的通訊,例如SNMP或SMTP)這兩個協議。
    由於TCP和UDP資料包的包頭不僅包括了“埠號”這個域,它還指明瞭正在傳輸的資料包是什麼型別的網路資料,使用這種與特定應用有關的資訊(埠號),就可以完成大量與網路資料及資訊傳輸和交換相關的質量服務,其中最值得說明的是如下五項重要應用技術,因為它們是第四層交換機普遍採用的主要技術。
二三四層交換機

 

五、初識socket

主要是建立一個服務端,在建立服務端的時候,主要步驟如下: 

建立socket物件socket——》繫結IP地址和埠bind——》監聽listen——》得到請求accept——》接收請求recv——》傳送資訊send——》關閉close

import socket
# 例項化一個socket物件
server = socket.socket()  # 建立一個手機(server)
ip_port = ("192.168.15.68", 8999) # 建立一個ip,和埠 相當於買了個電話卡
server.bind(ip_port) # 插卡

# 監聽
server.listen() # 開機

# 等待客戶端連線
conn, adds = server.accept() # 等別人電話,回產生阻塞
print(conn)  # conn連線管道
print(adds)  # adds客戶端地址  #('192.168.15.68', 60392) 60392:客戶端埠號電腦隨機分配

while 1:
    from_client_msg = conn.recv(1024) # 接收客戶端資訊
    print("來自客戶端的訊息:", from_client_msg.decode("utf-8")) # 顯示資訊
    server_msg = input("請輸入對話(q退出):") # 向客戶端傳送資訊 資訊必須是bytes型別的(需要編碼)
    if server_msg.upper() == "Q":
        break
    else:
        conn.send(server_msg.encode("utf-8"))

conn.close() # 關閉通道
server.close() # 關機 關閉socket
server 服務單

 

客戶端程式碼就是連線伺服器,接收和傳送訊息,具體流程如下: 

建立socket物件socket——》connet連線伺服器——》獲取訊息recv——》傳送訊息send——關閉close

import socket
# 例項化一個socket物件
client = socket.socket() # 建立一個客戶端
server_ip_port = ("192.168.15.68", 8999) # 服務端的ip和埠
client.connect(server_ip_port) # 連線服務端ip和埠

while 1:
    client_msg = input("請輸入對話(q退出):") # 想服務端傳送資訊 必須是bytes型別
    if client_msg.upper() == "Q":
        break
    else:
        client.send(client_msg.encode("utf-8"))

        from_server_msg = client.recv(1024)
        print("來自服務端的資訊:", from_server_msg.decode("utf-8"))  # 將接受的資訊bytes解碼

client.close()
client 客戶端