【网络】数据链路层

数据链路层

  • 前言
  • 正式开始
    • 认识以太网
    • 以太网帧格式
    • 重谈局域网通信原理
      • 同一个局域网中主机的通信
      • 数据碰撞
      • MTU
        • MTU对IP协议的影响
        • MTU对UDP协议的影响
        • MTU对于TCP协议的影响
    • ARP协议——地址解析协议
      • 简介
      • 报文格式
      • 模拟ARP请求和响应
        • 小问题
        • ARP欺骗
    • 对于前面的补充
      • NAT
      • 内网穿透
      • DNS协议
      • 代理服务器
        • 正向代理服务器
        • 反向代理服务器
        • NAT和代理服务器
      • 浏览器中输入url后, 发生的事情
    • 总结我前面网络博客所讲的内容
      • 数据链路层
      • 网络层
      • 传输层
      • 应用层

【网络】数据链路层_第1张图片

前言

对于网络层不熟悉的同学建议先看看我上一篇的网络层,本篇部分内容会对于上一篇的网络层进行讨论:【网络】网络层讲解

本篇主要讲解:

  • 数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据
  • 以太网技术标准;
  • 以太网帧格式
  • 理解mac地址
  • 理解arp协议
  • 对于前面网络相关的博客进行补充
  • 总结网络

正式开始

数据链路层最基本的服务是将当前节点网络层来的数据可靠的传输到相邻节点的网络层。

来看看一张图:
【网络】数据链路层_第2张图片

主机A ⇒ 路由器A ⇒ 路由器B ⇒ 路由器C ⇒ 路由器D ⇒ 主机B

注意:决定将数据从当前节点交付给下一个节点的时候,下一个节点和当前节点一定在同一个局域网中。

我来圈一圈:
【网络】数据链路层_第3张图片

主A和路A,路A和路B,路B和路C,路C和路D,路D和主B,数据的转发都是子网(局域网)间的转发。

数据链路层要解决的问题就是你如何保证把当前节点的数据交给下一个节点,比如说如何保证主机A将数据交给同一个子网中的路A,这一点能做到,那么就能做到路A到路B,路B到路C……,能保证相邻两点的传递,就能保证一条路上的传递。

认识以太网

“以太网” 不是一种具体的网络, 而是一种技术标准。

网络刚发展的时候都是各个实验室在搞的,不同实验室搞出来的标准多少会不太一样。

以太网这个技术标准,既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;

例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;

以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

以太网帧格式

传输层发送的报文叫数据段,网络层发送的报文叫数据报,数据链路层发送的报文叫数据帧。

【网络】数据链路层_第4张图片

非常的简单。

报文采用定长报头,662。

  • 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;

  • 类型字段有三种值(十六进制),分别对应IP、ARP、RARP;
    这里的类型的值对应上层网络层用的是什么协议,如图:
    【网络】数据链路层_第5张图片

有效载荷向上交付的时候就是通过类型来向上交的,根据类型来选择网络层用的是哪一个协议,然后就交给哪个协议。

  • 中间的数据就是网络层传下来的数据报:
    【网络】数据链路层_第6张图片

  • 帧末尾是CRC校验码

重谈局域网通信原理

同一个局域网中主机的通信

看图:
【网络】数据链路层_第7张图片

假如说这里有六台主机,在同一个局域网中。

编上号:
【网络】数据链路层_第8张图片

六台主机名字分别给成h1~h6,其对应的MAC地址我就直接按顺序给成M1~M2了。

同一局域网下不需要经过路由器的转发:
【网络】数据链路层_第9张图片

当某一台主机想给另一台主机发送报文的时候,所有的主机都能够获取到这个报文,不过会先将报文中的目的MAC地址与当前主机的MAC地址进行对比,如果对不上,那么就会直接丢弃到报文,如果对上了就会收取这个报文。

比如说h1想和h5通信:
【网络】数据链路层_第10张图片

那么h1发送的数据帧中目的地址就是m5,源地址就是m1,h1发送的数据帧h2~h6都会收到,不过收到后会先和自己主机的MAC地址对比一下,比如说h4收到后数据帧后,m4不等于m5,那么h4就会丢掉这个数据帧,h5收到后,目的MAC和自己的MAC地址相同,所以就会读取这个报文。

