1.遞迴查詢和迭代查詢:遞迴查詢是一條環路,直接想成遞迴的定義就行,你想查乙個**的ip,首先將這個**傳給它的本地dns,然後認為本地dns可以直接將ip給你,然後本地dns為了知道這個ip又詢問下個dns伺服器。從此可以看出,增加了被涉及的伺服器的資料,所以一般用迭代查詢,迭代查詢是你詢問完後給你下乙個dns伺服器的位址,和你說你去那裡找能找到
2.dns響應報文包含幾個資源記錄,資源記錄形式如下:,ttl是記錄生成的時間,如果type==a,那麼name是主機名,value是ip;如果type==ns,那麼name是個域,value是可以獲得該name的ip的權威dns伺服器的位址;
如果type==cname,那麼value是name的別名;如果type是mx,那value就是name的規範郵件伺服器的主機名;
這幾種方式中name可以相同,但是根據type的不同,獲得的資源記錄也不同,個域理解為baidu.com。
3.ddos攻擊,向dns伺服器傳送大量無用報文,使得正常的詢問無法得到響應,dns denial of service。
4.應用層協議有http,smtp等,他們是重要組成部分,但不是全部,他們通過傳輸層協議,(tcp或udp),這兩個協議相當於提供了乙個介面,不管實現,只管用,bittorrent協議是p2p的一種最為流行的協議。
5.dht(distribute hash table):分布式資料庫儲存的是key—value對,首先將key通過hash function map為乙個n個bit的二進位制數,然後為每個對等方分配乙個n bit的識別符號。然後每次要插入乙個key-value對,都遵循最鄰近原則(如果正好相等,那就直接儲存,如果大於所有識別符號,那就將key%=2的n次方)。但是這裡要注意怎麼樣才能知道最鄰近的的識別符號,為此先想到向每個對等方傳送報文然後知道,但是這不現實。
為此採用環形dht,將對等方組織成乙個環,每個對等方只知道它的前後,當乙個對等方想插入key-value對時候,依次向後問,知道乙個對等方確定接受該資料,(因為知道前後,就知道誰更臨近),之所以要知道前乙個是誰是為了在有乙個接受資料後,向回告訴想要插入的對等方它的位置
這樣做最多要傳送n/2個報文,還是太慢,可以增加捷徑(太難)
又因為對等方是可以隨時走和進的,所以要週期性的傳送是否還在的報文,如果不在,那麼就要更新前後
6.伺服器**
import socket
serverport = 50009
serversocket = socket.socket(socket.af_inet,socket.sock_dgram)
serversocket.bind(('',serverport))
print("the server is ready to receive")
while 1:
message,clientaddress = serversocket.recvfrom(2048)
print(message,clientaddress)
modifiedmessage = message.upper()
serversocket.sendto(modifiedmessage,clientaddress)
客戶**
import socket
servername = '127.0.0.1'
serverport = 50009
clientsocket =socket.socket(socket.af_inet,socket.sock_dgram)
message = input('input your lowercase sentence:')
clientsocket.sendto(message.encode(),(servername,serverport))
modifiedmessage,serveraddress = clientsocket.recvfrom(2048)
print(modifiedmessage.decode(),serveraddress)
##print (modifiedmessage.decode())
clientsocket.close()
af_inet是ipv4的意思,sock_dgram是udp套接字的意思,在伺服器**中,先隨便定乙個介面,這裡是50009,這是約定好的,客戶知道的,然後等待客戶端傳送message和clientaddress的list,客戶要傳送address的原因是為了讓伺服器可以知道發回去的位址。
客戶端**中,先要給出伺服器的ip,127.0.0.1是測試用ip,不用經過網路,伺服器端口號是約定好的,python中tuple用(),list用,rvmfrom從伺服器的ip的50009埠獲得資料,2048代表緩衝區大小。
還有很重要的一點,客戶端每次建立連線的埠號是不同的,是系統分配的。
tcp連線是socket_stream,在伺服器端繫結埠號後,就會有接上一句listen(),括號裡是允許同時連線的數目,最少為1,之後就會建立乙個連線套接字
複習題:
1.ssl,安全 套接字 層 ,執行在應用 層,是在應用層中加**加密的
2.ftp維護兩個tcp連線,乙個用於控制資訊,乙個用於檔案傳輸
3.bittorrent中,新加入的使用者沒有任何檔案塊,無法成為任何使用者的前四位,所以他的第乙個檔案塊只能通過每30秒隨機選擇的方式獲得
4.tcp是一開始先建立連線,udp是打包資料直接傳送
第二章學習筆記
在c 中,陣列下標從0開始,而不是1.c 不支援陣列的抽象,也不支援對整個陣列的操作。在c 中,物件可以靜態分配 即編譯器在處理程式源 時分配,也可以動態分配 即程式執行時,用執行時刻庫函式來分配。靜態與動態記憶體分配的兩個主要區別是 1 靜態物件是有名字的變數,可以直接對你進行操作。而動態物件是沒...
第二章 C 筆記
1.可以用函式sizeof來確定乙個型別占用記憶體的大小 如 cout 2.整數除法的結果仍為整數,小樹部分會被截去。如,5 2 2 5 2 2 而不是 2.5 模運算 只有當被除數 前面的那個數 是負數時候,餘數才會是負數。如 7 3 1 12 4 0,20 13 7 而不是 7 3.型別轉換並不...
c primer 筆記,第二章
初始化的含義是建立變數並賦予其乙個初始值,賦值的含義是將物件當前的值擦除 初始化四種方式 int n 0 int n 用花括號稱為列表初始化,當使用列表初始化且初始值存在丟失的風險,編譯器會報錯 int n int n 0 定義於函式體外的變數被初始化為0,函式體內部的內建型別變數不被初始化,類的物...