内网穿透引出的网络底层的故事

概述:

  在明白内网穿透之前先介绍一些概念:数据链路层,局域网,以太网,CSMA,CSMA/CD,ARM协议,NET等等。

  底层的东西支撑上层的实现,如果仅仅只是知道表面,很难弄清楚某些问题。当然这些概念每一个都很有干货,涉及面很广。本篇的目的是将这些概念串接起来,以完成结构化的理解,并不会深入其中某一点,或一个概念。

数据链路层:

  在数据线路层主机和路由器被称为节点,而链路有无线链路和有线链路,还有局域网经常被看做是链路(这里说明:局域网技术主要侧重点在数据链路层以及数据链路层相邻的网络层和物理层),数据链路层传送的数据被称为帧frame。

  数据链路层(实现)的服务:

  ①组帧,实现帧同步(常见做法在帧头帧尾加上冗余信息)。

  ②链路接入:如果网络中采取共享介质发送数据,就要解决链路的接入问题(及可以理解为一条链路有多个用户使用,那么那个用户在什么时候可以使用链路就是个很重要的问题)。反之PPP(point to point)不考虑链路接入问题。

  ③链路层的寻址:MAC地址,这是在共享介质中发送数据所需要的,PPP不需要。

  ④可靠数据传输:某些特定场景中实现(在某段链路上传输是可靠的),例如:无线网络。

  ⑤流量控制

  ⑥差错检测:链路层提供的差错检测并不是100%可信。采用奇偶校验码,CRC循环冗余码,最后放在checksum校验和字段。

  数据链路层的实现:一般就是一块网卡,无线网卡或以太网网卡等,网卡实现了链路层和物理层两层。

  

          图片来自哈工大的慕课,仅作为参考。

CSMA,CSMA/CD

  链路层采用共享介质通信,就必须设计到链路接入问题,CSMA,CSMA/CD协议就是解决链路接入问题的经典实现协议,那么可以这样理解CSMA,CSMA/CD就是工作在链路层的协议,就像http就是工作在应用层的协议。在局域网技术中有线局域网(以太网)就是采用CSMA/CD协议。

  广播介质实现通信的要解决的问题:冲突。因为由于多用户可以共享广播链路,而链路在同一时间点上只能被一个用户使用,如果链路被两个用户同时使用,那么必然产生冲突,两个信号叠加就成了一个不可识别的信号(例如两个人同时说话,那么第三个人谁谁说的话都听不明白)CSMA,CSMA/CD存在就是为了解决这种冲突。解决冲突当然也有其他协议(例如:Aloha协议,和时隙Aloha协议,令牌网络协议等),但以太网中应用CSMA/CD协议实现。

  CSMA协议:发送数据之前先监听信道,如果信道有别的节点在发送数据,则不发数据进行等待,等待的方式有三种(1坚持,非坚持,和P坚持)。因为信道有传播延迟,因此CSMA协议存在t0,t1的情况。在此情况中还是会产生冲突,并且BD节点不会(在传输过程中及时的)感知到冲突,这就是CSMA/CD解决的问题。

    

  CSMA/CD协议:边发边听,不发不听,解决CSDA留下的问题。

    

 

  上图中如果B发送数据帧很小,B发送完此数据帧后,由于传播延迟,还没到达D,而B已经结束监听,B会认为没有发生冲突,而其实已经发生了冲突,因为D也向信道上发数了据帧。为什么会产生这种情景,这是因为B发送的数据帧太小造成的。因此在CSMD/CD中有个很重要的概念是:最小数据帧长度。

    

 

 

 局域网:是连接住宅、学校、实验室、大学校园或办公大楼等有限区域内计算机的计算机网络。(这是从外形上的介绍=.=)

  具体什么是局域网?局域网可以理解由以太网和802.11(WIFI)代表。这里面以太网使用CSMA/CD协议,WIFI使用CSMA/CA协议。那么说到局域网就是这两个网络喽。

