面试之DNS,FTP

DNS

https://blog.csdn.net/smilesundream/article/details/69397318

使用CName记录的好处(转)

    使用别名记录,对于多网站、多域名的人来说,是一个非常方便的管理方法!特别是对租用虚拟主机的用户,更是简单。做一个别名记录后,就不用再去管服务器的IP怎么变了!
一.使用域名的别名记录(CNAME),让多域名管理轻松到极点!
  别名记录(CNAME):也被称为规范名字。这种记录允许您将多个名字映射到同一台计算机。 通常用于同时提供WWW和MAIL服务的计算机。例如,有一台计算机名为“host.mydomain.com”(A记录)。 它同时提供WWW和MAIL服务,为了便于用户访问服务。可以为该计算机设置两个别名(CNAME):WWW和MAIL。 这两个别名的全称就是“www.mydomain.com”和“mail.mydomain.com”。实际上他们都指向“host.mydomain.com”。 同样的方法可以用于当您拥有多个域名需要指向同一服务器IP,此时您就可以将一个域名做A记录指向服务器IP然后将其他的域名做别名到之前做A记录的域名上,那么当您的服务器IP地址变更时您就可以不必麻烦的一个一个域名更改指向了 只需要更改做A记录的那个域名其他做别名的那些域名的指向也将自动更改到新的IP地址上了。如果你是租用虚拟主机的话,一般的服务商都会提供一个三级或者四级的域名给你,那个地址解析的IP永远是服务器的最新IP,所以,大家如果是租用虚拟主机的,就直接做别名记录指向到那个赠送的域名就可以了!
  二.使用域名的别名记录(CNAME),让你的域名解析不再蜗牛。
  众所周知,国内很多域名注册机构的DNS服务器解析生效速度很慢,这便给很多人带来了麻烦,当网站需要更换IP或其他必须对域名重新解析的时候,如果存在大量网站,第一麻烦就是多域名的解析问题,我们可以通过第一条技巧轻松解决!但对于生效速度,通过普通的解析估计我们就无法解决了!
  其实,我们可以通过使用域名的别名(CNAME)另类使用达到加速解析的目的。首先我们最好选择一个主域名如:qqya.com,将该域名转移到国外(推荐:ENom)注册商平台下,解析速度与国内的注册商可不是一个两个等级的差别了,然后将其他的相关域名使用CNME记录:(www.abc.com.)切记最后有一英文状态下的“句号”!
  OK!以后当需要更换域名解析的时候,只需要变动abc.com,立即解决了所有问题,因为你其他的域名都已经跟随你的abc.com域名了,只要你解析了abc.com,其他也都相应变化,不再担心国内解析慢的问题了!

  

   下面详细地介绍下DNS协议的工作原理。

      一、域名

       像Linux目录结构一样,现代因特网采用层次树状结构的命名方法,任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,该名字称为域名

        

           

           (1)域名的分级:域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。

        

        其中顶级域名分为:国家顶级域名、通用顶级域名、反向域名

        国家顶级域名:中国:cn, 美国:us,英国uk...

        通用顶级域名:com 公司企业  edu教育机构 gov政府部门  int国际组织  mil军事部门  net网络

                                  org非盈利组织...

        反向域名:只有一个arpa,用于PTR查询(IP地址转换为域名) 。

       (2)域名的完整性:根据域名的完整性,我们将域名分为FQDN和PQDN。

         FQDN(Full Qualified Domain Name):完全合格的域名,也称为绝对域名(还记得绝对路径吗?Linux中的绝对路径是以/开头,而此处的绝对域名则是已.结尾)。

        PQDN(Partiallly qualified domain name):标号不是以.结束,在将该地址传递给DNS服务器之前,本主机的DNS客户进程中的解析程序可以补充缺少的部分(称为后缀),使得PQDN变为FQDN,显然DNS客户程序通常保存了一份有关后缀的列表

       一个域名服务器所负责的范围,或者说有管理权限的范围,就称为,每一个区中所有的结点必须是连通的,每一个区中都设置相应的权限域名服务器,用来保存该去中的所有主机的域名到IP地址的映射。所以,DNS服务器的负责范围不是以“域”为单位的,而是以“区”为单位,区可能小于或等于域,但一定不会大于域,区是“域”的子集


       NOTICE:同一个区可能存在多个权限域名服务器。

       域名服务器主要分为:根域名服务器、顶级域名服务器、权限域名服务器、本地域名服务器。

       根域名服务器:相当于一个总指挥,每一个域名服务器都必须知道如何与根域名服务器联系;

       顶级域名服务器:负责管理所有的二级域名;

       权限域名服务器:负责管理一个区。当一个权限域名服务器还不能给出最后的查询回答时,就会告诉查询请求的DNS客户进程,下一步应当找哪一个权限域名服务器;

       本地域名服务器:可以看成是默认域名服务器,DNS客户进程收到主机发送过来的域名后,就会最初向该域名服务器发送查询请求。

        为了保证数据的安全性,一个区域的管理者必须为该区域提供一个主域名服务(primaryserver)和 辅助域名服务器(secondary server)主域名服务器从磁盘文件中调入该区域的所有信息,而辅助域名服务器则从主域名服务器调入所有信息,我们将辅助域名服务器从主域名服务器调入信息的过程称为区域传送。当主域名服务器的磁盘文件更新时,辅助名字服务器会定时(通常为3h)向主域名服务器询问是否有数据更新,如果有,则通过区域传送方式获得新数据。建立辅助域名服务器的目的是为了保证数据的安全性,当主域名服务器出现故障时间,其辅助域名服务器可以继续对客户提供服务。

         NOTICE:一个服务器可以是某个区域的主域名服务器,同时又是另一个区域的辅助域名服务器。

       二、递归查询与迭代查询       

       在理解递归查询与迭代查询之前,必须要弄明白“递归”与“迭代”的区别。我们从C++的角度来理解递归与迭代的区别,所谓递归就是函数自己调用自己,而迭代则是函数内部循环地调用他人。下面,我们举出递归与迭代的C++程序:

