有了网卡(硬件)的支持,还得有软件的支持。网卡负责跟外面的世界沟通,但是沟通回来的所有资料都是一堆堆的,他不负责完美的展现给你看。这个时候操作系统程序会对获取回来的资料进行精心的整理,排列好输送到电脑屏幕。这样你最后获得的就是规则整齐的东西。操作系统有着极其发杂的程序从QQ啊,浏览器等软件接收你的请求,通过网卡发送出去,然后再通过网卡返回整理并展现你想要东西。
假设你的名字叫小甲,你住在院子甲里,你有很多的邻居小伙伴——X,X...,在门口传达室还有个看门的甲大爷,甲大爷就是你的网关。当你想跟院子里的小伙伴玩时,只要你在院子里大喊一声他的名字,他听到了就会回应你,并且跑出来跟你玩。
但是你不被允许走出大门,你想与外界发生的一切联系,都必须由门口的甲大爷(网关)用电话帮你联系。假如你想找你的同学小乙聊天,小乙家住在院子乙里,院子乙里也有一个看门的乙大爷(小乙的网关)。但是你不知道小乙家的电话号码,不过你的班主任老师有一份你们班全体同学的名单和电话号码对照表,你的老师就是你的DNS服务器。于是你在家里拨通了门口甲大爷的电话,有了下面的对话:
->小甲:甲大爷,我想找班主任查一下小乙的电话号码吗?
->甲大爷:好,你等着。(接着甲大爷给你的班主任打了一个电话,问清楚了小乙的电话)问到了,他家的电话号码是211.99.99.99。
->小甲:太好了!甲大爷,我想找小乙,你再帮我联系一下小乙。
->甲大爷:没问题。(接着甲大爷向电话局发出了请求接通了小乙家电话的请求,最后一关当然是被接到了小乙家那个院子的乙大爷那里,然后乙大爷把电话给转到小乙家)就这样甲和小乙取得了联系。
至于DHCP服务器吗,可以这样比喻:你家院子里的居民越来越多了,传达室甲大爷那里的电话交换机已经不能满足这么多居民的需求了,所以只好采用了一种新技术叫做DHCP,居民开机的时候随机得到一个话号码,每一次得到的号码都可能会不同。
网关:你家门口的甲大爷就是你的网关。
DNS服务器:你的班主任就是你的DNS服务器。
DHCP服务器:甲大爷传达室的电话交换机就是你的DHCP服务器。
路由:甲大爷和乙大爷之间的对话就叫做路由。
另:
如果你还有个小朋友叫小丙,他住的院子看门的是丙大爷,因为小丙住的院子刚盖好,丙大爷刚来不久,他没有甲大爷和乙大爷办公室的电话,甲大爷和乙大爷自然也没有丙大爷的电话。这时可以用两种办法解决:
居委会的赵大妈告诉了丙大爷关于甲,乙二位大爷的电话,同时赵大妈也告诉了甲,乙关于丙的电话。这叫做静态设定路由。
赵大妈病了,丙大爷自己到处打电话,见人就说:“我是小丙他们院子管电话的”,结果被甲,乙二位听到了,于是就记在了他们的通讯录上,然后甲,乙就给丙回了个电话说:“我是小甲他们院子管电话的”,这就叫做动态设定路由。
然后有一天小甲要找小丙,结果自然是小甲给甲大爷打电话说:“甲大爷,我要找小丙”,于是甲大爷一找通讯录:“哦,小丙的院子电话是丙大爷管着的,要找小丙自然先要通知丙大爷,我可以通知乙大爷让他去找丙大爷,也可以自己直接找丙,那当然是自己直接找快了",于是甲大爷给丙大爷打了电话,然后丙大爷又把电话转到了小丙家。这里,甲大爷的通讯录叫做路由表。甲大爷选择是自己直接找丙大爷还是让乙大爷帮忙转接叫做路由选择。
甲大爷之所以直接找丙大爷是有依据的,因为它直接找丙大爷就能一步到位,如果要找乙大爷转接就需要两步才能完成,这里的“步”叫做“跳数”,甲大爷的选择遵循的是最小跳数原则(如果不遵循这个原则,小甲可能就要多等些时间才能找到小丙,最终结果可能导致甲大爷因为工作不力被炒鱿鱼,这叫做“延时太长,选路原则不合理,换了一个路由器”)。
事情总是有变化的,小甲和小乙吵架了,这些天小甲老是给小丙打电话,小乙心想:“他是不是在说起坏话啊?”于是小乙决定偷听小甲和小丙的通话,但是他又不能出院子,怎么办呢?小乙做了这样一个决定:首先他告诉自己院子里管电话的乙大爷说:“你给甲大爷打个电话说小丙搬到咱们院子了,以后凡是打给他的电话我来接”,乙大爷没有反应过来(毕竟年纪大了)就给甲大爷打了电话,说:“现在我来管理小丙的电话了,丙大爷已经不管了”,结果甲大爷就把他的通讯录改了,这叫做路由欺骗。以后小甲再找小丙,甲大爷就转给乙大爷了(其实应该转给丙大爷的),乙大爷收到了这个电话就转给小乙(因为他之前已经和小乙说好了),小乙收到电话就假装小丙和小甲通话。因为小乙做贼心虚,害怕明天小甲和小丙见面后当面问他,于是通信断了之后,又自己以小甲的名义给小丙通了个电话复述了一遍刚才的话,这就叫做数据窃听。
再后来,小甲还是不断和小丙联系,而冷落了小乙,小乙心里嘀咕啊:“我不能总是这样以小丙的身份和小甲通信啊,万一有一天露馅了怎么办?”于是他想了一个更阴险的招数:“干脆我也不偷听你们电话了,你小甲不是不给我打电话吗!那我让你给小丙也打不了,哼哼!”他怎么做呢,我们来看:他联系了一批狐朋狗友,和他们串通好,每天固定一个时间大家一起给院子丙打电话,内容什么都有,只要传达室的丙爷爷接电话,就会听到“打雷啦,下雨收衣服啊!”、“人是人他妈生的,妖是妖他妈生的”、“你妈贵姓”等等,听的脑袋都大了,不听又不行,电话不停的响啊!终于有一天,丙爷爷忍不住了,大喊一声:“我受不了啦!!!”,于是上吊自杀了!这就是最简单的DDOS攻击,丙爷爷心理承受能力弱的现象叫做“数据处理模块有BUG”,丙爷爷的自杀叫做“路由器瘫痪”。 如果是我,就会微笑着和他们拉家常,例如告诉他们“我早就听了天气预报,衣服10分钟前已经收好了”或者“那你妈是人还是妖”或者“和你奶奶一个姓”等等,我这种健全的心理叫做“健壮的数据报处理,能够抵御任何攻击”。丙爷爷自杀之后,小甲终于不再给小丙打电话了,因为无论他怎么打对方都是忙音,这种现象叫做“拒绝服务”,所以小乙的做法还有一个名字叫做“拒绝服务攻击”。小乙终于安静了几天,...
几天后,小乙的院子来了一个美丽的女孩,名字叫做小丽,小乙很喜欢她(小小年纪玩什么早恋!)可是小丽有个很帅的男朋友,小乙干瞪眼没办法。当然这里还是要遵循上面的原则:小丽是不能出院子的。那个男的想泡小丽自然只能打电话,于是小乙又蠢蠢欲动了:还记得乙大爷是院子的电话总管吗?他之所以能管理电话是因为他有一个通讯录,因为同一个院子可能有2个孩子都叫小乙,靠名字无法区分,所以通讯录上每一行只有两项:
门牌 电话
一号门 1234567 (这个是小乙的)
二号门 7654321 (这个是小丽的)
......
乙大爷记性不好,但这总不会错了吧(同一个院子不会有2个“二号门”吧)?每次打电话人家都要说出要找的电话号码,然后通过通讯录去院子里面敲门,比如人家说我找“1234567”,于是乙大爷一比较,哦,是一号门的,他就去敲一号门“听电话”,如果是找“7654321”,那他就找二号门“听电话”。这里的电话号码就是传说中的“IP地址”。这里的门牌号就是传说中的网卡的“MAC地址”(每一块网卡的MAC地址都是不一样的,这是网卡的制造商写死在网卡的芯片中的)小乙心里想“奶奶的,老子泡不到你也别想泡”,于是他打起了乙大爷通讯录的主意,经过细心的观察,周密的准备,他终于发现乙大爷有尿频的毛病(毕竟是老人啊...),终于在一个月黑风高的白天,乙大爷去上厕所了,小明偷偷的摸进传达室,小心翼翼的改了乙大爷的通讯录......
过了几天,小丽的男朋友又给小丽打来了电话,对方报的电话是“7654321”,乙大爷一看通讯录,靠,名字无法区分,所以通讯录上每一行只有两项:
门牌 电话
一号门 1234567 (这个是小乙的)
一号门 7654321 (注意:这个原来是小丽的,但是被小乙改了)
......
乙大爷不知道改了啊,于是就去找一号门的小乙了,小乙心里这个美啊,他以小丽父亲的口吻严厉的教训了那个男的和小丽之间不正当的男女关系,结果那个男的恭恭敬敬的挂了电话。当然小丽并不知道整个事情的发生...这里小乙的行为叫做“ARP欺骗”(因为在实际的网络上是通过发送ARP数据包来实现的,所以叫做“ARP欺骗”),乙大爷的通讯录叫做“ARP表”这里要注意:乙大爷现在有两个通讯录了,一个是记录每个院子传达室电话的本本,叫做“路由表”,一个是现在说的记录院子里面详细信息的本本,叫做“ARP表”。有句名言是“人们总是在追求完美的,尽管永远也做不到”(请记住这句话,因为这是一个大名人--也就是我,说的)乙大爷的制度中有一条是这么写的“每个月要重新检查一下门牌号和电话的对应本(也就是ARP表)”,这个动作叫做“刷新ARP表”,每个月的时间限制叫做“刷新ARP表的周期”。这样小乙了让那个男的永远不能找到小丽,之后每个月都要偷偷改一次那个通讯录,不过这样也是不得不做的事啊!
补充一点,小乙是很聪明的,如果通讯录(ARP表)被改成了这样:
门牌(MAC) 电话(IP)
一号门 1234567 (这个是小乙的)
二号门 1234567 (注意:这个被小乙改了,但是他一时头晕改错了)
......
就会使计算机就会弹出一个对话框提示“出现重复的IP地址”,最终会导致王爷爷不知所措,于是通知一号门和二号门,你们的电话重复了。这样小丽就知道有人在破坏她的好事,这个现象叫做“骗局被揭穿了”。
过了几天,小甲知道了小乙偷听他和小丙的电话,于是就和小丙约定好了密码。小甲在家里把要说的加密了之后告诉小丙。土豆-〉星期三,地瓜-〉请客,笨蛋-〉小甲家。于是小甲告诉小丙:土豆笨蛋地瓜。小乙听了???不懂。。。。郁闷了。。。这是加密。除此之外,小丽也知道了小乙改他家的电话号码了。于是乙大爷就登门一个一个把电话和门牌号记下来。并且藏起来不允许外人修改,只能自己有钥匙(密码)。这是ip地址和MAC地址绑定。当有人改了电话号码的时候,就得找乙大爷改。麻烦是麻烦了,但是安全了。不过小乙偷偷的把乙大爷的钥匙偷配了一把(盗窃密码成功),于是他还可以修改。 大概就这个意思。
网络中数据传输过程
我们每天都在使用互联网,我们电脑上的数据是怎么样通过互联网传输到到另外的一台电脑上的呢?
我们知道现在的互联网中使用的TCP/IP协议是基于,OSI(开放系统互联)的七层参考模型的,(虽然不是完全符合)从上到下分别为 应用层 表示层 会话层 传输层 网络层 数据链路层和物理层。其中数据链路层又可是分为两个子层分别为逻辑链路控制层(Logic Link Control,LLC )和介质访问控制层((Media Access Control,MAC )也就是平常说的MAC层。LLC对两个节点中的链路进行初始化,防止连接中断,保持可靠的通信。MAC层用来检验包含在每个桢中的地址信息。在下面会分析到。还要明白一点路由器是在网路层的,而网卡在数据链路层。
我们知道,ARP(Address Resolution Protocol,地址转换协议)被当作底层协议,用于IP地址到物理地址的转换。在以太网中,所有对IP的访问最终都转化为对网卡MAC地址的访问。如果主机A的ARP列表中,到主机B的IP地址与MAC地址对应不正确,由A发往B数据包就会发向错误的MAC地址,当然无法顺利到达B,结 果是A与B根本不能进行通信。
首先我们分析一下在同一个网段的情况。假设有两台电脑分别命名为A和B,A需要相B发送数据的话,A主机首先把目标设备B的IP地址与自己的子网掩码进行“与”操作,以判断目标设备与自己是否位于同一网段内。如果目标设备在同一网段内,并且A没有获得与目标设备B的IP地址相对应的MAC地址信息,则源设备(A)以第二层广播的形式(目标MAC地址为全1)发送ARP请求报文,在ARP请求报文中包含了源设备(A)与目标设备(B)的IP地址。同一网段中的所有其他设备都可以收到并分析这个ARP请求报文,如果某设备发现报文中的目标IP地址与自己的IP地址相同,则它向源设备发回ARP响应报文,通过该报文使源设备获得目标设备的MAC地址信息。为了减少广播量,网络设备通过ARP表在缓存中保存IP与MAC地址的映射信息。在一次 ARP的请求与响应过程中,通信双方都把对方的MAC地址与IP地址的对应关系保存在各自的ARP表中,以在后续的通信中使用。ARP表使用老化机制,删除在一段时间内没有使用过的IP与MAC地址的映射关系。一个最基本的网络拓扑结构:
如果中间要经过交换机的话,根据交换机的原理,它是直接将数据发送到相应端口,那么就必须保有一个数据库,包含所有端口所连网卡的MAC地址。它通过分析Ethernet包的包头信息(其中包含不原MAC地址,目标MAC地址,信息的长度等信息),取得目标B的MAC地址后,查找交换机中存储的地址对照表,(MAC地址对应的端口),确认具有此MAC地址的网卡连接在哪个端口上,然后将数据包发送到这个对应的端口,也就相应的发送到目标主机B上。这样一来,即使某台主机盗用了这个IP地址,但由于他没有这个MAC地址,因此也不会收到数据包。
现在我们讨论两台不在同一个网段中的主机,假设网络中要从主机PC-A发送数据包PAC到PC-C主机中,如下图所示:
PC-A并不需要获取远程主机(PC-C)的MAC地址,而是把IP分组发向缺省网关,由网关IP分组的完成转发过程。如果源主机(PC-A)没有缺省网关MAC地址的缓存记录,则它会通过ARP协议获取网关的MAC地址,因此在A的ARP表中只观察到网关的MAC地址记录,而观察不到远程主机的 MAC地址。在以太网(Ethernet)中,一个网络设备要和另一个网络设备进行直接通信,
除了知道目标设备的网络层逻辑地址(如IP地址)外,还要知道目标设备的第二层物理地址(MAC地址)。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。 数据包在网络中的发送是一个及其复杂的过程,上图只是一种很简单的情况,中间没有过多的中间节点,其实现实中只会比这个更复杂,但是大致的原理是一致的。
(1)PC-A要发送数据包到PC-C的话,如果PC-A没有PC-C的IP地址,则PC-A首先要发出一个dns的请求,路由器A或者dns解析服务器会给PC-A回应PC-C的ip地址,这样PC-A关于数据包第三层的IP地址信息就全了:源IP地址:PC-A,目的ip地址:PC-C。
(2)接下来PC-A要知道如何到达PC-C,然后,PC-A会发送一个arp的地址解析请求,发送这个地址解析请求,不是为了获得目标主机PC-C的MAC地址,而是把请求发送到了路由器A中,然后路由器A中的MAC地址会发送给源主机PC-A,这样PC-A的数据包的第二层信息也全了,源MAC地址:PC-A的MAC地址,目的MAC地址:路由器A的MAC地址,
(3)然后数据会到达交换机A,交换机A看到数据包的第二层目的MAC地址,是去往路由器A的,就把数据包发送到路由器A,路由器A收到数据包,首先查看数据包的第三层ip目的地址,如果在自己的路由表中有去往PC-C的路由,说明这是一个可路由的数据包。 (4)然后路由器进行IP重组和分组的过程。首先更换此数据包的第二层包头信息,路由器PC-A到达PC—C要经过一个广域网,在这里会封装很多广域网相关的协议。其作用也是为了找下一阶段的信息。同时对第二层和第三层的数据包重校验。把数据经过Internet发送出去。最后经过很多的节点发送到目标主机PC_C中。
现在我们想一个问题,PC-A和PC-C的MAC地址如果是相同的话,会不会影响正常的通讯呢!答案是不会影响的,因为这两个主机所处的局域网被广域网分隔开了,通过对发包过程的分析可以看出来,不会有任何的问题。而如果在同一个局域网中的话,那么就会产生通讯的混乱。当数据发送到交换机是,这是的端口信息会有两个相同的MAC地址,而这时数据会发送到两个主机上,这样信息就会混乱。因此这也是保证MAC地址唯一性的一个理由。
我暂且按我的理解说说吧。
先看一下计算机网络OSI模型的七个层次:
┌—————┐
│ 应用层 │←第七层
├—————┤
│ 表示层 │
├—————┤
│ 会话层 │
├—————┤
│ 传输层 │
├—————┤
│ 网络层 │
├—————┤
│数据链路层│
├—————┤
│ 物理层 │←第一层
└—————┘
而我们现在用的网络通信协议TCP/IP协议者只划分了四成:
┌—————┐
│ 应用层 │ ←包括OSI的上三层
├—————┤
│ 传输层 │
├—————┤
│ 网络层 │
├—————┤
│网络接口层 │←包括OSI模型的下两层,也就是各种不同局域网。
└—————┘
两台计算机通信所必须需要的东西:IP地址(网络层)+端口号(传送层)。
两台计算机通信(TCP/IP协议)的最精简模型大致如下:
主机A---->路由器(零个或多个)---->主机B
举个例子:主机A上的应用程序a想要和主机B上面的应用程序b通信,大致如下
程序a将要通信的数据发到传送层,在传送层上加上与该应用程序对应的通信端口号(主机A上不同的应用程序有不同的端口号),如果是用的TCP的话就加上TCP头部,UDP就加上UDP头部。
在传送成加上头部之后继续向往下传到网络层,然后加上IP头部(标识主机地址以及一些其他的数据,这里就不详细说了)。
然后传给下层到数据链路层封装成帧,最后到物理层变成二进制数据经过编码之后向外传输。
在这个过程中可能会经过许多各种各样的局域网,举个例子:
主机A--->(局域网1--->路由器--->局域网2)--->主机B
这个模型比上面一个稍微详细点,其中括号里面的可以没有也可能有一个或多个,这个取决于你和谁通信,也就是主机B的位置。
主机A的数据已经到了具体的物理介质了,然后经过局域网1到了路由器,路由器接受主机A来的数据先经过解码,还原成数据帧,然后变成网络层数据,这个过程也就是主机A的数据经过网络层、数据链路层、物理层在路由器上面的一个反过程。
然后路由器分析主机A来的数据的IP头部(也就是在主机A的网络层加上的数据),并且修改头部中的一些内容之后继续把数据传送出去。
一直到主机B收到数据为止,主机B就按照主机A处理数据的反过程处理数据,直到把数据交付给主机B的应用程序b。完成主机A到主机B的单方向通信。
这里的主机A、B只是为了书写方便而已,可能通信的双方不一定就是个人PC,服务器与主机,主机与主机,服务器与服务器之间的通信大致都是这样的。
再举个例子,我们开网页上百度:
就是我们的主机浏览器的这个应用程序和百度的服务器之间的通信。应用成所用的协议就是HTTP,而服务器的端口号就是熟知端口号80.
大致过程就是上面所说,其中的细节很复杂,任何一个细节都可以写成一本书,对于非专业人员也没有必要深究。