关于网络的总结(二)

  • 局域网

    • 局域网就是若干台互相连接起来的机器,它们能够给彼此发送信息。最简单的情形就是用一根网线把两台电脑连接起来。当两台以上的机器要互相连接时,一般采用星型拓扑,即用一台交换机或集线器把各个机器连接起来。

      与局域网相对应就是广域网,也称公网。在上面描述的局域网中,信息的流动只能限于这个网内的机器;若要跟其他的局域网中的机器通信,需要在两个局域网之间架设网络。广域网本质上干的是同一件事情,只不过范围有点大,它能够连接全世界的局域网。我们平时所说的上网,指的就是通过广域网访问其他局域网或被访问。

    • 局域网与公网的对接

      如果局域网内只有一台机器(显然此时还不能称为“网”),那直接用网线把它和路由器的一个端口相连就行了。但是一台以上的机器连成网时,就需要通过交换机来连接路由器,交换机有一个端口和路由器相连,其他的端口连接的是局域网内的机器。

      和交换机直接相连的路由器被称为网关路由器,因为它是局域网和外界通信的关口。

    • 局域网的IP

      上篇文章中提到了IP的本质,它其实是由路由器决定的。路由器代表的是公网,所以IP是用来标识一个节点在公网中的位置。IP不关心某个节点的具体构成,节点可以是一台单独的电脑还可以是由若干台电脑组成的局域网。

      局域网内每台机器的IP又是如何分配的呢?这里要分两种情况:一种是每台机器有自己的公网IP;另一种每台机器没有公网IP,它们只有内网IP,然后共享同一个公网IP。此时,这个公网IP也被称为网关。

      由于在第一种情况下,局域网的每台机器可以代表公网的一个节点,故这个节点可以被替换成另一个局域网,即局域网中的子网,这个子网就是后一种情况。这种网中网的嵌套可以分为三种情况:第一种嵌套第一种;第一种嵌套第二种;第二种嵌套第二种。但是第二种不可以嵌套第一种。嵌套起来就很复杂了,但是基本原理是相通的。

      对于前者,我感觉交换机的作用就是路由器的一个扩展端口:本来路由器把一个IP映射到一个MAC地址,然后把这个MAC地址映射到一个端口;而现在IP和MAC的映射没有改变,但是却把这些特定IP(它们属于同一局域网)对应的MAC只映射到一个端口,通过这个端口和交换机相连。接着由交换机来完成MAC和特定主机的匹配。这等于是说,路由器中那张MAC地址和端口的映射表转移到了交换机中。

      需要牢记的是,交换机属于链路层设备,它只能读取MAC地址,不能识别IP地址。

      对于后者,需要用到NAT技术,即网络地址转换。因为局域网内所有机器共享一个IP带来这样一个问题:交换机接收到路由器发来的分组之后,这些分组具有相同的目的IP,交换机如何来确定这个分组到底要传给哪台机器呢?

    • NAT技术

      NAT技术的使命是完成内网IP和外网IP之间的转换,外网IP指的就是网关IP。它实现的核心其实是类似于路由器转发表的NAT转换表。

      局域网的核心是交换机,它只能识别MAC地址。但集成了NAT功能的交换机就不仅仅是普通的交换机了,比如家用的路由器,它包括至少三个功能:交换机,DHCP服务器,NAT。家用路由器不仅要完成交换机的功能,还要负责内网IP的分配,另外NAT功能也是必不可少的。所以,在这个设备上我们可以看到网络设备日渐模糊的界限,到底是谁集成了谁?

      所以,在第二种局域网中,处于核心的“多功能交换机”,首先要给内网的机器分配内网IP,这需要用到DHCP功能。

      现在,若有台机器得到的IP是192.168.122.105,它要跟外界通信,目的IP是123.25.36.10。该分组经过“交换机”时,源主机IP会被替换成网关IP108.122.31.25,并且会在NAT转换表中留下一条记录:

      | ——-源 ——— | —–目的—- |

      |192.168.122.105 | 123.25.36.10 |

      然后,当“交换机”接收到一个分组时,会识别其源主机IP,若它匹配123.25.36.10,那么就发给内网IP为192.168.122.105 的机器。

      我们应该知道,网络通信基本都是一问一答,问和答所使用的分组,其源主机IP与目的地IP正好是相反的。

      上面这个过程用到了NAT功能,显然这个模块可以识别IP且修改它。这不是普通交换机可以完成的任务。

    • ARP协议

      前面说过路由器有一张表可以把IP映射到MAC上。这个映射实际上是通过ARP协议完成的。

      很多书上都说ARP协议仅限于局域网内使用,我个人觉得不是这样的。前面说过,路由器内部也有ARP协议,但是路由器不属于局域网,它是公网上的一个节点。我的理解是:如果一台设备支持ARP协议,那么ARP只能解析与该设备直接相连的那些机器的IP;如果一个IP不能被解析,那么相应的分组会被发给该设备的上级路由器或网关路由器。

      在每台安装有TCP/IP协议的电脑或路由器里都有一个ARP缓存表(维基百科)

      我认为ARP协议的核心就是是这张表,存放IP和MAC地址的映射。ARP协议的工作包含两部分,一是动态生成这张表;二是根据表的内容完成对IP的解析,得出MAC地址。

      比如,局域网中的主机A向B发送消息,当消息从IP数据报封装成MAC帧前,会从A的表中查找B的IP对应的MAC地址,然后把这个地址封装到MAC帧中再发送出去。这里需要了解的是,这个MAC帧将会被所有局域网中的机器接收,类似于“广播”,所有机器都会检查这个帧中的MAC地址,如果和自己的MAC地址一致,将继续解封;否则,直接丢弃这个帧。

      如果A的表中没有与B的IP对应的MAC地址,那么A就向局域网中的所有主机发送一条ARP请求,这个请求包含B的IP地址,且MAC地址是FF-FF-FF-FF-FF-FF,于是所有与交换机相连接的主机(包括路由器)都会收到这个请求,但是只有B会回应,因为只有B的IP与请求中的IP一致。这样,A就可以更新自己的表,填入B的IP与MAC的对应。

      但是,如果请求的IP不在这个局域网中,那么路由器会对请求做出回应,将自己的MAC地址发给A,当然是那个与该局域网相连的接口的MAC,因为一台路由可能同时连接了好几个局域网。

      但是这里有个问题:路由器如何知道请求的IP在不在这个局域网?呃,好吧,纠结了半天终于想通了;路由器会查询自己的转发表,最后它肯定能知道有哪些IP是和这个接口绑定在一起的。当路由器接收到一个ARP请求后,读取它的请求IP:

      • 如果这个IP是内网专用的IP,比如192.168.X.X,那它就直接丢弃不会应,因为显然这个IP肯定是局域网内某台机器的;
      • 如果这个请求IP是公网IP,它会对比转发表,若请求IP和这个接口是绑定的,那意味着请求IP必然是局域网中某台机器的,丢弃;
      • 那么就剩最后一种情况:请求的IP是公网IP且没有和这个路由器接口绑定,那意味着这个IP是外界的,只有此时路由器才会回应ARP请求,返回这个接口的MAC。

      当主机A知道了路由器的MAC地址后,剩下的事情就简单了:更新自己的缓存表;将MAC帧发送给路由器;路由器提取目的IP,利用ARP找到对应的MAC地址,再发送到相应的接口,完事。

    • 从上面的描述中我们可以看到,局域网中的机器互相通信时,信息是不经过路由器的,只需要经过交换机,无论这些机器具有公网IP还是内务IP,这会大大提升通信的效率。我想,这就是局域网的好处吧。

