今天来讲网络协议栈的最后一层,数据链路层(物理层我们不考虑了),我们之前学到,TCP协议提供了数据传输的可靠性,IP层决定数据报从哪到哪,那么数据报是如何从一个结点到下一个结点呢?得到相应如何返回呢?接下来博主讲解它们。下一篇博客博主将更新多路转接的知识博客了,再接下来就是关于数据库的操作,期待大家的关注~
目录
认识以太网
"以太网" 不是一种具体的网络, 而是一种技术标准;
既包含了数据链路层的内容, 也包含了一些物理层的内容.
例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
例如以太网中的网线必须使用双绞线; 传输速率有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和公网IP6、理解网络层的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的原理和工作流程
看到这里,给博主点个赞吧~
转载:https://blog.csdn.net/qq_58724706/article/details/127565466