当前位置: 首页 > news >正文

计算机网络--数据链路层

                     

        今天来讲网络协议栈的最后一层,数据链路层(物理层我们不考虑了),我们之前学到,TCP协议提供了数据传输的可靠性,IP层决定数据报从哪到哪,那么数据报是如何从一个结点到下一个结点呢?得到相应如何返回呢?接下来博主讲解它们。下一篇博客博主将更新多路转接的知识博客了,再接下来就是关于数据库的操作,期待大家的关注~

目录

认识以太网

以太网帧格式

认识MAC地址

对比理解MAC地址和IP地址

认识MTU

MTU对UDP协议的影响

MTU对于TCP协议的影响

MSS和MTU的关系

ARP协议

为什么要有ARP协议?

ARP数据报的格式

ARP协议的工作流程

NAT技术

NAT技术背景

NAT IP转换过程

NAPT

NAT技术的缺陷

NAT和代理服务器

那么NAT和代理服务器的区别有哪些呢?

正向代理服务器

正向代理服务器

翻墙原理

检测一个子网中上网的私有IP

总结

数据链路层--数据帧

网络层--数据报

传输层--数据段

应用层--request/response


认识以太网

"以太网" 不是一种具体的网络, 而是一种技术标准;

既包含了数据链路层的内容, 也包含了一些物理层的内容.

例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

以太网帧格式

源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
帧协议类型字段有三种值,分别对应IP、ARP、RARP;
帧末尾是CRC校验码。 

认识MAC地址

MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节。 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改。 mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).

对比理解MAC地址和IP地址

IP地址描述的是路途总体的 起点 和 终点

在数据报不断转发的过程中,目的IP是不会改变的,源IP地址可能会发生改变(NAT技术)。

MAC地址描述的是路途上的每一个区间的起点和终点

在数据帧报头中,每经过一个区间,源地址和目的地址是一直改变的。

注意:

        虽然MAC地址在全球范围内表示唯一,但是我们并不用MAC地址代替IP去查找主机,事实上,MAC用于子网内主机匹配搜索,不用于跨网络搜索。

认识MTU

MTU相当于发快递时对包裹尺寸的限制。 这个限制是不同的数据链路对应的物理层, 产生的限制

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

2、最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
3、如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);

4、不同的数据链路层标准的MTU是不同的。

MTU对UDP协议的影响

        一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。同时,UDP还没有可靠性机制,当数据报丢了也不会再次重传。

MTU对于TCP协议的影响

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

MSS和MTU的关系

查看硬件地址和MTU:

ARP协议

虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议;

为什么要有ARP协议?

会不会存在这样的一个场景:

       数据从一个跳到下一个路由器时,路由器是配有下一个路由器的MAC地址,但是当跳到目标主机所在的局域网中,主机B的MAC地址是没法直接获取的,那么数据就没办法再次转发了,这时候就需要用一种手段来获取主机B的MAC地址,来打破僵局。 

所以ARP技术可以解决这个问题。

ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.

      在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
      数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;因此在通讯前必须获得目的主机的硬件地址

ARP数据报的格式

注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
硬件类型:指链路层网络类型,1为以太网;
协议类型:指要转换的地址类型,0x0800为IP地址;

帧类型:是上面的数据帧报头里面的字段
硬件地址长度:对于以太网地址为6字节;
协议地址长度:对于和IP地址为4字节;
op字段:为1表示ARP请求,op字段为2表示ARP应答。

ARP协议的工作流程

请求:

        以太网目的地址首先是不知道的,所以先填充全F,代表在这个局域网内广播式传播。每台主机都会收到这个报文,然后解包向上交付,进行匹配。

       当主机B收到ARP请求报头时,首先分析OP字段,这时候收到的是1,说明是请求报头。然后对比其中的目的IP地址,如果和自己的IP地址是匹配的,那么该主机就会发送ARP报文交给主机A,告诉主机A自己的MAC地址。

响应:

       主机B响应主机A的时候,这次不再是以广播的形式发送报文,因为这时候是知道目标主机的MAC地址,这时候主机B直接把ARP报文交给主机A。 

      主机A首先检测报文中OP字段是几,这时候是2,说明它是应答报文,接着再匹配目的IP地址是否和自己匹配(这一步也可以没有),接着就可以拿到MACB地址了。

