第二章笔记

1.递归查询和迭代查询:递归查询是一条环路,直接想成递归的定义就行,你想查一个网站的ip,首先将这个网站传给它的本地dns,然后认为本地dns可以直接将ip给你,然后本地dns为了知道这个ip又询问下个dns服务器。从此可以看出,增加了被涉及的服务器的数据,所以一般用迭代查询,迭代查询是你询问完后给你下一个dns服务器的地址,和你说你去那里找能找到

2.dns响应报文包含几个资源记录,资源记录形式如下:{name,value,type,ttl},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是打包数据直接发送



猜你喜欢

转载自blog.csdn.net/qq_40178140/article/details/80670951