关于MAC地址是啥就不讲了,我最开始给的博客中说过的。用ifconfig能查到:
【网络】数据链路层_第11张图片

举个例子,老师上课的时候点名张三起来回答问题,此时张三就会站起来回答,但是为什么同班的李四不会站起来呢?因为李四听到老师叫的是张三,而不是李四,老师的话就看做是报文,目的MAC就是张三,李四收到后会先对比一下,目的地址不是李四,所以就会丢掉这个报文,没有后续的反应,但是张三收到后对比目的地址就是自己,所以就会执行后续动作,站起来回答问题。

数据碰撞

如果一台主机发送数据的同时别人也想发呢?
这样就会发生数据碰撞的问题:
【网络】数据链路层_第12张图片

如果此时h2发送的同时h4也发,那么二者的数据可能就会交织在一起,这样就会出问题,两个报文混在一块交给了其他主机,那么这个报文就是废的。

还拿上课来说,老师在讲课的时候,别的同学在课堂上乱叫,那课就上不成了。

那么发送数据的时候若发生了碰撞,发送数据的主机知道自己的数据碰撞了吗?
能,就像自己说话一样,你说话你自己也是能听见的,你讲话的时候别人打断你,你是能知道的。

发送方发送报文自己也会受到,如果发生了碰撞,碰撞后的报文就会传回来,这样发送方就可以根据数据帧中的数据是否变化或CRC校验就行。

数据一发生碰撞就不能用了,所以要尽量避免,如何避免呢?
当发送方得知自己的数据发生了碰撞之后就会执行碰撞避免算法,大概功能就是发送主机会休息随机时间,然后再重新发送刚刚的数据帧。

注意看这里我把重新发送加粗了,传输层也有重新发送的功能,而这个功能保证的就是可靠性,那么数据链路层也有重新发送,说明数据链路层也有保证可靠性的策略。

简单说说局域网攻击的原理,就是搞一个绕过数据链路层的工具,不进行数据碰撞避免算法一直发送数据,这样同一局域网中的主机一发送数据帧就会发生碰撞,就会让用电脑上网的人觉得非常卡,没法用,就是因为TA发送的报文一直发生碰撞,一碰撞就进行碰撞避免,报文就一直发不出去。想了解的自行查找,我就不讲了。

两台主机通信的本质是进行进程间通信(前面博客讲过了),而进程间通信的前提就是能让多个进程看到同一份资源,而这里网络通信的同一份资源就是局域网,多台主机都在局域网通信,出现数据碰撞问题其实就是数据不一致的问题(发送数据和接收数据的不一致),想要解决这一问题就是进行“访问控制”。所以这里的局域网就是一个临界资源,想要数据一致就要保证同一时刻只有一次主机的通信,前面讲多线程部分时想要做到这一点就是用锁,但这里的解决方法是多次尝试,试着发出去没问题就成功,失败就再试,直到成功为止。

这就是为什么你家里面的WiFi设备连的多了就会很卡,人一多数据碰撞的就多了。

那么由此可提出两个问题:

  1. 一个局域网中是主机越多越好还是越少越好?
  2. 数据帧是越长越好还是越短越好?

第一个问题,很显然,主机越少越好,再用一下上课的例子,小教室上课,就二三十个人,上课的时候比较安静,只有老师说话;大课就不一样了,二三百个人,总是有一点聒噪,每一个时刻总是有人在窃窃私语。如果非要想让局域网中有很多主机,那么就安装一个交换机,交换机的作用就是划分碰撞区域,简单理解就是将局域网再划分成小块,如图:
【网络】数据链路层_第13张图片
假如说这里的这个交换机将局域网分成了两了左右两块。

如果说h1给h6发送数据帧,交换机一看,h6在左边,不需要往右边发,那么就直接不给右边的主机发送这个数据帧,光给左边所有主机发,此时右边区域的压力就会减小。

但如果说h1想要给h4发,两个主机在两块地方,那么此时右边也得发,也就是说此时两边的主机都会收到。

如果h1给h5发送数据帧的同时h2给h6发送了数据帧,那么二者就会发生碰撞,如果碰撞的同时h4想要给h5发数据就会先不让h4的数据过去左边,等碰撞结束了之后再发给左边的区域。

