my blog my blog

Tag: DNS
一个网络数据包的故事——理顺下网络数据包的传输(三)

 

接续接着上节“ 二.怎么找到你?” ,奶牛继续来说说这个网络数据包滴故事的第三节:你等着,我来了。

三.你等着,我来了。

这节呢,就是一个传输的过程,涉及比较多的就是网络层跟运输层的一些东东。其实前几天打算自己理顺下计算机网络是有原因滴,看鸟哥讲述的网络那部分有一些迷惑,主要是对于NAT问题的理解。这节我们将把自己藏身在一个最隐蔽的角落来讲述这个故事,我们是一个内网滴小主机,什么是内网呢,呃,就是说你没有public ip address,所以你没法直接在互联网上进行通信。那么怎么办哇,你可以走你的网关哇,那这个网关又是什么哩?我们这里就笼统滴把它当个路由器吧。路由器是在物理层、网络层、运输层上的东西,也就是说,我们发一个数据包出去的时候,除了具体的data内容不会被修改,其它滴很多东西都是重新封包处理滴。好啦,下面我们就一层层滴来解释。

首先第一个过程是判断我们的目的地址是不是内网的ip,如果是,直接ARP后直接用硬件地址通信(我们本来就没打算再继续这个过程,比较容易理解,只是提一下),如果不是哩,那么我们就会把这个数据包交给我们的路由器。这时候路由器有了这个数据包(仍旧以TCP为例),路由的NAT会自动将其中的源地址与源端口还有源mac(source ip && source port)地址都更新成为路由器自己的硬件地址,IP地址跟端口(路由器公网的IP跟端口),并且在NAT转换表中添加一条记录,这里记录的是路由器更新的内容以及目标主机的信息(目标IP跟目标端口)。这个就是NAT工作的一个很重要的作用,它将我们内网的主机完全隐藏在了自己的身下,然后把自己作为一个外交官,与外界进行通信。然后路由器将数据包运输到公网IP所在滴网络,再进行对目的主机的查找,如果没找到就继续往上一层网关传递数据包,直至找到目标主机,并将数据包传递上去。这里奶牛说的很简单,不想让大家很混乱,所以很多细节都避而不谈了,一般也不需要知道。

当目标主机发回数据的时候,目标ip跟端口就是我们第一层公网路由器的ip跟端口,因为那个ip跟端口已经可以定位一台主机了,所以那些在网络传输的过程中是不会变化的,唯一变化滴是mac地址,这里我们说下,数据包传递过程中mac地址是逐层变化的,一般就是本机的mac与上层网关的mac会每次都被修改,因为这个是硬件通信的要求,但是网络层跟运输层在公网的传递是不变的,直到数据又回到了我们的保护伞第一层路由器。这时候路由器看到:哦?终于等待的数据回来了。(因为我们刚才记录在NAT转换表中了目标ip跟目标端口哇,所以这里我们可以知道是我们想要的数据咯),然后我们要把这些数据换个头发回给我们的内网主机,这时候目标ip跟端口信息被更换为内网主机的ip跟端口,又发回给了内网主机,这时候内网主机就得到了自己需要的信息。

有何为证这就是我们想要的信息呢?1.因为我们在内网,所以这些数据包肯定发来时候的mac是网关的,直接arp就可以查到,你看看是不是。2.仍旧是那个ip跟端口哇,你看看是不是你要的不就是到了哇,汗一下。这里奶牛截取一下自己的通信包的一些信息给大家看下,增强下印象:

首先我们发送一个数据包的信息是:

  1. 源主机:192.168.1.100 
  2. 目标主机:220.181.111.147 
  3. 协议:TCP 
  4. Source port: 63516 (63516) 
  5. Source: QuantaCo_60:44:f1 (00:26:9e:60:44:f1) 
  6. Destination port: http (80) 
  7. Destination: Tp-LinkT_23:d7:9a (94:0c:6d:23:d7:9a) 

我们接收到的数据包的信息是:

  1. 目标主机:192.168.1.100  
  2. 源主机:220.181.111.147  
  3. 协议:TCP  
  4. Source port: http (80) 
  5. Source: Tp-LinkT_23:d7:9a (94:0c:6d:23:d7:9a) 
  6. Destination port: 63516 (63516) 
  7. Destination: QuantaCo_60:44:f1 (00:26:9e:60:44:f1) 

好吧,故事就讲到这里吧,如果朋友们看着还是乱,那就自己看下《计算机网络:自顶向下方法》这本书吧,写得很好,细致容易理解,作为入门书籍相当棒。

一个网络数据包的故事——理顺下网络数据包的传输(二)

 

接续接着上节“ 一.我在哪里?你又在哪里?” ,奶牛继续来说说这个网络数据包滴故事。

二.怎么找到你?

你可能会疑问,上一节我们不是说了你在哪里哇,那还用找哇?当然,我们这节就是要弄清楚我是怎么知道的你在哪里。

