TCP/IP五层模型 VS OSI参考模型
1 | 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet |
数据链路层
ARP
IP地址和MAC地址
MAC地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址
使用IP地址的IP数据报一旦交给了数据链路层,就被封装成了MAC帧,MAC帧在传送时使用的原地址和目的地址都是硬件地址,连接在通信链路上的设备(主机或者路由器)在接收MAC帧时,根据是MAC帧首部的硬件地址
1 | IP地址本质上是终点地址,它在跳过路由器的时候不会变(NAT(Network address translation)例外) |
ARP地址解析协议
地址解析协议,基本功能是透过目标设备的IP地址,查询目标设备的MAC地址
每台安装有TCP/IP协议的主机里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的
当主机A要向主机B发送IP数据报时,就先在其ARP高速缓存中查找有无主机B的IP地址,如果有,就把硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。
没有就会按照如下步骤找出主机B的硬件地址
主机A,B在同一个局域网的时候,ARP广播发送一个ARP请求分组
主机B在ARP分组中见到自己的IP地址,就会响应分组,并写入自己的硬件地址
主机A,B不在同一个局域网的时候,此时发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是当前路由器的MAC地址 这种情况称为委托ARP或ARP代理。
同网段和不同网段设备通信原理
通信实现的前提是拥有双方的IP地址和MAC地址
主机A与主机B通信,已知A的IP地址,MAC地址,B的IP地址,通过ARP获取主机B的MAC地址
网络层
ICMP协议
IP协议并不提供可靠传输,如果丢包了,IP协议并不能通知传输层是否丢包,以及丢包原因。ICMP可以完成这样的功能
- 确认IP包是否成功到达目标地址。
- 通知在发送过程中IP包被废弃的具体原因。
IP通信中如果某个IP包因为某种原因未能到达目标地址,那么这个具体原因将由ICMP负责通知
- ICMP消息类型
ICMP超时消息
IP包中有一个字段TTL(Time To Live,生存周期),它的值随着每经过一次路由器就会减1,直到0时该IP包就会被丢弃,此时IP路由器将会发送一个ICMP超时的消息给发送端主机,并通知该包已被丢弃。
- traceroute
可以显示出由执行程序的主机到达特定主机之前历经多少路由器。原理就是利用IP包的TTL从1开始按照顺序递增的同时发送UDP包,强制接收ICMP超时消息的一种方法,这样可以将所有路由器的IP地址逐一呈现。
1 | Jack-Mac-mini:~ Jack$ traceroute www.baidu.com |
ICMP回送消息
用于通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息,网络上常用的ping命令就是利用这个消息实现的。
IP协议
IP分割与重组
在数据链路层,每一条数据链路都有它的最大传输单元MTU,所以如果你传输的数据包大于数据链路层的最大传输单元,就需要对它进行分割。
如图,由于以太网的默认MTU是1500字节,因此4342字节的IP数据报无法在一个帧当中发送完成,这时路由器将此IP数据报划分成了3个分片进行发送。
经过分片之后的IP数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。因为无法保证IP数据报是否经由同一个路径传送
路径MTU发现
分片机制的不足:
- 加重路由器的负荷
- 一旦某个分片丢失,则会导致整个IP数据报作废
路径MTU:是指从发送端主机到接收端主机之间不需要分片时最大MTU的大小,即路径中存在的所有数据链中最小的MTU,就可以避免在中途的路由器上进行分片处理。
- 路径MTU发现的原理 1.首先发送端发送IP数据报时将其首部的分片禁止标志位设置1,根据这个标志位,路由器遇到需要分片才能处理的大包,也不会去分片,而是将包丢弃。
- 丢弃的时候,ICMP会回送一个不可达消息将数据链路上的MTU的值发送主机
- 发送给同一个目标主机的IP数据报会设置步骤2获取到的MTU为当前MTU,发送主机会根据这个MTU对数据报进行分片处理。如此反复,直到数据报被发送到目标主机为止,没有再收到任何ICMP,就认为最后一次ICMP所通知的MTU即是一个合适MTU。一般会缓存10分钟
应用层协议
DNS协议
DNS 是域名到 IP 地址的映射,DNS 解析使用 UDP 数据报,端口号53,并且采用明文传输的方式
客户端在向服务端发送请求时,会先将 域名 到 DNS 服务器映射出 IP 地址,然后再访问。
Mac系统下更改host文件
1 | sudo vi /etc/hosts |
DNS 解析的两种方式
- 递归查询 (用户向本地 DNS 服务器发起请求)
不断地自下而上遍历解析,“我去给你问一下”的方式
主机向本地域名服务器的查询采用递归查询
,如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向根域名服务器继续发出查询请求报文,而不是让主机自己进行下一步查询。因此,递归查询返回的结果或者是要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
- 迭代查询 (本地 DNS 服务器向各级域名服务器发起请求)
迭代查询 是 “我告诉你谁可能知道”的方式
本地域名服务器向根域名服务器的查询通常采用迭代查询
,当根域名服务器收到本地域名服务器发出的迭代查询请求报文是,要么给出所要查询的IP地址,要么告诉域名服务器下一步要向哪个域名服务器进行查询。然后本地域名服务器继续进行下一步查询。
DNS优化与应用
DNS缓存
DNS存在着多级缓存,从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。DNS负载均衡(DNS重定向) DNS负载均衡技术的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时, DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问 引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的
1 | CDN(Content Delivery Network)就是利用DNS的重定向技术,DNS |
- dns-prefetch DNS Prefetch 是一种 DNS 预解析技术。当你浏览网页时,浏览器会在加载网页时对网页中的域名进行解析缓存,这样在你单击当前网页中的连接时就无需进行 DNS 的解析,减少用户等待时间,提高用户体验。
DNS 解析存在的问题
DNS 劫持
被钓鱼网站劫持,有可能返回错误的 IP,浏览的不是目标浏览器
DNS 解析转发
小的运营商可能将 DNS 解析请求转发,解析的比较慢,效率低
DNS 劫持解决办法
使用 http 协议向 DNS 服务器 80 端口进行请求
1 | HttpDNS是使用HTTP协议向DNS服务器的80端口进行请求,代替传统的DNS协议向DNS服务器的53端口进行请求,绕开了运营商的Local DNS,从而避免了使用运营商Local DNS造成的劫持和跨网问题。 |
- 长连接
找一个中间的长连 server ,在内网专线进行 Http 请求。客户端和这个长连 server通信即可。
DNS为什么使用UDP协议作为传输层协议?
主要是为了避免使用TCP协议时照成的连接时延,因为为了得到一个域名的IP地址,往往会向多个域名服务器查询,如果使用TCP协议,那么每次请求都会存在连接时延,这样使DNS服务变得很慢,因为大多数的地址查询请求,都是浏览器请求页面时发出的,这样会照成网页的等待时间过长。
使用UDP作为DNS协议的问题?
- 由于物理链路的最小MTU(最大传输单元,大于这个值会导致IP分片,IP包每次最大为1500)=576,所以为了限制报文长度不超过576,UDP的报文长度被限制在512个字节以内,这样一旦DNS的查询或者应答报文,超过了512字节,那么基于UDP的DNS协议,就会被截断为512字节,那么有可能用户得到的DNS应答就是不完整的,为了解决这个问题,可以使用TCP协议去请求报文。
- 安全问题,无法确定得到的应答一定是一个安全的应答。所以现在有了DNS over HTTPS来解决这个问题。