精华内容
下载资源
问答
  • 那么问题就来了,如何判断一个IP地址是否是DNS服务器呢? 想了想,没有啥好的方法可以直接查询到。最后就是可以反证法。比如我有一个IP地址是a.a.a.a,然后我假设这个地址是DNS服务器,我这个地址去(DNS)...

    这几天做子域名爆破,看了几个online的app。发现很多软件里都有一个DNS的list,里面一大堆的IP地址。然后我就问了自己一个问题,这里面的难道都是DNS服务器嘛?抱着好奇的心态,我决定试一试,查询一下。那么问题就来了,如何判断一个IP地址是否是DNS服务器呢

     

    想了想,没有啥好的方法可以直接查询到。最后就是可以用反证法。比如我有一个IP地址是a.a.a.a,然后我假设这个地址是DNS服务器,我用这个地址去(DNS)查询www.baidu.com的IP地址,如果有返回结果,就说明这个地址a.a.a.a是DNS服务器;反之,则说明这个地址不是DNS服务器。

    比如在Ternimal里,我们可以看出:

     

    所以,决定用python试一试,去实现这个判断。

    首先要安装nslookup的包。link:https://pypi.org/project/nslookup/

    pip3 install nslookup

    然后大概写了一个例子,假设我有三个IP地址,8.8.8.8是Google的DNS服务器,然后1.1.1.1我随便打的一个地址。最后128.232.132.8是网站www.cam.ac.uk的IP地址。然后有:

    from nslookup import Nslookup
    
    domain = "www.st-andrews.ac.uk"
    server = "8.8.8.8"
    server_test = "1.1.1.1"
    server_cam = "128.232.132.8"
    
    def verification_process(ip_address):
    	dns_query = Nslookup(dns_servers=[ip_address])
    	try:
    		result = dns_query.dns_lookup(domain)
    		return result
    	except Exception as e:
    		print(e)
    		return False
    
    result = verification_process(server)
    result1 = verification_process(server_test)
    result2 = verification_process(server_cam)
    
    print("======Regarding Server 8.8.8.8=========")
    print(result)
    print(result.response_full)
    
    print("======Regarding Server 1.1.1.1=========")
    print(result1)
    print(result1.response_full)
    
    print("======Regarding Server 128.232.132.8=========")
    print(result2)
    print(result2.response_full)
    

    result是个object,想看具体的内容需要result.response_full。最后的输出结果:

    所以,可以看出来,只有用8.8.8.8,也就是Google的DNS服务器查询的时候,才可以查出来www.st-andrews.ac.uk对应的IP地址,其他的都查不出来。所以我们可以判断,IP 8.8.8.8是一个DNS服务器。

    最后附上一份,把一个.txt文件里,所有的IP进行检测,看是否是DNS服务器。

    import sys
    from nslookup import Nslookup
    
    domain = "www.st-andrews.ac.uk"
    
    dns_list = []
    not_dns_list = []
    
    def read_file(path):
    	text_ip_add = open(path,'r')
    	detail_ip_add = text_ip_add.readlines()
    	content = []
    	for i in detail_ip_add:
    		i = i.strip('\n')
    		i = i.strip(' ')
    		content.append(i)
    	text_ip_add.close()
    	return content
    
    def dns_verify(ip_address):
    	dns_query = Nslookup(dns_servers=[ip_address])
    	try:
    		result = dns_query.dns_lookup(domain)
    		if len(result.response_full) > 0:
    			dns_list.append(ip_address)
    		else:
    			not_dns_list.append(ip_address)
    	except Exception as e:
    		print(ip_address,"with Exception",e)
    
    def verification_process(content):
    	for i in content:
    		dns_verify(i)
    	print("dns_list is:",dns_list)
    	print("not_dns_list is:", not_dns_list)
    
    
    file_path = sys.argv[1]
    content = read_file(file_path)
    verification_process(content)
    
    

     

    展开全文
  • 能不能给一个比较完整的程序,实在感谢。我是想做一个有动态的IP地址服务器,但是需要绑定域名,搞一个类似于花生壳的IPV6的DDNS
  • 现在基于域名IP地址的网络过滤...下面讲述如何用常规手段破解基于域名IP地址的网络过滤封锁? 1、基于语义搜索和人机交互参与的公开入口检索(也就是说,从应用层发起一个端点查询请求,而非从低级TCPIP网络层)

    现在基于域名和IP地址的网络过滤封锁为什么不那么容易破解的原因是,

    DNS系统是一个非常落后的架构

    比如说它的恶心的区域传送机制,可能2个DNS服务器之间的数据同步需要花几小时

    实际上,这个过程应该可以更快一点

    下面讲述如何用常规手段破解基于域名和IP地址的网络过滤封锁?

    1、基于语义搜索和人机交互参与的公开入口检索(也就是说,从应用层发起一个端点查询请求,而非从低级TCPIP网络层)

    2、基于人机交互参与的客户端认证(也就是说,必须证明是一个真实的人发起的请求,而非机器自动的)发送一个新的跳转地址,最好能够做到端到端加密和独一无二

    3、快速失效机制

       如果检测到目标端已经被封锁(基于IP地址的),则能够让它快速失效,这就要求网站的前端服务器必须能够快速切换

    邪恶的gfw使用有效IP地址来使得目标DNS服务器“中毒”,这种行为简直太无耻鸟。

    展开全文
  • 6.13 选择本地IP地址的一个基本问题 60 6.14 将TCP套接字连接到服务器 61 6.15 使用TCP和服务器通信 61 6.16 从TCP连接上读取响应 62 6.17 关闭TCP连接 63 6.17.1 需要部分关闭 63 6.17.2 部分关闭的操作 ...
  • TCP/IP教程TCP/IP基础

    热门讨论 2009-11-23 20:58:46
    10.1.3 128位IP地址 89 10.1.4 IP扩展头 90 10.2 多IP地址主机 91 10.3 单播、组播和任一播头 91 10.4 从IPv4到IPv6的过渡 93 10.5 小结 94 第四部分 IP互联 第11章 IP网络中的路由 95 11.1 路由基本知识 95 11.1.1 ...
  • TCP-IP协议详解

    热门讨论 2008-11-24 20:46:50
    10.1.3 128位IP地址 89 10.1.4 IP扩展头 90 10.2 多IP地址主机 91 10.3 单播、组播和任一播头 91 10.4 从IPv4到IPv6的过渡 93 10.5 小结 94 第四部分 IP互联 第11章 IP网络中的路由 95 11.1 路由基本知识 95 11.1.1 ...
  • 它们允许服务器改变 IP 地址,但是还同样的名字。操作系统已经提供了执行基本 DNS 查找的服务,直接节约了我们花费在处理各种 DNS 查询上的时间。并且 Python 在它的 socket 标准库中,提供了访问这些基本操作系统...

    本博文介绍如何使用 Python 网络编程,设计并实现客户端的 DNS 域名解析及缓存服务。


    1 基本概念

    域名系统(DNS)是一个庞大的、全球的分布式数据库,,它主要用来把主机名转换成 IP 地址,DNS 以及相关系统之所以存在,主要有以下两个原因:

    • 它们可以使人们比较容易地记住名字,比如说对于百度,我们更容易记住 www.baidu.com,而不是 IP 地址 36.152.44.95;

    • 它们允许服务器改变 IP 地址,但是还用同样的名字。

    DNS 的工作原理是这样的,对于我们的输入,它提供一系列的提名回答,而对每个提名又给出一个更详细的答案,直到获得最终答案,这句话是什么意思呢?

    举一个例子,我们如果要查询清华大学官网的 IP 地址 www.tsinghua.edu.cn,首先,我们的程序会和操作系统指定的本地域名服务器通信,并向其发送一次查询请求,本地域名服务器是一个递归的域名服务器,如果这个服务器无法解析我们的请求,它收到请求后就会以 DNS 客户机的身份向其它域名服务器查询,直到得到最终的 IP 地址告诉本机,这是一个递归查询的过程。

    那么本地域名服务器如何向其他域名服务器查询呢?是这个样子的,它是一个迭代查询的过程:

    • 本地域名服务器首先向一个根域名服务器查询,根域名服务器会告诉本地域名服务器,下一次应该查询顶级域名服务器 dns.cn 的 IP 地址;
    • 然后本地域名服务器向顶级域名服务器 dns.cn 进行查询,顶级域名服务器 dns.cn 会告诉本地域名服务器,下一次应查询的权限域名服务器 dns.edu.cn 的 IP 地址;
    • 接着本地域名服务器就会向权限域名服务器 dns.edu.cn 进行查询,然而权限域名服务器 dns.edu.cn 还是不能给出最后的查询回答,因此它会告诉本地域名服务器下一个权限域名服务器 tsinghua.edu.cn 的 IP 地址;
    • 本地域名服务器再向权限域名服务器 tsinghua.edu.cn 查询,这个权限域名服务器就会告诉本地域名服务器,说它知道清华大学官网的 IP 地址,并把该 IP 地址返回给本地域名服务器。

    虽然这整个过程看起来很复杂,但是操作系统已经提供了执行基本 DNS 查找的服务,这些服务对大多数程序来说是足够的,直接节约了我们花费在处理各种 DNS 查询上的时间。

    并且 Python 在它的 socket 标准库中,提供了访问这些基本操作系统服务的接口,一些第三方库还提供了很多更高级的功能。


    2 使用 socket 标准库实现 DNS 正向查询及缓存

    最基本的 DNS 查询是正向查询,它根据一个主机名来查找 IP 地址,在 Python 当中,为了实现 DNS 正向查询,我们将用到函数 socket.getaddrinfo(),Python 是这么定义它的:

    getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])
    

    其中,host 参数就是我们输入的域名,port 参数是域名对应主机的端口号,其他的参数只有当我们想把结果直接传递给 socket.socket()socket.connect() 的时候才用到,它们会在输出中限制显示什么协议,以及为了建立 socket 而根据默认值得到的结果。

    我们可以设置 port 值为 None,然后省略其他的参数来进行一个基本的查询,socket.getaddrinfo() 函数的返回值是一个 tuple 元组的列表,每一个 tuple 的格式如下,其中,sockaddr 实际上就是我们要查询的域名的 IP 地址:

    (family, socktype, proto, canonname, sockaddr)
    

    socket.getaddrinfo() 返回一个 tuple 的列表是因为对于一个域名的查询,可能有多个答案,即一个域名可能有多个 IP 地址,因为一些网站流量很大,同时将域名映射在多个服务器上可以有效解决负载问题,不过,如果我们只是想得到一个简单的 IP 地址来连接,我们选择列表中的第一个 tuple 即可。

    对于上述所说,我们通过例子来验证一下,我们运行下面的代码:

    print(socket.getaddrinfo("www.baidu.com", None))
    

    可以看到,确实打印了一个列表,列表的每个元素是一个元组:
    在这里插入图片描述
    因此我们就可以根据索引找到我们要的 IP 地址:

    print(socket.getaddrinfo("www.baidu.com", None)[0][4][0])
    

    运行代码,结果如下:
    在这里插入图片描述
    如果只需要找到域名的一个 IP 地址的话,还可以使用 socket.gethostbyname() 函数:

    print(socket.gethostbyname("www.baidu.com"))
    

    它的参数是要查询的域名,返回的是域名对应的一个 IP 地址:
    在这里插入图片描述
    以上就是使用 socket 标准库实现 DNS 正向查询的过程,我们总结一下,有如下两个非常简便的方法实现 DNS 正向查询:

    print(socket.getaddrinfo("www.baidu.com", None)[0][4][0])
    
    print(socket.gethostbyname("www.baidu.com"))
    

    一般地,在 DNS 查询过程中,我们会有一个 DNS 缓存机制,DNS 缓存可以减小下一次查询时域名到 IP 地址的映射时间消耗,DNS 缓存的实现可以在操作系统、虚拟机、解释器,以及应用层上进行。

    在获取域名和 IP 地址的对应关系后,我们可以用列表的形式来维护这些关系,以在应用层上实现我们自己的 DNS 缓存:

    def dnsQuery(domain_name_list, ip_list, source): # source 为域名,表示要获得域名对应的 IP 地址
        
        if source in domain_name_list: # DNS 缓存命中
            print("DNS 缓存命中,直接读取...")
            index = domain_name_list.index(source)
            target = ip_list[index]
            print("读取成功!")
        else: # DNS 缓存缺失
            print("DNS 缓存缺失,查询域名服务器中...")
            domain_name_list.append(source)
            target = socket.getaddrinfo(source, None)[0][4][0] # 获得相应的 IP 地址
            ip_list.append(target)
            print("查询成功!")
        
        return target
    

    这里用 domain_name_list 域名列表和 ip_list IP 地址列表以索引的方式来维护域名和 IP 地址之间的映射关系,我们通过一个例子试一下:
    在这里插入图片描述
    可以看到,在上面的例子中,第一次查询 www.baidu.com 的 IP 地址时,域名列表和 IP 地址列表为空,所以 DNS 缓存缺失,于是使用 socket.getaddrinfo() 函数去查询域名服务器,当第二次查询时,域名列表和 IP 地址列表当中已经存有了对应的域名和 IP 地址,因此 DNS 缓存命中,从 IP 地址列表当中直接读取。

    上述过程的完整代码如下:

    import socket
    
    
    def dnsQuery(domain_name_list, ip_list, source): # source 为域名,表示要获得域名对应的 IP 地址
        
        if source in domain_name_list: # DNS 缓存命中
            print("DNS 缓存命中,直接读取...")
            index = domain_name_list.index(source)
            target = ip_list[index]
            print("读取成功!")
        else: # DNS 缓存缺失
            print("DNS 缓存缺失,查询域名服务器中...")
            domain_name_list.append(source)
            target = socket.getaddrinfo(source, None)[0][4][0] # 获得相应的 IP 地址
            ip_list.append(target)
            print("查询成功!")
        
        return target
    
    
    if __name__ == "__main__":
    
        domain_name_list = []
        ip_list = []
    
        domain_name = "www.baidu.com"
        ip = dnsQuery(domain_name_list, ip_list, domain_name)
        print(f"{domain_name} 的 IP 地址:{ip}")
    
        ip = dnsQuery(domain_name_list, ip_list, domain_name)
        print(f"{domain_name} 的 IP 地址:{ip}")
    

    3 使用 dnspython 第三方库实现 DNS 正向查询及缓存

    除了 socket 标准库,我们还可以使用一些第三方库来实现 DNS 查询的一些更高级的功能,比如说 dnspython 这个强大而便利的工具,接下来我们来了解一下如何通过 dnspython 实现 DNS 正向查询及缓存。

    对于 dnspython 的安装,pip 一下即可:

    pip install dnspython
    

    对于 DNS 的正向查询,dnspython 也可以很简便地实现:

    import dns.resolver
    
    a = dns.resolver.query("www.tsinghua.edu.cn", 'A') # A 表示将主机名转换为 IP 地址
    ip = a.response.answer[0].items[0].address # 获得相应的 IP 地址
    print(ip)
    

    可以看到,通过几句代码就可以完成 IP 地址的查询:
    在这里插入图片描述
    不过,关于 dnspython 我还不熟悉,上面的代码中的一些参数也不清楚,但是我觉得在以后使用的过程中应该会逐渐熟悉它们。

    对于 dnspython,类似地,我们也可以使用它来实现应用层上的 DNS 缓存机制:

    def dnsQuery(domain_name_list, ip_list, source): # source 为域名,表示要获得域名对应的 IP 地址
        
        if source in domain_name_list: # DNS 缓存命中
            print("DNS 缓存命中,直接读取...")
            index = domain_name_list.index(source)
            target = ip_list[index]
            print("读取成功!")
        else: # DNS 缓存缺失
            print("DNS 缓存缺失,查询域名服务器中...")
            domain_name_list.append(source)
            a = dns.resolver.query(source, "A") # A 表示将域名转换为 IP 地址
            target = a.response.answer[0].items[0].address # 获得相应的 IP 地址
            ip_list.append(target)
            print("查询成功!")
        
        return target
    
    展开全文
  • TCP-IP技术大全

    千次下载 热门讨论 2007-12-18 15:42:09
    DNS:名字服务器 48 6.1 域名系统概述 48 6.2 授权局 50 6.3 DNS分布数据库 50 6.4 域和区 50 6.5 Internet顶级域 51 6.6 选择一个域名服务器 52 6.7 名字服务解析过程 52 6.7.1 递归查询 ...
  • 10.1.3 128位IP地址 89 10.1.4 IP扩展头 90 10.2 多IP地址主机 91 10.3 单播、组播和任一播头 91 10.4 从IPv4到IPv6的过渡 93 10.5 小结 94 第四部分 IP互联 第11章 IP网络中的路由 95 11.1 路由基本知识 95 11.1.1 ...
  • TCP_IP详解卷1

    热门讨论 2010-12-29 10:53:54
    3.6 特殊情况的IP地址 33 3.7 一个子网的例子 33 3.8 ifconfig命令 35 3.9 netstat命令 36 3.10 IP的未来 36 3.11 小结 37 第4章 ARP:地址解析协议 38 4.1 引言 38 4.2 一个例子 38 4.3 ARP高速缓存 40 4.4 ARP的...
  • 而2个内网DNS服务器会返回正确的内网IP地址。 但使用SmartDNS后,返回的最终结果是“域名不存在”,按理来说,“返回连接速度最快的查询结果”,应该能返回正确的IP地址。所以不太明白。 ...
  • 从URL输入到页面展现

    2020-11-02 17:53:21
    IP 地址ip地址域名解析浏览器如何通过域名查询 URL 对应的 IP 呢小结TCP 连接:TCP 三次握手TCP 三次握手的过程如下:为啥需要三次握手发送 HTTP 请求请求行包含请求方法、URL、协议版本请求头包含请求的附加信息...


    在这里插入图片描述
    URL(Uniform Resource Locator),统一资源定位符,用于定位互联网上资源,俗称网址。
    遵守以下的语法规则:
    scheme://host.domain:port/path/filename

    scheme - 定义因特网服务的类型。常见的协议有 http、https、ftp、file,其中最常见的类型是 http,而 https 则是进行加密的网络传输。
    host - 定义域主机(http 的默认主机是 www)
    domain - 定义因特网域名,比如 w3school.com.cn
    port - 定义主机上的端口号(http 的默认端口号是 80)
    path - 定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)。
    filename - 定义文档/资源的名称
    

    DNS 解析:将域名解析成 IP 地址

    在浏览器输入网址后,首先要经过域名解析,因为浏览器并不能直接通过域名找到对应的服务器,而是要通过 IP 地址。
    

    ip地址

     IP 地址是指互联网协议地址,是 IP Address 的缩写。IP 地址是 IP 协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP 地址是一个 32 位的二进制数,比如 127.0.0.1 为本机 IP。
     域名就相当于 IP 地址乔装打扮的伪装者,带着一副面具。它的作用就是便于记忆和沟通的一组服务器的地址。用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP 地址访问。因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。但要让计算机去理解名称,相对而言就变得困难了。因为计算机更擅长处理一长串数字。为了解决上述的问题,DNS 服务应运而生。
    

    域名解析

    DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。DNS 是一个网络服务器,我们的域名解析简单来说就是在 DNS 上记录一条信息记录
    

    浏览器如何通过域名去查询 URL 对应的 IP 呢

    浏览器缓存:浏览器会按照一定的频率缓存 DNS 记录。
    
    操作系统缓存:如果浏览器缓存中找不到需要的 DNS 记录,那就去操作系统中找。
    
    路由缓存:路由器也有 DNS 缓存。
    
    ISP 的 DNS 服务器:ISP 是互联网服务提供商(Internet Service Provider)的简称,ISP 有专门的 DNS 服务器应对 DNS 查询请求。
    
    根服务器:ISP 的 DNS 服务器还找不到的话,它就会向根服务器发出请求,进行递归查询(DNS 服务器先问根域名服务器.com 域名服务器的 IP 地址,然后再问.baidu 域名服务器,依次类推)
    

    在这里插入图片描述

    小结

    浏览器通过向 DNS 服务器发送域名,DNS 服务器查询到与域名相对应的 IP 地址,然后返回给浏览器,浏览器再将 IP 地址打在协议上,同时请求参数也会在协议搭载,然后一并发送给对应的服务器。接下来介绍向服务器发送 HTTP 请求阶段,HTTP 请求分为三个部分:TCP 三次握手、http 请求响应信息、关闭 TCP 连接。
    

    在这里插入图片描述

    TCP 连接:TCP 三次握手

    在这里插入图片描述

    TCP 三次握手的过程如下:

    客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口(第一次握手,由浏览器发起,告诉服务器我要发送请求了)
    
    服务器发回一个带 SYN=1, ACK=X+1, Seq=Y 的响应包以示传达确认信息(第二次握手,由服务器发起,告诉浏览器我准备接受了,你赶紧发送吧)
    
    客户端再回传一个带 ACK=Y+1, Seq=Z 的数据包,代表“握手结束”(第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧)
    

    为啥需要三次握手

    谢希仁著《计算机网络》中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。
    

    发送 HTTP 请求

    TCP 三次握手结束后,开始发送 HTTP 请求报文。

    请求报文由请求行(request line)、请求头(header)、请求体四个部分组成,如下图所示:
    在这里插入图片描述

    请求行包含请求方法、URL、协议版本

    请求方法包含 8 种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。
    
    URL 即请求地址,由 <协议>://<主机>:<端口>/<路径>?<参数 组成
    
    协议版本即 http 版本号
    

    请求头包含请求的附加信息,由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。

    请求头部通知服务器有关于客户端请求的信息。它包含许多有关的客户端环境和请求正文的有用信息。其中比如:Host,表示主机名,虚拟主机;Connection,HTTP/1.1 增加的,使用 keepalive,即持久连接,一个连接可以发多个请求;User-Agent,请求发出者,兼容性以及定制化需求。
    

    请求体,可以承载多个请求参数的数据,包含回车符、换行符和请求数据,并不是所有请求都具有请求数据。

    name=tom&password=1234&realName=tomson
    

    服务器处理请求并返回 HTTP 报文

    服务器

    服务器是网络环境中的高性能计算机,它侦听网络上的其他计算机(客户机)提交的服务请求,并提供相应的服务,比如网页服务、文件下载服务、邮件服务、视频服务。而客户端主要的功能是浏览网页、看视频、听音乐等等,两者截然不同。 每台服务器上都会安装处理请求的应用——web server。常见的 web server 产品有 apache、nginx、IIS 或 Lighttpd 等。
    
    web server 担任管控的角色,对于不同用户发送的请求,会结合配置文件,把不同请求委托给服务器上处理相应请求的程序进行处理(例如 CGI 脚本,JSP 脚本,servlets,ASP 脚本,服务器端 JavaScript,或者一些其它的服务器端技术等),然后返回后台程序处理产生的结果作为响应。
    
    
    

    MVC 后台处理阶段

    后台开发现在有很多框架,但大部分都还是按照 MVC 设计模式进行搭建的。
    MVC 是一个设计模式,将应用程序分成三个核心部件:模型(model)-- 视图(view)--控制器(controller),它们各自处理自己的任务,实现输入、处理和输出的分离。
    

    在这里插入图片描述

    1、视图(view)
    它是提供给用户的操作界面,是程序的外壳。
    
    2、模型(model)
    模型主要负责数据交互。在 MVC 的三个部件中,模型拥有最多的处理任务。一个模型能为多个视图提供数据。
    
    3、控制器(controller)
    它负责根据用户从"视图层"输入的指令,选取"模型层"中的数据,然后对其进行相应的操作,产生最终结果。控制器属于管理者角色,从视图接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示模型处理返回的数据。
    这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。
    至于这一阶段发生什么?简而言之,首先浏览器发送过来的请求先经过控制器,控制器进行逻辑处理和请求分发,接着会调用模型,这一阶段模型会获取 redis db 以及 MySQL 的数据,获取数据后将渲染好的页面,响应信息会以响应报文的形式返回给客户端,最后浏览器通过渲染引擎将网页呈现在用户面前。
    

    http 响应报文

    响应报文由响应行(request line)、响应头部(header)、响应主体三个部分组成。如下图所示:
    

    在这里插入图片描述

    (1) 响应行包含:协议版本,状态码,状态码描述
    
    状态码规则如下:
    
    1xx:指示信息--表示请求已接收,继续处理。
    2xx:成功--表示请求已被成功接收、理解、接受。
    3xx:重定向--要完成请求必须进行更进一步的操作。
    4xx:客户端错误--请求有语法错误或请求无法实现。
    5xx:服务器端错误--服务器未能实现合法的请求。
    
    (2) 响应头部包含响应报文的附加信息,由 名/值 对组成
    
    (3) 响应主体包含回车符、换行符和响应返回数据,并不是所有响应报文都有响应数据
    

    浏览器解析渲染页面

    浏览器拿到响应文本 HTML 后,接下来介绍下浏览器渲染机制
    
    浏览器解析渲染页面分为一下五个步骤:
    
    根据 HTML 解析出 DOM 树
    
    根据 CSS 解析生成 CSS 规则树
    
    结合 DOM 树和 CSS 规则树,生成渲染树
    
    根据渲染树计算每一个节点的信息
    
    根据计算好的信息绘制页面
    
    
    1、根据 HTML 解析 DOM 树
    根据 HTML 的内容,将标签按照结构解析成为 DOM 树,DOM 树解析的过程是一个深度优先遍历。即先构建当前节点的所有子节点,再构建下一个兄弟节点。
    
    在读取 HTML 文档,构建 DOM 树的过程中,若遇到 script 标签,则 DOM 树的构建会暂停,直至脚本执行完毕。
    
    2、根据 CSS 解析生成 CSS 规则树
    解析 CSS 规则树时 js 执行将暂停,直至 CSS 规则树就绪。
    
    浏览器在 CSS 规则树生成之前不会进行渲染。
    
    3、结合 DOM 树和 CSS 规则树,生成渲染树
    DOM 树和 CSS 规则树全部准备好了以后,浏览器才会开始构建渲染树。
    
    精简 CSS 并可以加快 CSS 规则树的构建,从而加快页面相应速度。
    
    4、根据渲染树计算每一个节点的信息(布局)
    布局:通过渲染树中渲染对象的信息,计算出每一个渲染对象的位置和尺寸
    
    回流:在布局完成后,发现了某个部分发生了变化影响了布局,那就需要倒回去重新渲染。
    
    5、根据计算好的信息绘制页面
    绘制阶段,系统会遍历呈现树,并调用呈现器的“paint”方法,将呈现器的内容显示在屏幕上。
    
    重绘:某个元素的背景颜色,文字颜色等,不影响元素周围或内部布局的属性,将只会引起浏览器的重绘。
    
    回流:某个元素的尺寸发生了变化,则需重新计算渲染树,重新渲染。
    

    断开连接:TCP 四次挥手

    当数据传送完毕,需要断开 tcp 连接,此时发起 tcp 四次挥手。
    

    在这里插入图片描述

    发起方向被动方发送报文,Fin、Ack、Seq,表示已经没有数据传输了。并进入 FIN_WAIT_1 状态。(第一次挥手:由浏览器发起的,发送给服务器,我请求报文发送完了,你准备关闭吧)
    
    被动方发送报文,Ack、Seq,表示同意关闭请求。此时主机发起方进入 FIN_WAIT_2 状态。(第二次挥手:由服务器发起的,告诉浏览器,我请求报文接受完了,我准备关闭了,你也准备吧)
    
    被动方向发起方发送报文段,Fin、Ack、Seq,请求关闭连接。并进入 LAST_ACK 状态。(第三次挥手:由服务器发起,告诉浏览器,我响应报文发送完了,你准备关闭吧)
    
    发起方向被动方发送报文段,Ack、Seq。然后进入等待 TIME_WAIT 状态。被动方收到发起方的报文段以后关闭连接。发起方等待一定时间未收到回复,则正常关闭。(第四次挥手:由浏览器发起,告诉服务器,我响应报文接受完了,我准备关闭了,你也准备吧)
    
    展开全文
  • linux的dns被劫持(解决方案)

    千次阅读 2017-09-08 14:52:33
    如何解决linux dns被劫持? 1.首先如何确定是否被劫持: 那么查询一个并不存在的域名 ...那么8.8.8.8域名服务器解析一下此错误域名试试: nslookup notexit.comrrrr 8.8.8.8 输出的内容如下: jello
  • 如何判定服务器IP已被加入访问白名单,使用如下两种方式: 1. AT+NPING 指令,通过PING自己的服务器地址,如返回ERROR,则多半(尚需继续排除防火墙因素)未就绪; 2. UDP通讯,如能与自己的服务器直接连接UDP通讯...
  • 浏览器输入域名怎么查询IP地址(DNS过程) 客户端与服务器通信的过程(socket和网络体系结构答了)。 什么是单例模式? 单例模式如何保证同步性? Hashmap底层结构、如何插入数据、扩容机制、负载因子等 ...
  • 有一定技术基础的互联网用户都知道DNS是做什么的,但大多数人都不清楚DNS如何查找域名。 Ven发现了一幅图片,这幅图片非常形象地描述了DNS查找下的连锁反应,对不了解DNS运行的人们可能会有些帮助。 下面这张图片...
  • 高效处理ip地址相关的功能 dnspython 实现是dns的服务监控 可以实现域名解析,对域名的A记录,NS记录进行相应的查询等 解析结果的校验 系统信息的获取 在Windows系统中可以通过任务管理器来获取系统的时时...
  • 10.1.3 128位IP地址 89 10.1.4 IP扩展头 90 10.2 多IP地址主机 91 10.3 单播、组播和任一播头 91 10.4 从IPv4到IPv6的过渡 93 10.5 小结 94 第四部分 IP互联 第11章 IP网络中的路由 95 11.1 路由基本知识 95 11.1.1 ...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    113 <br>5.6 其他应用技巧 114 <br>0189 如何判断年份是否为闰年 114 <br>0190 如何根据年份判断十二生肖 114 <br>0191 如何根据IP地址获取本机域名 115 <br>0192 如何获取“我的文档”系统...
  • 每个服务器有两个属性,host是访问域名IP,certification是目标服务器是否会对docker api 进行鉴权(如何开启远程api访问和鉴权可去docker官网查询相关资料)。如果是需要鉴权的服务器,需要在certification目录下...
  • C++网络爬虫项目

    2018-07-04 00:59:17
     爬虫将网站服务器IP地址、通信端口、网页路径等信息交给“网页下载” 器;  “网页下载”器负责从“互联网”上下载网页内容;  对于已经下载到本地的网页内容,一方面将其存储到“下载页面库” 中,等 待...
  • 实例278 IN查询表中的记录信息 9.16 交叉表查询 实例279 利用TRANSFORM分析数据 实例280 利用TRANSFORM动态分析数据 实例281 静态交叉表(SQL Server 2000) 实例282 动态交叉表(SQL Server 2000) 9.17 函数...
  • 实例278 IN查询表中的记录信息 9.16 交叉表查询 实例279 利用TRANSFORM分析数据 实例280 利用TRANSFORM动态分析数据 实例281 静态交叉表(SQL Server 2000) 实例282 动态交叉表(SQL Server 2000) 9.17 函数...
  • 实例278 IN查询表中的记录信息 9.16 交叉表查询 实例279 利用TRANSFORM分析数据 实例280 利用TRANSFORM动态分析数据 实例281 静态交叉表(SQL Server 2000) 实例282 动态交叉表(SQL Server 2000) 9.17 函数...
  • 实例278 IN查询表中的记录信息 9.16 交叉表查询 实例279 利用TRANSFORM分析数据 实例280 利用TRANSFORM动态分析数据 实例281 静态交叉表(SQL Server 2000) 实例282 动态交叉表(SQL Server 2000) 9.17 函数...
  • Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。 下载文件成功。 2.14 用户中心微服务 提供的接口: 检查用户名和手机号是否可用 发送短信验证码 用户注册 ...
  • 实例278 IN查询表中的记录信息 9.16 交叉表查询 实例279 利用TRANSFORM分析数据 实例280 利用TRANSFORM动态分析数据 实例281 静态交叉表(SQL Server 2000) 实例282 动态交叉表(SQL Server 2000) 9.17 函数...
  • 实例278 IN查询表中的记录信息 9.16 交叉表查询 实例279 利用TRANSFORM分析数据 实例280 利用TRANSFORM动态分析数据 实例281 静态交叉表(SQL Server 2000) 实例282 动态交叉表(SQL Server 2000) 9.17 函数...
  • 实例278 IN查询表中的记录信息 9.16 交叉表查询 实例279 利用TRANSFORM分析数据 实例280 利用TRANSFORM动态分析数据 实例281 静态交叉表(SQL Server 2000) 实例282 动态交叉表(SQL Server 2000) 9.17 函数...
  • 实例278 IN查询表中的记录信息 9.16 交叉表查询 实例279 利用TRANSFORM分析数据 实例280 利用TRANSFORM动态分析数据 实例281 静态交叉表(SQL Server 2000) 实例282 动态交叉表(SQL Server 2000) 9.17 函数...

空空如也

空空如也

1 2 3
收藏数 51
精华内容 20
关键字:

如何用域名查询服务器ip地址