ARP协议:

  解决的问题:在知道ip地址的情况下,怎么获取MAC地址。

    ip地址:网络层,32bit组成,耳熟能详。

    MAC地址:数据链路层,48bit,每一个网络设备都用一个唯一的MAC地址,一般MAC地址被固化到网卡的ROM中。MAC地址被设计出来,主要是用在局域网技术中。

    理论上MAC地址是唯一的,但有些MAC地址是可以通过软件进行更改的,但一个局域网内的所有主机必须要保证任意两台主机的MAC地址不能相同。

  在同一局域网中,A主机与B主机通信,B主机的MAC地址不在A主机的ARP表中,那么A主机会构造一个ARP查询分组在局域网内进行广播,每个局域网内的主机都会收到此分组,但只有B主机会回应,应为查询分组内的ip地址为B主机的ip地址。B主机收到A的查询分组,利用单播的形式向A发送自己的MAC地址。A主机收到后,将B主机的MAC地址记录在ARP表中,开始和B主机的通信。ARP表会定时刷新。

  在不同局域网中,数据帧的MAC地址,随路由器的转发而改变。路由器在路由转发的过程中会先建立自己的ARP表。在第一次进行两个节点之间的路由时,它也必须通过构造ARP查询分组去查询对应ip地址的MAC地址。

  

 以太网:

  以太网采用二进制退避算法的CSMA/CD协议,具有造价低,传输速度快的特点,因此普遍的有线局域网都使用以太网进行通信。

  

 

DHCP协议:

  解决问题:如何获取ip地址?在一个局域网中,新的主机连接到网络之后怎么获取ip地址来与局域网中的其他通信呢?或者与局域网外的外网通信。DHCP协议就是解决这个问题提出的。

  当然在这里面如果你是个高手可以静态(手动)配置网络局域网地址,子网掩码,默认网关,DNS服务器等等。

  如果采用DHCP协议实现一个DHCP服务器就可以自动配置ip地址了,当然接入主机上必须运行一个DHCP的客户端(我们的个人电脑上,系统的后台运行的进程中应该就有这个客户端进程)。客户端和DHCP服务器进行通信的步骤如下图:

    

 

  DHCP服务器给用户分配到的具体信息:ip地址,子网掩码,默认网关(默认网关一般是与路由器连接的入口的ip地址),存活时间(ip是有时间限制的,到时后客户可以续租),DNS服务器。

  DHCP协议在应用层实现,传输层使用UDP封装,ip层广播,链路层广播。

NAT网络地址转换

  局域网(内网)网络之间都使用私有ip地址通信,这在这个局域网内部是没有问题的,但是当内网的某个主机要访问外网时,它不能以私有ip地址去访问外网!因此要访问外网,必须有一个公网ip。那么可不可以每个内网主机都获取一个公网ip,当与公网通信时使用公网ip,与内网通信时,使用内网ip,如果可以这样实现,那么确实挺好(这里不考虑内网安全问题)。但是,有一个事实,ipv4的公网ip早在几年之前就被分配完了。那么我们的内网怎么与外网去通信?

  解决问题:在ipv4已经分配殆尽的情况下,解决内网与外网通信问题!

  思路:内网的所有主机(可能有几百上千台)通过交换机相连,最后汇聚交换机到一个路由器上,这个路由器有一个公网ip,在某个主机要与公网通信时,就可以必通过此路由器,路由器最后将内网ip替换为公网ip就可以解决此问题。

  那么问题又来了,如果收到外网返回的消息,怎么知道要发送给哪个内网的主机呢?

  这里有提出了一种方案,采取ip地址加端口号的形式解决这个问题。路由器维护一个端口转换表:将内网访问外网的ip地址端口号进行记录,当有外网信息返回时通过记录来实现回传内网。

  

 

  最后这里面存在一个争议:路由器是第三层设备(工作的最高层是网络层),但是在这里路由器读取了端口号信息,突破了网络层去访问了传输层。从设计上讲:这是不应该的。

  虽然有争议,但是目前的网络环境中,网络地址转换被大量应用,一定程度上解决了ipv4地址分配殆尽的问题,并且在内网安全问题上也做出了贡献,我们内网之间的通信,外网时看不到的。

  端口号信息只有16bit,因此并发的访问最多支持6万多个内网ip访问。

内网穿透:

  解决问题:如果在内网中部署一台服务器,供外网访问,那么内网中的服务器的ip地址必然是私有地址,不能直接被外网访问,那么如何才能让外网访问内网中的服务器呢?内网穿透技术就被提出了。

  ①静态配置NAT表,将内网服务器的ip地址端口号信息与连接外网路由器的ip地址+1000端口号绑定(1000只是个例子)。这样访问内网的服务器就相当于访问连接外网的路由器的ip地址+1000端口号,实现内网穿透。

  ②IGT

  ③中继(Skype)

    

 

 

  

 

 

 

posted @ 2019-11-27 17:42  Ccluck_tian  阅读(274)  评论(0编辑  收藏  举报