互联网协议入门

互联网协议入门(一) http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

互联网协议入门(二) http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html

 

1.  5层模型

 

"实体层",它就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。

  

 

"链接层"的功能,它在"实体层"的上方,确定了0和1的分组方式。

 

以太网帧结构 http://www.cnblogs.com/mylinux/p/5553242.html

IP数据包结构 http://www.cnblogs.com/mylinux/p/3988928.html

TCP数据包结构  http://www.cnblogs.com/mylinux/p/5552738.html

 

2. ARP协议: 从IP地址得到MAC地址。

因为IP数据包是放在以太网数据包里发送的,所以我们必须同时知道两个地址,一个是对方的MAC地址,另一个是对方的IP地址。通常情况下,对方的IP地址是已知的(后文会解释),但是我们不知道它的MAC地址。

 

第一种情况,如果两台主机不在同一个子网络,那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的"网关"(gateway),让网关去处理。

第二种情况,如果两台主机在同一个子网络,那么我们可以用ARP协议,得到对方的MAC地址。ARP协议也是发出一个数据包(包含在以太网数据包 中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网 络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃 这个包。

总之,有了ARP协议之后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。

3. DHCP协议

首先,它是一种应用层协议,建立在UDP协议之上,所以整个数据包是这样的:

  (1)最前面的"以太网标头",设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。

  (2)后面的"IP标头",设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。

  (3)最后的"UDP标头",设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。

这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF- FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是 0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道"这个包是发给我的",而其他计算机就可以丢弃这个包。

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个"DHCP响应"数据包。这个响应包的结构也是类似的,以太网标头的 MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是 67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数。

 

4. 上网设置:小结

这个部分,需要记住的就是一点:不管是"静态IP地址"还是"动态IP地址",电脑上网的首要步骤,是确定四个参数。这四个值很重要,值得重复一遍:

  * 本机的IP地址
  * 子网掩码
  * 网关的IP地址
  * DNS的IP地址

有了这几个数值,电脑就可以上网"冲浪"了。

5. DNS 原理入门 http://www.ruanyifeng.com/blog/

DNS服务器的IP地址,有可能是动态的,每次上网时由网关分配,这叫做DHCP机制;也有可能是事先指定的固定地址。Linux系统里面,DNS服务器的IP地址保存在/etc/resolv.conf文件。

5.1 工具软件dig可以显示整个DNS查询过程。

    
$ dig math.stackexchange.com
dig命令的+trace参数可以显示DNS的整个分级查询过程。
    $ dig +trace math.stackexchange.com
dig命令可以单独查看每一级域名的NS记录。
    $ dig ns com
    $ dig ns stackexchange.com
+short参数可以显示简化的结果。
    $ dig +short ns com
    $ dig +short ns stackexchange.com

 

5.2 域名的层级


DNS服务器怎么会知道每个域名的IP地址呢?答案是分级查询。
请仔细dig的结果,每个域名的尾部都多了一个点。

比如,域名math.stackexchange.com显示为math.stackexchange.com.。这不是疏忽,而是所有域名的尾部,实际上都有一个根域名。

举例来说,www.example.com真正的域名是www.example.com.root,简写为www.example.com.。因为,根域名.root对于所有域名都是一样的,所以平时是省略的。

根域名的下一级,叫做"顶级域名"(top-level domain,缩写为TLD),比如.com、.net;再下一级叫做"次级域名"(second-level domain,缩写为SLD),比如www.example.com里面的.example,这一级域名是用户可以注册的;再下一级是主机名(host),比如www.example.com里面的www,又称为"三级域名",这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。

总结一下,域名的层级结构如下。

主机名.次级域名.顶级域名.根域名 # 即 host.sld.tld.root

  DNS服务器根据域名的层级,进行分级查询。

所谓"分级查询",就是从根域名开始,依次查询每一级域名的NS记录,直到查到最终的IP地址,过程大致如下。

    1. 从"根域名服务器"查到"顶级域名服务器"的NS记录和A记录(IP地址)

    2. 从"顶级域名服务器"查到"次级域名服务器"的NS记录和A记录(IP地址)

    3. 从"次级域名服务器"查出"主机名"的IP地址

仔细看上面的过程,你可能发现了,没有提到DNS服务器怎么知道"根域名服务器"的IP地址。回答是"根域名服务器"的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面。

 

5.3 其他DNS工具


除了dig,还有一些其他小工具也可以使用。
(1)host 命令
host命令可以看作dig命令的简化版本,返回当前请求域名的各种记录。
    $ host github.com
    github.com has address 192.30.252.121
    github.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM.
    github.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.COM.
    github.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.COM.
    github.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM.
    github.com mail is handled by 1 ASPMX.L.GOOGLE.COM.

    $ host facebook.github.com

    facebook.github.com is an alias for github.map.fastly.net.
    github.map.fastly.net has address 103.245.222.133

host命令也可以用于逆向查询,即从IP地址查询域名,等同于dig -x <ip>。
    $ host 192.30.252.153
    153.252.30.192.in-addr.arpa domain name pointer pages.github.com.

(2)nslookup 命令
nslookup命令用于互动式地查询域名记录。
    $ nslookup
    > facebook.github.io
    Server:     192.168.1.253
    Address:    192.168.1.253#53

    Non-authoritative answer:
    facebook.github.io  canonical name = github.map.fastly.net.
    Name:   github.map.fastly.net
    Address: 103.245.222.133
    >

(3)whois 命令
whois命令用来查看域名的注册情况。
    $ whois github.com

原文地址:https://www.cnblogs.com/mylinux/p/5603044.html