DNS基础原理及配置详解

DNS: Domain Name Service 域名服务器(应用层协议)     

    DNS所监听的端口
        53/UDP,53/TCP(默认)

wKioL1cJF0DQUR3tAABL1TNsYas974.png

    一般情况下仅使用UDP协议进行讯通,若网络出现连接问题会自动转为TCP协议通讯

DNS所说的“域”是逻辑概念

域名结构:
    根域:
为DNS根节点服务器,用"."表示           

     全球有13组DNS根服务器
        
    顶级域:top level domain:(也叫一级域)
     分类:
      组织域:.com, .org, gov, .edu, mil
      国家域:.tw, .hk, .cn
      反向域:.in-addr.arpa

       顶级域是由根域划分,由各种组织或商业公司代理

       

    二级域:
     二级域就是我们常见的网站名,例如baidu.com就是一个二级域的域名,www.baidu.com是

     baidu.com这个域中的某个主机


    子域:

     子域是相对而言,对于根域来说,顶级域如.com就是跟域的子域;而对于二级域baidu.com来说

      www.baidu.com是baidu.com的子域

   

    FQDN: Full Qualified Domain Name 完全限定名称

    完全的限定名称书写为www.baidu.com. 没错,.com后面是有点的,在配置DNS的时候是必须要加

    上点的,这样才是一个完整的FQDN

        
    整个域名的的结构成为namespace:名称空间

DNS查找类型:        

    递归:recursion
     客户端对DN服务器只发起1次请求,DNS服务器响应并返回答案,称为递归

     DNS服务器对客户端递归意味着,客户端对DNS服务器发起请求,若DNS服务器本地缓存有答案

     则直接返答案,若没有,则需要多次查找答案,最终返回答案给客户端

            
    迭代:iteration
     客户端向DNS服务器请求答案,服务器没有授权回答,则指返回一个可查询的服务器IP给客户端客

     户端再对这个IP发起请求,循环往复,直到得到答案,称为迭代

     只对客户端迭代查询的服务器意味着,若客户端请求不属于服务器自己的解析区域,则不会为客户端

     查询答案,而是为客户端返回一个可查询的服务器IP,让客户端自己去查找答案           
     

     递归和迭代可以理解为DNS服务器的两种响应方式  

     注意:客户端指向的DNS服务器一定是允许给本地主机做递归的,只有DNS服务器才能进行迭代,根

     服务器不做任何递归性答复 (考虑到负载情况)
           

         
答复类型:

    权威回答:负责解析请求主机所在的域的DNS服务器的回答,比如查找www.johnson.com,刚好

    DNS服务器就是负责解析www.johnson.com主机,返回的答案就是权威答案

    非权威回答:非负责请求的域名解析的DNS服务器从缓存中查询到返回的答案


     域名解析请求答案有肯定和否定之分,避免DNS服务器做过多的不必要响应,肯定的答案和否定答案

     都会缓存到本地,当对同一主机解析再次请求时,都先从缓存从查找

    

域名解析流程:(以www.johnson.com为例)
    1.
当客户端要解析一个域名时,客户端首先分析本地hosts文件,若无对应的主机条目,就去分析

    本地缓存,若没有答案,则向本地DNS服务器发起请求       
   

    2.DNS服务器接收到请求,首先分析服务器本地的缓存,看是否存在要解析的答案,有则直接返回

    没有则向根发起请求

   

    3.根接收到请求,但根并不负责任何递归性的回答,所以,根会返回www.johnson.com的顶级域

     .com所在的主机地址给本地DNS服务器   

   

    4.本地DNS服务收到根的指向性答复,然后去找负责.com的DNS服务器

    

    5.负责.com的DNS服务器发现johnson.com是自己的管理的区域,但自己并不负责做递归性的答复

    所以返回负责解析johnson.com的DNS服务器地址给本地DNS服务器

   

    6.本地DNS服务器向负责解析johnson.com这个域的DNS服务器发起请求

    

    7.负责解析johnson.com这个二级域的DNS服务器接收到解析www.johnson.com请求后,分析自己

     的区域数据库文件,发现存在www主机,给本地DNS服务器返回答案(权威答案)

    

    8.本地DNS服务器收到答复,将答案返回给客户端,域名解析过程完成              
        
    是不是发现解析一个主机名的过程很麻烦,所以才需要缓存这个东西,把第一次请求的答案放到缓存  

    中,当同一请求再次出现时,直接从缓存中返回答案,客户端和DNS服务器都可以缓存

    需要注意的是,客户端是相对而言的,比如本地DNS服务器向根发起请求,那么相对于根,本地DNS

    服务器就是客户端,不管请求者是客户端还是DNS服务器,只要你向我发起请求,你就是客户端 


 



DNS域名解析方式:
    正向解析:FQDN --> IP
    反向解析:IP --> FQDN

    传统意义上,正反向解析技术不同,不应该存放于同一数据库文件中,主机名的解析式依赖于

    正反解析数据库文件

       

资源记录:Resource Record
    资源记录有类型,用于资源的功能
    SOA:Start Of  Authority, 起始授权
    NS: Name Server, 域名服务器
    MX: Mail eXchanger: 邮件服务器
    A: Address, FQDN --> IPv4
    PTR: PoiTeR, IPv4 --> FQDN
    AAAA: Address,FQDN --> IPv6
    CNAME: Canonical Name, 别名记录

 

    DNS数据库文件(区域数据文件,区域自身有名字):只能包含资源记录或宏的定义

    资源记录格式:
     name    [ttl]   In    RRtype   Value
      name:资源名称,不同资源类型名称不同
      [ttl]: 缓存有效期,可省略,可以在宏中定义
      IN: Internet,固定格式
      RRtype: 资源类型
      value:资源对应的值

     资源记录的起始行可以定义宏,如TTL,缓存有效期,这样就可在资源条目中省略不写  


     例子:A资源记录
      www  600     IN      A       172.16.11.1

      www.johnson.com.  600     IN  A    172.16.11.1

     注意:
      若给出相对路径,则会自动补全
      若给出绝对名称,后面的"."一定不能省略


    资源配置
     SOA:只能有一个
      name:为区域名称,通常可以简写为@
      value:主DNS服务器的FQDN(ns.johnsonxu.com.)

      注意:SOA必须是区域数据库的第一条记录

     例:@  600  IN  SOA  ns.johnson.com.  admin.johnson.com.  (
        serial number:为数据库的版本号,十进制格式,不能超过10位
        refresh time:从服务器到主服务器的更新间隔
        retry time:更新失败重试时间,应该小于refresh time
        expire time:重试多久后,依然没有联系到主DNS,自己拒绝提供服务的时间
        netgative answer ttl ):否定答案缓存时间

    NS: 可以有多条
     name:为区域名称,通常可简写为@
     value:DNS服务器的FQDN(可以使用相对名称)
    

     例:@     600     IN      NS      ns

     相对名称:如ns,则会自动补全为ns.johnson.com.(补全的名称为区域名字)

     @表示为区域名字,即johnson.com,一般域名即为区域名       
    

    A:
     name:FQDN(可使用相对名称)
     value:IP

    例:
     www     600  IN  A    172.18.17.1
     www     600  IN  A    172.18.17.2

    同一主机名使用不同IP地址可作简略的负载均衡(轮询访问)

     www     600  IN  A     172.18.17.1
     tp          600  IN  A     172.18.17.1

    同一ip地址使用不同主机名,同一主机提供多种服务

    注意:任何Value以FQDN作为其值的资记录,都应该添加一条A资源记录,以确保该资源的FQDN能

    解析为IP地址

    MX: 可以有多个
     name:区域名称,用于表示smtp服务器
     value:优先级和FQDN
     优先级:0-99,数字越小,优先级越高

    例:
     @   600    IN   MX  10   mail
     @   600    IN   MX  20   mail

    注意:配置MX资源的时候千万不能把优先级省略,否则会报错

    CNAME:
     name: FQDN
     value:FQDN

    例:
     ftp     IN      CNAME   www
     ftp的正式名称为www,即ftp为www的别名

    PTR: IP --> FQDN
     name:IP是逆向的‘主机’地址,如172.18.17.2的name为2.17,其完全
     的书写格式为2.17.18.172.in-addr-arpa.
     value: FQDN

    例:
    2.17   600    IN     PTR    www.johnson.com

    需要提醒的是:PTR资源记录name为主机地址(注意区分网络地址和主机地址,IP包含两者)

    若网络地址是16位,那么主机是16位,name的填写如172.18.17.2,为2.17,后面不用填写,会自动

    补全,反向区域的命名为IP的网络地址,为"18.172.in-addr.arpa"

    其实,若反向区域命名为"17.18.172.in-addr.arpa",则在PTR资源记录中name填写2即可,不管怎样

    使用相对名称,则补全后必须是一个完整的IP,或name直接写全2.17.18.172.in-addr.arpa.

  

    区域和域:
     Domain:域是逻辑概念
     zone:区域是物理概念,可以说区域是域的实现,区域数据库文件定义了此域能够解析的资源条目
    

     在一个域内的ns,正向解析文件和反向解析文件各标示为一个物理空间,称为区域
   

DNS服务器类型:
    主DNS服务器
    辅助DNS服务器
        
    缓存名称服务器
     不做特定的区域解析,所有请求都将转发出去,并把查询的结果缓存至本地
     若再有相同的请求,则从缓存中直接返回结果给请求者(此答案为非权威答案)



DNS协议实现:
    DNS --> BIND --> named

    DNS是协议,而协议的实现靠软件,实现DNS协议的软件是BIND,BIND的进程名称为named

BING安装:

    本文只是基本的DNS服务配置,只安装BIND即可

  

创建新的DNS主配置文件:

    1.手动创建新的named.conf文件,内容如下(在创建之前先把原文件重命名使其失效)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
options {   # 全局配置,定义区域文件目录,后面file引用的路径都是相对此定义的路径
     directory  "/var/named" ;
};
 
zone  "."  IN {          # 根区域配置
     type  hint;
     file  "named.ca" ;
};
 
zone  "localhost."  IN {         # 本地正向解析区域配置
     type  master;
     file  "named.localhost" ;
};
 
zone  "1.0.0.172-in.addr.arpa"  IN {    # 本地反向解析区域配置
     type  master;
     file  "named.loopback" ;
};
 
# 实际上,仅有以上区域配置,一个简单DNS服务就能运行起来了
下面是自己定义的区域配置
 
zone  "johnson.com."  IN {         # 正向解析区域配置
     type  master;
     file  "johnson.com.zone" ;
};
 
# 检查主配置文件的语法错误 
 
[root@johnson-linux ~] # named-checkconf
 
# 修改主配置文件的属主和属组,并修改权限为640
[root@johnson_server ~] # chown root:named /etc/named.conf
[root@johnson_server ~] # chmod 640 /etc/named.conf

    其实可以不用创建一个主配置文件,因为软件安装后就已经生成了,这里自己手动配置,只是为了对主配置文件做一个简单了解,在自己能够手动配置完并且能够把服务运行起来,相信文件配置就不是问题了,若你不想自己编辑,则直接使用原来的主配置文件即可


    2.在/var/named目录创建johnson.com.zone区域数据文件,内容如下       

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$TTL 600
@       IN      SOA     ns.johnson.com.     admin.johnson.com. (
             2016140913 ;serial number
             2H ; fresh  time
             20M ; retry  time
             7D ; expire  time
             4H ) ; netgtive  time