第二个问题,其实问题中的数据帧越长和越短都不行,太长更容易导致碰撞,太短通信的效率会降低。所以数据有最小长度和最大长度:
【网络】数据链路层_第14张图片
这里的数据最小长度为46,最大长度为1500。(不同的网络可能不同,以太网是这样,别的就不是了,等会再细说这个)。

这里就像我们打游戏一样,对线的时候是先慢慢换血,换到一定长度的时候才能all in,不能说一上线就猛着拼,打的太凶容易被抓。

前一篇网络层的时候说了分片,这里数据长度的限制就是IP数据报太长得分片的原因。

MTU

前一篇我也讲过MTU了,MTU相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层产生的限制。听着有点懵,其实就是限制网络层数据报大小的。

  • 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;

  • 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;

  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);

  • 不同的数据链路层标准的MTU是不同的;

MTU对IP协议的影响

由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.

  • 将较大的IP包分成多个小包, 并给每个小包打上标签;
  • 每个小包IP协议头的 16位标识(id) 都是相同的;
  • 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
  • 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
  • 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据; 由传输层负责。

【网络】数据链路层_第15张图片

【网络】数据链路层_第16张图片

MTU对UDP协议的影响

让我们回顾一下UDP协议:

  • 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.

  • 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加

MTU对于TCP协议的影响

让我们再回顾一下TCP协议:

  • TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);

MSS由多大呢?
【网络】数据链路层_第17张图片

MTU是1500,1500 - 20(IP报头) - 20(TCP报头) = 1460,1460就是MSS,也就是TCP数据的最大大小。如果TCP有效载荷大于该值就会在网络层发生分片。所以我前面讲TCP的时候滑动窗口中的数据还要分多块来发,比如说4096字节大小的滑动窗口,分成4个1024字节来发,而不是整个4096一个包发出去,就是为了避免网络层发生分片。

  • TCP在建立连接的过程中, 通信双方会进行MSS协商.
  • 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
  • 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
  • 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
  • MSS的值就是在TCP首部的40字节变长选项中

ARP协议——地址解析协议

来个小问题:
在跨局域网发送数据的过程中,MAC帧的报头要不断发生改变,因为发送的过程中要不断更改源mac地址和目的mac地址:
【网络】数据链路层_第18张图片

比如说路由器A ⇒ 路由器B:
【网络】数据链路层_第19张图片

问题来了,路由器A是怎么知道路由器B的mac地址的?
用的是ARP协议。

简介

ARP协议是在以太网协MAC帧协议上层的,但是ARP协议还是在数据链路层,而非网络层:
【网络】数据链路层_第20张图片

所以不是说一个协议在某个协议的上层就能说明这两个协议不能在同一个协议栈层中,在同一层中有可能还会细分成若干协议,这就是为什么帧中有一个帧类型来表述ARP / IP。

在同一个网段中,可以通过目标IP来获取到目标主机的MAC地址,是一个局域网的协议,假如说入口路由器(就是整个路程中的最后一个路由器,上面图中对应路由器D),想要把报文转发给主机B,就必须要知道主机B的MAC,但只要该子网中有B的IP,就可以根据ARP协议来获取到B的MAC地址,入口路由器是一定能确定目的主机在当前子网中的,因为入口路由器所在的下级子网的网络号一定和目的主机的网络号相同。

具体是如何实现的呢?
很简单,先举个例子。

假如说现在老师手里有一个没有名字光有学号的名单,老师像知道学号为1234的学生叫什么,那么老实就可以对全班的同学说:学号为1234的同学,请告诉我你的名字,此时假如张三的学号就是1234,此时除了张三之外的同学听到1234学号不是他们,所以就不做反应,张三听到后就回话:我的学号是1234,我的名字叫张三。

这就是一个ARP的例子,我们把上面的内容转成一些专业术语来说说,把学号看成主机的IP,老师看成请求方,班里面所有人(学生和老师)都看成子网中的所有主机,老师对所有的同学发起请求,其实就是用MAC帧封装了ARP请求,张三就是目的主机,张三的回答也是用MAC帧封装的ARP相应,在老师问的时候并不知道张三的名字,也就是说请求主机并不知道目的主机的MAC地址,但是这个同学回答的时候是知道老师的MAC的,因为老师发起的请求中包含其MAC地址。学生回应的MAC帧所有人还是能收到,但是可一对比MAC帧报头中的目的地址,就会自动丢包。

