DNS的定義html
1)主機名到IP地址映射的轉換服務python
2)主機別名(host aliasing)數據庫
3)提供負載均衡(load distribution)編程
DNS是一個在因特網上實現分佈式數據庫的精彩範例。api
1.分佈式、層次數據庫緩存
DNS服務器是有層次的,它能夠分爲三種類型:根DNS服務器, 頂級域(Top-Level Domain, TLD )DNS服務器和權威DNS服務器,分別對應下面三個層次(從上至下)服務器
實際上,在DNS服務中, 並不能經過對某個DNS服務器,經過僅僅一次的「請求/響應」就取得主機名/IP地址的查詢結果。相反,須要多個不一樣的DNS服務器之間進行屢次交互才能獲取最終的查詢結果:網絡
2.DNS緩存負載均衡
由於緩存,除了少數DNS查詢之外,根服務器被繞過了。socket
1.DNS報文
DNS只有兩種報文,即查詢和回答報文,而且這兩種報文有着相同的格式。下圖是DNS報文格式:
2.在DNS數據庫中插入記錄
假設你剛剛建立了一個網絡烏托邦(Network Utopia)公司, 要作的第一件事情就是到註冊登記機構註冊域名(networkutopia.com), 註冊的時候,須要向該機構提供你的權威DNS服務器的名字和IP地址,該註冊機構將確保將一個NS記錄和A記錄被插入com頂級域DNS服務器中。
在P2P文件分發中,每一個對等方可以向任務其餘對等方從新分發它已經收到的該文件的任何部分,從而在分發過程當中協助該服務器
1.P2P體系結構的擴展性
擴展性的直接成因是:對等方除了是比特的消費者外仍是它們的從新分發者。
2.BitTorrent
BitTorrent是一種用於文件分發的流行P2P協議。每一個下載者在下載的同時不斷向其餘下載者上傳已下載的數據。
咱們也能使用壓縮生成相同視頻的多個版本,每一個版本有不一樣的質量等級。
因爲HTTP流具備缺陷,無論客戶可用的帶寬大小,全部客戶都接收到的相同編碼的視頻。這致使了一種新型基於HTTP的流的研發,稱爲經HTTP的動態適應性流(Dynamic Adaptive Streaming over HTTP,DASH).在DASH中,視頻編碼爲幾個不一樣的版本,其中每一個版本具備不一樣的比特率,對應於不一樣的質量水平。
幾乎全部主要的視頻流公司都利用內空分發網。CDN一般採用兩種不一樣的服務器安置原則。
1.CDN操做
2.集羣選擇策略。
1.UDPClient.py
客戶端代碼:
#socket 模塊造成了在python中全部網絡通訊的基礎 from socket import * serverName='45.76.204.40' #包含服務器的主機名或IP地址 serverPort=12000 #目標端口號 #使用socket()建立客戶套接字。 #第一個參數指示了地址簇:AF_INET指示了底層網絡使用了IPv4 #第二個參數,SOCK_DGRAM指示了它是一個UDP套接字(而不是TCP套接字) #特別注意:咱們無需指定客戶端套接字的端口號,這個工做由操做系統完成 clientSocket=socket(AF_INET,SOCK_DGRAM) message=input('Input lowercase sentence:') #提示用戶從鍵盤輸入,並將輸入讀取到message中 #sendto()爲報文message附上目的地址(serverName,serverPort), #並向進程的套接字clientSocket發送結果分組 clientSocket.sendto(message.encode(),(serverName,serverPort)) #來自因特網的分組到達該客戶的套接字時,其分組數據放在變量ModifiedMessage中,源地址放置在serverAddress中 #方法recvfrom取長度2048做爲輸入 ModifiedMessage,serverAddress=clientSocket.recvfrom(2048) print (ModifiedMessage.decode()) clientSocket.close()
2.UDPServer.py
from socket import * serverPort=12000 serverSocket=socket(AF_INET,SOCK_DGRAM) serverSocket.bind(('',serverPort)) #將端口號與服務器的套接字顯示綁定在一塊兒 print('The server is ready to receive') #這個while容許服務器無限期地接收來自客戶端的分組 while True: message,clientAddress=serverSocket.recvfrom(2048) modifiedMessage=message.upper() serverSocket.sendto(modifiedMessage,clientAddress)
與UDP不一樣,TCP是一個面向鏈接的協議。這意味着,在客戶端和服務器可以開始互相發送數據以前,它們要先握手和建立一個TCP鏈接。鏈接創建以後,當有一方須要給另外一方發送數據,它只需經套接字把數據丟個TCP鏈接,無需再爲數據附上目的地地址。
以下圖所示,使用TCP的兩個通訊進程之間的交互有如下幾個過程:
1.TCPClient.py
from socket import * serverName='127.0.0.1' #服務器的IP地址或主機名(這裏是本地回送地址) serverPort=12000 #第一個參數AF_INET代表底層網絡使用IPv4, #第二個參數SOCK_STREAM代表它是一個TCP套接字(而不是UDP) clientSocket=socket(AF_INET,SOCK_STREAM) #connect()執行完後,執行三次握手,並在客戶和服務器程序之間建立起一條TCP鏈接 clientSocket.connect((serverName,serverPort)) sentence=input('Input lowercase sentence:') #進入客戶套接字,並經過TCP鏈接發送數據 #無需附上目的地地址 clientSocket.send(sentence.decode()) #當字符到達套接字時,它們被放在modifiedSentence,其緩存長度爲2048 #知道收到回車符纔會結束該行 modifiedSentence=clientSocket.recv(2048) print('From Server:',modifiedSentence.encode()) clientSocket.close()
2.TCPServer.py
from socket import * serverPort=12000 #建立一個歡迎套接字serverSocket,將其綁定在serverPort上 serverSocket=socket(AF_INET,SOCK_STREAM) serverSocket.bind(('',serverPort)) #聆聽來自客戶的鏈接請求;參數1表示請求鏈接的最大數 serverSocket.listen(1) print('The server is ready to receive.') while True: #當有客戶敲門時,seerverSocket調用accept(), #在服務器中建立一個叫connectionSocket由這個客戶專用 connectionSocket,addr=serverSocket.accept() sentence=connectionSocket.recv(2048) capitalizedSentence=sentence.upper() connectionSocket.send(capitalizedSentence) #關閉鏈接套接字,沒有關閉歡迎套接字 connectionSocket.close()
參考:
https://blog.csdn.net/qq_36464448/article/details/80305497
https://blog.csdn.net/qq_36464448/article/details/80302793
https://www.cnblogs.com/hithongming/category/1245180.html