为什么不直接匹配IP地址,而是要先匹配OP字段?

因为一个主机在同一时间内可能收到多个报文,首先要区分哪些是应答报文,哪些是请求报文,如果是请求报文,这时候主机还要发送OP为2的ARP应答报文;如果是应答报文,就接着发送IP数据报文了。

NAT技术

NAT技术背景

之前我们讨论了, IPv4协议中, IP地址数量不充足的问题
NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能

NAT能够将私有IP对外通信时转为全局IP。 

也就是就是一种将私有IP和全局IP相互转化的技术方法:
很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的

NAT IP转换过程

NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;
在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系 

NAPT

         那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的。 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系

        事实上,数据报每次经过一次路由转发时,都会自动维护上面的那张表,每对映射关系互为键值,通过一侧,可以唯一的查找到另一个映射关系,这个特性和map有些像,可以类比来理解。 

        这样的话,当数据报返回时,只需要不断地查找表中映射关系,就可以不断确定返回路径。放心,每个键值对在自己的局域网中是具有唯一性的,不会出现重复的情况。

注意,这个表在路由器中并不会一直保存,一般是有时间限制的。

不难理解,每个设备连入局域网时,私有IP是会发生改变的,这样路由器维护的映射表就没有意义了。

NAT技术的缺陷

由于NAT依赖这个转换表, 所以有诸多限制:

无法从NAT外部向内部服务器建立连接;
装换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开

NAT和代理服务器

        路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程。代理服务器看起来和NAT设备有一点像。 客户端向代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端

那么NAT和代理服务器的区别有哪些呢?

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

2、从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
3、从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.

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

代理服务器是一种应用比较广的技术

翻墙: 广域网中的代理.
负载均衡: 局域网中的代理

代理服务器又分为正向代理和反向代理

正向代理服务器

我们在校园内使用校园网上网,入网前,我们都会先进性身份认证。

          我们在上网时,我们上网请求并不是直接请求服务器,而是首先把请求交给代理服务器,代理服务器进行检测,看请求是否正常后,再把请求交给服务端,服务端把响应交给代理服务器,然后再返回给客户端。

这样有什么好处呢?

1、身份认证

也就是说只有本校人可以访问学校校园网,这样就避免过多外界人访问,造成网络拥塞。

2、加速内网服务

如果在一个时间段内一个电影访问量特别多,这时候代理服务器就会在内部缓存一份,当再次有请求访问这个资源时,代理服务器就直接将缓存的资源给客户端,这样大大提高了内网服务效率。

3、可以对访问内网的请求进行筛选

校园内有很多小白用户,可能不小心点击恶意网站,这时候代理服务器就会对client的请求进行检测,如果是非法请求,那么就可以终止掉,进而保护了client。

正向代理服务器

多用于企业端。

        客户端发起大量请求,并不是直接发送给公司内网的服务器,而是先交给代理服务器,然后代理服务器根据公司各服务器的负载情况进行甄别,将服务均匀的交给服务器进行业务处理。 

这样有什么好处呢?

1、负载均衡的将请求交给后台主机

代理服务器根据后端每台机器的负载情况,进行业务转发,较为均匀的将请求打散到每台主机上。

2、安全

避免了公司内网主机直接暴露的风险,同时代理服务器也可以拦截很多恶意请求。

翻墙原理

        事实上,我们上面的做法就是骗过运营商来访问外网。如果我们访问qq,我们的请求先被运营商拿到,经过域名解析,发现IP地址是国内合法网站,于是请求建立成功,响应当然也是同样的过程。 

        当我们访问外网时,肯定不能直接去访问,因为经过运营商域名解析后,发现目标IP不是国内网站,于是就直接终止请求了。所以我们要把请求交给一种客户端软件,将我们的请求发送给能够访问外网的服务器(比如港澳台服务器),在中间,运用商拿到了我们的报文,经过解析,发现我们访问的是(假如: )111.11.1.1的IP,是合法的,当然,运营商会对我们的访问内容进行检测,这时候我们在自己的客户端把数据进行加密,不能让运营商检测出来。这时候部署的能访问外网的代理服务器解密数据(秘钥协商阶段就拿到了双方对称秘钥),根据我们的请求访问外网,把数据返回给客户端时,也是这样的过程。