可能你看完后还有点问题,我其实也故意漏了点ARP的细节,没关系,等会看了ARP的报文你就全知道了。不过上述不中可以简单总结一下:

  1. 请求主机先广播
  2. 响应主机再向请求主机一对一发送

这两个步骤都是要封装成mac帧并在局域网中完成这个工作。

报文格式

【网络】数据链路层_第21张图片

上面就是ARP报文格式,可以看到没有数据,是专门用来获取mac地址的。

前四个字段可以认为是固定格式,因为我这里通篇懂都是以太网,网络层协议也是IP协议:

  • 硬件类型指链路层网络类型,1为以太网;
  • 协议类型指要转换的地址类型,0x0800为IP地址;
  • 硬件地址长度对于以太网地址为6字节;
  • 协议地址长度对于和IP地址为4字节;

所以前四个填的时候就是1,0x0800,6,4。
【网络】数据链路层_第22张图片

op先跳过,后面的四个字段根据这张图来说:
【网络】数据链路层_第23张图片
假如说这里h1是入口路由器,要问h3的mac地址是啥。

此时h1是有h2的IP地址(假如说是IP_h3)的。h1也知道自己的IP和MAC(假如说分别是IP_h1和MAC_h3),唯独不知道h3的MAC,所以后面的四个字段就这样填:
【网络】数据链路层_第24张图片

对比着来看:
【网络】数据链路层_第25张图片

以太网地址就是MAC地址,此处发送端知道自身的MAC和IP,还有目的主机的IP,不知道目的主机的MAC,那么不知道的就给全1,也就是0xff…ff,中间的几个f我就不写了。

下面来讲讲OP字段。
这里的op可不是原神奥。

两点:

  1. 任何主机可能之前向目标主机发送过ARP请求,注定了未来会收到对应的ARP应答。
  2. 任何一台主机也可能收到别人发起的ARP请求。

⇒ 局域网中,任何一台主机收到ARP时,可能是一个应答,也可能是一个请求。

  • 所以op字段为1表示ARP请求,op字段为2表示ARP应答。

所以刚刚对于h1来说这个字段就是1:
【网络】数据链路层_第26张图片

这样一个ARP请求就构建好了。不过想要发送的话还有进行mac封装,因为ARP协议下面就是mac协议,我这里就简单添加一个mac报头演示一下:
【网络】数据链路层_第27张图片

这里目的mac还是不知道,给的就是全1,表示广播,即所有的主机接收到mac帧后都要将数据向上交付。(不管上层是IP还是ARP还是别的):

【网络】数据链路层_第28张图片

这样就是一个mac封装过的简易ARP请求。

模拟ARP请求和响应

下面就来简易模拟一下ARP的整个流程,还是刚刚的h1给h3发,如图:
【网络】数据链路层_第29张图片

上面就是h1构建好的arp请求,此时mac报头目的地址为全1,所以所有主机收到这个数据帧的时候都要将ARP请求交给ARP层,所以说所有的arp层都会收到这个:
【网络】数据链路层_第30张图片

此时所有主机都先判断一下OP位,先看看是arp请求还是arp响应,然后再来看其中的目的IP地址,一看是IP_h3,所以IP不是h3的主机就会将这个报文丢弃,h3就会将这个报文获取,那么这时h3就知道了h1想要知道TA的MAC地址,并且也知道了h1的IP和MAC。

然后h3就开始构建arp响应并封装成mac帧,如下:
【网络】数据链路层_第31张图片

此时的mac帧和arp中的两个目的MAC都是知道的,那么值就会给定,而不是全1。

当这个响应发到子网中时,所有的主机都收到了,但是收到时会先对比一下MAC帧报头中的目的以太网地址,MAC地址不是MAC_h1的主机就会将这个报文丢掉。h1就会接收。
注意,上面发生了两种报文丢弃,场景式不一样的,第一种是在arp层丢弃的,第二种是在MAC层丢弃的,不要搞混了,没看懂的同学再看一遍。

h1收到arp应答的时候还是先判断OP是1还是2,是2就直接提取出发送端以太网的地址,也就是h3的地址,这样h1就得到h3的MAC地址了。