@       IN      NS      ns
@       IN      NS      ns2
@       IN      MX  10  mail
ns      IN      A       172.18.17.16
mail    IN      A       172.18.17.3
www     IN      A       172.18.17.3
ns2     IN      A       172.18.17.2
img     IN      A       172.18.17.4
ftp      IN      CNAME   www
http    IN      CNAME   www
 
# 配置完成保存退出,检测语法错误
[root@johnson-linux ~] # named-checkzone "johnson.com" /var/named/johnson.com.zone 
zone johnson.com /IN : loaded serial 2016140913
OK
# 显示OK则表示没有语法问题
 
# 同样需要修改文件的属主和属组及权限
[root@johnson_server ~] # chown root:named /var/named/johnson.com.zone
[root@johnson_server ~] # chmod 640 /var/named/johnson.com.zone

    注意:在配置新区域文件是必须要给出从服务器的数据同步各项参数,缺一不可
       

    3.启动服务,使用dig工具测试

     在测试之间,简单了解dig工具使用

     dig [-t TYPE] NMAE [@SERVER]

      -t type:指定测试类型,如 -t A,就是测试A资源类型(FQDN --> IP)

      @SERVER:使用指定DNS服务器来测试,如@172.18.17.16

      NAME:要测试的主机名,如www.johnson.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 语法检测没有问题后启动服务
[root@johnson-linux ~] # service named start
Starting named:                       [  OK  ]
 
# 可以通过/var/log/message 查看日志获取服务信息
[root@johnson-linux ~] # tail /var/log/messages
Apr  9 20:25:26 johnson-linux named[6371]: automatic empty zone: B.E.F.IP6.ARPA
Apr  9 20:25:26 johnson-linux named[6371]: automatic empty zone: 8.B.D.0.1.0.0.2.IP6.ARPA
Apr  9 20:25:26 johnson-linux named[6371]:  command  channel listening on 127.0.0.1 #953
Apr  9 20:25:26 johnson-linux named[6371]:  command  channel listening on ::1 #953
Apr  9 20:25:27 johnson-linux named[6371]: zone 1.0.0.172- in .addr.arpa /IN : loaded serial 0
Apr  9 20:25:27 johnson-linux named[6371]: zone johnson.com /IN : loaded serial 2016140913
Apr  9 20:25:27 johnson-linux named[6371]: zone localhost /IN : loaded serial 0
Apr  9 20:25:27 johnson-linux named[6371]: managed-keys-zone . /IN : loaded serial 5
Apr  9 20:25:27 johnson-linux named[6371]: running    # 已经运行起来了
Apr  9 20:25:27 johnson-linux named[6371]: zone johnson.com /IN : sending notifies (serial 2016140913)
 
# 服务有任何问题,都记得要看一下日志,要养成习惯
 
# 测试DNS服务器是否能解析
[root@johnson-linux ~] # dig -t A www.johnson.com @172.18.17.16
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -t A www.johnson.com @172.18.17.16
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,  id : 12888
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
 
;; QUESTION SECTION:
;www.johnson.com.        IN    A      <-------------- # 我们的请求
 
;; ANSWER SECTION:   # 返回的答案,主机名成功解析
www.johnson.com.    600    IN    A    172.18.17.3   <-------------
 
;; AUTHORITY SECTION:        # 解析此区域的dns
johnson.com.        600    IN    NS    ns.johnson.com.
johnson.com.        600    IN    NS    ns2.johnson.com.
 
;; ADDITIONAL SECTION:       # 附加信息,把dns服务器的地址也解析出来了
ns.johnson.com.        600    IN    A    172.18.17.16
ns2.johnson.com.    600    IN    A    172.18.17.2
# 我这里配置了主从DNS,所以又两个DNS服务器
 
;; Query  time : 1 msec
;; SERVER: 172.18.17.16 #53(172.18.17.16)
;; WHEN: Sat Apr  9 20:12:14 2016
;; MSG SIZE  rcvd: 116

    

    提醒:dig 工具测试可以指定解析的DNS,若不指定,则使用/etc/resolv.conf中的DNS,也可手动

    把配置文件的中DNS改为自己配置的DNS,这样就不必手动指定

    

    正向解析的配置到此就搞定了,下面来搞一下反向解析区域的配置
  
反向解析区域配置:
    1.编辑/etc/named.conf文件,添加反向解析区域,添加内容如下

1
2
3
4
5
6
7
8
# 添加区域授权
  zone  "18.172.in-addr.arpa"  {
     type  master;
      file  "172.18.zone" ;
  };
# 检测语法错误
[root@johnson-linux ~] # named-checkconf
# 没有结果就是最好的结果

    注意:反向解析区域名以逆向‘网络地址’.in-addr.arpa命名

    2.编辑反向解析数据库文件:
     第一条应该为SOA记录
     应该具有NS记录,但不能出现MX和A记录
     较为常见的即为PTR记录
     名称为逆向‘主机’地址 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 在/var/named目录下创建反向解析区域数据库文件
$TTL 600
@       IN      SOA     ns.johnson.com.  admin.johnson.com. (
                 2016040914
                 2H
                 20M
                 7D
                 3H )
         IN      NS      ns.johnson.com.
         IN      NS      ns2.johnson.com.
3.17    IN      PTR     www.johnson.com.
2.17    IN      PTR     ns2.johnson.com.
4.17    IN      PTR     img.johnson.com.
 
#完成保存退出,检测区域文件语法错误
[root@johnson-linux ~] # named-checkzone "18.172.in-addr.arpa" /var/named/172.18.zone 
zone 18.172. in -addr.arpa /IN : loaded serial 2016040914
OK
 
# 修改文件属主属组及文件权限
[root@johnson_server ~] # chown root:named /var/named/172.18.zone
[root@johnson_server ~] # chmod 640 /var/named/172.18.zone
数据
# 没有任何语法错误,则启动重载一下服务
[root@johnson-linux ~] # service named reload
Reloading named:                     [  OK  ]


    注意:逆向解析库文件name为‘主机地址’,会自动以区域名字补全网络号
    逆向解析文件的FQDN必须给全,不能使用简写

   

    3.测试反向解析是否正常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@johnson-linux ~] # dig -x 172.18.17.3 @172.18.17.2
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -x 172.18.17.3 @172.18.17.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,  id : 52862
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
 
;; QUESTION SECTION:        # 发出的请求
;3.17.18.172. in -addr.arpa.    IN    PTR
 
;; ANSWER SECTION:       # DNS服务器返回答案,反向解析成功
3.17.18.172. in -addr.arpa. 600    IN    PTR    www.johnson.com.
 
;; AUTHORITY SECTION:
18.172. in -addr.arpa.    600    IN    NS    ns.johnson.com.
18.172. in -addr.arpa.    600    IN    NS    ns2.johnson.com.
 
;; ADDITIONAL SECTION:
ns.johnson.com.        600    IN    A    172.18.17.16
ns2.johnson.com.    600    IN    A    172.18.17.2
 
;; Query  time : 1 msec
;; SERVER: 172.18.17.2 #53(172.18.17.2)
;; WHEN: Sat Apr  9 20:57:15 2016
;; MSG SIZE  rcvd: 138


以上都是基于自己手动编辑的主配置文件进行的,可以直接使用原来的主配置文件/etc/named.conf

和区域配置文件/etc/named.rfc1912.zones,添加区域直接往里面写即可

    主配置文件:

    全局配置段:
        options { ... }
    日志配置段:
        logging { ... }
    区域配置段:
        zone { ... }

    要点:

     1.服务监听端口:
      listen-on port 53 { 127.0.0.1; };
      默认监听与本地的主机,若要改为监听任意主机,将配置文件中此行
      使用//注释即可,或者括号内容改为{ any; },注意前后需要有空格

     2.allow-query   { localhost; }
      此项定义允许查询的主机范围,localhost为只允许本地计算机查询,若想让其他特定主机查询,{}内改为IP地址即可,若想让所有主机查询,使用//注释或 改为{ any; } 即可          
        
     3.recursion yes;
      是否允许递归,yes为允许,no为不允许

wKiom1cJ07awD8FUAACf5p99ZZg869.png
    




主从同步:

    为了防止一个DNS服务器出现宕机或压力过大,往往要配置多台辅助DNS服务器,此时就涉及到主从

    数据同步的问题

    

    区域传送:
     辅助DNS服务器向主DNS服务器或其他辅助DNS服务器请求数据传输的过程
     完全区域传送:传送区域的所有数据,AXFR
     增量区域传送:传送区域中改变的数据,IXFR

    在设立了主从DNS服务器之后,从服务器每隔一段时间就会到主服务器上查询区域数据,看看是否发

    生变化,以保证数据的准确性;当主服务器修改区域数据时,版本号发生改变,将会通知从服务器数

    据发生变化,从服务器便会执行同步操作
   

    注意:主从DNS服务器的BIND版本最好能保持一致,从服务器BIND版本不能低于主服务器,可以是

    等于或大于


从DNS服务器配置:

    我这里使用虚拟机实现,创建一台新的centos6.7,IP地址为172.18.17.2

    named主配置文件不再手动创建,直接使用原来的,简单做一下注释

   

    其实在配置从服务器的第一部要先向上级授权,就是.com,否则在互联网上,从DNS服务不会被找

    到,但我们这里是测试,所以忽略这一步

        
    1.安装BIND并配置从服务器区域文件信息
      编辑/etc/named.rfc1912.zones,添加条目
                       
    正向解析区域配置

1
2
3
4
5
6
zone  "johnson.com"  {
         type  slave;
         masters { 172.18.17.16; };
         file  "slaves/johnson.com.zone" ;   #从服务器区域文件存放
         allow-transfer { none; };     #设置传送权限,不允许其他主机传送
};

     

    反向解析区域配置        

1
2
3
4
5
6
7
8
9
10
zone  "18.172.in-addr.arpa"  {
         type  slave;
         masters { 172.18.17.16; };
         file  "slaves/18.172.zone" ;
          allow-transfer { none; };
};
 
# 配置完后,检测语法错误,无报错启动服务
[root@johnson_server ~] # service named start
Starting named:                                            [  OK  ]

             
    注意:

     1.从服务器不需要创建区域数据文件,会自动从主DNS服务器中复制,只要在添加区域是设定好

     区域文件目录为/var/named/slaves/file_name.zone 即可

     2.基于安全考虑,从服务器应设置为不接受任何人的转,发使用allow-transfer { IP; };,实现

     区域数据安全传输控制

    
    2.在主DNS服务器添加从DNS服务器NS条目和A或PTR条目
                
     正向解析区域数据文件添加从服务器资源条目:

     编辑/var/named/johnson.com.zone

1
2
     IN  NS  ns2
ns2  IN  A   172.18.17.2


     反向解析区域数据文件添加从服务器资源条目:
     编辑/var/named/172.18.zone

1
2
        IN  NS  ns2.johnson.com.
2.17    IN  PTR  ns.johnson.com.

   

    若无语法错误,重载主DNS服务和从DNS的服务 

1
2
3
# 服务重启后,区域数据已经复制过来了
[root@johnson_server ~] # ls /var/named/slaves/
18.172.zone  johnson.com.zone


    3.测试从服务器是否能完成解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[root@johnson_server ~] # dig -t A www.johnson.com @172.18.17.2 #指定为从DNS服务器地址
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -t A www.johnson.com @172.18.17.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,  id : 61007
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
 