完。

时间: 2024-10-12 17:07:26

关于网络的总结(二)的相关文章

python 网络编程 (二)---tcp

异常 python的socket模块实际上定义了4种可能出现的异常: 1)与一般I/O 和通信问题有关的socket.error; 2)与查询地址信息有关的socket.gaierror; 3)与其他地址错误有关的socket.herror; 4)与在一个socket上调用settimeout()后,处理超时有关的socket.timeout; import socket, sys, time host = sys.argv[1] textport = sys.argv[2] filename

OTN交换& P-OTN有效降低100G 网络成本 (二)

OTN交换& P-OTN有效降低100G 网络成本 (二) 全球范围来看,移动及互联网流量的增长速度是空前的,导致此现象的缘由包括云服务的增长.移动宽带和基于互联网的视频点播服务的增长.Cisco预计,从2012至2017年,全球互联网IP流量将增至三倍,达到每月120艾字节,而移动数据流量将增长13倍,达到每月逾11艾字节[i].贝尔实验室则预计,在同一时间区段,城域及骨干网的流量分别将增长560%和360%[ii].如此高速的带宽增长为作为当前IP网络基石的光传送网带来了难以想像的压力.由于

【UNIX网络编程(二)】基本TCP套接字编程函数

基于TCP客户/服务器程序的套接字函数图如下: 执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型. #include <sys/socket.h> int socket(int family, int type, int protocol);/*返回值:若成功则为非负描述符,若出错则为-1*/ socket函数成功时返回一个小的非负整数值,它与文件描述符类似,把它称为套接字描述符,简称sockfd.family参数指明协议族,被称为协议域.type参数指

