网络转发,本质是子网和子网之间进行转发。在学习IP之后,我们具体了解了报文从B到C为什么要先到路由器D的问题。
现在的问题是:同一个子网 中,一个主机如何把数据交给另一台主机------也就是局域网通信的问题,这就是数据链路层解决的问题。

一.认识以太网
1.什么是以太网
• "以太⽹" 不是⼀种具体的⽹络, ⽽是⼀种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理层的内容. 例如: 规定了⽹络拓扑结构, 访问控制⽅式, 传输速率等;
• 例如以太⽹中的⽹线必须使⽤双绞线; 传输速率有10M, 100M, 1000M等;
• 以太⽹是当前应⽤最⼴泛的局域⽹技术; 和以太⽹并列的还有令牌环⽹, ⽆线LAN等;
2.以太网帧和重要字段
以太网帧

无论是什么协议,我们都需要讨论两方面问题:
1.如何分离报头和有效载荷?
固定长度的协议,可以直接分离。
2.如何分用?
以太网帧中的类型会标识不同的以太网帧。
其中有效载荷部分大部分情况是IP数据报。
重要字段:
源地址,目的地址:通信双方的源MAC和目的MAC。MAC地址内置在硬件网卡中,6字节48比特位。在云服务器中我们也可以查看网络接口的MAC地址:
ifconfig
可以看到我自己的服务器以太网如下
cpp
ether 52:54:00:8e:58:76 txqueuelen 1000 (Ethernet)
帧协议字段有三种值,对应IP,ARP和RARP,帧末尾为CRC循环校验码。
对比理解MAC地址和IP地址:
1.IP地址描述的是路途总体的起点和终点
2.MAC地址描述的是路途上的每一个区间的起点和重点
MTU:
MTU相当于发快递时对包裹尺⼨的限制. 这个限制是不同的数据链路对应的物理层, 产⽣的限制.
• 以太⽹帧中的数据⻓度规定最⼩46字节,最⼤1500字节,ARP数据包的⻓度不够46字节,要在后⾯补填充位;
• 最⼤值1500称为以太⽹的最⼤传输单元(MTU),不同的⽹络类型有不同的MTU;
• 如果⼀个数据包从以太⽹路由到拨号链路上,数据包⻓度⼤于拨号链路的MTU了,则需要对数据包进⾏分⽚(fragmentation);• 不同的数据链路层标准的MTU是不同的;
MTU对IP的影响:造成IP分片,进而影响传输率和传输效率
• 将较⼤的IP包分成多个⼩包, 并给每个⼩包打上标签;
• 每个⼩包IP协议头的 16位标识(id) 都是相同的;
• 每个⼩包的IP协议头的3位标志字段中, 第2位置为0, 表⽰允许分⽚, 第3位来表⽰结束标记(当前是否是最后⼀个⼩包, 是的话置为1, 否则置为0);
• 到达对端时再将这些⼩包, 会按顺序重组, 拼装到⼀起返回给传输层;• ⼀旦这些⼩包中任意⼀个⼩包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;

