一 协议概引
简单的局域网协议模拟(这里只简单模拟“链路层”和“网络层”)
/**
- 1.链路层
- 以太网协议规定,接入网络的设备都必须安装网络适配器,即网卡,数据包必须是从一块网卡传送到另一块网卡。
- 而网卡地址就是数据包的发送地址和接收地址,有了MAC地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,
- 子网内每台主机在接收到这个包以后,都会读取首部里的目标MAC地址,然后和自己的MAC地址进行对比,如果相同就做下一步处理,如果不同,就丢弃这个包。
- 所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。
- 2.网络层
- 2.1IP协议
- 网络层引入了IP协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的IP地址。
- IP协议将这个32位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。
- 如果两个IP地址在同一个子网内,则网络地址一定相同。
- 2.2 ARP协议即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议。
- 其工作原理如下:ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,
- 然后这个数据包会在链路层进行再次包装,生成以太网数据包,
- 最终由以太网广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,
- 然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,
- 以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
- 2.2 路由协议
- 首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的MAC地址,然后以广播的形式向该子网内的主机发送数据包;
- 如果不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。
- 网关是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标IP所在的子网中,然后再通过ARP获取目标机MAC,最终也是通过广播形式将数据包发送给接收方。
- 而完成这个路由协议的物理设备就是路由器,路由器扮演着交通枢纽的角色,它会根据信道情况,选择并设定路由,以最佳路径来转发数据包。
- 所以,网络层的主要工作是定义网络地址、区分网段、子网内MAC寻址、对于不同子网的数据包进行路由。
*/
二 代码
using System;
using System.Collections.Generic;
namespace 网络模拟
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
LuYou luYou = new LuYou("luyou");
Pc p1 = new Pc("p1");
Pc p2 = new Pc("p2");
luYou.insertWangXian(p1);
luYou.insertWangXian(p2);
Console.WriteLine("ip 1 发送数据");
p1.sent("ni hao", 2);
Console.ReadLine();
}
}
public class SheBei {
public SheBei(string mac) {
this.mac = mac;
}
public int ip;
public string mac;
}
public class Pc: SheBei
{
public Pc(string mac):base(mac) {
}
public LuYou luYou;
public void sent(string data, int ip) {
DataBao dataBao = new DataBao();
dataBao.ip = ip;
dataBao.myIp = ip;
dataBao.data = data;
LianluData lianluData = new LianluData();
lianluData.mac = luYou.mac;
lianluData.dataBao = dataBao;
luYou.accept(lianluData);
}
public void accept(LianluData dataBao)
{
if (dataBao.mac == mac) {
Console.WriteLine("ip: "+ip+" 收到数据");
Console.WriteLine(dataBao.dataBao.data);
}
}
}
public class DataBao {
public int ip;
public int myIp;
public string data;
}
public class LianluData
{
public DataBao dataBao;
public string mac;
}
public class YingShe
{
public int ip;
public string mac;
public Pc pc;
}
public class LuYou : SheBei
{
public LuYou(string mac) : base(mac)
{
}
List<YingShe> list = new List<YingShe>();
// 插入网线
public void insertWangXian(Pc pc) {
YingShe yingShe = new YingShe();
yingShe.mac = pc.mac;
pc.ip = yingShe.ip = createIp();
yingShe.pc = pc;
pc.luYou = this;
list.Add(yingShe);
}
public void accept(LianluData dataBao) {
if (dataBao.mac == mac)
{
Pc p = getPcBy(dataBao.dataBao.ip);
dataBao.mac = p.mac;
p.accept(dataBao);
}
}
public Pc getPcBy(int ip) {
foreach (YingShe yingShe in list) {
if (ip == yingShe.ip) {
return yingShe.pc;
}
}
return null;
}
private int createIp() {
int index = 1;
foreach (YingShe yingShe in list) {
if (yingShe.ip >= index) {
index++;
}
}
return index;
}
}
}