目录
数据链路层🌷
数据链路层:用于两个设备
(
同一种数据链路节点
)
之间进行传递;
认识以太网
- "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的;
- 内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
- 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
- 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
以太网帧格式
以太网的帧格式如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/a9a9245daadf7f559de2c43055ac736f.png)
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
- 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
- 帧末尾是CRC校验码;
认识MAC地址
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19);
- 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址;
对比理解MAC地址和IP地址
- IP地址描述的是路途总体的 起点 和 终点;
- MAC地址描述的是路途上的每一个区间的起点和终点;
认识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层不会负责重新传输数据;
![](https://i-blog.csdnimg.cn/blog_migrate/b19c519091172b49e2804f4d8a037247.png)
MTU对UDP协议的影响
让我们回顾一下
UDP
协议
:
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报;
- 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了;
MTU对于TCP协议的影响
让我们再回顾一下
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的关系:
![](https://i-blog.csdnimg.cn/blog_migrate/64bb7f769baa2421508975654426c3c5.png)
查看硬件地址和MTU
使用
ifconfifig
命令
,
即可查看
ip
地址
, mac
地址
,
和
MTU;
![](https://i-blog.csdnimg.cn/blog_migrate/ef2020f4ff3538dafd74138d0dae7001.png)
ARP协议
虽然我们在这里介绍
ARP
协议
,
但是需要强调
, ARP
不是一个单纯的数据链路层的协议
,
而是一个介于数据链路层和网络层之间的协议;
ARP协议的作用
ARP
协议建立了主机
IP
地址 和
MAC
地址 的映射关系;
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
- 因此在通讯前必须获得目的主机的硬件地址;
ARP协议的工作流程
![](https://i-blog.csdnimg.cn/blog_migrate/e59e6f0a9a0e40013e42c378a42b88bf.png)
- 源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
- 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
- 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址;
想一想
,
为什么要有缓存表
?
为什么表项要有过期时间而不是一直有效
?
再想一想
,
结合我们刚才讲的工作流程
, ARP
的数据报应该是一个什么样的格式
?
ARP数据报的格式
![](https://i-blog.csdnimg.cn/blog_migrate/3e331f20b90eb7c761ee9d369c32cd1f.png)
- 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的;
- 硬件类型指链路层网络类型,1为以太网;
- 协议类型指要转换的地址类型,0x0800为IP地址;
- 硬件地址长度对于以太网地址为6字节;
- 协议地址长度对于和IP地址为4字节;
- op字段为1表示ARP请求,op字段为2表示ARP应答;
DNS(Domain Name System)
DNS
是一整套从域名映射到
IP
的系统
DNS背景
TCP/IP
中使用
IP
地址和端口号来确定网络上的一台主机的一个程序
.
但是
IP
地址不方便记忆
;
于是人们发明了一种叫主机名的东西
,
是一个字符串
,
并且使用
hosts
文件来描述主机名和
IP
地址的关系
;
![](https://i-blog.csdnimg.cn/blog_migrate/c8e1893c163df7913bc34095af575358.png)
最初
,
通过互连网信息中心
(SRI-NIC)
来管理这个
hosts
文件的
;
- 如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网;
这样就太麻烦了
,
于是产生了
DNS
系统;
- 一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系.
- 如果新计算机接入网络, 将这个信息注册到数据库中;
- 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
至今
,
我们的计算机上仍然保留了
hosts
文件
.
在域名解析的过程中仍然会优先查找
hosts
文件的内容
;
cat /etc/hosts
域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称:
www.baidu.com
域名使用
.
连接
- com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.
- baidu: 二级域名, 公司名;
- www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议;
浏览器中输入url后, 发生的事情
这是一个经典的面试题
.
没有固定答案
,
越详细越好
.
可以参考
:
ICMP协议
ICMP
协议是一个
网络层协议
一个新搭建好的网络
,
往往需要先进行一个简单的测试
,
来验证网络是否畅通
;
但是
IP
协议并不提供可靠传输
.
如果丢包了, IP
协议并不能通知传输层是否丢包以及丢包的原因
;
ICMP功能
ICMP
正是提供这种功能的协议
; ICMP
主要功能包括
:
- 确认IP包是否成功到达目标地址;
- 通知在发送过程中IP包被丢弃的原因;
- ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
- ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
![](https://i-blog.csdnimg.cn/blog_migrate/c983f9af3d615fd605f89a0c54aec8c6.png)
ICMP的报文格式
关于报文格式
,
我们并不打算重点关注
,
大家稍微有个了解即可
.
![](https://i-blog.csdnimg.cn/blog_migrate/ecd9c7d638ffc2069a541800dae80090.png)
ICMP
大概分为两类报文
:
- 一类是通知出错原因
- 一类是用于诊断查询
![](https://i-blog.csdnimg.cn/blog_migrate/7feacc2273f216d77878c1e503818c17.png)
ping命令
![](https://i-blog.csdnimg.cn/blog_migrate/0ff08719449908f24409eccb54880d12.png)
- 注意, 此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址;
- ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期);
- ping命令会先发送一个 ICMP Echo Request给对端;
- 对端接收到之后, 会返回一个ICMP Echo Reply;
一个值得注意的坑
有些面试官可能会问
: telnet
是
23
端口
, ssh
是
22
端口
,
那么
ping
是什么端口
?
千万注意
!!!
这是面试官的圈套
![](https://i-blog.csdnimg.cn/blog_migrate/fbb57cda5aabccf05d0f8de1594a12de.png)
ping命令基于ICMP, 是在网络层.
而端口号
,
是传输层的内容
.
在
ICMP
中根本就不关注端口号这样的信息
.
traceroute命令
也是基于
ICMP
协议实现
,
能够打印出可执行程序主机
,
一直到目标主机之前经历多少路由器
.
![](https://i-blog.csdnimg.cn/blog_migrate/3f6d161017f54a8d19da9503a0d9a1ea.png)
NAT技术
NAT技术背景
之前我们讨论了
, IPv4
协议中
, IP
地址数量不充足的问题
NAT
技术当前解决
IP
地址不够用的主要手段
,
是路由器的一个重要功能
;
- NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法;
- 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
- 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;
NAT IP转换过程
![](https://i-blog.csdnimg.cn/blog_migrate/0dbc50c77d8969ecd39e49973a1b6abf.png)
- 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
来建立这个关联关系
![](https://i-blog.csdnimg.cn/blog_migrate/6e7f3f55e485ddf9446ddd2bdea13452.png)
这种关联关系也是由
NAT
路由器自动维护的
.
例如在
TCP
的情况下
,
建立连接时
,
就会生成这个表项
;
在断开连接后
,
就会删除这个表项;
NAT技术的缺陷
由于
NAT
依赖这个转换表
,
所以有诸多限制
:
- 无法从NAT外部向内部服务器建立连接;
- 装换表的生成和销毁都需要额外开销;
- 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
课外调研
: NAT
穿越
NAT和代理服务器
路由器往往都具备
NAT
设备的功能
,
通过
NAT
设备进行中转
,
完成子网设备和其他子网设备的通信过程
.
代理服务器看起来和
NAT
设备有一点像
.
客户端像代理服务器发送请求
,
代理服务器将请求转发给真正要请求的服务器;
服务器返回结果后
,
代理服务器又把结果回传给客户端
.
那么
NAT
和代理服务器的区别有哪些呢
?
- 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器;
- 从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
- 从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网;
- 从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上;
代理服务器是一种应用比较广的技术
.
- 翻墙: 广域网中的代理.
- 负载均衡: 局域网中的代理.
代理服务器又分为正向代理和反向代理
.
代购例子
花王尿不湿是一个很经典的尿不湿品牌 , 产自日本 .我自己去日本买尿不湿比较不方便 , 但是可以让我在日本工作的表姐去超市买了快递给我 . 此时超市看到的买家是我表姐, 我的表姐就是 " 正向代理 ";后来找我表姐买尿不湿的人太多了 , 我表姐觉得天天去超市太麻烦 , 干脆去超市买了一大批尿不湿屯在家里 , 如果有人来找她代购, 就直接把屯在家里的货发出去 , 而不必再去超市 . 此时我表姐就是 " 反向代理 "’
正向代理用于请求的转发(例如借助代理绕过反爬虫).
有如下优点
- 身份认证;
- 加速内网服务;
- 可以对访问内网的请求进行筛选;
反向代理往往作为一个缓存.
有如下优点:
- 负载均衡:根据后端每台机器的负载情况,进行业务转发,较为均衡的将请求打散到每台主机上;
- 安全;
翻墙的原理
我们平常使用浏览器访问某个网页的话,这个http请求报文首先会发送给运营商,运营商对其进行检测看是否有非法访问请求(外网),如果没有的话,这个请求报文会被转递给Golle服务器,服务器发送http响应报文,这个报文由运营商转递给客户端浏览器;
如果我们是访问外网的话,我们首先在自己的主机上下载一个客户端软件工具,并且能够访问部署代理服务,这个部署代理服务一般设置在港台地区,能够被内网和外网共同访问的;我们在浏览器中发送了访问外网的http请求报文,这个报文首先被客户端软件工具拿到,客户端软件工具对其进行加密,并对其添加访问部署代理服务的http报头信息,运营商对其进行检测,没有非法访问;http请求信息被部署代理服务拿到后,部署代理服务首先对其进行去报头信息,并对正文信息进行解密,将真正的http请求信息发送给Goole服务器;Goole服务器发送http响应报文,部署代理服务对信息进行加密,并添加访问客户端软件工具的http报头信息,经过封装后的报文信息运营商是不会察觉到不对的,运营商将报文转递给客户端软件工具,客户端软件工具对报文信息去掉报头,并对正文信息进行解密,将解密结果响应给浏览器;
总结
数据链路层
- 数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据
- 以太网是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑
- 结构, 访问控制方式, 传输速率等;
- 以太网帧格式
- 理解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的影响.
应用层
- 应用层的作用: 满足我们日常需求的网络程序, 都是在应用层
- 能够根据自己的需求, 设计应用层协议.
- 了解HTTP协议.
- 理解DNS的原理和工作流程