計算機網絡自頂向下方法第2章-應用層(application-layer).2

2.4 DNS:因特網的目錄服務

  2.4.1 DNS提供的服務

  DNS的定義html

  • 實體層面看,DNS是一個由分層的DNS服務器實現的分佈式數據庫
  • 協議層面看,DNS是一個使得主機可以查詢分佈式數據庫的應用層協議
  • DNS運行在UDP之上,使用53號端口

  1)主機名到IP地址映射的轉換服務python

  2)主機別名(host aliasing)數據庫

  3)提供負載均衡(load distribution)編程

  2.4.2 DNS工做機理概述

  DNS是一個在因特網上實現分佈式數據庫的精彩範例。api

  1.分佈式、層次數據庫緩存

  DNS服務器是有層次的,它能夠分爲三種類型:根DNS服務器, 頂級域(Top-Level Domain, TLD )DNS服務器和權威DNS服務器,分別對應下面三個層次(從上至下)服務器

  

  • 根DNS服務器:有400多個根名字服務器遍佈全世界,由13個不一樣的組織管理
  • 頂級域DNS服務器:頂級域服務器負責頂級域名,如com,org,net,edu和gov和全部國家的頂級域名如cn,uk,jp (edu 教育機構域名, gov 政府部門域名 , org 非盈利性的組織 ,com 企業域名 )權威DNS服務器:在因特網上具備公共可訪問的主機的每一個組織機構必須提供公共可訪問的DNS記錄,這些記錄將這些主機的名字映射爲IP地址。 由組織機構的權威DNS服務器保存這些DNS記錄,組織機構能夠選擇實現它本身的權威DNS服務器來保持這些記錄,或者經過支付費用將這些記錄存儲在某個服務提供商的DNS服務器中。多數大學和大公司實現和維護它們本身基本的權威DNS服務器。
  • 本地DNS服務器:還有另外一類比較重要的DNS服務器,叫作本地DNS服務器(local DNS server),它並不在咱們上面所說的DNS層次結構中。本地DNS服務器的做用有如下兩點:
    • 1)主機和本地DNS服務器通常是相鄰的,當主機發出DNS請求的時候,該請求會被髮往本地DNS服務器,它起着代理的做用,並將該請求轉發到DNS服務器層次結構中
    • 2)本地DNS服務器能夠經過緩存主機名/IP地址,減小對相同主機名的查詢而消耗的時間,改善時延和性能

  實際上,在DNS服務中, 並不能經過對某個DNS服務器,經過僅僅一次的「請求/響應」就取得主機名/IP地址的查詢結果。相反,須要多個不一樣的DNS服務器之間進行屢次交互才能獲取最終的查詢結果:網絡

  

  2.DNS緩存負載均衡

  由於緩存,除了少數DNS查詢之外,根服務器被繞過了。socket

  2.4.3 DNS記錄和報文

  1.DNS報文

  DNS只有兩種報文,即查詢和回答報文,而且這兩種報文有着相同的格式。下圖是DNS報文格式:

  2.在DNS數據庫中插入記錄

  假設你剛剛建立了一個網絡烏托邦(Network Utopia)公司, 要作的第一件事情就是到註冊登記機構註冊域名(networkutopia.com), 註冊的時候,須要向該機構提供你的權威DNS服務器的名字和IP地址,該註冊機構將確保將一個NS記錄和A記錄被插入com頂級域DNS服務器中。

2.5 P2P文件分發

  在P2P文件分發中,每一個對等方可以向任務其餘對等方從新分發它已經收到的該文件的任何部分,從而在分發過程當中協助該服務器

  1.P2P體系結構的擴展性

  擴展性的直接成因是:對等方除了是比特的消費者外仍是它們的從新分發者。

  2.BitTorrent

  BitTorrent是一種用於文件分發的流行P2P協議。每一個下載者在下載的同時不斷向其餘下載者上傳已下載的數據。

2.6 視頻流和內容分發網

  2.6.1 因特網視頻

  咱們也能使用壓縮生成相同視頻的多個版本,每一個版本有不一樣的質量等級。

  2.6.2 HTTP流和DASH

  因爲HTTP流具備缺陷,無論客戶可用的帶寬大小,全部客戶都接收到的相同編碼的視頻。這致使了一種新型基於HTTP的流的研發,稱爲經HTTP的動態適應性流(Dynamic Adaptive Streaming over HTTP,DASH).在DASH中,視頻編碼爲幾個不一樣的版本,其中每一個版本具備不一樣的比特率,對應於不一樣的質量水平。

  2.6.3 內容分發網(Content Distribution Network,CDN)

  幾乎全部主要的視頻流公司都利用內空分發網。CDN一般採用兩種不一樣的服務器安置原則。

  • 深刻。
  • 邀請作客

  1.CDN操做

  2.集羣選擇策略。

 2.7 套接字編程:生成網絡應用

  2.7.1 UDP套接字編程

  •  UDP是無鏈接的,從一個端系統向另外一個端系統發送獨立的數據分組,不對交付提供任何保證。
  •  以下圖所示,使用UDP的兩個通訊進程之間的交互有如下幾個過程:

  

  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)

  2.7.2 TCP套接字編程

  與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

相關文章
相關標籤/搜索