递归程序:f(n)=f(n-1)+n,f(1)=1,我们用C++递归实现如下

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<iostream>  
  2. int f(int n)  
  3. {  
  4.     if(n==1)  
  5.         return 1;  
  6.     else  
  7.         return f(n-1)+n;<span style="color:#ff0000;">//递归过程</span>  
  8. }  
迭代程序:f(n)=1+2+3+...+n,我们用C++迭代实现如下

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<iostream>  
  2. int f(int n)  
  3. {  
  4.     int i,sum=0;  
  5.     for(i=1;i<=n;i++)  
  6.     {  
  7.         sum+=i;<span style="color:#ff0000;">//迭代过程</span>  
  8.     }  
  9.     return sum;  
  10. }  

       NOTICE递归和迭代的区别,通俗地说:递归就是把一件事情交给别人,如果事情没有办完,哪怕已经办了很多,都不要把结果告诉我,我要的是你的最终结果,而不是中间结果;如果你没办完,请你找别人办完;而迭代则是我交给你一件事,你能办多少就告诉我你办了多少,然后剩下的事情就由我来办。

        下面给出这两种查询方式在DNS查询中的应用图:

         递归查询


         迭代查询:


         Notice:通常情况下,主机向本地域名服务器的查询一般都是采用递归查询,本地域名服务器向根根域名服务器的查询通常采用迭代查询。

         三、DNS报文格式

         

         下面注意介绍下DNS报文中的标志部分(注意不是标识,标识只是给出一个序列号,客户在每次发送查询时使用不同的标识好,服务器在响应的响应中重复这个标识号):

                              

      QR:定义报文类型,QR=0表示查询报文,1表示响应报文;

      opcode:定义查询或响应的类型,0表示标准的,1表示反向的,2表示服务器状态请求;

       AA(Authoritative answer):授权回答,只用于响应报文。1表示该域名服务器是该区域的授权服务器;

       TC(Truncated):可截断的,使用UDP服务时,若响应报文的总长度超过512B,则只返回前512B;

       RD(Recursion Desired):期望递归,0表示DNS客户进程希望迭代查询,1表示DNS客户希望递归查询;

       RA(Recursion Available):递归可用,只用于响应报文。若域名服务器支持递归,则该服务器便在响应报文中将 RA=1。

       (zero):保留字段;

       rcode:表示在响应中的差错状态,只有权限服务器才能做出该判断。具体如下:

                     0:无差错               1:格式差错            2:问题出在域名服务器上

                     3:名字差错           4:查询类型不支持  5:在管理上被禁止           6~15:保留

      查询问题(问题记录):


      查询名:包含域名的可变长度字段,每个域以计数开头,最后一个字符为0(零),每个字符占1B。如:www.baidu.com可以这样记录:3www5baidu3com0

      查询类型:每一个问题的查询有一个类型,响应也有一个类型。


                           其中最常用的查询是A类型和PTR类型:A类型就是域名到IP地址,PTR查询就是IP地址到域名。

       查询类:定义了使用DNS的特定协议,1表示因特网。

       资源记录(RR)

        响应报文中的三种资源记录回答、授权、附加)均采用相同的格式,如下图所示:


        上图域名、类型和类与查询报文中的问题记录中的查询名、查询类型、查询类对应;

         生存时间:    以s为单位,定义了此回答的有效期(一般为2天)。在这段有效期内,客户长须可以将此回答保存在caching中,当TTL设置为0表示该资源记录只能用于本次回答,而不能存放在caching中;

         资源数据长度:用于记录后面资源数据的长度;

         资源数据:包含对查询的回答(在回答部分),或者权限服务器的域名(在授权部分),或者一些附加信息(在附加信息部分)。这个字段的格式和内容取决于类型字段的值。它可以是下述之一:

          a.数值  这个数以八位组为单位,例如IPv4是4个八位组的整数倍;

          b.域名   记录域名由两种方法,方法一就是查询报文中所提到的如:3www5baidu3com0,方法二是采用指针的方法,因为一个回答报文中可能同时包含多种资源记录RR,而对于每一种资源记录RR,都会重复域名部分,为了节约空间,在后面的RR(非第一个RR)的域名部分,我们采用偏移指针的方式。偏移指针(占用16位)指的是偏离DNS响应报文首部最开始的位置(以字节为单位)且以11开头,偏移值范围为0~63B。例如偏离首部最开始部分12B可以记录为:1100 0000 0000 1100。