关键词:ARP DNS

先来说ARP

  1. ARP(address resolution protocol):地址解析协议是获取物理地址的一个TCP/IP协议。
  2. 某节点的IP地址的ARP请求被广播到网络上后,这个节点会收到确认其物理地址的应答,这样的数据包才能被传送出去。 

那ARP解析的究竟是什么呢?让我们看一下:

  1. arp -a 
  2.  
  3. 接口: 192.168.1.100 --- 0xb 
  4.   Internet 地址         物理地址              类型 
  5.   192.168.1.1           94-0c-6d-23-d7-9a     动态 
  6.   192.168.1.255         ff-ff-ff-ff-ff-ff     静态 

奶牛查询了下本地的arp,我们可以看到,奶牛是在路由器的环境下,网关就是IP:192.168.1.1,它的硬件mac地址是94-0c-6d-23-d7-9a ,这记录在我们的arp表中,而192.168.1.255就是广播地址啦,如果我们的路由器下还有一台机器的IP是192.168.1.2,如果我们知道它就是我们的目标,我们就要把数据包发送给它,那么我们就需要首先利用ARP来查询到192.168.1.2的硬件MAC地址,然后将这个地址封在我们的以太网帧中,这样子才能把数据通过硬件发送出去,因为最终归结到最后,所有数据包还是要通过硬件来完成传送的。

再来说说DNS

  1. DNS(Domain Name System)是域名系统的缩写
  2. 它是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库
  3. 能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。  

从定义来看,DNS就是将IP与域名进行互相映射,我们可以通过dns查找一个域名对应的IP,也可以通过IP查找这个IP下的域名。对于域名,我们这里也来说一下,域名是指abc.com  nenew.net或相类似形式的名称,而www.abc.com  www.nenew.net只是一个子域名,跟blog.nenew.net哇wiki.nenew.net哇是同等地位的。当然子域跟IP也是对应的。

  1. nslookup nenew.net 8.8.8.8 
  2. 服务器:  google-public-dns-a.google.com 
  3. Address:  8.8.8.8 
  4. 非权威应答: 
  5. 名称:    nenew.net 
  6. Address:  65.49.24.75 

用nslookup命令来查询nenew.net的IP地址,可以得到奶牛现在用的服务器的IP,当然,这里跟我们说的数据包的故事有些远了,我们继续绕回去,有了域名,我们就不用去记忆一整串的IP地址了,因此,如果你想与一台服务器进行通信,传送数据包,有时候也会用到DNS来帮助我们解析出目标的IP,这样子我们就知道了IP包中的目标地址了。

对于TCP或者UDP的表头中的目标端口,我们一般还是以默认的知道的情况下才好进行数据包的传送,比如我们要浏览一个网页,那么默认的端口一般就是80,这个是公认的,小于1024的端口一般都被赋予了相应的功能跟意义,虽然我们也可以手动进行修改,但是很多东西是约定俗成的。

综合一下上面:

以太网帧的表头中的目的地址是mac硬件地址,使用arp将目标IP解析成硬件地址

IP数据包的表头中的目的地址是IP,这个IP可以是我们事先知道的,也可以是通过DNS查询得到的。

TCP包的表头中的目的端口是目标的端口号,一般是默认定义好的(比如web的80端口ftp的21端口)也可以是事先知道的。

通过这三点,我们就可以确定出你在哪里,并且知道我是怎么找到你的。

数据包的故事继续,下节继续说数据包的传输过程:你等着,我来了。

Ubuntu等Linux系统清除DNS缓存的方法

 

昨天介绍了从windows系统下如何清除DNS缓存,今天也来说说linux的。

奶牛并没有做测试,系统还没有装起来,呃,还木有从上次的分区表丢失中完全恢复过来,所以也没抽时间装系统。

这个也不碍事,直接说方法:

如果系统下有nscd,那么就直接

sudo /etc/init.d/nscd restart

如果没有也没关系,网上接受的方法大都是

sudo aptitude install nscd
sudo /etc/init.d/nscd restart 

其实我们也可以直接

sudo /etc/init.d/dns-clean start

来完成的。

本文参考了文章Ubuntu 清空本地 DNS 命令

Windows下清除DNS缓存

 

不知道朋友们是否遇到过这种情况,当你在多个接入Internet的方式中转换的时候,本来可以访问的网页却突然无法访问了,ping下网址会提示线路故障无法访问。奶牛就遇到了,挺囧的,因为奶牛是教育网,下载自己网站备份的时候速度只有10K左右,下载一个备份要一个多小时,所以就用临宿舍的无线,但是链接上无线就提示无法访问,当然,无法访问只是一个表现,实际上是缓存的DNS信息让系统无法到达我们的网址。那么怎么解决呢?注销重启?其实不需要,只要一条简单的dos命令就可以解决问题的。

进入CMD输入ipconfig /flushdns回车后提示清除成功。ok搞定,看看是不是网站可以正常访问了。