这样再将前面主机发来的报文重新进行mac封装并交给h3主机即可。

  • 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
小问题

arp看起来至少进行一个请求和一个应答,是不是每次发送数据前都要进行arp请求和应答?还是拿刚刚的h1和h3来说,问题就是:是不是h1给h3发数据前都要arp一下?

不需要,arp请求成功后,请求方会暂时将IP和MAC地址的映射关系暂时保存下来。暂时保存时有原因的,比如说h3主机接收了数据后就关闭了,后面局域网中再连上一个主机h9,IP可能会分配的和h3一样,但是此时二者的MAC是绝对不一样的,如果还用mac的地址数据就发不出去,永久保存也就没有意义了,浪费资源。

可以用arp -a来查看映射关系的缓存:
【网络】数据链路层_第32张图片

圆括号里的就是IP,at后面的就是对应的MAC地址,你也可以看看你主机上面是啥样。如果我的主机给上面的这些主机中的某一个发送数据,直接就通过这里的缓存来发。

是不是只会在目标最终的子网中进行arp,路由的时候会不会也发生arp?

会,arp的过程会在路径中随时发生,路由器MAC也是MAC。
实际上分片也可能发生在路上,不同网段可能采用不用的网络,比如说当前数据所在的是以太网,下一个网段就变成了令牌环网,不同的网络MTU会不一样,这样在转发报文的过程中就可能会出现MTU变小的情况,此时就可能出现在路由器处进行分片,当然概率非常小,网络都是有运营商架设的,他们会尽量避免这种情况,也就是尽量让不同网段的网络一致。

ARP欺骗

ARP响应回来的报文,不会对其中的MAC地址进行验证,不法分子也就跟这里的问题搞出了ARP欺骗。

讲一下原理,如图:
【网络】数据链路层_第33张图片
h1代表私网中的一台电脑,r1代表一台路由器。

h1和r1通信前,需要进行arp请求和响应。h1发起arp请求,r1进行响应,假如说各自的IP和mac分别是IP_h1、mac_h1和IP_r1、mac_r1。

通信前,突然来了一台主机h2:
【网络】数据链路层_第34张图片

疯狂的向h1和r1发送arp响应,对h1的响应中的源地址是IP_r1和mac_h2,对r1的响应中的源地址是IP_h1和mac_h2:
【网络】数据链路层_第35张图片

这样就能做到篡改h1和r1的本来正确的缓存,此时h1记录的缓存IP虽然是r1的,但是mac是h2的,那么发送数据的时候其实是向h2发送,r1同理。

此时h1和r1通信的数据都会经过主机h2,如果应用层采用的是HTTP,那A就惨了,数据能被主机h2直接看到,而且还可以对其中的数据进行篡改,如果应用层采用的是HTTPS,那还稍微好一点h2看不到也不能改,但是二者都有一个共同问题,就是h2可以直接丢掉h1的报文,这样就能间接导致h1处于断网的状态,h2一直丢,h1就永远无法上网。

更深的细节我就不讲了,话题比较敏感,感兴趣的同学自行了解一下。

对于前面的补充

到目前为止,结合我前面网络的相关博客,整个网络协议栈已经讲的大差不差了,从应用层到数据链路层,还有部分小知识和网络层遗留的一个小问题(公网中的响应怎么发给私网中的一台主机)还没说。

NAT

前一篇网络的博客我说了如何从私网中奖报文转发到公网,就是在私网中不断替换报文的源IP地址,直到到了上级网络为公网的路由器时停下来。但是后面没有讲如何将公网中服务器的响应交到请求的主机手里。这里就简单说说。

路由器在对源IP地址修改的同时还会记录一下修改前后的对应的转换关系,也就是说路由器中还有一个转换表,比如说:
【网络】数据链路层_第36张图片

假如说左下角第一台主机要和122.77.241.3通信,那么其发送的报文会经过一个家用路由器和一个运营商路由器,那么这两个路由器会记录下源IP转换前后的关系:
【网络】数据链路层_第37张图片

无论是从内向外还是从外向内,源IP + 端口都能表示其所在网络的唯一一台主机中的进程,所以这里的映射关系是互为key值的。

所以此时公网中的报文发回来的时候就直接根据路由器中的转换表直接映射到对应的IP和端口发回来就行。比如说服务器响应报文源IP和端口为122.77.241.4 : 8080,当运营商路由器看到这个IP和端口时就会查转换表,找到原来主机请求的源IP和端口,也就是10.1.1.2 : 1234,把响应报文就发送到这个IP对应的主机上,也就是那个家庭路由器,然后家庭路由器再查表,发现还要发送给IP为192.168.1.201的主机,也就是请求的那台电脑,所以最终服务器的响应就能得到其想要的响应。

在进行原地址转换的过程中,可能不一定只替换源IP地址,必要的时候源端口也会换,比如一台主机有一个还没有响应的请求,假如端口号为1234,此时另一台主机若也想用这个端口,且二者目的IP和端口都指向的是同一个服务器,那么转换到公网的时候会导致最终发出去的两个报文中的IP和端口会一模一样,所以此时就需要将后到的那个报文的端口改一下。

如图:

【网络】数据链路层_第38张图片

客户端A和客户端B的源地址中的端口都是1025,转出去后若还用的是1025,路由器中转换表就会产生两个202.244.174.37 : 1025,所以就得改一改其中的一个端口,但是返回的时候还是会映射成原来报文中的端口。

内网穿透

就是让外网中的报文能够进入内网中,并发送给内网中的指定主机。

有很多基于NAT原理的软件,能帮我们进行从外网访问内网的工作,即内网穿透。

就是让私网中的一台主机(h1)安一个软件,定期向外网中的某台主机(h2)发一次数据,这样做的目的是让路由器中留下h1和h2地址转换关系的缓存。

此时那个h2就可以通过内网中路由器的缓存来向h1发数据。或者说另一台私网中的主机(h3)可以通过h2来间接的向h1发送数据。

像远程操控什么的,或者是我前面博客中写的那个UDP服务器实现的简易群聊功能,原理很类似。

也是感兴趣的同学自行查找。

DNS协议

DNS协议是一个应用层的协议,其作用是将域名和IP地址构建映射关系。

我们平时访问某个网站都是通过域名来访问的,比如说www.baidu,com。想要进行通信,一定是要有IP的。

我们输入了域名后不是直接就去对应公司的服务器取数据了,而是先把这个网站的域名打个包(传输层是UDP)发给域名解析服务器,域名解析服务器找到域名对应的IP后再将IP打个包发回给浏览器,浏览器再根据IP去访问对应公司的服务器来获取用户想要的数据。

【网络】数据链路层_第39张图片

我这里用ping命令来获取一下百度的IP:
【网络】数据链路层_第40张图片
ping命令想了解一下的话可以看这篇:常用网络命令:ping命令的使用。

这我也可以直接通过IP来访问百度的官网:
【网络】数据链路层_第41张图片
也可以直接pingIP:
【网络】数据链路层_第42张图片

所以说访问某个公司的服务器其实重点不是域名,而是IP。访问域名也是要先将域名转换成IP才能访问,那为什么要用域名呢?
因为IP全都是数字,不利于商业公司推广自己的服务,我们普通老百姓不懂这些数字的意思,而且想要记住这些IP数字还是有点难度的,但是www.xxx.com就不一样了,比如www.qq.com,一看到就知道是qq的官网,腾讯的,所以域名是为了让普通用户使用起来更舒服而搞出来的,但是机器不认识域名,所以要先将域名转成IP才能获取服务。

域名解析服务式有区域性的,在哪个区域就用哪个区域的服务。这个区域很像网络的划分。最顶上有一个根域名服务,然后再往下分块。

域名使用 . 连接
com: 一级域名. 表示这是一个企业域名. 同级的还有 “net”(网络提供商), “org”(非盈利组织) 等.
baidu: 二级域名, 公司名.
www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议,现在不带www也可以直接访问。

先请求你那一小块区域的,小块的区域没有就在往上找。
这里给一篇详细的,感兴趣的同学自己看看,不是什么重点:详解域名解析服务

而且同一个域名可能映射出不同的IP,因为如果一个公司比较大的话,为了需求就会多搞几个机房,这样会有多个IP,不过多个机房服务器的功能都是一样的,想了解一下这个的话可以看看这篇:
尝试Ping百度域名后的思考。