Notice:当在响应报文中出现域名重复时,DNS要求用偏移指针来代替域名,DNS定义了2B的偏移指针,格式“11+偏移长度”,最高位固定为11,从而实现压缩

         c.字符串 字符串用1B的长度字段紧跟着一串长度的字符。长度字段并不像域名长度哪有受限。字符串可以多打255个字符(包括长度字段)

        四、高速缓存Caching 

        DNS客户程序将查询报文交给某个DNS服务器后(通常是主机域名服务器),若被查询的域名不在该DNS服务器的映射表中,则该DNS服务器会向另外一个DNS服务器请求 映射并在接收到响应后,把该映射信息返回给DNS客户程序之前,先要将该映射存储在自己的Caching中。若同一个客户或另一个客户请求同样的映射时,它就检查caching,并能够快速实现解析。当然,由于该服务器不是DNS程序的所请求域名的权限服务器,为了告知DNS客户程序这个响应是来自caching,而不是一个授权的信息源,这个服务器要把响应标记为未授权的。

         Caching可以提高解析效率,当然“如何更新Caching”是一个问题。可以采取如下方案反正Caching过时:

         方案一:权限域名服务器把TTL的信息添加到映射上,因为TTL定义了接收信息的服务器可以把映射信息放入Caching的时间长度(通常为2天),经过这段时间后,这个映射就变为无效的,因而任何查询都必须在发送给权限服务器。

        方案二:DNS要求每一个权限服务器对Caching中的每一条映射都有保持一个TTL计数器。Caching必须定期地搜索并清除那些TTL到期的映射。

        五、DNS请求中UDP和TCP的选择

         DNS可以使用UDP/53,也可以使用TCP/53,当响应报文的长度小于512B时就使用UDP(因为UDP的最大报文长度为512B),若响应报文的长度超过512B,则选用TCP。DNS协议关于UDP和TCP的选择通常为以下两种情况:

        (1)若DNS客户程序事先知道响应报文的长度512B,则应当使用TCP连接;

          NOTICE:主域名服务器与辅助域名服务器在进行区域传送时,通常数据量都比较大,所有DNS规定,区域传送使用TCP协议。

        (2)若解析程序不知道响应报文的长度,它一般使用UDP协议发送DNS查询报文,若DNS响应报文的长度大于512B,服务器就截断响应报文,并把TC(truncated)位置1,在这种情况下,DNS客户程序通常使用TCP重发原来的查询请求,从而它将来能够从DNS服务器中收到完整的响应。

          综上所述,我们可以得出结论:DNS客户程序在不知情(不知道DNS响应报文的长度是否超过512B)的情况下通常采用UDP与DNS服务器程序连接,在知情的情况下则采用TCP进行连接



FTP

https://blog.csdn.net/xu735456/article/details/54846239

主动模式 (PORT)

主动模式下,客户端随机打开一个大于 1024 的端口向服务器的命令端口 P,即 21 端口,发起连接,同时开放N +1 端口监听,并向服务器发出 “port N+1” 命令,由服务器从它自己的数据端口 (20) 主动连接到客户端指定的数据端口 (N+1)。

FTP 的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。

被动模式 (PASV)

为了解决服务器发起到客户的连接问题,有了另一种 FTP 连接方式,即被动方式。命令连接和数据连接都由客户端发起,这样就解决了从服务器到客户端的数据端口的连接被防火墙过滤的问题。

被动模式下,当开启一个 FTP 连接时,客户端打开两个任意的本地端口 (N > 1024 和 N+1) 。

第一个端口连接服务器的 21 端口,提交 PASV 命令。然后,服务器会开启一个任意的端口 (P > 1024 ),返回如“227 entering passive mode (127,0,0,1,4,18)”。 它返回了 227 开头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数第二个乘 256 再加上最后一个数字,这就是 FTP 服务器开放的用来进行数据传输的端口。如得到 227 entering passive mode (h1,h2,h3,h4,p1,p2),那么端口号是 p1*256+p2,ip 地址为h1.h2.h3.h4。这意味着在服务器上有一个端口被开放。客户端收到命令取得端口号之后, 会通过 N+1 号端口连接服务器的端口 P,然后在两个端口之间进行数据传输。


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值