從零開始的python世界的闖蕩之視頻學習篇 第十九話 網路編程---<Three>
#今天搜了搜有關python面試的,發現,問的基本都不會,#這才知道自己依舊是吊車尾。。#然後又看到了一個感動的回答, 技術不行,態度來湊#發現,我的學習態度還是可以的。每天花上幾個小時寫筆記,#這都是無形之中產生的財富。#好的,今天來講 tcp 以及 網路通信的一些知識,全是概念。概念比較多,寫了大概兩天。。。。。
一.廣播
#事先說明,廣播只有udp廣播,tcp可是沒有廣播的
#1,.udp廣播
#就像學校裡頭,每當中午飯點的時候,都會播放音樂,能讓全校的人都能聽見,這就是生活中的廣播。#那麼網路中的廣播是什麼呢?同理,那就是一台計算機,向與你同網段的所有機器,發送數據包#圖示:
#那麼如何實現udp廣播呢? #請看代碼:
#補充#單播: 是進行點對點通信,這就是單播,就像你和我打電話,就咱們兩個。#多播: 是進行點對多通信,就好像做項目,有小組之分,然後老大和單獨一個小組裡的人講話。#廣播風暴:就是一個網段中,廣播數據充斥網路無法處理,並佔用大量網路帶寬,導致正常業務不能運行 廣播也是有風險的,需要善用。#廣播適用場景: 一般常用於尋找指定mac地址的機器,或者說當需要向同網段的機器發送信息的時候
二.網路通信
#1.packet tracer工具的安裝
#2.工具的介紹
#packet tracer工具是一個思科的網路模擬工具,它為用戶提供了設計、配置、排除網路故障提供了 網路模擬環境,用戶可以在軟體的圖形用戶界面上直接使用拖曳方法建立網路拓撲,並可提供數據包在 網路中行進的詳細處理過程,觀察網路實時運行情況。
#3.第一個示例 2台電腦進行組網
#兩台電腦都要設置,並且ip不能一樣,但是要保證子網掩碼要一樣
#如何判斷兩個計算機能夠通信呢? 咱們使用命令 ping 來進行測試。#ping 命令是專門用來檢測兩個ip是否能夠相互通信。利用的是icmp協議
#由這個示例,可以學習到,當兩個主機在同一個網段,就能夠進行直接通信。#那麼什麼是子網掩碼呢?#答疑:又叫網路掩碼、地址掩碼、子網路遮罩,它是一種用來指明一個IP地址的哪些位標識的是主機 所在的子網,以及哪些位標識的是主機的位掩碼。子網掩碼不能單獨存在,它必須結合IP地址 一起使用。#子網掩碼的作用? #答疑: 子網掩碼只有一個作用,就是將某個IP地址劃分成網路地址和主機地址兩部分#那麼,咱們怎麼判斷機器在同一個網段呢?#答疑:咱們需要利用子網掩碼,以及IP地址, 將他們全部化成2進位表示。然後逐位進行與運算。# 此時會得到一個新的二進位數,他就是該機器的網路號。只要其他機器的網路號也是這個,# 那麼稱他們在同一個網段,能夠通信。
#4.第二個示例 利用集線器進行組網
#什麼是集線器?#答疑:集線器又稱之為hub,屬於純硬體網路底層設備,它發送數據時都是沒有針對性的,而是採用廣播 方式發送,容易造成廣播風暴。#集線器的作用?#答疑:集線器的主要功能是對接收到的信號進行再生整形放大, 以擴大網路的傳輸距離,同時把所有節點集中在以它為中心的節點上。#疑惑: 當我們有3台電腦,該如何讓他們相互都能夠通信呢? 如下圖
#此時,咱們就需要利用到集線器了。
#上圖可以發現,集線器充當一個中介,給多個機器進行牽線。讓他們能夠類似於相互連接的狀態。
#5.第三個示例 利用交換機組網
#什麼是交換機? #答疑:交換機(又名交換式集線器)作用可以簡單的理解為將一些機器連接起來組成一個區域網,並且 擁有"智能記憶"能力和"學習"能力。具有MAC地址表。 此處只說二層交換機。#交換機的作用是什麼?#答疑:交換機不僅具有和集線器一樣的功能,還有記錄MAC地址的功能,這樣在發送數據的時候,並不 需要一直採用廣播的方式, 只有第一次才需要廣播。 轉發過濾:當一個數據幀的目的地址在MAC地址表中有映射時,它被轉發到連接目的節點的埠 而不是所有埠(如該數據幀為廣播幀則轉發至所有埠) 學習功能:乙太網交換機了解每一埠相連設備的MAC地址,並將地址同相應的埠映射起來存 放在交換機緩存中的MAC地址表中
#在講解具體操作過程的時候,有必要先講解幾個名詞。#1.MAC地址: 也成為物理地址,由六個十六進位數組成,前三個為IEEE機構規定的固定數值,後三個為 廠家製造的商品序列號。 MAC地址就如同我們身份證上的身份證號碼,具有全球唯一性。#2.MAC地址的作用: 唯一的標識一個機器。他在tcp/ip7層模型的第二層鏈路層發揮作用。#3.為什麼有了ip還要mac地址呢?# 答疑:ip地址只在邏輯上標記計算機的位置,mac地址是物理實際標記計算機的位置#4.arp協議:地址解析協議,是根據IP地址獲取物理地址的一個TCP/IP協議。#5.arp協議的工作過程:1.當主機A 想要與主機B通信的時候, 主機A根據路由表確定主機B的IP地址, 然後,查看arp緩存,如果有IP對於的物理地址,那麼直接將數據發送給主機B 2.如果沒有主機B的物理地址,主機A會發送ARP請求廣播到本地網路的所有主機 3.所有主機判斷一下請求中的目的IP與自己是否相同,如果不是,就將包丟棄 4.如果是的話,那麼就將主機A的IP地址和MAC地址映射添加到本地ARP緩存中 5.主機B再將包含其MAC地址的ARP回復消息直接發送回主機A 6.主機A收到從主機B發來的ARP回復消息時,會用主機B的IP和MAC地址映射更新 ARP緩存。但是這個緩存有時間,過期了還得重複以上的步驟。#6.icmp協議: 當我們使用ping 命令的時候,實際上就是利用icmp協議,他用來測試兩個ip是否是互通 的。#7.rarp 協議:反向地址轉換協議, 也就是根據物理地址,獲取IP地址。#8.查看arp緩存的命令 :arp -a #9.刪除arp緩存的命令 :arp -d #好的,有上面的知識後,咱們來探索一下,當主機0 去 ping 主機1 的時候,會有哪些過程?#
#根據圖片簡單的總結一下具體步驟: 1.主機0先檢查自己arp緩存是否有主機1ip對應的物理地址,如果沒有,就向本地網路廣播發送 arp請求包。 2.本地網路中的主機檢查ARP中的目的IP是否為自己的IP,如果不是則丟棄。 3.如果是的話,將源IP以及物理地址加入到本地的ARP緩存中,然後再把自己的IP以及物理地址發回去 4.主機0接受到了主機1發回的IP和物理地址,將他們假如到本地的ARP緩存中。 5.然後開始icmp包的發送。
#6.疑問統一解答:
#1.兩台電腦之間能通信的前提是什麼?#答疑: 這兩台電腦要在同一個網段中,並且線路要完好連接。#2.多台電腦之間為什麼不能把網線剪開鏈接在一起?#答疑: 肯定不行,網線不是電線,網線只能有兩個頭,一旦剪開再拼接成三頭,那麼這線就沒用了#3.鏈接多台電腦的hub集線器有什麼用?#答疑:集線器能夠完成多個電腦的鏈接。#4.集線器和交換機的區別?#答疑: 交換機可以說是集線器的升級版,交換機在一定程度上避免了廣播風暴產生的概率,還具有 學習和記錄MAC地址的能力。
#7.利用路由器進行組網
#路由器(Router),是連接網際網路中各區域網、廣域網的設備,它會根據信道的情況自動選擇和設定路 由,以最佳路徑,按前後順序發送信號。又稱網關設備(Gateway)是用於連接多個邏輯上分開的網路 所謂邏輯網路是代表一個單獨的網路或者一個子網。當數據從一個子網傳輸到另一個子網時,可通過路 由器的路由功能來完成 #路由器的功能:連通不同的網路,信息傳輸#好的,咱們開始通過路由來進行不同網段的通信#示例如下圖
#對路由器簡單的總結一下:# 1.不在同一網段的pc,需要設置默認網關才能把數據傳送過去 通常情況下,都會把路由器IP設置成 默認網關# 2. 當路由器收到一個其它網段的數據包時,會根據「路由表」來決定,把此數據包發送到哪個埠; 路由表的設定有靜態和動態方法# 3. 每經過一次路由器,那麼TTL值就會減一# 4. 查看路由表的命令為: route print
#8.模擬仿照咱們訪問網頁的簡單組網
#在操作之前,咱們要知道,我們能訪問網站,實際上,咱們是去訪問一個web伺服器,他會將數據#發送到咱們的電腦上,經過軟體的渲染,才能出現畫面。#所以,伺服器這各全新的概念就需要咱們了解一下下#伺服器是什麼?#答疑:也稱伺服器,是提供計算服務的設備。由於伺服器需要響應服務請求,並進行處理, 因此一般來說伺服器應具備承擔服務並且保障服務的能力。#常接觸的伺服器有:文件伺服器,資料庫伺服器,應用程序伺服器,WEB伺服器##當咱們訪問www.baidu.com 的時候,有沒有想過,為啥咱們沒有訪問IP就能夠獲取到資源呢??#這是因為 dns伺服器的功勞。##那麼dns伺服器是用來幹啥的?#答疑:首先了解一下dns是域名系統的縮寫。萬維網上作為域名和IP地址相互映射的一個分散式資料庫 能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。 而dns伺服器是指保存有該網路中所有主機的域名和對應IP地址,並具有將域名轉換為IP地址功能 的伺服器#當我們電腦訪問網頁的時候,涉及了幾個協議呢?#1.dns域名解析協議:DNS協議是用來將域名轉換為IP地址,他使用的是UDP傳輸。#2.http協議:超文本傳輸協議,是用於從WWW伺服器傳輸超文本到本地瀏覽器的傳輸協議。 它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文本 文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)#現在咱們開始組網
#環境已經搭建完畢,設置方法,是一樣的。一個伺服器用於DNS服務,一個用於HTTP web服務#並且測試,瀏覽器直接通過IP訪問,是能夠出現咱們自定義的網頁。#現在測試,咱們用域名來訪問。
#如果不會進行搭建伺服器的話,可以自行百度。如果不碰壁,那麼記憶將不會深刻#好的咱們現在來講解面試中很容易會問到的問題#請說出,當你訪問www.baidu.com的時候,具體的步驟#答疑:
#再次總結一下過程:# 1.如果都是第一次進行通信的話,雙方都發送一個arp包,讓路由器記錄主機1和http伺服器的物理地址# 2.此時主機1再次發送一個arp包,用來獲取網關的物理地址,因為要從這兒出去。# 3.主機1根據已經設置的dns伺服器地址,直接發送一個dns請求包給dns伺服器接收,dns伺服器返回 一個網址和ip的映射關係數據回來。# 4.主機1發送tcp請求給http伺服器接收。# 5.當http伺服器接收到tcp請求的時候,想要發送確認包回去,發現,自己並不知道主機1的物理地址# 那麼就發送一個arp包,路由器接收到後,回復攜帶主機1物理地址的包給http伺服器。# 6.http伺服器發送tcp確認包給主機1# 7.主機1接收到tcp確認包後, 再給http伺服器發送對確認包確認的包,並緊跟著發送http數據請求包# 8.http伺服器接受到tcp確認包的確認包,連接正式成立,然後緊接著就收到了http數據請求包, 此時就發送給主機1攜帶網站信息的回復包給主機1,然後再進行4次揮手 斷開連接。#如果嫌文字太長太抽象,不妨和我一樣,嘗試的利用Packer Tracer工具實驗一把,它能夠支持數據包一步一步查詢,能夠清晰的看到各種包的運行過程。#最後,補充一下 dhcp協議: 這是一個動態主機配置協議,也就是由dhcp伺服器動態的給你分配ip地址 每次有可能分配到不同的地址。
三.tcp通信的介紹
#1.tcp是什麼?
#tcp和udp一樣,也是一種通信方式,但是利用tcp通信前需要和對方建立連接,通常稱之為3次握手, 同樣的,當要斷開連接的時候,通常稱為4次揮手。#利用tcp通信,就好像生活中的打電話一樣。得先撥通,才能交談
#2.tcp通信的特點?
#1.比udp通信更加的安全,數據不易丟失#2.但是運行速度會比udp更慢一些。#3.通常也稱tcp通信為面向連接,可靠的通信協議。
#3.tcp通信的模型介紹
需要注意的是,tcp和udp有些方法是不同的。伺服器端:#1.listen(): 開啟監聽,可以加一個參數,設置能夠同時連接伺服器的最大數量。也可以說是讓套接字 變成被動。因為默認創建的套接字都是主動的。 實際上是隊列去控制最大數量。當連接數達到了最大數量的時候,那麼新的連接將不會成功 需要等待隊列中連接斷開,才會讓新的連接進去。#2.accept(): 這是一個等待連接過來的函數,他會阻塞在這兒,當有客戶端嘗試連接的時候,才會繼續 往下走,這個函數的返回值為 (new_socket_obj, (client_ip, client_port))#3.recv(): 在tcp通信中使用這個方法來接受數據,只有一個參數,設置一次接受數據的大小#4.send(): 這是在tcp通信中使用,發送數據,也是只有一個參數,就是發送的內容客戶端:#1.connect() : 這個方法是在tcp通信中使用,用來與伺服器端建立連接使用的。參數為一個元組(ip,port)
#4.利用tcp通信重寫模擬qq聊天程序
#伺服器端:import socket#1.創建套接字tcp_socket = socket.socket()#2.綁定Ip和埠addr = ("localhost", 9999)tcp_socket.bind(addr)#3.設置監聽tcp_socket.listen(5)#4.等待連接while True: new_socket, client_addr = tcp_socket.accept() while True: #5.接受數據 content = new_socket.recv(1024) print("%s:%s"%(client_addr,content.decode())) #6.發送數據 server_content = input(">>:") if server_content == "quit": break new_socket.send(server_content.encode()) #7.關閉與客戶端通信的套接字 new_socket.close()
import socket#1.創建套接字client_socket = socket.socket()#2.進行連接伺服器端client_socket.connect(("localhost", 9999))#3.開始發送數據while True: client_content = input(">>:") if client_content == "quit": break client_socket.send(client_content.encode()) #4.接受數據 content = client_socket.recv(1024) print("server:%s"%(content.decode())) #5.關閉套接字client_socket.close()
#5.tcp與udp的不同
#1.tcp通信 適用於對速度不是絕對的追求,但是對數據要絕對的安全情況下 udp通信 適用於對速度快的追求,數據安全不做要求的情況。#2.tcp通信 在傳輸數據之前,需要先建立連接。 結束後,需要經過4次揮手斷開連接# udp通信 不需要事先建立連接, 即傳即用。
#6.tcp通信 建立連接的過程
#在講解tcp連接建立過程前,咱們先舉個生活例子#1.男朋友對女朋友說我給你買了一個禮物#2.女朋友對男朋友說什麼禮物,給我看看#3.男朋友說,好,拿給你看。#請記住類似於這樣的例子,有助於你接下來對tcp通信建立連接有很大的幫助。#tcp通信建立連接的過程,也被成為3次握手的過程。
#如果用上面的比喻, 客戶就是男朋友,伺服器就是女朋友。
#通過上述三步,客戶端就能和伺服器端進行通信了。
#6.tcp通信斷開連接的過程
#同樣的,咱們也是用一個生活例子來引入#1.男朋友對女朋友說,咱們分手吧#2.女朋友說,分手就分手#3.然後女朋友就說,把你的東西拿走#4.男朋友說,拿走就拿走。之後彼此就相忘於江湖了。#tcp通信斷開連接的過程,一般稱之為四次揮手的過程,更皮的人將它稱之為四步分手的過程。#
#如果記不住這個過程,可以把我的例子記住,保證能懂這個tcp通信的連接與斷開過程。
#7.長連接和短連接
#當咱們使用tcp通信的時候,是需要先通過三次握手建立連接後才能開始通信,然後通過四次分手釋放。#這兩個過程都是需要消耗一定的時間的。#1.什麼是長連接?#答疑:假設咱們有abcde這些數據,規定每次只能發送一個字母,那麼咱們發送的過程為 三次握手建立連接--> 發送a --> 發送b --> 發送c --> .... -->發送e -->四次分手釋放連接 這就是所謂的長連接,只建立一次,就開始傳輸所有的數據,然後只釋放一次。 比如打遊戲,你登陸遊戲,這就相當於三次握手進行建立連接,然後你操縱遊戲人物,最後 你結束遊戲,此時就相當於四次分手釋放連接。#2.什麼是短連接?#答疑: 同樣,假設咱們有abcde這些數據,規定每次只能發送一個字母,那麼咱們發送的過程為 三次握手建立連接-->發送a-->四次分手釋放連接 三次握手建立連接-->發送b-->四次分手釋放連接 ...... 三次握手建立連接-->發送e-->四次分手釋放連接 這就是所謂的短連接,每發送一次就立馬釋放連接,然後再建立連接進行發送數據。 比如瀏覽網頁,你打開一個網頁,他一直都這個樣子,只有當你刷新或者跳轉的時候,才 會變化。圖示解釋:
#好的,咱們來解釋一下tcp長/短連接的優缺點:1.長連接可以省去較多的TCP建立和關閉的操作,減少浪費,節約時間2.短連接對於伺服器來說管理較為簡單,存在的連接都是有用的連接,不需要額外的控制手段3.長連接如果一直不關閉的話,隨著客戶端越來越多,此時的server會扛不住了。就需要額外的控制 手段。4.如果使用短連接,客戶請求頻繁,將在TCP的建立和關閉操作上浪費時間和帶寬#tcp長/短連接的使用場景#答疑: 長連接:多用於操作頻繁,點對點的通訊,而且連接數不能太多情況。例如資料庫的連接用長連接 短連接:WEB網站的http服務。
#8.tcp的十種狀態
#發送FIN通常是應用層對socket進行關閉的結果
#9.TTL 以及 2msl
#TTL 代表著最大能通過路由器的次數, 默認值為128,每經過一個路由器,值就會減小一。#MSL 指的是報文最長存活時間,一般來說是1-2分鐘。#2MSL 指的就是2倍的MSL時間
#關於上圖,為什麼要等待2MSL時間呢? 主要是怕最後一個ACK數據包收不到。#當伺服器端發送FIN包給客戶端的時候,等待2MSL時間後,伺服器端還沒有收到確認包,#那麼伺服器端就會重發FIN包給客戶端,然後再等待2MSL時間。#在出獄TIME_WAIT的狀態時,兩端的埠都不能使用。要等到2MSL時間結束才可繼續使用#當連接處於2MSL等待階段時任何遲到的報文段都將被丟棄。#當你使用強制的先關閉伺服器端,那麼就會有幾分鐘的時間你是不能夠再啟動伺服器端的,#因為這時候,埠還處於TIME_WAIT狀態。
推薦閱讀: