【python web開發知識點整理7】- 網絡編程基礎

網絡協議

(1)TCP/IP協議

TCP/IP是分層協議,如層次圖所示:從底層到應用層,分別是物理層,鏈路層,網絡層,傳輸層,應用層。數據是層層封裝,封裝的方式一般都是在原有數據的前面加一個數據控制頭。

(2)Telnet協議

Telnet是TCP/IP中的一種應用協議,可以爲終端仿真提供支持。可使用戶連接到主機上,使主機響應起來就像它直接連接在終端上一樣。Telnet在發送端和接收端使用TCP的23號端口以進行專用的通信。

(3)FTP協議

FTP協議使用TCP20號和21號端口,20號端口用於數據交換,21號端口用於建立連接,允許目錄和文件訪問,上傳下載,不能遠程執行文件。
TFTP是簡單文件傳輸協議(Trivial File Transfer Protocol,TFTP),TFTP是無連接的,使用UDP的69號端口,用於當數據傳輸錯誤無關緊要而且無須安全性時的小型文件的傳輸。

(4)SMTP協議

SMTP是簡單郵件傳輸協議(Simple Mail Transfer Protocol,SMTP)是爲網絡系統間的電子郵件交換而設計的。使用 25 端口。SMTP只需要在接收端的一個電子郵件地址即可發送郵件。POP3 協議用來接收郵件.使用110端口

(5)DNS服務

DNS是域名解析服務(Domain Name Service, DNS),作用是將域名轉換爲IP地址,或將IP地址轉換爲域名,用於解析完全合格域名(FQDN)。使用53號端口。

(6)DHCP服務

DHCP是動態主機配置協議(DHCP),服務器可以提供的信息有:
1、IP地址
2、子網掩碼(subnet mask)
3、域名(domain name)
4、默認網關(default gateway)
5、DNS

SNMP協議

SNMP是簡單的網絡管理協議,它不是一個軟件,而是用於網絡管理的一套規則。利用SNMP,一個管理工作站可以遠程管理所有支持這種協議的網絡設備,包括監視網絡狀態、修改網絡設備配置、接收網絡事件警告等。

但話又說回來,爲什麼要使用SNMP協議?

因爲網絡設備可能來自不同的廠商,如果每個廠商提供一套獨立的管理接口,將使網絡管理變得越來越複雜,若想對網絡中來自不同廠商的設備監控,用基於SNMP開發的軟件進行管理最方便的,因爲大部分的設備都支持SNMP協議。

那麼SNMP有哪些技術有點?
(1)基於TCP/IP互聯網的標準協議,傳輸層協議一般用UDP
(2)自動化網絡管理。網絡管理員可以利用SNMP平臺在網絡上的節點檢索信息、修改信息、發現故障、完成故障診斷、進行容量規劃和生成報告
(3)屏蔽不同設備的物理差異,實現對不同廠商產品的自動化管理。SNMP只提供最基本得功能集,使得管理任務與被管理設備的物理特徵和實際網絡類型相對獨立,從而實現對不同廠商設備的管理
(4)簡單的請求-應答方式和主動通告方式相結合,並有超時和重傳機制
(5)報文種類少,報文格式簡單,方便解析,易於實現
(6)SNMPv3版本提供了認證和加密安全機制,以及基於用戶和視圖的訪問控制功能,增強了安全性

二、SNMP的網絡架構

SNMP網絡架構由三部分組成:NMS(網絡管理站)、Agent(代理)、MIB(管理信息庫)

1、NMS(網絡管理站)

NMS是網絡中的管理者,是一個利用SNMP協議對網絡設備進行管理和監視的系統。可以是一臺專門用來進行網絡管理的服務器,也可以指某個設備中之中管理功能的一個應用程序。

NMS可以向Agent發出請求,查詢或修改一個或多個具體的參數值。同時,NMS可以接收Agent主動發送的Trap信息,以獲知被管理設備當前的狀態

2、Agent

Agent是網絡設備中的一個應用模塊,用於維護被管理設備的信息數據,並響應NMS的請求,把管理數據彙報給發送請求的NMS。

Aent接收到NMS的請求信息後,完成查詢或修改操作,並把操作結果發送給NMS,完成響應。同時,當設備發生故障或者其他事件的時候,Agent會主動發送Trap信息給NMS,通知設備當前的狀態變化。
3、MIB

任何一個被管理的資源都表示成一個對象,稱爲被管理的對象。MIB就是被管理對象的集合。它定義了被管理對象的一系列的屬性:對象的名稱、對象的訪問權限和對象的數據

類型等。每個Agent都有自己的MIB。MIB也可以看做是NMS和Agent之間的一個接口,通過這個接口,NMS可以對Agent中的每一個被管理對象進行讀/寫操作,從而達到管理和監控設備的目的。
在這裏插入圖片描述
NMS、Agent和MIB之間的關係如圖所示:

MIB的結構:

MIB是以樹狀結構進行存儲的,樹的節點表示被管理對象,它可以用從根開始的一條路徑唯一地識別,這條路徑就稱爲OID。

如圖所示,管理對象system可以用一串數字{1.3.6.1.2.1.1}唯一標識,這串數字就是system的OID。
在這裏插入圖片描述
三、SNMP的操作
在這裏插入圖片描述

後續的文章我們會通過抓包工具來抓取報文,來具體的分析SNMP報文的格式,以及SNMPv1、v2c、v3版本的相同與區別,以及v3所用的基於用戶和基於視圖的安全措施,認證和加密的過程!

長連接、短連接

在HTTP/1.0中,默認使用的是短連接。也就是說,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。如果客戶端瀏覽器訪問的某個HTML或其他類型的 Web頁中包含有其他的Web資源,如JavaScript文件、圖像文件、CSS文件等;當瀏覽器每遇到這樣一個Web資源,就會建立一個HTTP會話。但從 HTTP/1.1起,默認使用長連接,用以保持連接特性。使用長連接的HTTP協議,會在響應頭有加入這行代碼:
Connection:keep-alive
  在使用長連接的情況下,當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的 TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接。Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。實現長連接要客戶端和服務端都支持長連接。HTTP協議的長連接和短連接,實質上是TCP協議的長連接和短連接。

Http請求的過程與原理

1.關於網絡領域的知識(掌握和了解)

a) 協議:tcp、udp、multicast
b) IO (BIO、NIO、AIO)
c) Socket
d) NIO(Netty/Mima)
e) 序列化和反序列化
  1. 一個http請求,在整個網絡中的請求過程

    TCP 總共有四層模型:傳輸層、網絡層、數據鏈路層、物理層

    當應用程序用TCP傳輸數據時,數據被送入協議棧中,通過逐步分層,最終以一串比特流傳送網絡。其中每層都需要增加頭部的信息。

    傳輸層:表示當前的協議頭。使用的是TCP協議傳輸

    網絡層:增加ip頭,IP地址是一個網卡在網絡中的通訊地址

    數據鏈路層:增加MAC頭,表示這個數據包要發送到網卡地址;MAC地址是全局唯一的。

    物理層:轉化爲比特流進行傳輸

在這裏插入圖片描述

爲什麼有了MAC層還要繼續走IP層

我們都知道MAC是全局唯一,就類似於人的身份證號一樣,雖然人的身份證號是和戶口地、出生時間有關,但是人是移動的,不能通過身份證號就能找到這個人再什麼地方,mac地址類似,知道mac地址,並不能在網絡中將數據發送給它,除非它和發送方在同一個網絡內。所以要實現機器之間的通信,不僅僅需要mac地址,也必須需要ip地址。IP地址代表的是,當前機器在網絡中的位置,通過ip層的尋找,就可以實現任意兩臺Internet上的機器之間的傳輸數據。

什麼是IP協議

TCP 和UDP 是兩種著名的傳輸層的協議,它們都是使用IP作爲網絡層協議。IP協議提供了一組數據報文服務,每組分組報文都是由網絡獨立處理和分發。

TCP提供IP環境下的數據可靠傳輸,它提供的服務包括數據流傳送、可靠性、有效流控、全雙工操作和多路複用。通過面向連接、端到端和可靠的數據包發送。通俗說,它是事先爲所發送的數據開闢出連接好的通道,然後再進行數據發送。

UDP則不爲IP提供可靠性、流控或差錯恢復功能。一般來說,TCP對應的是可靠性要求高的應用,而UDP對應的則是可靠性要求低、傳輸經濟的應用。

a) TCP/IP

TCP協議能夠檢測和恢復IP層提供的主機到主機的通信中可能發生的報文丟失、重複及其他錯誤。TCP提供了一個可信賴的字節流通道,這樣應用程序就不需要考慮這些問題。同時,TCP協議是一種面向連接的協議,在使用TCP進行通信之前,兩個應用程序之間需要建立一個TCP連接,而這個連接有涉及到兩臺電腦需要完成握手消息的交換。

b) UDP/IP

UDP協議不會對IP層產生的錯誤進行修復,而是簡單的擴展了IP協議的數據報文服務,使它能夠在應用程序之間工作,而不是在主機之間工作,因此使用UDP協議必須要考慮到報文丟失,順序混亂的問題

5.TCP如何做到可靠傳輸?

a)建立可靠的連接

由於TCP協議是一個種可信的傳輸協議,所以在傳輸之前,需要通過三次握手建立一個連接,所謂的三次握手,就是在建立TCP鏈接時,需要客戶端和服務端總共發送3個包來確認連接的建立

b) 斷開連接(TCP四次揮手協議)

四次揮手錶示TCP斷開連接的時候,需要客戶端和服務端總共發送4個包來確認連接的斷開;客戶端和服務器均可主動發起揮手動作(TCP是一個全雙工協議),在socket編程中,任何一方執行close()操作既可產生揮手操作。

c)爲什麼連接三次握手、關閉四次揮手

三次握手是因爲當Server端收到Client端SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答,SYN報文是用來同步的,第三次發送的時候,客戶發送一個確認包,告訴服務端已經建立連接。但是關閉連接是,當Server端接收到FIN報文時,很可能並不會立即關閉SOCKET(因爲還有消息沒有處理完),所以只能先回復一個ACK報文,告訴CLient端,“你發的FIN報文我收到了”。只有等到我Server端所有報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四次握手。

6.滑動窗口協議

當建立可靠連接以後,就開始進行數據傳輸,在通信過程中,最重要的就是數據包,也就是協議傳輸的數據。如果數據的傳送方和接收方出現來不及接收的情況,就會出現數據的丟失。因此利用滑動窗口機制,很有效的在TCP連接上實現對發送發流量控制。TCP的窗口單位是字節,不是報文段,發送方的的發送窗口不能超過接收方給出的窗口。

三次握手與四次揮手?

通過HTTP網絡請求過程中的TCP協議
TCP連接的特點
相較於UDP來說,更加安全可靠,是面向連接,傳輸的話是以流的形式傳輸
TCP連接如何保證安全可靠的
爲什麼TCP連接需要三次握手,兩次不可以嗎,爲什麼
不可以兩次握手只能一方確認自己的收發沒有問題,而另一方的收沒問題,發可能存在問題

在進行網絡編程時,我們常常見到同步(Sync)/異步(Async),阻塞(Block)/非阻塞(Unblock)四種調用方式:

同步/異步主要針對C端:

同步:

所謂同步,就是在c端發出一個功能調用時,在沒有得到結果之前,該調用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。

例如普通B/S模式(同步):提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能幹任何事

異步:

異步的概念和同步相對。當c端一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。

例如 ajax請求(異步): 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢

阻塞/非阻塞主要針對S端:

阻塞

阻塞調用是指調用結果返回之前,當前線程會被掛起(線程進入非可執行狀態,在這個狀態下,cpu不會給線程分配時間片,即線程暫停運行)。函數只有在得到結果之後纔會返回。

有人也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對於同步調用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回而已。 例如,我們在socket中調用recv函數,如果緩衝區中沒有數據,這個函數就會一直等待,直到有數據才返回。而此時,當前線程還會繼續處理各種各樣的消息。

快遞的例子:比如到你某個時候到A樓一層(假如是內核緩衝區)取快遞,但是你不知道快遞什麼時候過來,你又不能幹別的事,只能死等着。但你可以睡覺(進程處於休眠狀態),因爲你知道快遞把貨送來時一定會給你打個電話(假定一定能叫醒你)。

非阻塞

非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。

還是等快遞的例子:如果用忙輪詢的方法,每隔5分鐘到A樓一層(內核緩衝區)去看快遞來了沒有。如果沒來,立即返回。而快遞來了,就放在A樓一層,等你去取。

對象的阻塞模式和阻塞函數調用
對象是否處於阻塞模式和函數是不是阻塞調用有很強的相關性,但是並不是一一對應的。阻塞對象上可以有非阻塞的調用方式,我們可以通過一定的API去輪詢狀 態,在適當的時候調用阻塞函數,就可以避免阻塞。而對於非阻塞對象,調用特殊的函數也可以進入阻塞調用。函數select就是這樣的一個例子。

總結

同步,就是我客戶端(c端調用者)調用一個功能,該功能沒有結束前,我(c端調用者)死等結果。
異步,就是我(c端調用者)調用一個功能,不需要知道該功能結果,該功能有結果後通知我(c端調用者)即回調通知。
同步/異步主要針對C端, 但是跟S端不是完全沒有關係,同步/異步機制必須S端配合才能實現.同步/異步是由c端自己控制,但是S端是否阻塞/非阻塞, C端完全不需要關心。
阻塞, 就是調用我(s端被調用者,函數),我(s端被調用者,函數)沒有接收完數據或者沒有得到結果之前,我不會返回。
非阻塞, 就是調用我(s端被調用者,函數),我(s端被調用者,函數)立即返回,通過select通知調用者
同步IO和異步IO的區別就在於:數據訪問的時候進程是否阻塞!
阻塞IO和非阻塞IO的區別就在於:應用程序的調用是否立即返回!

同步和異步都只針對於本機SOCKET而言的。

同步和異步,阻塞和非阻塞,有些混用,其實它們完全不是一回事,而且它們修飾的對象也不相同。
阻塞和非阻塞是指當server端的進程訪問的數據如果尚未就緒,進程是否需要等待,簡單說這相當於函數內部的實現區別,也就是未就緒時是直接返回還是等待就緒;
而同步和異步是指client端訪問數據的機制,同步一般指主動請求並等待I/O操作完畢的方式,當數據就緒後在讀寫的時候必須阻塞(區別就緒與讀寫二個階段,同步的讀寫必須阻塞),異步則指主動請求數據後便可以繼續處理其它任務,隨後等待I/O,操作完畢的通知,這可以使進程在數據讀寫時也不阻塞。(等待"通知")

網絡編程模型

阻塞I/O模型:

簡介:進程會一直阻塞,直到數據拷貝完成

非阻塞I/O模型:

簡介:非阻塞IO通過進程反覆調用IO函數(多次系統調用,並馬上返回);在數據拷貝的過程中,進程是阻塞的;

IO複用模型:

簡介:主要是select和epoll;對一個IO端口,兩次調用,兩次返回,比阻塞IO並沒有什麼優越性;關鍵是能實現同時對多個IO端口進行監聽;

I/O複用模型會用到select、poll、epoll函數,這幾個函數也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。

信號驅動IO

簡介:兩次調用,兩次返回;

首先我們允許套接口進行信號驅動I/O,並安裝一個信號處理函數,進程繼續運行並不阻塞。當數據準備好時,進程會收到一個SIGIO信號,可以在信號處理函數中調用I/O操作函數處理數據。

異步IO模型

簡介:數據拷貝的時候進程無需阻塞。

當一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者的輸入輸出操作

同步IO引起進程阻塞,直至IO操作完成。
異步IO不會引起進程阻塞。
IO複用是先通過select調用阻塞。

5個I/O模型的比較:

在這裏插入圖片描述

select、poll、epoll簡介

epoll跟select都能提供多路I/O複用的解決方案。在現在的Linux內核裏有都能夠支持,其中epoll是Linux所特有,而select則應該是POSIX所規定,一般操作系統均有實現

select:

select本質上是通過設置或者檢查存放fd標誌位的數據結構來進行下一步處理。這樣所帶來的缺點是:

1、 單個進程可監視的fd數量被限制,即能監聽端口的大小有限。
一般來說這個數目和系統內存關係很大,具體數目可以cat /proc/sys/fs/file-max察看。32位機默認是1024個。64位機默認是2048.
2、 對socket進行掃描時是線性掃描,即採用輪詢的方法,效率較低:
當套接字比較多的時候,每次select()都要通過遍歷FD_SETSIZE個Socket來完成調度,不管哪個Socket是活躍的,都遍歷一遍。這會浪費很多CPU時間。如果能給套接字註冊某個回調函數,當他們活躍時,自動完成相關操作,那就避免了輪詢,這正是epoll與kqueue做的。
3、需要維護一個用來存放大量fd的數據結構,這樣會使得用戶空間和內核空間在傳遞該結構時複製開銷大

poll:

poll本質上和select沒有區別,它將用戶傳入的數組拷貝到內核空間,然後查詢每個fd對應的設備狀態,如果設備就緒則在設備等待隊列中加入一項並繼續遍歷,如果遍歷完所有fd後沒有發現就緒設備,則掛起當前進程,直到設備就緒或者主動超時,被喚醒後它又要再次遍歷fd。這個過程經歷了多次無謂的遍歷。

它沒有最大連接數的限制,原因是它是基於鏈表來存儲的,但是同樣有一個缺點:

1、大量的fd的數組被整體複製於用戶態和內核地址空間之間,而不管這樣的複製是不是有意義。
2、poll還有一個特點是“水平觸發”,如果報告了fd後,沒有被處理,那麼下次poll時會再次報告該fd。

epoll:

epoll支持水平觸發和邊緣觸發,最大的特點在於邊緣觸發,它只告訴進程哪些fd剛剛變爲就需態,並且只會通知一次。還有一個特點是,epoll使用“事件”的就緒通知方式,通過epoll_ctl註冊fd,一旦該fd就緒,內核就會採用類似callback的回調機制來激活該fd,epoll_wait便可以收到通知

epoll的優點:

1、沒有最大併發連接的限制,能打開的FD的上限遠大於1024(1G的內存上能監聽約10萬個端口);
2、效率提升,不是輪詢的方式,不會隨着FD數目的增加效率下降。只有活躍可用的FD纔會調用callback函數; 即Epoll最大的優點就在於它只管你“活躍”的連接,而跟連接總數無關,因此在實際的網絡環境中,Epoll的效率就會遠遠高於select和poll。
3、 內存拷貝,利用mmap()文件映射內存加速與內核空間的消息傳遞;即epoll使用mmap減少複製開銷。

總結:

綜上,在選擇select,poll,epoll時要根據具體的使用場合以及這三種方式的自身特點。

1、表面上看epoll的性能最好,但是在連接數少並且連接都十分活躍的情況下,select和poll的性能可能比epoll好,畢竟epoll的通知機制需要很多函數回調。
2、select低效是因爲每次它都需要輪詢。但低效也是相對的,視情況而定,也可通過良好的設計改善

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章