网络基础(二)

网络基础(二) 配置网络高级命令nmcli(NetworkManager command line tool) nmcli命令修改是直接修改配置文件 命令语法:nmcli [OPTIONS] OBJECT { COMMAND | help } 一般常用选项是connection(con)和device(dev)可以tab (比较方便) [root@localhost ~]# nmcli agent connection device general help networking radio 显

RN实战项目网络请求封装(二)

RN实战项目网络请求封装(二) 网络相关学习文档,参考 RN中文网文档 RN中主要是用fetch来完成异步网络请求的,传统的ajax慢慢的会被fetch替代 RN中文网fetch API 案例 fetch('https://mywebsite.com/endpoint/', { method: 'POST', //请求方法 默认get headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', //数据

嵌入式 Linux网络编程(二)——TCP编程模型

嵌入式 Linux网络编程(二)--TCP编程模型 一.TCP编程模型 TCP编程的一般模型如下图: TCP编程模型分为客户端和服务器端编程,两者编程流程如下: TCP服务器端编程流程: A.创建套接字: B.绑定套接字: C.设置套接字为监听模式,进入被动接受连接状态: D.接受请求,建立连接: E.读写数据: F.终止连接. TCP客户端编程流程: A.创建套接字: B.与远程服务器建立连接: C.读写数据: D.终止连接. 二.TCP迭代服务器编程模型 TCP循环服务器接受一个客户端的连接

网络编程(二):戏说非阻塞网络编程

著作权归作者所有. 商业转载请联系作者获得授权非商业转载请注明出处.作者大家可以看我的知乎专栏链接http://zhuanlan.zhihu.com/auxten/20204159这是一个系列的文章之三之四已经写完了会陆陆续续搬到Linuxtone着急的同学可以看 网络编程三从libevent到事件通知机制 网络编程四互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题 在数据加密领域举例子我们经常会提到Alice和Bob我们也继续延续这种传统. 在遥远的1752年的英国电报这种可以

游戏网络编程(二)

游戏网络编程(二) 本篇介绍Socket编程,因为我觉得每个开始接触网络编程的人应该都是先从了解socket编程开始的吧.后面介绍的WebSocket也会和Socket编程的概念做比较,因此先介绍下Socket编程. 游戏网络编程二 什么是Socket 常用的Socket函数API WinSock CSocket Socket函数介绍 socket bind listen accept connect sendsendto recvrecvfrom select setsocketoptgets

Ubuntu Vmware虚拟机网络配置(二)

Ubuntu Vmware虚拟机网络配置(二) 2015-05-17  青岛  张俊浩 对网络配置中遇到的网络相关术语进一步解析. 一.VMware三种上网方式说明 VMware提供了三种工作模式,是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式). 1.bridged(桥接模式) 在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器.在桥接模式下,你需要手工为虚拟系统配置IP地址.子网掩码,而且还要和宿主机

[转帖]脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么? http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机网络编程的基础,TCP/UDP收发消息都靠它.我们熟悉的web服务器底层依赖它,我们用到的MySQL关系数据库.Redis内存数据库底层依赖它.我们用微信和别