需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。
路由器之间相互转发的是IP报文,而网线上跑的是MAC帧。跨网络传输的本质,是由无数个局域网(子网)转发的结果。那么在同一个局域网在中进行数据的转发,就需要依靠数据链路层的以太网协议。
一、MAC帧
1、IP地址和MAC地址的区别
IP地址描述的是路途总体的起点和终点;
MAC地址描述的是路途上的每一个区间的起点和终点;
2、MAC帧协议
数据链路层的MAC帧协议规定自己的有效载荷不能超过1500字节(MTU(最大传送单元,可以修改)),这1500个字节限制包括了上层报头+有效载荷。
数据包的大小只有传输层能控制,但有时仍会超过1500字节,只能由IP协议进行分片与组装来解决,发送端IP层进行分片,每一个分片都会有IP报头,对端IP层进行组装(字节超限并不是主流情况)。TCP和MAC帧并不关心IP对数据包进行了分片和组装,这仅仅是IP层自己的行为。
路由器也是主机,也有自己的最大MTU的限制,如果某个路由器的MTU为500字节,但是接收到了局域网内某个主机1500字节的报文,这是路由器就会对这个报文再次进行分片组装!
3、MTU对IP协议的影响
由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包:
1、将较大的IP包分成多个小包, 并给每个小包打上标签;
2、每个小包IP协议头的 16位标识(id) 都是相同的;
3、每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
4、到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
5、一旦这些小包中任意一个小包丢失, 接收端的重组就会失败,但是IP层不会负责重新传输数据,传输层若为TCP将超时重传,UDP将表现为丢包。
4、MTU对UDP协议的影响
1、一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。
2、这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。
5、MTU对TCP协议的影响
1、TCP的一个数据报也不能无限大, 还是受制于MTU。TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);
2、TCP在建立连接的过程中, 通信双方会进行MSS协商。
最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。
3、双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
4、然后双方得知对方的MSS值之后, 选择较小的作为最终MSS。
5、MSS的值就是在TCP首部的40字节变长选项中(kind=2)。
二、以太网协议
1、以太网中的MAC帧如何解包、分用
1.1解包
采用定长的策略。如图,报头是6+6+2=14字节,CRC校验位是4字节,解包时掐头去尾固定字节即可,剩下的就是有效载荷。
1.2分用
如图,以太网协议的MAC帧的报头里有类型字段,这个字段包含了这个报文应该向上交付给网络层中的哪一种协议。其中0800代表上层是IP协议;0806代表上层是ARP协议;8035代表上层是RARP协议等。
2、MAC地址
MAC地址共48位。全球任意一张网卡都有唯一的MAC地址。(其实MAC地址只要保证在局域网中唯一就行了)
使用ifconfig命令查看本机的MAC地址:
3、局域网中转发的原理
1、局域网中的一台主机发送了一个MAC帧,在该局域网中所有的主机都可以收到这个MAC帧,由于MAC帧中存在目的MAC地址字段,非该IP的主机的数据链路层拿到后会丢弃该MAC帧,并不会向上交付,只有目的MAC地址的主机才会收到并向上交付MAC帧。
2、在局域网中,网卡有一种“混杂模式”(默认不开启),该模式不放弃任何数据帧,从局域网中获得的所有数据帧不管目标MAC地址是不是我,全部向上交付。这也是局域网抓包工具的原理。
3、在局域网中,如果多个主机同时进行数据传输,那么总线上的模拟信号就会互相干扰,发生碰撞冲突。所以在同一时刻,局域网中只能有一台主机发送消息。为了控制局域网中同一时刻只能由一台主机发送消息,就有了多种标准对其进行控制。例如:
令牌环:令牌环网络中有一个令牌(Token)在环路上循环传递。只有持有令牌的节点才能发送数据,其他节点则监听该链路以接收数据。当节点需要发送数据时,它会将数据附加到令牌上,并将令牌继续传递下去。每个节点在接收到令牌时检查是否有附加的数据,如果有,节点就将数据提取出来并处理。
以太网:以太网使用一种称为CSMA/CD(带冲突检测的载波侦听多路访问)的协议来管理和调度数据传输。在CSMA/CD中,每个节点都监听网络上的信道来检测是否有其他节点正在发送数据。如果检测到信道空闲,则节点可以开始发送数据;否则,节点会等待一段随机时间后再次尝试发送。
可以使用某些方法不间断的在局域网中发送垃圾数据(发送垃圾数据的主机不参与碰撞检测和碰撞避免算法,就一直发),轻则局域网内其他主机数据卡顿,重则局域网瘫痪。
4、局域网越大,局域网内主机发生碰撞的概率就会增加。可以在局域网中使用交换机。首先交换机能够对局域网进行区域分割,例如图中主机A、D之间的数据转发将不会被交换机转发至另一侧;其次交换机能够识别局部性的碰撞,如果交换机一侧发生了碰撞,那么就不会对这个碰撞数据进行转发,该次碰撞将不会影响另一侧的数据转发。
5、对于每条MAC的数据长度,数据越长,越有可能发生碰撞,这也是MAC帧协议限制有效载荷最大是1500字节的原因。
三、ARP协议
源主机只知道目的IP却不知道目标主机的MAC地址,当报文千里迢迢来到目的IP地址后,需要找到对应的主机递交报文。在局域网通信中,必须得知道目标主机的MAC地址才能将数据封装成MAC帧。
此时目的IP的路由器通过报文只知道该报文的目的IP,想知道这个IP对应的主机MAC地址是多少,路由器就需要使用ARP协议来查找IP和MAC地址的映射关系。
1、ARP协议的介绍
ARP协议是一个介于数据链路层和网络层之间的协议。
1、在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的MAC地址。
2、ARP协议对主机的IP地址和MAC地址建立了映射关系。
1、源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
2、目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
3、每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的MAC地址。
4、ARP收到应答的时候,会以最新的应答为准。
2、ARP协议的格式
1、注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
2、硬件类型指链路层网络类型,1为以太网;
3、协议类型指要转换的地址类型,0x0800为IP地址;
4、硬件地址长度对于以太网地址为6字节;
5、协议地址长度对于和IP地址为4字节;
6、op字段为1表示ARP请求,op字段为2表示ARP应答
7、局域网中的主机可以通过ARP协议获取当前局域网中所有主机的MAC地址。
3、ARP的请求和响应
1、全F表示该字段并未设置。例如ARP请求是不知道目的以太网地址的。当ARP请求在广播时(以太网目的地之为全F),局域网内的其他主机都能接收到该MAC帧并向上交付至ARP协议。
2、这些主机接收到ARP类型的MAC帧时,根据op字段区分该ARP报文时应答还是请求。
3、当被请求主机发送ARP应答时,其他主机在数据链路层就可以通过以太网目的地址字段区分这个MAC帧是不是给我的。
4、ARP欺骗
底层是可以通过ARP欺骗窃取报文的,所但是报文通过HTTPS协议加密后,即便中间人拿到报文,没有秘钥也解不开报文。
窃取报文只是一方面,也可以利用ARP欺骗不断向某个主机(或者对局域网所有主机循环)发送ARP应答,应答的内容是路由器的IP+乱写的MAC地址,那么某个主机收到这个应答就会误以为路由器的MAC地址是你乱写的MAC地址,只要你的ARP应答不停,这台主机就上不了网。
四、RARP协议
只知道某台主机的MAC地址,不知道它的IP地址。发送RARP请求问一下局域网中的所有主机,指定MAC地址的主机将会把该请求数据帧向上交付给RARP协议,若非指定MAC的主机拿到该数据帧后发现MAC地址不符,这个MAC帧在数据链路层就被丢弃了。
五、一些重要的技术或协议
1、DNS(应用层协议,用的是UDP协议)
整个网络协议栈用的都是IP而不是域名,我们访问的百度的网址就是域名。这是因为IP对人的记忆及使用不友好,域名网址就比较直观了。DNS就是一套从域名映射为IP的系统。
例如百度的域名:
www.baidu.com
域名之间使用** . **连接
com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等。
baidu: 二级域名, 公司名。
www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议。在浏览器输入域名时可以省略。
目前计算机上仍然保留了hosts文件,在域名解析的过程中仍然会优先查找hosts文件的内容。
域名解析过程:详见《图解TCP/IP》。
2、ICMP(网络层协议)
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因。
1、确认IP包是否成功到达目标地址;
2、通知在发送过程中IP包被丢弃的原因;
3、ICMP也是基于IP协议工作的,但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
4、ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
ping命令的底层就是通过ICMP来实现的:
1、此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址;
2、ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期);
3、ping命令会先发送一个 ICMP Echo Request给对端;
4、对端接收到之后, 会返回一个ICMP Echo Reply;
ping命令是不关注端口的,因为ping命令是基于ICMP, 是在网络层;而端口号, 是传输层的内容。在ICMP中根本就不关注端口号这样的信息。
traceroute命令,也是基于ICMP协议实现, 能够打印出可执行程序主机, 一直到目标主机之前经历多少路由器:
3、代理服务器
正向代理:客户端想请求目标服务器,代理服务器代理客户端的请求去目标服务器请求资源并发送给客户端称为正向代理。(收集客户端请求,对请求进行管理)
反向代理(作为机房的入口机器):客户端想从服务端请求某一资源,代理服务器将从内网服务器集群中将结果返回给客户端,客户端是不知道请求的目标服务器是谁。
负载均衡策略:客户端可能会发送大量的数据,反向代理服务器需要合理的将数据分配给服务器集群。
作为反向代理的服务器,需要配置较高,充当软件服务的可以是Nginx(Web服务器,不做业务处理,只做转发处理),当反向代理服务器中的服务器集群将请求处理完,可以通过代理服务器将结果发回给客户端,也可以直接发回给客户端。
NAT和代理服务器的区别:
1、从应用层面上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题。代理服务器则是更贴近具体应用, 比 如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器;
2、从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换,代理服务器往往工作在应用层;
3、从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网。
4、从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上。
版权归原作者 蒋灵瑜的笔记本 所有, 如有侵权,请联系我们删除。