MTU对UDP协议和TCP协议的影响:
• ⼀旦UDP携带的数据超过1472(1500 - 20(IP⾸部) - 8(UDP⾸部)), 那么就会在⽹络层分成多个IP数据报.
• 这多个IP数据报有任意⼀个丢失, 都会引起接收端⽹络层重组失败. 那么这就意味着, 如果UDP数据报在⽹络层被分⽚, 整个数据被丢失的概率就⼤⼤增加了.
• 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:1500
cpp
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.12.14 netmask 255.255.252.0 broadcast 10.0.15.255
inet6 fe80::5054:ff:fe8e:5876 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:8e:58:76 txqueuelen 1000 (Ethernet)
RX packets 34236575 bytes 8216424620 (8.2 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 28892352 bytes 4830897674 (4.8 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3.数据报传输时的MAC地址
局域网就是一个碰撞域 ,一个时刻只能发送一个数据帧。以太网是一个共享资源,在任意一个时刻只允许一台主机访问。不难想出,使用这个临界资源时,时间肯定越短越好------越短发生碰撞的概率越低。同样地,数据帧数量 不能太多,而数据帧长度不能太长也不能太短------以太网帧对这个范围进行了规范。
问题:在同一个局域网中,发送方如何知道接收方的MAC地址?
路由器如果不知道MAC地址,是无法进行以太网帧封装从而进行内网转发的,但我们知道,路由器大概是可以知道接收端的IP地址的。我们需要一种局域网协议实现IP地址和MAC地址的映射------ARP协议。
问题:发送端如何知道接收端的IP地址呢?路由算法等等工作;
4.ARP协议
ARP协议建⽴了主机 IP地址 和 MAC地址 的映射关系.
• 在⽹络通讯时,源主机的应⽤程序知道⽬的主机的IP地址和端⼝号,却不知道⽬的主机的硬件地址;
• 数据包⾸先是被⽹卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
• 因此在通讯前必须获得⽬的主机的硬件地址;
ARP协议帧:

• 注意到源MAC地址、⽬的MAC地址在以太⽹⾸部和ARP请求中各出现⼀次,对于链路层为以太⽹的情况是多余的,但如果链路层是其它类型的⽹络则有可能是必要的。
• 硬件类型指链路层⽹络类型,1为以太⽹;
• 协议类型指要转换的地址类型,0x0800为IP地址;
• 硬件地址⻓度对于以太⽹地址为6字节;
• 协议地址⻓度对于和IP地址为4字节;• op字段为1表⽰ARP请求,op字段为2表⽰ARP应答。
局域网中,任何主机都可以收到ARP请求,收到ARP应答
ARP报文是一个定长报文。发送ARP报文也需要进行以太网帧封装(帧类型为0806)。
op字段:标识当前的ARP是请求还是应答。
以太网目的地址在未知的情况下以全F表示(广播地址)
仿真:发起一个ARP的过程
当一个IP报文从外网到达子网的路由器,我们需要知道IPE的MAC地址。因此我们就需要ARP协议。

根据上面ARP的定位:此时为一个IP报文,先经过ARP协议
在ARP协议中:发送端以太网地址------macR,发送端IP地址------ipR,目的以太网地址FFFF....
此时ARP作为一个广播帧,开始在局域网中广播。。每一台在该局域网中的主机都会收到这个ARP,然后受理这个报文。具体做法就是在该主机的ARP层分析ARP报文的目的IP地址,如果不符合就丢弃。
主机E此时也收到这个ARP请求,发现目的IP正好是自己,于是构建一个ARP应答(OP字段为2):发送端为macE,ipE,接收端就是macR,ipR。
此时应答ARP,本局域网中的所有主机也会收到,但此时其他无关主机不会再受理,因为目的MAC不再是广播。
处理任何ARP协议,永远先看OP字段,以分辨是什么类型的ARP。此时路由器R收到这个ARP并判断出是应答,就知道了目标主机E的MAC地址。
一些细节:在一段时间内,主机会记录局域网中各个IP对应的MAC地址映射关系 arp-a
ARP的过程,会在任意相邻结点中出现。而IP地址是由路由算法生成的,只要知道IP地址就可以进行ARP得知MAC地址。
二.NAT、代理服务器和内网穿透
1.NAT
1.NAT技术是解决IP地址不够用的主要手段。
NAT能将私有IP对外通信时转为全局IP,也就是将私有IP和全局IP互相转化的技术。
许多学校,公司,家庭内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP
全局IP要求唯一,但不同子网的私有IP可以重复。
NAT的过程简单来说就是IP地址的转换。例如一个局域网内要向外发送一个报文:查到dst不是本局域网内的IP,通过默认设置转发到路由器,此时将源IP改为当前局域网路由器的公网IP,以此类推。

同样地,报文也需要从外网传输到内网。NAT的过程其实不仅仅是源IP的替换,端口号也可以进行替换------NAPT,这是解决从外转发到内的方法。只有在内网环境才会进行源IP替换。
每一个路由器中都会维护一张表:NAT转换表,会记录内网IP与公网IP 的映射关系
私有IP在全网可以重复,但是在内网是确定的,而私有IP+port=内网中的唯一进程。从外向内,公网IP具有唯一性,但是端口号不同且唯一,所以路由器IP+port=唯一。
NAT的缺陷:无法从外网直接内部,因为NAT是由内向外建立的。
转换表的生成和销毁需要开销
通信过程中一旦NAT设备异常,即使存在热备TCP连接也会全部断开。
2.代理服务器
类似于一些高校,会在自己的内网中缓存一些资源方便用户使用。关于代理服务器分为正向代理和反向代理服务器。
1.正向代理:
• 正向代理(Forward Proxy)是⼀种常⻅的⽹络代理⽅式,它位于客⼾端和⽬标服务器之间,代表客⼾端向⽬标服务器发送请求。正向代理服务器接收客⼾端的请求,然后将请求转发给⽬标服务器,最后将⽬标服务器的响应返回给客⼾端。通过这种⽅式,正向代理可以实现多种功能,如提⾼访问速度、隐藏客⼾端⾝份、实施访问控制等。

工作原理与特点:
• 客⼾端将请求发送给正向代理服务器。
• 正向代理服务器接收请求,并根据配置进⾏处理,如缓存查找、内容过滤等。
• 正向代理服务器将处理后的请求转发给⽬标服务器。
• ⽬标服务器处理请求,并将响应返回给正向代理服务器。
• 正向代理服务器将响应返回给客⼾端。• Nginx
• 缓存功能:正向代理服务器可以缓存经常访问的资源,当客⼾端再次请求这些资源时,可以直接从缓存中获取,提⾼访问速度。
• 内容过滤:正向代理可以根据预设的规则对请求或响应进⾏过滤,如屏蔽⼴告、阻⽌恶意⽹站等。
• 访问控制:通过正向代理,可以实现对特定⽹站的访问控制,如限制员⼯在⼯作时间访问娱乐⽹站。
• 隐藏客⼾端⾝份:正向代理可以隐藏客⼾端的真实IP地址,保护客⼾端的隐私。• 负载均衡:在多个⽬标服务器之间分配客⼾端请求,提⾼系统的可扩展性和可靠性。
2.反向代理:解决负载不均衡
• 反向代理服务器是⼀种⽹络架构模式,其作为Web服务器的前置服务器,接收来⾃客⼾端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客⼾端。这种架构模式可以提升⽹站性能、安全性和可维护性等

基本原理:
• 反向代理服务器位于客⼾端和Web服务器之间,当客⼾端发起请求时,它⾸先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的Web服务器,并将Web服务器的响应返回给客⼾端。在这个过程中,客⼾端并不知道实际与哪个Web服务器进⾏了交互,它只知道与反向代理服务器进⾏了通信。
3.NAT与代理服务器:
路由器往往都具备NAT设备的功能, 通过NAT设备进⾏中转, 完成⼦⽹设备和其他⼦⽹设备的通信过程. 代理服务器看起来和NAT设备有⼀点像. 客⼾端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器⼜把结果回传给客⼾端. 那么NAT和代理服务器的区别有哪些呢?
• 从应⽤上讲, NAT设备是⽹络基础设备之⼀, 解决的是IP不⾜的问题. 代理服务器则是更贴近具体应⽤, ⽐如通过代理服务器进⾏翻墙, 另外像迅游这样的加速器, 也是使⽤代理服务器.
• 从底层实现上讲, NAT是⼯作在⽹络层, 直接对IP地址进⾏替换. 代理服务器往往⼯作在应⽤层.
• 从使⽤范围上讲, NAT⼀般在局域⽹的出⼝部署, 代理服务器可以在局域⽹做, 也可以在⼴域⽹做,也可以跨⽹.
• 从部署位置上看, NAT⼀般集成在防⽕墙, 路由器等硬件设备上, 代理服务器则是⼀个软件程序, 需要部署在服务器上.代理服务器是⼀种应⽤⽐较⼴的技术.
• 翻墙: ⼴域⽹中的代理.
• 负载均衡: 局域⽹中的代理.代理服务器⼜分为正向代理和反向代理.
3、内网穿透和内网打洞
1.科学上网: 不科学的地方在于运营商内部,需要瞒过运营商。
开发一个软件,在自己的电脑。同时在一些对外开放的区域(比如US,JP),安装代理服务器。此时我们的各种访问google的请求都会被本地的特殊软件拦截获取 ,并对这些请求做加密,直接访问这个代理服务器,然后对这个加密信息做解密,访问真正的资源。
对应的,google返回资源就是这个过程的逆过程。科学上网属于正向代理。

2.内网穿透
从公网无法直接访问内网:比如一旦回家,就无法访问公司的内网环境了。内网穿透就是解决这种问题的技术。frp是专门用来进行内网穿透的端口映射的软件。原理上也只是经过了一层服务器转发。

经过NAT技术,云服务器拿到的client ip是客户端的出入口路由器的WAN口IP,并且路由器记录了NAT路由,可以直接通过ip+port访问对方而不经过云服务器,这就是p2p。内网打洞和内网穿透,原理上是一样的。

交换机:划分碰撞域,报文不会再局域网中无脑转发

三.总结
1.数据链路层
• 数据链路层的作⽤: 两个设备(同⼀种数据链路节点)之间进⾏传递数据
• 以太⽹是⼀种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理层的内容. 例如: 规定了⽹络拓扑结构, 访问控制⽅式, 传输速率等;• 以太⽹帧格式
• 理解mac地址
• 理解arp协议
• 理解MTU
2.网络层
• ⽹络层的作⽤: 在复杂的⽹络环境中确定⼀个合适的路径.
• 理解IP地址, 理解IP地址和MAC地址的区别.
• 理解IP协议格式.
• 了解⽹段划分⽅法
• 理解如何解决IP数⽬不⾜的问题, 掌握⽹段划分的两种⽅案. 理解私有IP和公⽹IP
• 理解⽹络层的IP地址路由过程. 理解⼀个数据包如何跨越⽹段到达最终⽬的地.
• 理解IP数据包分包的原因.
• 了解ICMP协议.
• 了解NAT设备的⼯作原理.
3.传输层
• 传输层的作⽤: 负责数据能够从发送端传输接收端.
• 理解端⼝号的概念.
• 认识UDP协议, 了解UDP协议的特点.
• 认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.
• 掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗⼝, 流量控制, 拥塞控制, 延迟应答, 捎带应答特
性.
• 理解TCP⾯向字节流, 理解粘包问题和解决⽅案.
• 能够基于UDP实现可靠传输.
• 理解MTU对UDP/TCP的影响.
4.应用层
• 应⽤层的作⽤: 满⾜我们⽇常需求的⽹络程序, 都是在应⽤层
• 能够根据⾃⼰的需求, 设计应⽤层协议.
• 了解HTTP协议.
• 理解DNS的原理和⼯作流程.