;; QUESTION SECTION:
;www.johnson.com.        IN    A
 
;; ANSWER SECTION:
www.johnson.com.    600    IN    A    172.18.17.3    # 成功解析
 
;; AUTHORITY SECTION:
johnson.com.        600    IN    NS    ns.johnson.com.
johnson.com.        600    IN    NS    ns2.johnson.com.
 
;; ADDITIONAL SECTION:
ns.johnson.com.        600    IN    A    172.18.17.16
ns2.johnson.com.    600    IN    A    172.18.17.2
 
 
# 反向解析-------------------------------------------------------
[root@johnson_server ~] # dig -x 172.18.17.3 @172.18.17.2
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -x 172.18.17.3 @172.18.17.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,  id : 36439
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
 
;; QUESTION SECTION:
;3.17.18.172. in -addr.arpa.    IN    PTR
 
;; ANSWER SECTION:
3.17.18.172. in -addr.arpa. 600    IN    PTR    www.johnson.com.
 
;; AUTHORITY SECTION:
18.172. in -addr.arpa.    600    IN    NS    ns2.johnson.com.
18.172. in -addr.arpa.    600    IN    NS    ns.johnson.com.
 
;; ADDITIONAL SECTION:
ns.johnson.com.        600    IN    A    172.18.17.16
ns2.johnson.com.    600    IN    A    172.18.17.2

    

 区域增量传送就不演示了,也没办法演示实时的效果,要注意的是,在主从DNS服务配置完成之后,每次修改主DNS服务器的区域数据都要将版本号修改(大小加1即可),这样这样从服务器才会更新




子域授权:
    (1)在主DNS服务器的区域数据文件中添加以下内容:
     1.NS条目添加子域名称,如test.johnson.com
     2.子域对应的A记录

1
2
3
# 添加如下资源记录
test     IN      NS      ns. test      
ns. test  IN      A       172.18.17.5

   

    (2)在新的DNS服务器中添加以下内容:
     1.添加区域(以子域名称命名)
     2.创建区域数据文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 定义zone
[root@johnson_linux named] # vim /etc/named.rfc1912.zones
zone  "test.johnson.com"  IN {
         type  master;
         file  "test.johnson.com.zone" ;
};
 
# 创建区域数据文件
$TTL 600
@       IN      SOA     ns. test .johnson.com.    admin. test .johnson.com. (
                 2016041010
                 2H
                 20M
                 7D
                 3H )
@       IN      NS      ns
ns      IN      A       172.18.17.5
www     IN      A       172.18.17.6

    注意:在父域zone中添加的子域记录只是授权作用,把父域和子域联系起来,不能做解析,需要转发到子域DNS服务器才能解析

    

    测试是否能正常解析(父域为DNS为172.18.17.16,子域的DNS地址为172.18.17.5)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 测试父域是否能解析子域
[root@johnson-linux named] # dig -t NS test.johnson.com @172.18.17.16
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -t NS  test .johnson.com @172.18.17.16
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,  id : 31281
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
 
;; QUESTION SECTION:
; test .johnson.com.        IN    NS
 
;; ANSWER SECTION:     # 解析成功
test .johnson.com.    600    IN    NS    ns. test .johnson.com.
 
;; ADDITIONAL SECTION:
ns. test .johnson.com.    600    IN    A    172.18.17.5
 
# 测试子域DNS是否能正常解析
[root@johnson_linux named] # dig -t A www.test.johnson.com @172.18.17.5
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -t A www. test .johnson.com @172.18.17.5
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,  id : 5725
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
 
;; QUESTION SECTION:
;www. test .johnson.com.        IN    A
 
;; ANSWER SECTION:     #
www. test .johnson.com.    600    IN    A    172.18.17.6
 
;; AUTHORITY SECTION:
test .johnson.com.    600    IN    NS    ns. test .johnson.com.
 
;; ADDITIONAL SECTION:
ns. test .johnson.com.    600    IN    A    172.18.17.5

注意:此时子域只能解析自己服务器定义的zone的主机,无法解析父域的主机





区域转发:
    在默认情况下,任何不属于自己解析区域的主机,都将转发给根
    客户端请求的主机不属于自己解析的区域,而又不想转发给根,想直接转发给指定的能够解析此主机的DNS服务器,就需要配置区域转发

    定义一个要转发的zone

     如:在上面的提到子域中转发johnson.com这个域的所有主机,子域本身不能解析父域的主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 定义转发的zone
[root@johnson_linux named] # vim /etc/named.rfc1912.zones
zone  "johnson.com"  {
         type  forward;
         forwarders { 172.18.17.16; };
         forward only;
};
 
# 重启服务后测试这时是否能解析解析父域的主机
[root@johnson_linux named] # dig -t A www.johnson.com @172.18.17.5 #本机DNS
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -t A www.johnson.com @172.18.17.5
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,  id : 65094
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
 
;; QUESTION SECTION:
;www.johnson.com.        IN    A
 
;; ANSWER SECTION:
www.johnson.com.    595    IN    A    172.18.17.3   # 有结果,成功转发
 
;; AUTHORITY SECTION:
johnson.com.        595    IN    NS    ns2.johnson.com.   #答案来自于父域的DNS
johnson.com.        595    IN    NS    ns.johnson.com.
 
;; ADDITIONAL SECTION:
ns.johnson.com.        595    IN    A    172.18.17.16   # 父域DNS的IP
ns2.johnson.com.    595    IN    A    172.18.17.2

    forward only|first
     only:代表此域仅做转发,即使转发的服务器不做回应也不再向根请求
     first:表示先做转发,若转发的服务器无响应,则自己去找根

    在named.conf的options定义格式:
     forward first|only
     forward { IP; };
        
    要点:
     1.添加特定的转发区域,定义一个zone即可
     2.不属于自己解析的主机都转发到指定的DNS服务器,在named.conf的options中定义即可       



安全控制选项:
    allow-transter { IP|none;};

    主从传送控制,通常需要开启

        一般主填写从服务器,从填写none,不允许任何人传送

    allow-query{ IP; };

        一般不启用此设置,此项一般仅用于缓存名称服务器,仅对本地开放       

    allow-recursion{ IP; };

        设置允许递归的白名单,可以使用网络,如172.18.0.0/16

    allow-update{};

        设置是否允许动态更新区域数据文件的主机IP,此项一般为{ none;},不建议开启,安全风险很

    大,动态更新一般基于DHCP服务器的动态地址分配   

    ACL:访问控制列表

     通常定义acl列表在主配置文件name.conf的上方(options的上方)

     内置列表:
      any:任何主机
      none:无
      local:本机
      localnet:本机所在的网络
    

     自定义:
      acl NAME {
       172.18.17.1/16
       192.168.1.19/24
        ...
       };

    当需要在多个zone中的安全控制选项中定义大量的主机,为了方便修改,ACL访问控制列表就起到很好的作用,只要定义好一个主机列表,将列表名称填上即可,列表名即表示此列表中的所有主机

   