有时候qq、微信、游戏等能正常登录,但是网页却打不开,看看你是不是在用域名访问某个网站,可能是浏览器内置的DNS-IP地址对应的服务挂掉了。

代理服务器

讲讲正向代理服务器和反向代理服务器。

正向代理服务器

你学校的wifi是如何进行学生认证的?

反正我学校是搞一个页面,输入正确的学号和密码认证成功后才能连上学校的WiFi。为什么要这样做呢?

看图:
【网络】数据链路层_第43张图片

学校的服务器中实现了身份认证功能,学生的请求报文必须经过学校的服务器,当学生想要连网就要先进行认证,认证通过后才让你访问外网,不然就把你的请求拒绝掉,也就是直接将你的报文丢弃。这是第一个功能。

第二个功能是能够缓存数据,比如说学校中有一个人刚刷到一个视频,学校的服务器可以将对应的视频数据先保存在服务器上,如果有其他人也刷到了这个视频的时候就会直接从服务器中将视频数据发送给想要这个资源的主机,这样就不用再跑到外网中找资源了。效率更高一点。

第三个功能是内容审核,说好听点是为了保证学生们的身心健康,外网中的报文也必须经过服务器才能推到你手里,如果是那种色情暴力的内容就会丢掉,你就访问不了了。

第四个功能就是保证内网安全,当外网中有非法请求的时候服务器就会直接拦截掉。

这就是正向代理服务器,代理服务器一般由web服务器来承担,多是Nginx。

反向代理服务器

【网络】数据链路层_第44张图片

如果客户主机发送的请求没有进行相关的转发,可能会出现大量请求集中于公司的一台主机而导致单个主机压力过大的问题。

只需要在请求发送来的时候进行均匀的转发就行:
【网络】数据链路层_第45张图片

比如说这里通过随机转发的方式,不做任何业务处理,只负责将请求推送给后端的指定主机就行。这就是反向代理服务器。

其实就相当于一个调度器,来均衡的将客户请求发给后端主机,以免出现局部主机压力过大的问题,这样就能保证整个集群的负载均衡,如果一个公司的客户比较多,上百万或千万的,那这样也可能会导致代理服务器的压力过大,那么就可以多搞几个机房,然后每个机房都搞成上图中同样的模式,这样每个机房中的代理服务器的IP都是不同的,而一个域名可以映射多个IP,这样通过映射不同的IP就可以做到均衡的访问不同的主机:
【网络】数据链路层_第46张图片

这样一个域名就可将多个客户请求一对一转给多个代理服务器,就实现了跨机房的负载均衡。代理服务器前还会有一层防火墙,非法请求就会直接在防火墙处被拒绝掉,正常的请求才会被代理服务转发。

  • 反向代理服务器可以隐藏后端服务器的真实IP地址,提高系统的安全性。

  • 此外,反向代理服务器还可以实现负载均衡,将请求分发到多个后端服务器上,从而提高系统的性能和可靠性。

  • 反向代理服务器还可以实现缓存功能,将经常访问的数据缓存在本地,从而减少对后端服务器的访问压力,提高系统的响应速度。

说一点,不要轻易的用学校或公司的网络去访问不该访问的东西,公司或学校一般都会有代理服务器,你所有的数据会经过其中,代理服务器就会直接看到你要的数据。比如说你用公司的网络去投其他公司的简历/跳槽。行了,点到为止,不多说了。

NAT和代理服务器

路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.

代理服务器看起来和NAT设备有一点像. 客户端向代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端。

那么二者有什么区别呢?

  • 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行, 另外像迅游这样的加速器, 也是使用代理服务器.

  • 从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.

  • 从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网

  • 从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.

代理服务器是一种应用比较广的技术.
比如说 、加速器啥的。

说说加速器大概原理:

假如说你现在打开了加速器,速度快是因为其会将你的请求先发到一块离你最近的网络中,这个网络中就有一个代理服务器,代理服务器可能之前已经保存了你想要的资源,那么就直接从代理服务器中将资源发给你,如果代理服务器中没有就再到公网中找,找到了再发回代理服务器,然后代理服务器再返回给你。这些专用门用来加速的代理服务器用的人比正常网络中的人少,人家机器也好,数据返回来的速度也就会快一点。

再来说说翻_墙:

首先一点,我们所有发送到外网的请求都必须经过运营商,但外网也可以分为我们国内(后面以gn表示)的外网和国外(后面以gw表示)的外网。省和省之间的转发是随便的,运营商不会拦着,但是想要访问gw的外网运营商就会拦着你。
.
因为无论是IP还是域名都是精心规划过的,单通过IP就可以分辨出你想请求的数据是在gn还是在gw,但是香港(后面以hk表示)等特殊地区gn和gw的外网都是能直接访问的。hk这样的特殊地区的运营商和我们大陆(后面以dl表示)不一样。
.
所以如果我们想要直接访问gw的外网,没法做到,但可以在hk这样的特殊地区设置一个代理服务器(后面以fwq表示),就可以通过hk中的fwq来间接访问gw的外网:
【网络】数据链路层_第47张图片
.
如何做到呢:
【网络】数据链路层_第48张图片
怎么保证带回来的时候不被发现呢?
.
很简单,不过先来说怎么让fwq执行你的请求。假如说fwq的IP是1.1.1.1
.
应用层采用HTTPS协议,HTPP请求的报头中还是正常的GET 1.1.1.1 HTTP/1.1等字段,不过有效载荷是你想要访问的gw外网的链接什么的,比如说谷歌www.google.com,不过采用的是HTTPS,就要对这个有效载荷加密,这样打包成一个报文,就会直接将报文发送给hk的那个fwq,此时运营商看到了请求报文的报头,很正常,且TA也没有秘钥,没法对有效载荷进行解包,所以TA也就不知道里面装的是什么,也就正常的将你发给fwq的请求放走了,此时就能发给fwq了。
.

fwq获取到有效载荷并解包,一看其中是www.google.com,人家就知道你什么意思了,访问那个gw网站,然后这个gw网站对应的服务器就将数据发给了fwq,fwq接收到之后就将数据加密,封装HTTP报头,然后再转发给你。
.
此时运营商一看报文也是正常的,有效载荷也看不见,那么也就不会拦截,此时你就可以获取到fwq给你返回的报文,一获取有效载荷并解密,你就看到了gw的世界。

此处的代理服务器是一个正向代理服务器。
注意正向代理服务器是替你办事的,反向代理服务器是将请求转发给其他。

浏览器中输入url后, 发生的事情

这是一个经典的面试题. 没有固定答案,可以参考:
当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

这种开放向面试题,回答的一般套路是:

  1. 回答整体结构。上面的这个问题重点放在http/https上,不分设计到TCP。
  2. 和面试官沟通是否需要进一步讨论细节,针对细节再进行讨论,给别人表述。

总结我前面网络博客所讲的内容

数据链路层

  • 数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据

  • 以太网是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;

  • 以太网帧格式

  • 理解mac地址

  • 理解arp协议

  • 理解MTU

网络层

  • 网络层的作用: 在复杂的网络环境中确定一个合适的路径.

  • 理解IP地址, 理解IP地址和MAC地址的区别.

  • 理解IP协议格式.

  • 了解网段划分方法

  • 理解如何解决IP数目不足的问题, 掌握网段划分的两种方案. 理解私有IP和公网IP

  • 理解网络层的IP地址路由过程. 理解一个数据包如何跨越网段到达最终目的地.

  • 理解IP数据包分包的原因.

  • 了解ICMP协议.

  • 了解NAT设备的工作原理

传输层

  • 传输层的作用: 负责数据能够从发送端传输接收端.
  • 理解端口号的概念.
  • 认识UDP协议, 了解UDP协议的特点
  • 认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.
  • 掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗口, 流量控制, 拥塞控制, 延迟应答, 捎带应答特性.
  • 理解TCP面向字节流, 理解粘包问题和解决方案.
  • 能够基于UDP实现可靠传输.
  • 理解MTU对UDP/TCP的影响.

下三层(传输、网络、链路)共同解决一个问题,即将数据跨网络可靠的从主机A发给主机B上的一个进程。

应用层

  • 应用层的作用: 满足我们日常需求的网络程序, 都是在应用层
  • 能够根据自己的需求, 设计应用层协议.
  • 了解HTTP协议.
  • 理解DNS的原理和工作流程

到此结束。。。

你可能感兴趣的:(网络,网络,网络协议,linux,服务器,nginx)