两个不同网段的PC直接网线链接,或HUB链接,不用router
下图这中网络结构中,在默认配置下(也就是说A,B,C,D的路由配置为IP设定后的自动厨师配置)
——————默认配置下———————————-
在数据链路层(mac地址)
a,b,c,d是互通的,也就是数据链路层的数据frame发收信,广播之类frame是可以相互到达彼此的mac层,并能被该层协议栈程序正确处理的。
在网络层(如Ping之类ICMP协议等)
A,B可以互通,C,D可以互通,但A,B和C,D之间不能互通的(前提是没有设默认GW)。
——————A ping D的通信详细过程———————————-
比如我们现在想要在A上Ping D。
为什么ping不通呢?
首先来看看ping的详细处理流程。
第一步,在网络层做一个arp数据(源主机A的IP地址和MAC地址都包括在ARP请求中),
然后传递给数据链路层,数据链路层发一个接收mac地址全是111111111的广播
但是此时如果没有目标主机的IP路由信息,arp广播都会被拒绝。所以一开始A和D上就要有能互相通信的路由信息。
第二步,数据链路层相连的机器b,c,d都可以接受到这个来自a的数据链路层广播
然后各个接受到这个广播的pc都会把数据联络层的frame头信息去掉,拿到arp包
接下来,分析arp包里的信息(源IP,目标IP),如果目标IP是自己的话,这里是D,
那么D就 把D的mac地址做成一个arp数据包,然后根据A的IP查询自己的路由表(问题出在这里,初始设置中,D只有自己所属网络的路由信息,没有A网段信息,所以会转向默认GW接口,如果这里连默认GW都没有配的话,就会出问题、)对应的nic接口,然后将arp返回包传递给D的数据链路层,做成一个链路层返回包(目标mac是A),返回给A,此时A就知道了D的mac地址。
第三步,A得到了D的mac地址,那么就开始做一个ping包,然后根据D的IP查询自己A的路由表(问题出在这里,初始设置中,A只有自己所属网络的路由信息,没有D网段信息,所以会转向默认GW接口,如果这里连默认GW都没有配的话,就会出问题)对应的nic接口,然后将ping包传递给A的数据链路层,做成一个链路层ping包,发送到D的mac地址里。
第四步,D得到frame包,拆解后传递给网络层处理,网络层做一个ping返回包,然后根据A的IP查询自己D的路由表(问题出在这里,初始设置中,D只有自己所属网络的路由信息,没有A网段信息,所以会转向默认GW接口,如果这里连默认GW都没有配的话,就会出问题)对应的nic接口,然后将ping应答包传递给D的数据链路层,做成一个链路层ping应答包,发送到A的mac地址里。
第五步,A就可以收到ping应答信息,ping执行结束。
※从上面过程分析可以看出来,不能通信的主要愿意在于,发送数据时不知道往那么nic接口发送。
如果解决了这个问题,就可以把A和D在网络层联通。
解决办法1,正确设置默认GW。把不是本机网段的IP数据包,转发到GW,而这个GW的nic接口就直接连着要通信的对方的机器nic接口。(实测OK)
解决办法2,手动定义路由表。目的也是一样的,指定转发接口。(实测OK)
※由此也可以得出一个结论,路由器就是为了得到下一步要转发到哪个nic接口。如果能解决这个问题,不要路由器也可以在不同网段的PC之间,直接网线链接通信。或者换句话说,本来要用的哪个路由器中的路由信息被通信双方的两个PC分担了。
那为什么同一个网段pc之间的通信,就知道往哪个nic接口发送呢?
那是因为当默认启动后,会把该网段的信息追加到路由表中。从而只要是自己网段的通信,都可以从路由表中找到对应的nic接口。
※或者这么理解:A PC自己是一个网络,然后有一个路由器(只要有路由表就可以理解为一个路由器)镶嵌在A PC内部,B PC自己是另外一个网络,然后有一个路由器镶嵌在B PC内部。然后A B之间通信就是
A→A里的路由器→B里的路由器→B
arpPackage内容如下
バイト | 名前 | 意味 |
---|---|---|
4 | アドレスタイプ | アドレスの方式を表す |
2 | アドレス長 | アドレスの長さを示す |
2 | オペレーションコード | 要求か応答かを示す |
6 | 送信元MACアドレス | 送信元のMACアドレス |
4 | 送信元IPアドレス | 送信元のIPアドレス |
6 | 宛先MACアドレス | 宛先のMACアドレス |
4 | 宛先IPアドレス | 宛先のIPアドレス |
——————————————————————-
「サブネットマスクが正しくないと通信できない」は本当か?
http://ascii.jp/elem/000/000/562/562310/
「サブネットマスクが正しくないと通信できない」というよりも、「サブネットマスクが異なっていても、算出されるネットワークアドレスが同じなら通信は成立する」のが正解である。
サブネットマスクの役割を簡単にいうと、自分がどのネットワークに所属するかの判断材料である。IPのやり取りは、同じネットワーク内のコンピュータとは「直接通信」、異なるネットワークに所属するコンピュータとはルータを使った「間接通信」になる。サブネットマスクは、通信する相手が自分と同じネットワークに所属するか、異なるネットワークに所属するかを決める重要な設定項目なのだ。
初期のTCP/IPにはサブネットの概念はなく、当然「サブネットマスク」の設定もなかった。IPアドレスにはクラスA~クラスCの分類しかなく、しかもIPアドレスを見れば、ネットワークアドレスを判断できたからだ。
そこでネットワークを分割する「サブネット」の概念が生まれた。
サブネットは、ホスト部の一部をネットワーク部とみなして、あるIPアドレスの範囲に収容できるネットワークの数を増やすことだ。
たとえば、クラスCのネットワークである「192.168.0.0」にはネットワークを1つしか収容できないが、ネットワークを分割すれば、もっとたくさんのネットワークを収容できる。
ネットワークをサブネットに分割すると、サブネット同士の直接通信はできなくなる。IPでは、異なるネットワーク間の通信はルータが中継するからだ。そこで、あるパケットを送信元から宛先に直接送信するか、ルータに中継してもらうかを判断するときにサブネットマスクを使う。
サブネット同士の直接通信
異なるサブネット間での通信について
異なるサブネットのIPアドレス、たとえば
192.168.1.1/24と192.168.10.1/29の
この二つのIPアドレスで通信を行うことは可能でしょうか。
また可能な場合、ルータにはどのような設定を入れることで
通信ができるようになるのでしょうか。
どなたかお詳しい方ご教授の程お願いいたします。
できると言えばできるしできないと言えばできません。
まずそれらの端末がデフォルト状態の同じスイッチに接続された場合はできません。何故かと言えば物理的に同じ機器に収容されていたとしても端末同士はお互いのアドレスが自分と同じセグメントにないと認識するため、通信を行おうとするとデフォゲにパケットを送るからです。一つのセグメントに複数のセグメントは同居できないため通信はできません。
次に1つ以上のルータを経由する場合は可能です。ルータが一つだった場合192.168.1.0/24と192.168.10.0/29のセグメントを持たせればいいだけです。これらはルータから見ると直接接続されたセグメントのため特にルーティングは必要ありません。ただ端末には当然ですがデフォゲの設定が必要になります。
あと複数のルータを経由する場合には当然ルーティングは必要です。
サブネットマスクとゲートウェイ
http://www5e.biglobe.ne.jp/~aji/3min/ex/sup02.html
http://www5e.biglobe.ne.jp/~aji/3min/ex/sup25.html
「ルータがなくても別サブネットと通信する」方法は、直接宛先とつながっている場合のみ
- 宛先IPアドレスがアプリケーションの指示により決定
- ルーティングテーブルを参照。宛先IPアドレスとロンゲストマッチにより、送信インタフェース、ゲートウェイ決定—–到此为止是router在起作用,往后的几步已经和router无关了。
- 送信元IPアドレスを送信インタフェースのIPアドレスに
- ARPキャッシュ参照。宛先MACアドレスの入手
- ARPエントリ検索
- ゲートウェイがない(自分自身)の場合、宛先IPアドレスのARPエントリを検索
- ゲートウェイがある場合、ゲートウェイのIPアドレスのARPエントリを検索
- ARPエントリがないならばARP実行
- ゲートウェイがない(自分自身)の場合、宛先IPアドレスでARPリクエスト
- ゲートウェイがある場合、ゲートウェイのIPアドレスのARPリクエスト
- ARPエントリ検索
- 送信インタフェースのMACアドレスを送信元MACアドレスに
- 送信インタフェースからフレーム送信(CSMA/CDまたは全二重イーサネットによる制御)
ルータは別サブネットと通信するためには必要ない,
つまり「世界が1つのブロードキャストドメイン上にあれば、ルータは存在しなくてもよい」
つまりルータの役割とは「ブロードキャストドメインを分割したうえでネットワークをつなぐ」。