--END
       
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非扫描版TCP/IP详解卷一,你值得拥有: 《TCP/IP详解,卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作。 本书适合作为计算机专业学生学习网络的教材和教师参考书。也适用于研究网络的技术人员。 目 录 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 分层 1 1.3 TCP/IP的分层 4 1.4 互联网的地址 5 1.5 域名系统 6 1.6 封装 6 1.7 分用 8 1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU 21 2.10 串行线路吞吐量计算 21 2.11 小结 22 第3章 IP:网际协议 24 3.1 引言 24 3.2 IP首部 24 3.3 IP路由选择 27 3.4 子网寻址 30 3.5 子网掩码 32 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的分组格式 40 4.5 ARP举例 41 4.5.1 一般的例子 41 4.5.2 对不存在主机的ARP请求 42 4.5.3 ARP高速缓存超时设置 43 4.6 ARP代理 43 4.7 免费ARP 45 4.8 arp命令 45 4.9 小结 46 第5章 RARP:逆地址解析协议 47 5.1 引言 47 5.2 RARP的分组格式 47 5.3 RARP举例 47 5.4 RARP服务器的设计 48 5.4.1 作为用户进程的RARP服务器 49 5.4.2 每个网络有多个RARP服务器 49 5.5 小结 49 第6章 ICMP:Internet控制报文协议 50 6.1 引言 50 6.2 ICMP报文的类型 50 6.3 ICMP地址掩码请求与应答 52 6.4 ICMP时间戳请求与应答 53 6.4.1 举例 54 6.4.2 另一种方法 55 6.5 ICMP端口不可达差错 56 6.6 ICMP报文的4.4BSD处理 59 6.7 小结 60 第7章 Ping程序 61 7.1 引言 61 7.2 Ping程序 61 7.2.1 LAN输出 62 7.2.2 WAN输出 63 7.2.3 线路SLIP链接 64 7.2.4 拨号SLIP链路 65 7.3 IP记录路由选项 65 7.3.1 通常的例子 66 7.3.2 异常的输出 68 7.4 IP时间戳选项 69 7.5 小结 70 第8章 Traceroute程序 71 8.1 引言 71 8.2 Traceroute 程序的操作 71 8.3 局域网输出 72 8.4 广域网输出 75 8.5 IP源站选路选项 76 8.5.1 宽松的源站选路的traceroute 程序示例 78 8.5.2 严格的源站选路的traceroute 程序示例 79 8.5.3 宽松的源站选路traceroute程序 的往返路由 80 8.6 小结 81 第9章 IP选路 83 9.1 引言 83 9.2 选路的原理 84 9.2.1 简单路由表 84 9.2.2 初始化路由表 86 9.2.3 较复杂的路由表 87 9.2.4
该文件共分12个压缩包,必须下载到同一个文件夹后解压才可以用哦~~ 简介: 《TCP/IP详解,卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作。 本书适合作为计算机专业学生学习网络的教材和教师参考书。也适用于研究网络的技术人员。 目 录 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 分层 1 1.3 TCP/IP的分层 4 1.4 互联网的地址 5 1.5 域名系统 6 1.6 封装 6 1.7 分用 8 1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU 21 2.10 串行线路吞吐量计算 21 2.11 小结 22 第3章 IP:网际协议 24 3.1 引言 24 3.2 IP首部 24 3.3 IP路由选择 27 3.4 子网寻址 30 3.5 子网掩码 32 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的分组格式 40 4.5 ARP举例 41 4.5.1 一般的例子 41 4.5.2 对不存在主机的ARP请求 42 4.5.3 ARP高速缓存超时设置 43 4.6 ARP代理 43 4.7 免费ARP 45 4.8 arp命令 45 4.9 小结 46 第5章 RARP:逆地址解析协议 47 5.1 引言 47 5.2 RARP的分组格式 47 5.3 RARP举例 47 5.4 RARP服务器的设计 48 5.4.1 作为用户进程的RARP服务器 49 5.4.2 每个网络有多个RARP服务器 49 5.5 小结 49 第6章 ICMP:Internet控制报文协议 50 6.1 引言 50 6.2 ICMP报文的类型 50 6.3 ICMP地址掩码请求与应答 52 6.4 ICMP时间戳请求与应答 53 6.4.1 举例 54 6.4.2 另一种方法 55 6.5 ICMP端口不可达差错 56 6.6 ICMP报文的4.4BSD处理 59 6.7 小结 60 第7章 Ping程序 61 7.1 引言 61 7.2 Ping程序 61 7.2.1 LAN输出 62 7.2.2 WAN输出 63 7.2.3 线路SLIP链接 64 7.2.4 拨号SLIP链路 65 7.3 IP记录路由选项 65 7.3.1 通常的例子 66 7.3.2 异常的输出 68 7.4 IP时间戳选项 69 7.5 小结 70 第8章 Traceroute程序 71 8.1 引言 71 8.2 Traceroute 程序的操作 71 8.3 局域网输出 72 8.4 广域网输出 75 8.5 IP源站选路选项 76 8.5.1 宽松的源站选路的traceroute 程序示例 78 8.5.2 严格的源站选路的traceroute 程序示例 79 8.5.3 宽松的源站选路traceroute程序 的往返路由 80 8.6 小结 81 第9章 IP选路 83 9.1 引言 83 9.2 选路的原理 84 9.2.1 简单路由表 84 9.2.2 初始化路由表 86 9.2.3 较复杂的路由表 87 9.2.4 没有到达目的地的路由 87 9.3 ICMP主机与网络不可达差错 88 9.4 转发或不转发 89 9.5 ICMP重定向差错 89 9.5.1 一个例子 90 9.5.2 更多的细节 91 9.6 ICMP路由器发现报文 92 9.6.1 路由器操作 93 9.6.2 主机操作 93 9.6.3 实现 93 9.7 小结 94 第10章 动态选路协议 95 10.1 引言 95 10.2 动态选路 95 10.3 Unix选路守护程序 96 10.4 RIP:选路信息协议 96 10.4.1 报文格式 96 10.4.2 正常运行 97 10.4.3 度量 98 10.4.4 问题 98 10.4.5 举例 98 10.4.6 另一个例子 100 10.5 RIP版本2 102 10.6 OSPF:开放最短路径优先 102 10.7 BGP:边界网关协议 103 10.8 CIDR:无类型域间选路 104 10.9 小结 105 第11章 UDP:用户数据报协议 107 11.1 引言 107 11.2 UDP首部 107 11.3 UDP检验和 108 11.3.1 tcpdump输出 109 11.3.2 一些统计结果 109 11.4 一个简单的例子 110 11.5 IP分片 111 11.6 ICMP不可达差错(需要分片) 113 11.7 用Traceroute确定路径MTU 114 11.8 采用UDP的路径MTU发现 116 11.9 UDP和ARP之间的交互作用 118 11.10 最大UDP数据报长度 119 11.11 ICMP源站抑制差错 120 11.12 UDP服务器的设计 122 11.12.1 客户IP地址及端口号 122 11.12.2 目标IP地址 122 11.12.3 UDP输入队列 122 11.12.4 限制本地IP地址 124 11.12.5 限制远端IP地址 125 11.12.6 每个端口有多个接收者 125 11.13 小结 126 第12章 广播和多播 128 12.1 引言 128 12.2 广播 129 12.2.1 受限的广播 129 12.2.2 指向网络的广播 129 12.2.3 指向子网的广播 129 12.2.4 指向所有子网的广播 130 12.3 广播的例子 130 12.4 多播 132 12.4.1 多播组地址 133 12.4.2 多播组地址到以太网地址的转换 133 12.4.3 FDDI和令牌环网络中的多播 134 12.5 小结 134 第13章 IGMP:Internet组管理协议 136 13.1 引言 136 13.2 IGMP报文 136 13.3 IGMP协议 136 13.3.1 加入一个多播组 136 13.3.2 IGMP报告和查询 137 13.3.3 实现细节 137 13.3.4 生存时间字段 138 13.3.5 所有主机组 138 13.4 一个例子 138 13.5 小结 141 第14章 DNS:域名系统 142 14.1 引言 142 14.2 DNS基础 142 14.3 DNS的报文格式 144 14.3.1 DNS查询报文中的问题部分 146 14.3.2 DNS响应报文中的资源记录部分 147 14.4 一个简单的例子 147 14.5 指针查询 150 14.5.1 举例 151 14.5.2 主机名检查 151 14.6 资源记录 152 14.7 高速缓存 153 14.8 用UDP还是用TCP 156 14.9 另一个例子 156 14.10 小结 157 第15章 TFTP:简单文件传送协议 159 15.1 引言 159 15.2 协议 159 15.3 一个例子 160 15.4 安全性 161 15.5 小结 162 第16章 BOOTP: 引导程序协议 163 16.1 引言 163 16.2 BOOTP的分组格式 163 16.3 一个例子 164 16.4 BOOTP服务器的设计 165 16.5 BOOTP穿越路由器 167 16.6 特定厂商信息 167 16.7 小结 168 第17章 TCP:传输控制协议 170 17.1 引言 170 17.2 TCP的服务 170 17.3 TCP的首部 171 17.4 小结 173 第18章 TCP连接的建立与终止 174 18.1 引言 174 18.2 连接的建立与终止 174 18.2.1 tcpdump的输出 174 18.2.2 时间系列 175 18.2.3 建立连接协议 175 18.2.4 连接终止协议 177 18.2.5 正常的tcpdump输出 177 18.3 连接建立的超时 178 18.3.1 第一次超时时间 178 18.3.2 服务类型字段 179 18.4 最大报文段长度 179 18.5 TCP的半关闭 180 18.6 TCP的状态变迁图 182 18.6.1 2MSL等待状态 183 18.6.2 平静时间的概念 186 18.6.3 FIN_WAIT_2状态 186 18.7 复位报文段 186 18.7.1 到不存在的端口的连接请求 187 18.7.2 异常终止一个连接 187 18.7.3 检测半打开连接 188 18.8 同时打开 189 18.9 同时关闭 191 18.10 TCP选项 191 18.11 TCP服务器的设计 192 18.11.1 TCP服务器端口号 193 18.11.2 限定的本地IP地址 194 18.11.3 限定的远端IP地址 195 18.11.4 呼入连接请求队列 195 18.12 小结 197 第19章 TCP的交互数据流 200 19.1 引言 200 19.2 交互式输入 200 19.3 经受时延的确认 201 19.4 Nagle算法 203 19.4.1 关闭Nagle算法 204 19.4.2 一个例子 205 19.5 窗口大小通告 207 19.6 小结 208 第20章 TCP的成块数据流 209 20.1 引言 209 20.2 正常数据流 209 20.3 滑动窗口 212 20.4 窗口大小 214 20.5 PUSH标志 215 20.6 慢启动 216 20.7 成块数据的吞吐量 218 20.7.1 带宽时延乘积 220 20.7.2 拥塞 220 20.8 紧急方式 221 20.9 小结 224 第21章 TCP的超时与重传 226 21.1 引言 226 21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 快速重传与快速恢复算法 236 21.8 拥塞举例(续) 237 21.9 按每条路由进行度量 240 21.10 ICMP的差错 240 21.11 重新分组 243 21.12 小结 243 第22章 TCP的坚持定时器 245 22.1 引言 245 22.2 一个例子 245 22.3 糊涂窗口综合症 246 22.4 小结 250 第23章 TCP的保活定时器 251 23.1 引言 251 23.2 描述 252 23.3 保活举例 253 23.3.1 另一端崩溃 253 23.3.2 另一端崩溃并重新启动 254 23.3.3 另一端不可达 254 23.4 小结 255 第24章 TCP的未来和性能 256 24.1 引言 256 24.2 路径MTU发现 256 24.2.1 一个例子 257 24.2.2 大分组还是小分组 258 24.3 长肥管道 259 24.4 窗口扩大选项 262 24.5 时间戳选项 263 24.6 PAWS:防止回绕的序号 265 24.7 T/TCP:为事务用的TCP扩展 265 24.8 TCP的性能 267 24.9 小结 268 第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 277 25.7 一些简单的例子 277 25.7.1 简单变量 278 25.7.2 get-next操作 278 25.7.3 表格的访问 279 25.8 管理信息库(续) 279 25.8.1 system组 279 25.8.2 interface组 280 25.8.3 at组 281 25.8.4 ip组 282 25.8.5 icmp组 285 25.8.6 tcp组 285 25.9 其他一些例子 288 25.9.1 接口MTU 288 25.9.2 路由表 288 25.10 trap 290 25.11 ASN.1和BER 291 25.12 SNMPv2 292 25.13 小结 292 第26章 Telnet和Rlogin:远程登录 293 26.1 引言 293 26.2 Rlogin协议 294 26.2.1 应用进程的启动 295 26.2.2 流量控制 295 26.2.3 客户的中断键 296 26.2.4 窗口大小的改变 296 26.2.5 服务器到客户的命令 296 26.2.6 客户到服务器的命令 297 26.2.7 客户的转义符 298 26.3 Rlogin的例子 298 26.3.1 初始的客户-服务器协议 298 26.3.2 客户中断键 299 26.4 Telnet协议 302 26.4.1 NVT ASCII 302 26.4.2 Telnet命令 302 26.4.3 选项协商 303 26.4.4 子选项协商 304 26.4.5 半双工、一次一字符、一次 一行或行方式 304 26.4.6 同步信号 306 26.4.7 客户的转义符 306 26.5 Telnet举例 306 26.5.1 单字符方式 306 26.5.2 行方式 310 26.5.3 一次一行方式(准行方式) 312 26.5.4 行方式:客户中断键 313 26.6 小结 314 第27章 FTP:文件传送协议 316 27.1 引言 316 27.2 FTP协议 316 27.2.1 数据表示 316 27.2.2 FTP命令 318 27.2.3 FTP应答 319 27.2.4 连接管理 320 27.3 FTP的例子 321 27.3.1 连接管理:临时数据端口 321 27.3.2 连接管理:默认数据端口 323 27.3.3 文本文件传输:NVT ASCII 表示还是图像表示 325 27.3.4 异常中止一个文件的传输: Telnet同步信号 326 27.3.5 匿名FTP 329 27.3.6 来自一个未知IP地址的匿名FTP 330 27.4 小结 331 第28章 SMTP:简单邮件传送协议 332 28.1 引言 332 28.2 SMTP协议 332 28.2.1 简单例子 332 28.2.2 SMTP命令 334 28.2.3 信封、首部和正文 335 28.2.4 中继代理 335 28.2.5 NVT ASCII 337 28.2.6 重试间隔 337 28.3 SMTP的例子 337 28.3.1 MX记录:主机非直接连到 Internet 337 28.3.2 MX记录:主机出故障 339 28.3.3 VRFY和EXPN命令 340 28.4 SMTP的未来 340 28.4.1 信封的变化:扩充的SMTP 341 28.4.2 首部变化:非ASCII字符 342 28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 353 29.5.2 安装协议 353 29.5.3 NFS过程 354 29.5.4 UDP还是TCP 355 29.5.5 TCP上的NFS 355 29.6 NFS实例 356 29.6.1 简单的例子:读一个文件 356 29.6.2 简单的例子:创建一个目录 357 29.6.3 无状态 358 29.6.4 例子:服务器崩溃 358 29.6.5 等幂过程 360 29.7 第3版的NFS 360 29.8 小结 361 第30章 其他的TCP/IP应用程序 363 30.1 引言 363 30.2 Finger协议 363 30.3 Whois协议 364 30.4 Archie、WAIS、Gopher、Veronica 和WWW 366 30.4.1 Archie 366 30.4.2 WAIS 366 30.4.3 Gopher 366 30.4.4 Veronica 366 30.4.5 万维网WWW 367 30.5 X窗口系统 367 30.5.1 Xscope程序 368 30.5.2 LBX: 低带宽X 370 30.6 小结 370 附录A tcpdump程序 371 附录B 计算机时钟 376 附录C sock程序 378 附录D 部分习题的解答 381 附录E 配置选项 395 附录F 可以免费获得的源代码 406 参考文献 409 缩略语 420 目 录 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 源代码表示 1 1.2.1 将拥塞窗口设置为1 1 1.2.2 印刷约定 2 1.3 历史 2 1.4 应用编程接口 3 1.5 程序示例 4 1.6 系统调用和库函数 6 1.7 网络实现概述 6 1.8 描述符 7 1.9 mbuf与输出处理 11 1.9.1 包含插口地址结构的mbuf 11 1.9.2 包含数据的mbuf 12 1.9.3 添加IP和UDP首部 13 1.9.4 IP输出 14 1.9.5 以太网输出 14 1.9.6 UDP输出小结 14 1.10 输入处理 15 1.10.1 以太网输入 15 1.10.2 IP输入 15 1.10.3 UDP输入 16 1.10.4 进程输入 17 1.11 网络实现概述(续) 17 1.12 中断级别与并发 18 1.13 源代码组织 20 1.14 测试网络 21 1.15 小结 22 第2章 mbuf:存储器缓存 24 2.1 引言 24 2.2 代码介绍 27 2.2.1 全局变量 27 2.2.2 统计 28 2.2.3 内核统计 28 2.3 mbuf的定义 29 2.4 mbuf结构 29 2.5 简单的mbuf宏和函数 31 2.5.1 m_get函数 32 2.5.2 MGET宏 32 2.5.3 m_retry函数 33 2.5.4 mbuf锁 34 2.6 m_devget和m_pullup函数 34 2.6.1 m_devget函数 34 2.6.2 mtod和dtom宏 36 2.6.3 m_pullup函数和连续的协议首部 36 2.6.4 m_pullup和IP的分片与重组 37 2.6.5 TCP重组避免调用m_pullup 39 2.6.6 m_pullup使用总结 40 2.7 mbuf宏和函数的小结 40 2.8 Net/3联网数据结构小结 42 2.9 m_copy和簇引用计数 43 2.10 其他选择 47 2.11 小结 47 第3章 接口层 49 3.1 引言 49 3.2 代码介绍 49 3.2.1 全局变量 49 3.2.2 SNMP变量 50 3.3 ifnet结构 51 3.4 ifaddr结构 57 3.5 sockaddr结构 58 3.6 ifnet与ifaddr的专用化 59 3.7 网络初始化概述 60 3.8 以太网初始化 61 3.9 SLIP初始化 64 3.10 环回初始化 65 3.11 if_attach函数 66 3.12 ifinit函数 72 3.13 小结 73 第4章 接口:以太网 74 4.1 引言 74 4.2 代码介绍 75 4.2.1 全局变量 75 4.2.2 统计量 75 4.2.3 SNMP变量 76 4.3 以太网接口 77 4.3.1 leintr函数 79 4.3.2 leread函数 79 4.3.3 ether_input函数 81 4.3.4 ether_output函数 84 4.3.5 lestart函数 87 4.4 ioctl系统调用 89 4.4.1 ifioctl函数 90 4.4.2 ifconf函数 91 4.4.3 举例 94 4.4.4 通用接口ioctl命令 95 4.4.5 if_down和if_up函数 96 4.4.6 以太网、SLIP和环回 97 4.5 小结 98 第5章 接口:SLIP和环回 100 5.1 引言 100 5.2 代码介绍 100 5.2.1 全局变量 100 5.2.2 统计量 101 5.3 SLIP接口 101 5.3.1 SLIP线路规程:SLIPDISC 101 5.3.2 SLIP初始化:slopen和slinit 103 5.3.3 SLIP输入处理:slinput 105 5.3.4 SLIP输出处理:sloutput 109 5.3.5 slstart函数 111 5.3.6 SLIP分组丢失 116 5.3.7 SLIP性能考虑 117 5.3.8 slclose函数 117 5.3.9 sltioctl函数 118 5.4 环回接口 119 5.5 小结 121 第6章 IP编址 123 6.1 引言 123 6.1.1 IP地址 123 6.1.2 IP地址的印刷规定 123 6.1.3 主机和路由器 124 6.2 代码介绍 125 6.3 接口和地址小结 125 6.4 sockaddr_in结构 126 6.5 in_ifaddr结构 127 6.6 地址指派 128 6.6.1 ifioctl函数 130 6.6.2 in_control函数 130 6.6.3 前提条件:SIOCSIFADDR、 SIOCSIFNETMASK和 SIOCSIFDSTADDR 132 6.6.4 地址指派:SIOCSIFADDR 133 6.6.5 in_ifinit函数 133 6.6.6 网络掩码指派:SIOCSIFNETMASK 136 6.6.7 目的地址指派:SIOCSIFDSTADDR 137 6.6.8 获取接口信息 137 6.6.9 每个接口多个IP地址 138 6.6.10 附加IP地址:SIOCAIFADDR 139 6.6.11 删除IP地址:SIOCDIFADDR 140 6.7 接口ioctl处理 141 6.7.1 leioctl函数 141 6.7.2 slioctl函数 142 6.7.3 loioctl函数 143 6.8 Internet实用函数 144 6.9 ifnet实用函数 144 6.10 小结 145 第7章 域和协议 146 7.1 引言 146 7.2 代码介绍 146 7.2.1 全局变量 147 7.2.2 统计量 147 7.3 domain结构 147 7.4 protosw结构 148 7.5 IP 的domain和protosw结构 150 7.6 pffindproto和pffindtype函数 155 7.7 pfctlinput函数 157 7.8 IP初始化 157 7.8.1 Internet传输分用 157 7.8.2 ip_init函数 158 7.9 sysctl系统调用 159 7.10 小结 161 第8章 IP:网际协议 162 8.1 引言 162 8.2 代码介绍 163 8.2.1 全局变量 163 8.2.2 统计量 163 8.2.3 SNMP变量 164 8.3 IP分组 165 8.4 输入处理:ipintr函数 167 8.4.1 ipintr概观 167 8.4.2 验证 168 8.4.3 转发或不转发 171 8.4.4 重装和分用 173 8.5 转发:ip_forward函数 174 8.6 输出处理:ip_output函数 180 8.6.1 首部初始化 181 8.6.2 路由选择 182 8.6.3 源地址选择和分片 184 8.7 Internet检验和:in_cksum函数 186 8.8 setsockopt和getsockopt系统调用 190 8.8.1 PRCO_SETOPT的处理 192 8.8.2 PRCO_GETOPT的处理 193 8.9 ip_sysctl函数 193 8.10 小结 194 第9章 IP选项处理 196 9.1 引言 196 9.2 代码介绍 196 9.2.1 全局变量 196 9.2.2 统计量 197 9.3 选项格式 197 9.4 ip_dooptions函数 198 9.5 记录路由选项 200 9.6 源站和记录路由选项 202 9.6.1 save_rte函数 205 9.6.2 ip_srcroute函数 206 9.7 时间戳选项 207 9.8 ip_insertoptions函数 210 9.9 ip_pcbopts函数 214 9.10 一些限制 217 9.11 小结 217 第10章 IP的分片与重装 218 10.1 引言 218 10.2 代码介绍 219 10.2.1 全局变量 220 10.2.2 统计量 220 10.3 分片 220 10.4 ip_optcopy函数 223 10.5 重装 224 10.6 ip_reass函数 227 10.7 ip_slowtimo函数 237 10.8 小结 238 第11章 ICMP:Internet控制报文协议 239 11.1 引言 239 11.2 代码介绍 242 11.2.1 全局变量 242 11.2.2 统计量 242 11.2.3 SNMP变量 243 11.3 icmp结构 244 11.4 ICMP 的protosw结构 245 11.5 输入处理:icmp_input函数 246 11.6 差错处理 249 11.7 请求处理 251 11.7.1 回显询问:ICMP_ECHO和 ICMP_ECHOREPLY 252 11.7.2 时间戳询问:ICMP_TSTAMP和 ICMP_TSTAMPREPLY 253 11.7.3 地址掩码询问:ICMP_MASKREQ和 ICMP_MASKREPLY 253 11.7.4 信息询问:ICMP_IREQ和ICMP_ IREQREPLY 255 11.7.5 路由器发现:ICMP_ROUTERADVERT 和ICMP_ROUTERSOLICIT 255 11.8 重定向处理 255 11.9 回答处理 257 11.10 输出处理 257 11.11 icmp_error函数 258 11.12 icmp_reflect函数 261 11.13 icmp_send函数 265 11.14 icmp_sysctl函数 266 11.15 小结 266 第12章 IP多播 268 12.1 引言 268 12.2 代码介绍 269 12.2.1 全局变量 270 12.2.2 统计量 270 12.3 以太网多播地址 270 12.4 ether_multi结构 271 12.5 以太网多播接收 273 12.6 in_multi结构 273 12.7 ip_moptions结构 275 12.8 多播的插口选项 276 12.9 多播的TTL值 277 12.9.1 MBONE 278 12.9.2 扩展环搜索 278 12.10 ip_setmoptions函数 278 12.10.1 选择一个明确的多播接口:IP_ MULTICAST_IF 280 12.10.2 选择明确的多播TTL: IP_ MULTICAST_TTL 281 12.10.3 选择多播环回:IP_MULTICAST_ LOOP 281 12.11 加入一个IP多播组 282 12.11.1 in_addmulti函数 285 12.11.2 slioctl和loioctl函数:SIOCADDMULTI和SIOCDELMULTI 287 12.11.3 leioctl函数:SIOCADDMULTI和 SIOCDELMULTI 288 12.11.4 ether_addmulti函数 288 12.12 离开一个IP多播组 291 12.12.1 in_delmulti函数 292 12.12.2 ether_delmulti函数 293 12.13 ip_getmoptions函数 295 12.14 多播输入处理:ipintr函数 296 12.15 多播输出处理:ip_output函数 298 12.16 性能的考虑 301 12.17 小结 301 第13章 IGMP:Internet组管理协议 303 13.1 引言 303 13.2 代码介绍 304 13.2.1 全局变量 304 13.2.2 统计量 304 13.2.3 SNMP变量 305 13.3 igmp结构 305 13.4 IGMP的protosw的结构 306 13.5 加入一个组:igmp_joingroup函数 306 13.6 igmp_fasttimo函数 308 13.7 输入处理:igmp_input函数 311 13.7.1 成员关系查询:IGMP_HOST_ MEMBERSHIP_QUERY 312 13.7.2 成员关系报告:IGMP_HOST_ MEMBERSHIP_REPORT 313 13.8 离开一个组:igmp_leavegroup函数 314 13.9 小结 315 第14章 IP多播选路 316 14.1 引言 316 14.2 代码介绍 316 14.2.1 全局变量 316 14.2.2 统计量 317 14.2.3 SNMP变量 317 14.3 多播输出处理(续) 317 14.4 mrouted守护程序 318 14.5 虚拟接口 321 14.5.1 虚拟接口表 322 14.5.2 add_vif函数 324 14.5.3 del_vif函数 326 14.6 IGMP(续) 327 14.6.1 add_lgrp函数 328 14.6.2 del_lgrp函数 329 14.6.3 grplst_member函数 330 14.7 多播选路 331 14.7.1 多播选路表 334 14.7.2 del_mrt函数 335 14.7.3 add_mrt函数 336 14.7.4 mrtfind函数 337 14.8 多播转发:ip_mforward函数 338 14.8.1 phyint_send函数 343 14.8.2 tunnel_send函数 344 14.9 清理:ip_mrouter_done函数 345 14.10 小结 346 第15章 插口层 348 15.1 引言 348 15.2 代码介绍 349 15.3 socket结构 349 15.4 系统调用 354 15.4.1 举例 355 15.4.2 系统调用小结 355 15.5 进程、描述符和插口 357 15.6 socket系统调用 358 15.6.1 socreate函数 359 15.6.2 超级用户特权 361 15.7 getsock和sockargs函数 361 15.8 bind系统调用 363 15.9 listen系统调用 364 15.10 tsleep和wakeup函数 365 15.11 accept系统调用 366 15.12 sonewconn和soisconnected 函数 369 15.13 connect系统调用 372 15.13.1 soconnect函数 374 15.13.2 切断无连接插口和外部地址的 关联 375 15.14 shutdown系统调用 375 15.15 close系统调用 377 15.15.1 soo_close函数 377 15.15.2 soclose函数 378 15.16 小结 380 第16章 插口I/O 381 16.1 引言 381 16.2 代码介绍 381 16.3 插口缓存 381 16.4 write、writev、sendto和sendmsg 系统调用 384 16.5 sendmsg系统调用 387 16.6 sendit函数 388 16.6.1 uiomove函数 389 16.6.2 举例 390 16.6.3 sendit代码 391 16.7 sosend函数 392 16.7.1 可靠的协议缓存 393 16.7.2 不可靠的协议缓存 393 16.7.3 sosend函数小结 401 16.7.4 性能问题 401 16.8 read、readv、recvfrom和recvmsg 系统调用 401 16.9 recvmsg系统调用 402 16.10 recvit函数 403 16.11 soreceive函数 405 16.11.1 带外数据 406 16.11.2 举例 406 16.11.3 其他的接收操作选项 407 16.11.4 接收缓存的组织:报文边界 407 16.11.5 接收缓存的组织:没有报文边界 408 16.11.6 控制信息和带外数据 409 16.12 soreceive代码 410 16.13 select系统调用 421 16.13.1 selscan函数 425 16.13.2 soo_select函数 425 16.13.3 selrecord函数 427 16.13.4 selwakeup函数 428 16.14 小结 429 第17章 插口选项 431 17.1 引言 431 17.2 代码介绍 431 17.3 setsockopt系统调用 432 17.4 getsockopt系统调用 437 17.5 fcntl和ioctl系统调用 440 17.5.1 fcntl代码 441 17.5.2 ioctl代码 443 17.6 getsockname系统调用 444 17.7 getpeername系统调用 445 17.8 小结 447 第18章 Radix树路由表 448 18.1 引言 448 18.2 路由表结构 448 18.3 选路插口 456 18.4 代码介绍 456 18.4.1 全局变量 458 18.4.2 统计量 458 18.4.3 SNMP变量 459 18.5 Radix结点数据结构 460 18.6 选路结构 463 18.7 初始化:route_init和rtable_init 函数 465 18.8 初始化:rn_init和rn_inithead 函数 468 18.9 重复键和掩码列表 471 18.10 rn_match函数 473 18.11 rn_search函数 480 18.12 小结 481 第19章 选路请求和选路消息 482 19.1 引言 482 19.2 rtalloc和rtalloc1函数 482 19.3 宏RTFREE和rtfree函数 484 19.4 rtrequest函数 486 19.5 rt_setgate函数 491 19.6 rtinit函数 493 19.7 rtredirect函数 495 19.8 选路消息的结构 498 19.9 rt_missmsg函数 501 19.10 rt_ifmsg函数 503 19.11 rt_newaddrmsg函数 504 19.12 rt_msg1函数 505 19.13 rt_msg2函数 507 19.14 sysctl_rtable函数 510 19.15 sysctl_dumpentry函数 514 19.16 sysctl_iflist函数 515 19.17 小结 517 第20章 选路插口 518 20.1 引言 518 20.2 routedomain和protosw结构 518 20.3 选路控制块 519 20.4 raw_init函数 520 20.5 route_output函数 520 20.6 rt_xaddrs函数 530 20.7 rt_setmetrics函数 531 20.8 raw_input函数 532 20.9 route_usrreq函数 534 20.10 raw_usrreq函数 535 20.11 raw_attach、raw_detach和raw_disconnect函数 539 20.12 小结 540 第21章 ARP:地址解析协议 542 21.1 介绍 542 21.2 ARP和路由表 542 21.3 代码介绍 544 21.3.1 全局变量 544 21.3.2 统计量 544 21.3.3 SNMP变量 546 21.4 ARP结构 546 21.5 arpwhohas函数 548 21.6 arprequest函数 548 21.7 arpintr函数 551 21.8 in_arpinput函数 552 21.9 ARP定时器函数 557 21.9.1 arptimer函数 557 21.9.2 arptfree函数 557 21.10 arpresolve函数 558 21.11 arplookup函数 562 21.12 代理ARP 563 21.13 arp_rtrequest函数 564 21.14 ARP和多播 569 21.15 小结 570 第22章 协议控制块 572 22.1 引言 572 22.2 代码介绍 573 22.2.1 全局变量 574 22.2.2 统计量 574 22.3 inpcb的结构 574 22.4 in_pcballoc和in_pcbdetach函数 575 22.5 绑定、连接和分用 577 22.6 in_pcblookup函数 581 22.7 in_pcbbind函数 584 22.8 in_pcbconnect函数 589 22.9 in_pcbdisconnect函数 594 22.10 in_setsockaddr和in_setpeeraddr 函数 595 22.11 in_pcbnotify、in_rtchange和in_losing函数 595 22.11.1 in_rtchange函数 598 22.11.2 重定向和原始插口 599 22.11.3 ICMP差错和UDP插口 600 22.11.4 in_losing函数 601 22.12 实现求精 602 22.13 小结 602 第23章 UDP:用户数据报协议 605 23.1 引言 605 23.2 代码介绍 605 23.2.1 全局变量 606 23.2.2 统计量 606 23.2.3 SNMP变量 607 23.3 UDP 的protosw结构 607 23.4 UDP的首部 608 23.5 udp_init函数 609 23.6 udp_output函数 609 23.6.1 在前面加上IP/UDP首部和mbuf簇 612 23.6.2 UDP检验和计算和伪首部 612 23.7 udp_input函数 616 23.7.1 对收到的UDP数据报的一般确认 616 23.7.2 分用单播数据报 619 23.7.3 分用多播和广播数据报 622 23.7.4 连接上的UDP插口和多接口主机 625 23.8 udp_saveopt函数 625 23.9 udp_ctlinput函数 627 23.10 udp_usrreq函数 628 23.11 udp_sysctl函数 633 23.12 实现求精 633 23.12.1 UDP PCB高速缓存 633 23.12.2 UDP检验和 634 23.13 小结 635 第24章 TCP:传输控制协议 636 24.1 引言 636 24.2 代码介绍 636 24.2.1 全局变量 636 24.2.2 统计量 637 24.2.3 SNMP变量 640 24.3 TCP 的protosw结构 641 24.4 TCP的首部 641 24.5 TCP的控制块 643 24.6 TCP的状态变迁图 645 24.7 TCP的序号 646 24.8 tcp_init函数 650 24.9 小结 652 第25章 TCP的定时器 654 25.1 引言 654 25.2 代码介绍 655 25.3 tcp_canceltimers函数 657 25.4 tcp_fasttimo函数 657 25.5 tcp_slowtimo函数 658 25.6 tcp_timers函数 659 25.6.1 FIN_WAIT_2和2MSL定时器 660 25.6.2 持续定时器 662 25.6.3 连接建立定时器和保活定时器 662 25.7 重传定时器的计算 665 25.8 tcp_newtcpcb算法 666 25.9 tcp_setpersist函数 668 25.10 tcp_xmit_timer函数 669 25.11 重传超时:tcp_timers函数 673 25.11.1 慢起动和避免拥塞 675 25.11.2 精确性 677 25.12 一个RTT的例子 677 25.13 小结 679 第26章 TCP输出 680 26.1 引言 680 26.2 tcp_output概述 680 26.3 决定是否应发送一个报文段 682 26.4 TCP选项 691 26.5 窗口大小选项 692 26.6 时间戳选项 692 26.6.1 哪个时间戳需要回显,RFC1323 算法 694 26.6.2 哪个时间戳需要回显,正确的 算法 695 26.6.3 时间戳与延迟ACK 695 26.7 发送一个报文段 696 26.8 tcp_template函数 707 26.9 tcp_respond函数 708 26.10 小结 710 第27章 TCP的函数 712 27.1 引言 712 27.2 tcp_drain函数 712 27.3 tcp_drop函数 712 27.4 tcp_close函数 713 27.4.1 路由特性 713 27.4.2 资源释放 716 27.5 tcp_mss函数 717 27.6 tcp_ctlinput函数 722 27.7 tcp_notify函数 723 27.8 tcp_quench函数 724 27.9 TCP_REASS宏和tcp_reass函数 724 27.9.1 TCP_REASS宏 725 27.9.2 tcp_reass函数 727 27.10 tcp_trace函数 732 27.11 小结 736 第28章 TCP的输入 737 28.1 引言 737 28.2 预处理 739 28.3 tcp_dooptions函数 745 28.4 首部预测 747 28.5 TCP输入:缓慢的执行路径 752 28.6 完成被动打开或主动打开 752 28.6.1 完成被动打开 753 28.6.2 完成主动打开 756 28.7 PAWS:防止序号回绕 760 28.8 裁剪报文段使数据在窗口内 762 28.9 自连接和同时打开 768 28.10 记录时间戳 770 28.11 RST处理 770 28.12 小结 772 第29章 TCP的输入(续) 773 29.1 引言 773 29.2 ACK处理概述 773 29.3 完成被动打开和同时打开 774 29.4 快速重传和快速恢复的算法 775 29.5 ACK处理 778 29.6 更新窗口信息 784 29.7 紧急方式处理 786 29.8 tcp_pulloutofband函数 788 29.9 处理已接收的数据 789 29.10 FIN处理 791 29.11 最后的处理 793 29.12 实现求精 795 29.13 首部压缩 795 29.13.1 引言 796 29.13.2 首部字段的压缩 799 29.13.3 特殊情况 801 29.13.4 实例 802 29.13.5 配置 803 29.14 小结 803 第30章 TCP的用户需求 805 30.1 引言 805 30.2 tcp_usrreq函数 805 30.3 tcp_attach函数 814 30.4 tcp_disconnect函数 815 30.5 tcp_usrclosed函数 816 30.6 tcp_ctloutput函数 817 30.7 小结 820 第31章 BPF:BSD 分组过滤程序 821 31.1 引言 821 31.2 代码介绍 821 31.2.1 全局变量 821 31.2.2 统计量 822 31.3 bpf_if结构 822 31.4 bpf_d结构 825 31.4.1 bpfopen函数 826 31.4.2 bpfioctl函数 827 31.4.3 bpf_setif函数 830 31.4.4 bpf_attachd函数 831 31.5 BPF的输入 832 31.5.1 bpf_tap函数 832 31.5.2 catchpacket函数 833 31.5.3 bpfread函数 835 31.6 BPF的输出 837 31.7 小结 838 第32章 原始IP 839 32.1 引言 839 32.2 代码介绍 839 32.2.1 全局变量 839 32.2.2 统计量 840 32.3 原始 IP的protosw结构 840 32.4 rip_init函数 842 32.5 rip_input函数 842 32.6 rip_output函数 844 32.7 rip_usrreq函数 846 32.8 rip_ctloutput函数 850 32.9 小结 852 结束语 853 附录A 部分习题的解答 854 附录B 源代码的获取 872 附录C RFC 1122 的有关内容 874 参考文献 895 目 录 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1 1.1 概述 1 1.2 UDP上的客户-服务器 1 1.3 TCP上的客户-服务器 6 1.4 T/TCP上的客户-服务器 12 1.5 测试网络 15 1.6 时间测量程序 15 1.7 应用 17 1.8 历史 19 1.9 实现 20 1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 31 3.3 常规的T/TCP事务 33 3.4 服务器收到过时的重复SYN 34 3.5 服务器重启动 35 3.6 请求或应答超出报文段最大长度MSS 36 3.7 向后兼容性 39 3.8 小结 41 第4章 T/TCP协议(续) 43 4.1 概述 43 4.2 客户的端口号和TIME_WAIT状态 43 4.3 设置TIME_WAIT状态的目的 45 4.4 TIME_WAIT状态的截断 48 4.5 利用TAO跳过三次握手 51 4.6 小结 55 第5章 T/TCP协议的实现:插口层 56 5.1 概述 56 5.2 常量 56 5.3 sosend函数 56 5.4 小结 58 第6章 T/TCP的实现:路由表 59 6.1 概述 59 6.2 代码介绍 59 6.3 radix_node_head结构 60 6.4 rtentry结构 61 6.5 rt_metrics结构 61 6.6 in_inithead函数 61 6.7 in_addroute函数 62 6.8 in_matroute函数 63 6.9 in_clsroute函数 63 6.10 in_rtqtimo函数 64 6.11 in_rtqkill函数 66 6.12 小结 69 第7章 T/TCP实现:协议控制块 70 7.1 概述 70 7.2 in_pcbladdr函数 71 7.3 in_pcbconnect函数 71 7.4 小结 72 第8章 T/TCP实现: TCP概要 73 8.1 概述 73 8.2 代码介绍 73 8.3 TCP的protosw结构 74 8.4 TCP控制块 74 8.5 tcp_init函数 75 8.6 tcp_slowtimo函数 75 8.7 小结 76 第9章 T/TCP实现:TCP输出 77 9.1 概述 77 9.2 tcp_output函数 77 9.2.1 新的自动变量 77 9.2.2 增加隐藏的状态标志 77 9.2.3 在SYN_SENT状态不要重传SYN 78 9.2.4 发送器的糊涂窗口避免机制 78 9.2.5 有RST或SYN标志时强制发送报文段 79 9.2.6 发送MSS选项 80 9.2.7 是否发送时间戳选项 80 9.2.8 发送T/TCP的CC选项 80 9.2.9 根据TCP选项调整数据长度 83 9.3 小结 83 第10章 T/TCP实现:TCP函数 84 10.1 概述 84 10.2 tcp_newtcpcb函数 84 10.3 tcp_rtlookup函数 85 10.4 tcp_gettaocache函数 86 10.5 重传超时间隔的计算 86 10.6 tcp_close函数 89 10.7 tcp_msssend函数 90 10.8 tcp_mssrcvd函数 91 10.9 tcp_dooptions函数 96 10.10 tcp_reass函数 98 10.11 小结 99 第11章 T/TCP实现:TCP输入 101 11.1 概述 101 11.2 预处理 103 11.3 首部预测 104 11.4 被动打开的启动 105 11.5 主动打开的启动 108 11.6 PAWS:防止序号重复 114 11.7 ACK处理 115 11.8 完成被动打开和同时打开 115 11.9 ACK处理(续) 116 11.10 FIN处理 118 11.11 小结 119 第12章 T/TCP实现:TCP用户请求 120 12.1 概述 120 12.2 PRU_CONNECT请求 120 12.3 tcp_connect函数 120 12.4 PRU_SEND和PRU_SEND_EOF请求 124 12.5 tcp_usrclosed函数 125 12.6 tcp_sysctl函数 126 12.7 T/TCP的前景 126 12.8 小结 127 第二部分 TCP的其他应用 第13章 HTTP:超文本传送协议 129 13.1 概述 129 13.2 HTTP和HTML概述 130 13.3 HTTP 132 13.3.1 报文类型:请求与响应 132 13.3.2 首部字段 133 13.3.3 响应代码 133 13.3.4 各种报文头举例 134 13.3.5 例子:客户程序缓存 135 13.3.6 例子:服务器重定向 136 13.4 一个例子 136 13.5 HTTP的统计资料 138 13.6 性能问题 139 13.7 小结 141 第14章 在HTTP服务器上找到的分组 142 14.1 概述 142 14.2 多个HTTP服务器 144 14.3 客户端SYN的到达间隔时间 145 14.4 RTT的测量 149 14.5 用listen设置入连接队列的容量 150 14.6 客户端的SYN选项 154 14.7 客户端的SYN重传 156 14.8 域名 157 14.9 超时的持续探测 157 14.10 T/TCP路由表大小的模拟 160 14.11 mbuf的交互 162 14.12 TCP的PCB高速缓存和首部预测 163 14.13 小结 165 第15章 NNTP:网络新闻传送协议 166 15.1 概述 166 15.2 NNTP 167 15.3 一个简单的新闻客户 170 15.4 一个复杂的新闻客户 171 15.5 NNTP的统计资料 172 15.6 小结 173 第三部分 Unix域协议 第16章 Unix域协议:概述 175 16.1 概述 175 16.2 用途 176 16.3 性能 177 16.4 编码举例 177 16.5 小结 179 第17章 Unix域协议:实现 180 17.1 概述 180 17.2 代码介绍 180 17.3 Unix domain和protosw结构 181 17.4 Unix域插口地址结构 182 17.5 Unix域协议控制块 183 17.6 uipc_usrreq函数 185 17.7 PRU_ATTACH请求和unp_attach函数 186 17.8 PRU_DETACH请求和unp_detach函数 187 17.9 PRU_BIND请求和unp_bind函数 189 17.10 PRU_CONNECT请求和unp_connect 函数 191 17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp_shutdown 函数 205 17.17 PRU_ABORT请求和unp_drop函数 206 17.18 其他各种请求 207 17.19 小结 209 第18章 Unix域协议:I/O和描述符的传递 210 18.1 概述 210 18.2 PRU_SEND和PRU_RCVD请求 210 18.3 描述符的传递 214 18.4 unp_internalize函数 218 18.5 unp_externalize函数 220 18.6 unp_discard函数 221 18.7 unp_dispose函数 222 18.8 unp_scan函数 222 18.9 unp_gc函数 223 18.10 unp_mark函数 230 18.11 性能(再讨论) 231 18.12 小结 231 附录A 测量网络时间 232 附录B 编写T/TCP应用程序 242 参考文献 246 缩略语 251
目录 译者序 前言 第1章  概述 1.1  引言 1.2  分层 1.3  TCP/IP的分层 1.4  互联网的地址 1.5  域名系统 1.6  封装 1.7  分用 1.8  客户-服务器模型 1.9  端口号 1.10  标准化过程 1.11  RFC 1.12  标准的简单服务 1.13  互联网 1.14  实现 1.15  应用编程接口 1.16  测试网络 1.17  小结 第2章  链路层 2.1  引言 2.2  以太网和IEEE 802封装 2.3  尾部封装 2.4  SLIP:串行线路IP 2.5  压缩的SLIP 2.6  PPP:点对点协议 2.7  环回接口 2.8  最大传输单元MTU 2.9  路径MTU 2.10  串行线路吞吐量计算 2.11  小结 第3章  IP:网际协议 3.1  引言 3.2  IP首部 3.3  IP路由选择 3.4  子网寻址 3.5  子网掩码 3.6  特殊情况的IP地址 3.7  一个子网的例子 3.8  ifconfig命令 3.9  netstat命令 3.10  IP的未来 3.11  小结 第4章  ARP:地址解析协议 4.1  引言 4.2  一个例子 4.3  ARP高速缓存 4.4  ARP的分组格式 4.5  ARP举例 4.5.1  一般的例子 4.5.2  对不存在主机的ARP请求 4.5.3  ARP高速缓存超时设置 4.6  ARP代理 4.7  免费ARP 4.8  arp命令 4.9  小结 第5章  RARP:逆地址解析协议 5.1  引言 5.2  RARP的分组格式 5.3  RARP举例 5.4  RARP服务器的设计 5.4.1  作为用户进程的RARP服务器 5.4.2  每个网络有多个RARP服务器 5.5  小结 第6章  ICMP:Internet控制报文协议 6.1  引言 6.2  ICMP报文的类型 6.3  ICMP地址掩码请求与应答 6.4  ICMP时间戳请求与应答 6.4.1  举例 6.4.2  另一种方法 6.5  ICMP端口不可达差错 6.6  ICMP报文的4.4BSD处理 6.7  小结 第7章  Ping程序 7.1  引言 7.2  Ping程序 7.2.1  LAN输出 7.2.2  WAN输出 7.2.3  线路SLIP链接 7.2.4  拨号SLIP链路 7.3  IP记录路由选项 7.3.1  通常的例子 7.3.2  异常的输出 7.4  IP时间戳选项 7.5  小结 第8章  Traceroute程序 8.1  引言 8.2  Traceroute 程序的操作 8.3  局域网输出 8.4  广域网输出 8.5  IP源站选路选项 8.5.1  宽松的源站选路的traceroute 程序示例 8.5.2  严格的源站选路的traceroute 程序示例 8.5.3  宽松的源站选路traceroute程序 的往返路由 8.6  小结 第9章  IP选路 9.1  引言 9.2  选路的原理 9.2.1  简单路由表 9.2.2  初始化路由表 9.2.3  较复杂的路由表 9.2.4  没有到达目的地的路由 9.3  ICMP主机与网络不可达差错 9.4  转发或不转发 9.5  ICMP重定向差错 9.5.1  一个例子 9.5.2  更多的细节 9.6  ICMP路由器发现报文 9.6.1  路由器操作 9.6.2  主机操作 9.6.3  实现 9.7  小结 第10章  动态选路协议 10.1  引言 10.2  动态选路 10.3  Unix选路守护程序 10.4  RIP:选路信息协议 10.4.1  报文格式 10.4.2  正常运行 10.4.3  度量 10.4.4  问题 10.4.5  举例 10.4.6  另一个例子 10.5  RIP版本2 10.6  OSPF:开放最短路径优先 10.7  BGP:边界网关协议 10.8  CIDR:无类型域间选路 10.9  小结 第11章  UDP:用户数据报协议 11.1  引言 11.2  UDP首部 11.3  UDP检验和 11.3.1  tcpdump输出 11.3.2  一些统计结果 11.4  一个简单的例子 11.5  IP分片 11.6  ICMP不可达差错(需要分片) 11.7  用Traceroute确定路径MTU 11.8  采用UDP的路径MTU发现 11.9  UDP和ARP之间的交互作用 11.10  最大UDP数据报长度 11.11  ICMP源站抑制差错 11.12  UDP服务器的设计 11.12.1  客户IP地址及端口号 11.12.2  目标IP地址 11.12.3  UDP输入队列 11.12.4  限制本地IP地址 11.12.5  限制远端IP地址 11.12.6  每个端口有多个接收者 11.13  小结 第12章  广播和多播 12.1  引言 12.2  广播 12.2.1  受限的广播 12.2.2  指向网络的广播 12.2.3  指向子网的广播 12.2.4  指向所有子网的广播 12.3  广播的例子 12.4  多播 12.4.1  多播组地址 12.4.2  多播组地址到以太网地址的转换 12.4.3  FDDI和令牌环网络中的多播 12.5  小结 第13章  IGMP:Internet组管理协议 13.1  引言 13.2  IGMP报文 13.3  IGMP协议 13.3.1  加入一个多播组 13.3.2  IGMP报告和查询 13.3.3  实现细节 13.3.4  生存时间字段 13.3.5  所有主机组 13.4  一个例子 13.5  小结 第14章  DNS:域名系统 14.1  引言 14.2  DNS基础 14.3  DNS的报文格式 14.3.1  DNS查询报文中的问题部分 14.3.2  DNS响应报文中的资源记录部分 14.4  一个简单的例子 14.5  指针查询 14.5.1  举例 14.5.2  主机名检查 14.6  资源记录 14.7  高速缓存 14.8  用UDP还是用TCP 14.9  另一个例子 14.10  小结 第15章  TFTP:简单文件传送协议 15.1  引言 15.2  协议 15.3  一个例子 15.4  安全性 15.5  小结 第16章  BOOTP: 引导程序协议 16.1  引言 16.2  BOOTP的分组格式 16.3  一个例子 16.4  BOOTP服务器的设计 16.5  BOOTP穿越路由器 16.6  特定厂商信息 16.7  小结 第17章  TCP:传输控制协议 17.1  引言 17.2  TCP的服务 17.3  TCP的首部 17.4  小结 第18章  TCP连接的建立与终止 18.1  引言 18.2  连接的建立与终止 18.2.1  tcpdump的输出 18.2.2  时间系列 18.2.3  建立连接协议 18.2.4  连接终止协议 18.2.5  正常的tcpdump输出 18.3  连接建立的超时 18.3.1  第一次超时时间 18.3.2  服务类型字段 18.4  最大报文段长度 18.5  TCP的半关闭 18.6  TCP的状态变迁图 18.6.1  2MSL等待状态 18.6.2  平静时间的概念 18.6.3  FIN_WAIT_2状态 18.7  复位报文段 18.7.1  到不存在的端口的连接请求 18.7.2  异常终止一个连接 18.7.3  检测半打开连接 18.8  同时打开 18.9  同时关闭 18.10  TCP选项 18.11  TCP服务器的设计 18.11.1  TCP服务器端口号 18.11.2  限定的本地IP地址 18.11.3  限定的远端IP地址 18.11.4  呼入连接请求队列 18.12  小结 第19章  TCP的交互数据流 19.1  引言 19.2  交互式输入 19.3  经受时延的确认 19.4  Nagle算法 19.4.1  关闭Nagle算法 19.4.2  一个例子 19.5  窗口大小通告 19.6  小结 第20章  TCP的成块数据流 20.1  引言 20.2  正常数据流 20.3  滑动窗口 20.4  窗口大小 20.5  PUSH标志 20.6  慢启动 20.7  成块数据的吞吐量 20.7.1  带宽时延乘积 20.7.2  拥塞 20.8  紧急方式 20.9  小结 第21章  TCP的超时与重传 21.1  引言 21.2  超时与重传的简单例子 21.3  往返时间测量 21.4  往返时间RTT的例子 21.4.1  往返时间RTT的测量 21.4.2  RTT估计器的计算 21.4.3  慢启动 21.5  拥塞举例 21.6  拥塞避免算法 21.7  快速重传与快速恢复算法 21.8  拥塞举例(续) 21.9  按每条路由进行度量 21.10  ICMP的差错 21.11  重新分组 21.12  小结 第22章  TCP的坚持定时器 22.1  引言 22.2  一个例子 22.3  糊涂窗口综合症 22.4  小结 第23章  TCP的保活定时器 23.1  引言 23.2  描述 23.3  保活举例 23.3.1  另一端崩溃 23.3.2  另一端崩溃并重新启动 23.3.3  另一端不可达 23.4  小结 第24章  TCP的未来和性能 24.1  引言 24.2  路径MTU发现 24.2.1  一个例子 24.2.2  大分组还是小分组 24.3  长肥管道 24.4  窗口扩大选项 24.5  时间戳选项 24.6  PAWS:防止回绕的序号 24.7  T/TCP:为事务用的TCP扩展 24.8  TCP的性能 24.9  小结 第25章  SNMP:简单网络管理协议 25.1  引言 25.2  协议 25.3  管理信息结构 25.4  对象标识符 25.5  管理信息库介绍 25.6  实例标识 25.6.1  简单变量 25.6.2  表格 25.6.3  字典式排序 25.7  一些简单的例子 25.7.1  简单变量 25.7.2  get-next操作 25.7.3  表格的访问 25.8  管理信息库(续) 25.8.1  system组 25.8.2  interface组 25.8.3  at组 25.8.4  ip组 25.8.5  icmp组 25.8.6  tcp组 25.9  其他一些例子 25.9.1  接口MTU 25.9.2  路由表 25.10  trap 25.11  ASN.1和BER 25.12  SNMPv2 25.13  小结 第26章  Telnet和Rlogin:远程登录 26.1  引言 26.2  Rlogin协议 26.2.1  应用进程的启动 26.2.2  流量控制 26.2.3  客户的中断键 26.2.4  窗口大小的改变 26.2.5  服务器到客户的命令 26.2.6  客户到服务器的命令 26.2.7  客户的转义符 26.3  Rlogin的例子 26.3.1  初始的客户-服务器协议 26.3.2  客户中断键 26.4  Telnet协议 26.4.1  NVT ASCII 26.4.2  Telnet命令 26.4.3  选项协商 26.4.4  子选项协商 26.4.5  半双工、一次一字符、一次 一行或行方式 26.4.6  同步信号 26.4.7  客户的转义符 26.5  Telnet举例 26.5.1  单字符方式 26.5.2  行方式 26.5.3  一次一行方式(准行方式) 26.5.4  行方式:客户中断键 26.6  小结 第27章  FTP:文件传送协议 27.1  引言 27.2  FTP协议 27.2.1  数据表示 27.2.2  FTP命令 27.2.3  FTP应答 27.2.4  连接管理 27.3  FTP的例子 27.3.1  连接管理:临时数据端口 27.3.2  连接管理:默认数据端口 27.3.3  文本文件传输:NVT ASCII 表示还是图像表示 27.3.4  异常中止一个文件的传输: Telnet同步信号 27.3.5  匿名FTP 27.3.6  来自一个未知IP地址的匿名FTP 27.4  小结 第28章  SMTP:简单邮件传送协议 28.1  引言 28.2  SMTP协议 28.2.1  简单例子 28.2.2  SMTP命令 28.2.3  信封、首部和正文 28.2.4  中继代理 28.2.5  NVT ASCII 28.2.6  重试间隔 28.3  SMTP的例子 28.3.1  MX记录:主机非直接连到 Internet 28.3.2  MX记录:主机出故障 28.3.3  VRFY和EXPN命令 28.4  SMTP的未来 28.4.1  信封的变化:扩充的SMTP 28.4.2  首部变化:非ASCII字符 28.4.3  正文变化:通用Internet邮件 扩充 28.5  小结 第29章  网络文件系统 29.1  引言 29.2  Sun远程过程调用 29.3  XDR:外部数据表示 29.4  端口映射器 29.5  NFS协议 29.5.1  文件句柄 29.5.2  安装协议 29.5.3  NFS过程 29.5.4  UDP还是TCP 29.5.5  TCP上的NFS 29.6  NFS实例 29.6.1  简单的例子:读一个文件 29.6.2  简单的例子:创建一个目录 29.6.3  无状态 29.6.4  例子:服务器崩溃 29.6.5  等幂过程 29.7  第3版的NFS 29.8  小结 第30章  其他的TCP/IP应用程序 30.1  引言 30.2  Finger协议 30.3  Whois协议 30.4  Archie、WAIS、Gopher、Veronica 和WWW 30.4.1  Archie 30.4.2  WAIS 30.4.3  Gopher 30.4.4  Veronica 30.4.5  万维网WWW 30.5  X窗口系统 30.5.1  Xscope程序 30.5.2  LBX: 低带宽X 30.6  小结 附录A  tcpdump程序 附录B  计算机时钟 附录C  sock程序 附录D  部分习题的解答 附录E  配置选项 附录F  可以免费获得的源代码 参考文献 缩略语
目 录 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 分层 1 1.3 TCP/IP的分层 4 1.4 互联网的地址 5 1.5 域名系统 6 1.6 封装 6 1.7 分用 8 1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU 21 2.10 串行线路吞吐量计算 21 2.11 小结 22 第3章 IP:网际协议 24 3.1 引言 24 3.2 IP首部 24 3.3 IP路由选择 27 3.4 子网寻址 30 3.5 子网掩码 32 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的分组格式 40 4.5 ARP举例 41 4.5.1 一般的例子 41 4.5.2 对不存在主机的ARP请求 42 4.5.3 ARP高速缓存超时设置 43 4.6 ARP代理 43 4.7 免费ARP 45 4.8 arp命令 45 4.9 小结 46 第5章 RARP:逆地址解析协议 47 5.1 引言 47 5.2 RARP的分组格式 47 5.3 RARP举例 47 5.4 RARP服务器的设计 48 5.4.1 作为用户进程的RARP服务器 49 5.4.2 每个网络有多个RARP服务器 49 5.5 小结 49 第6章 ICMP:Internet控制报文协议 50 6.1 引言 50 6.2 ICMP报文的类型 50 6.3 ICMP地址掩码请求与应答 52 6.4 ICMP时间戳请求与应答 53 6.4.1 举例 54 6.4.2 另一种方法 55 6.5 ICMP端口不可达差错 56 6.6 ICMP报文的4.4BSD处理 59 6.7 小结 60 第7章 Ping程序 61 7.1 引言 61 7.2 Ping程序 61 7.2.1 LAN输出 62 7.2.2 WAN输出 63 7.2.3 线路SLIP链接 64 7.2.4 拨号SLIP链路 65 7.3 IP记录路由选项 65 7.3.1 通常的例子 66 7.3.2 异常的输出 68 7.4 IP时间戳选项 69 7.5 小结 70 第8章 Traceroute程序 71 8.1 引言 71 8.2 Traceroute 程序的操作 71 8.3 局域网输出 72 8.4 广域网输出 75 8.5 IP源站选路选项 76 8.5.1 宽松的源站选路的traceroute 程序示例 78 8.5.2 严格的源站选路的traceroute 程序示例 79 8.5.3 宽松的源站选路traceroute程序 的往返路由 80 8.6 小结 81 第9章 IP选路 83 9.1 引言 83 9.2 选路的原理 84 9.2.1 简单路由表 84 9.2.2 初始化路由表 86 9.2.3 较复杂的路由表 87 9.2.4 没有到达目的地的路由 87 9.3 ICMP主机与网络不可达差错 88 9.4 转发或不转发 89 9.5 ICMP重定向差错 89 9.5.1 一个例子 90 9.5.2 更多的细节 91 9.6 ICMP路由器发现报文 92 9.6.1 路由器操作 93 9.6.2 主机操作 93 9.6.3 实现 93 9.7 小结 94 第10章 动态选路协议 95 10.1 引言 95 10.2

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值