客户端的大致经历过程:

检测一个子网中上网的私有IP

我们在这里纯属是为了玩,不为别的~

#!/bin/bash

sb_net='192.168.0.';
cnt=1

while [ $cnt -le 255 ]
do
  echo "ping $sb_net$cnt"
  ping -c1 $sb_net$cnt &

  let cnt++
done
[cyq@VM-0-7-centos test]$ chmod u+x find_arp.sh 

 部分截图:

总结

数据链路层--数据帧

1、数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据
2、以太网是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;

3、以太网帧格式
4、理解mac地址

5、理解arp协议
6、理解MTU

网络层--数据报

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

2、理解IP地址, 理解IP地址和MAC地址的区别.
3、理解IP协议格式.

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

6、理解网络层的IP地址路由过程. 理解一个数据包如何跨越网段到达最终目的地.
7、理解IP数据包分包的原因.(受限于数据链路层MTU的大小)

8、了解ICMP协议.
9、了解NAT设备的工作原理

传输层--数据段

1、传输层的作用: 负责数据能够从发送端传输接收端.

2、理解端口号的概念.
3、认识UDP协议, 了解UDP协议的特点.
4、认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.

5、掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗口, 流量控制, 拥塞控制, 延迟应答, 捎带应答特性.
6、理解TCP面向字节流, 理解粘包问题和解决方案.
7、能够基于UDP实现可靠传输.
8、理解MTU对UDP/TCP的影响

应用层--request/response

1、应用层的作用: 满足我们日常需求的网络程序, 都是在应用层
2、能够根据自己的需求, 设计应用层协议.

3、了解HTTP协议.
4、理解DNS的原理和工作流程

看到这里,给博主点个赞吧~

                    

相关文章:

  • 阿里巴巴面试题- - -多线程并发篇(三十三)
  • 散列表(1)-集合/用位向量实现集合
  • VS2010编译支持openssl的Libcurl
  • 【MySQL高级篇】一文带你精通数据库系统
  • 【树莓派不吃灰】Raspberry Pi上搭建NodeJS运行环境
  • 【物理应用】基于matlab麦克风阵列近场波束形成的典型方法仿真【含Matlab源码 2196期】
  • 【数据结构】ArrayList与顺序表
  • Python基础_第11章_Python面向对象高级与学生管理系统案例
  • 《SpringBoot篇》23.SpringBoot整合JavaMail实现发送邮件详解
  • 基于javaweb的精美物流管理系统(java+springboot+vue+mysql)
  • 幼儿园小程序实战开发教程(终篇)
  • Linux 命令(183)—— bg 命令(builtin)
  • Google Earth Engine APP —— 全球地表温度监测APP(时序折线图和直方图展示)按照每个月展示
  • 自定义mybatis插件实现sql日志打印
  • 【C++初阶-类和对象下】嗯...这样对劲多了
  • 03Go 类型总结
  • Angular 4.x 动态创建组件
  • canvas 五子棋游戏
  • Docker 笔记(2):Dockerfile
  • javascript 总结(常用工具类的封装)
  • Less 日常用法
  • mysql常用命令汇总
  • nfs客户端进程变D,延伸linux的lock
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Objective-C 中关联引用的概念
  • scrapy学习之路4(itemloder的使用)
  • 给第三方使用接口的 URL 签名实现
  • 聊聊flink的TableFactory
  • 排序(1):冒泡排序
  • 排序算法学习笔记
  • 如何编写一个可升级的智能合约
  • 微信小程序:实现悬浮返回和分享按钮
  • 我从编程教室毕业
  • 物联网链路协议
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​secrets --- 生成管理密码的安全随机数​
  • # 数据结构
  • #Lua:Lua调用C++生成的DLL库
  • (C++17) std算法之执行策略 execution
  • (C语言)fgets与fputs函数详解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (转)原始图像数据和PDF中的图像数据
  • (转)重识new
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .gitignore
  • .NET : 在VS2008中计算代码度量值
  • .NET MVC 验证码
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C# 使窗口永不获得焦点
  • .NET开源快速、强大、免费的电子表格组件