Computer Network

常见网络协议

常见网络协议

NetworkARPDNSSMTPNATICMPCDNFTPIMAP

ARP

ARP协议其实就是通过已知的IP地址获取对应MAC地址的一种机制。

在网络传输的过程中,最开始的集线器使得发送的消息都是广播,无法做到A -> B的私密通信。

因此引入了MAC地址,MAC地址是48位,前24位是厂商的标识,后24位一般为厂商对应的序列号。MAC地址在全球范围内都唯一。

这样A 发送消息给 B时就能加上MAC头,记录消息的源MAC和目标MAC。在集线器广播时,每台主机收到消息后将数据包拆开看看目的MAC是否是自己,不是自己MAC的请求就不会接收。

但这样依然会有问题:就是不属于自己的消息,仍然会收到,只是我拒绝接收了而已,并且每次都需要拆开数据包拿到MAC信息才能知道是否是自己的数据

因此交换机出现了,替代了集线器。交换机内部维护了一张表,该表记录了交换机端口 -> MAC地址的映射关系。

一开始表是空的,交换机就会将消息广播出去,当对应的设备响应时,他就会记录这个流量,知道这个设备连接的是交换机的哪个接口,并且他的MAC地址是多少。等下次向她发消息时,交换机就能通过缓存的映射表直接将消息从对应端口转发到对应设备。

但现在问题又来了,随着设备越来越多,一个交换机的端口也不够用了。因此我们将交换机的某一个端口连接另一个交换机,并将另一个交换机的设备都通过这一个端口映射。当交换机A连接的设备要发送消息到交换机B连接的设备时,交换机通过映射表将消息转发给交换机B,再由交换机B进行转发。

但是这样又引入了一个问题:你不知道你连接的交换机会有多少设备连接进来,这还是会导致连接的设备越来越多,进而缓存表的大小越来越大,总有一天会出问题。

因此你想到了更好的方案,在两个相连的交换机中间加入一个新的设备,交换机对于外部设备的消息只转发给这个设备,然后由这个设备统一转发。这个设备就是路由器。

路由器是一个拥有独立MAC地址的设备,准确的来说他的每个端口都有独立的MAC地址。但现在又引入了一个新问题:设备A在发送消息给设备B时,怎么知道应该将消息发送给路由器?

其实就是子网,设备A会判断设备B是否在同一个子网中,如果在则直接交给交换机转发,如果不在,则交给路由器转发。

那如果在同一个子网里,设备A又是怎么填充MAC头呢?他怎么知道设备B的MAC地址?其实就是通过ARP协议,每个设备会维护一个ARP表,这个表记录了ip -> MAC地址的映射关系。如果设备A没有设备B的ARP映射关系,就会广播一条ARP消息,设备B就会回复A,此时A就能缓存他的ip和mac的映射关系,下次发消息就能直接带上对应的MAC头。

那设备A又是怎么知道谁是路由器呢?答案就是设置默认网关,其实就是一个IP地址,通过ARP获取默认网关的MAC地址,当设备B不在同一个子网时,就会将目标MAC改为默认网关的MAC,请求就会发给默认网关。

路由器同样会维护一张路由表,路由表记录了记录了自己直连的网络以及对应的路由器端口的映射关系,如果设备B的ip处于路由表中记录的某个局域网中,就会从对应端口发出去。如果不在,则会将请求转给下一跳

封装层OSI/TCP-IP 层典型协议封装内容
一层封装(物理层)物理层光纤/电缆/无线将二层帧转换成电信号或光信号
二层封装(数据链路层)数据链路层Ethernet、Wi-Fi加 MAC 头、尾;源MAC、目标MAC、帧校验码(FCS)
三层封装(网络层)网络层IP加 IP 头;源IP、目标IP、TTL、协议类型
四层封装(传输层)传输层TCP、UDP加 TCP/UDP头;源端口、目标端口、序号、确认号等
应用层封装应用层HTTP、DNS应用数据本身

ARP在网络中的重要作用是为了解决IP地址和MAC地址之间的映射问题,允许高层协议透明地在同一网络段内传输数据。然而,ARP协议也存在一些不足和安全问题,值得进一步了解。

1)ARP缓存:计算机使用ARP缓存来存储IP地址到MAC地址的映射表,以减少ARP请求的频率。但是,缓存的内容会定时过期,需要重新获取。

2)ARP欺骗:ARP协议没有安全机制,这使得它容易受到ARP欺骗(ARP Spoofing/ARP Poisoning)的攻击。攻击者可以伪装成另一台主机来接收通常不属于自己的流量,从而可能窃取敏感信息或进行中间人攻击(Man-in-the-Middle Attack)。网络管理员可以通过静态绑定IP和MAC的方式或使用防ARP欺骗的工具来减轻这种安全问题。

3)ARP扫描:网络管理员也常使用ARP扫描工具来发现局域网上的所有主机。通过发送ARP请求,可以检测局域网内哪些IP地址是已使用的,并获取对应的MAC地址。

4)ARP与缓存溢出攻击:攻击者也可能通过发送大量伪造的ARP响应包来填满目标主机的ARP缓存,从而导致正常通信失败。这种攻击方式被称为ARP缓存溢出攻击(ARP Cache Poisoning)。

ARP在请求时需要广播,响应时则单播即可。这样设计是因为请求时不知道目标 MAC 只能广播,响应时已经知道请求方的 MAC 了就没必要再广播浪费带宽。


NAT

NAT是网络地址转换协议,是一种在私有网络和公共网络之间进行IP地址转换的技术。主要的作用就是解决IPV4地址短缺的问题。

在早期,由于MAC地址的局限性,它由设备生产商表示+对应序列号组成,使得它不具备地理信息。如果你要找一个特定的 MAC 地址,除非全世界的交换机都记录了所有网卡的地址(这不可能),否则你就得向全世界广播寻址。

因此就引入了IP,它通过划分子网,将一堆主机划分在不同的子网下,并且由路由器直接连接并管理部分局域网。

这样当发送消息时,如果在同一子网下就能直接通过交换机发送消息,不在同一子网,直接交给默认网关也就是路由器。

但是早期由于互联网并不想现在发展地这么繁荣,但是全球总共也才几百台计算机,而且还是大型计算机。2^32^相当于40多亿,相当于地球上的所有人都能有一台大型计算机,这在那时候是想都不敢想的。因此当时就觉得IPV4用不完,或者说即便能用完,经过的时间也会很久,早就有更完善的规则了。因此早期的分发也非常大手大脚。

因此当临近21世纪时,互联网崛起,人们终于意识到IPV4可能会不够用了,但当时IPV4已经的标准以及指定了十几年了,使用的设备也不计其数。将这些设备全部更新为新协议那么成本就太大了。

因此IPV4提出了NAT这个续命的技术。它允许一个家庭或一个公司几百台设备共用一个公网 IP,并且还规定了像 192.168.x.x 这样的地址只能在局域网内部使用,全世界都可以重复用。

NAT这种记录目前集成在路由器中,其为了维护私有IP和映射的公共IP的这种关系,设置了缓存表。

NAT的缓存表就记录了这些信息:

字段说明
内网源 IP(src_ip)发起连接的内网主机 IP
内网源端口(src_port)发起连接的内网端口
外网映射 IP(nat_ip)NAT 分配的公网 IP(或出口 IP)
外网映射端口(nat_port)NAT 分配的公网端口
目的 IP(dst_ip)内网发起的目标外部 IP
目的端口(dst_port)内网发起的目标外部端口
协议(protocol)TCP / UDP / ICMP 等
状态 / 定时器连接状态或超时信息,用于缓存过期

当局域网内的设备A想要访问外部公共服务器B时

  1. A会判断B和自己是否在同一子网内(这里显然是不在的),因此会走默认网关,也就是路由器
  2. 路由器收到请求后,查询本地NAT缓存,如果有的话自己用已完成映射的端口和ip发送请求。如果没有的话就为当前ip随机分配一个公网ip和端口,并修改请求的源ip和源端口。将请求发送出去
  3. 公网服务器收到请求后,如果有响应,将会响应到NAT分配的公网ip的对应端口上。当NAT收到响应后,再根据缓存的NAT映射表,做反向代理。

从NAT的工作流程就能知道:外部服务器是无法直接访问局域网内的设备的(必须得有对应的NAT缓存)起到了一定的安全作用,并且NAT的缓存也是会过期的,因此分配的ip和端口会变化。

NAT分为静态NAT和动态NAT。静态NAT就是指内网 -> 公网的一个固定映射,通常是手动配置。动态NAT就是由NAT动态分配的,用于临时连接。

NAT默认情况下只允许局域网内的设备访问外部服务器,而不会响应外部服务器的请求。除非配置了静态NAT或者是恰好有对应的NAT缓存(说明直接建立过连接)


ICMP

ICMP 是互联网控制消息协议(Internet Control Message Protocol)的缩写。它是一种面向无连接的协议,用于网络设备之间传递控制信息。ICMP 的主要作用是发送错误消息,报告网络通信出现的问题,同时也用于进行网络探测,比如 ping 和 tracert 工具就是使用 ICMP 协议来实现的。

工作层次

  • ICMP 工作在 网络层(IP层),和 IP 协议紧密相关。
  • ICMP 消息通常封装在 IP 数据报中,通过 IP 协议传输。

ICMP 消息类型

  • 错误报告消息:如目标不可达(Destination Unreachable)、时间超时(Time Exceeded)、参数问题(Parameter Problem)、源端口不可达(Port Unreachable)等。
  • 网络诊断:用于测试网络连通性和性能。比如ping命令,发送一个ICMP Echo Request并接受Echo Relpy

3)常见应用

  • Ping:利用 ICMP 回显请求和回显应答,实现主机之间的连通性测试。
  • Traceroute:利用 ICMP 时间超时消息,通过逐跳查询的方式来确定数据包从源到目的地所经过的路由路径。

CMP 消息分为 两大类

  1. 差错报告类(Error Messages)
    • Destination Unreachable(目标不可达)
    • Time Exceeded(超时)
    • Parameter Problem(参数问题)
    • Source Quench(源端拥塞,已废弃)
  2. 信息查询类(Query Messages)
    • Echo Request / Echo Reply(用于 ping 测试)
    • Timestamp Request / Reply(时间戳请求/回复)

每个消息由 类型(Type)代码(Code) 字段区分具体用途。

ICMP 的特点

  • 不可靠:ICMP 本身不保证消息送达。
  • 没有端口号:不同于 TCP/UDP,ICMP 不使用端口。
  • 依赖 IP:ICMP 消息必须封装在 IP 数据报中传输。
  • 常用于网络调试和诊断,也常被防火墙过滤(为了安全)。

ICMP的重定向

ICMP重定向(ICMP Redirect)的主要作用是在网络中优化路由路径。它允许路由器通知主机,有更理想的路径可以发送数据包,从而减少网络延迟和资源消耗。其工作原理是当路由器收到一个数据包并决定向另一个路由器转发该数据包时,如果它发现主机直接发送数据包到另一台路由器会更有效率,它就会发出一个ICMP重定向消息给主机,以建议更新它的路由信息。

需要注意的是ICMP的重定向自会发生在一种情况下:即主机A、R1、R2 在同一个局域网里(假设主机A要发消息,R1是他的默认网关,R1在转发时发现下一跳的R2和A在同一个局域网,因此将数据转发给R2后,给主机发送一个ICMP重定向消息,告诉主机你可以直接发送给R2。此时主机收到消息后就会更新他的路由表)

⚠️注意:不是只有路由器才有路由表,所有 IP 设备都有路由表,比如手机,电脑,服务器,容器等等,只是规模不同。

具体工作过程

a) 主机A发送一个数据包,先查自己的路由表,没有具体路由,走默认网关R1

b) R1转发该数据包发现下一跳是R2,且R2和A在同一个局域网,则转发消息的同时,发送一个ICMP重定向消息给主机A。

c) 主机A接收到ICMP重定向消息后,会更新其路由表,直接向R2发送后续的数据包。


DNS

DNS协议就是将域名转换成机器能识别的IP地址

DNS 是一棵倒着的树。

              .
            (根域)
              |
        .com  .org  .cn
              |
           example
              |
             www

1️⃣ 根域名服务器(Root Server)

全球 13 组逻辑根服务器,例如:

  • IANA
  • ICANN

它们负责告诉你:

“.com 去哪里查”

2️⃣ 顶级域名服务器(TLD)

例如:

  • .com
  • .cn
  • .org

负责告诉你:

“example.com 去哪里查”

3️⃣ 权威 DNS 服务器

真正保存域名记录的服务器。

例如某公司自己的 DNS 服务器。

DNS的完整查询流程(递归 + 迭代)

假设访问www.example.com

  1. 浏览器查缓存,包括浏览器缓存,系统缓存,本地hosts文件
  2. 客户端将域名查询请求发送给本地DNS服务器(通常是网络运营商DNS,公司内部DNS等,或者用户自己配的 8.8.8.8、114.114.114.114 这些公共 DNS),这里是递归查询
  3. 本地DNS服务器做迭代查询,
    1. 问根服务器www.example.com去哪,根服务器回应:去.com查
    2. 再去问.com对应的顶级域名服务器**www.example.com**在哪,顶级域名服务器回应:去问example.com权威DNS服务器
    3. 最终从权威DNS服务器中拿到了IP

DNS默认使用UDP,因为无需连接,且报文小,解析更快。每个DNS缓存都有TTL。

同时DNS还有负载均衡的能力,一个域名可以配多个IP,DNS 服务器返回的时候可以轮询或者根据策略选择,把流量分散到不同服务器上。

常见的 DNS 记录类型

A 记录是最基本的,把域名指向一个 IPv4 地址。AAAA 记录是指向 IPv6 地址。

CNAME 记录是别名,让一个域名指向另一个域名。比如 www.example.com 可以 CNAME 到 example.com,或者 CNAME 到 CDN 的调度域名。(同一个域名 A 记录和 CNAME 不能共存。CNAME 是独占的,有了 CNAME 就不能有其他记录类型。这是因为 CNAME 表示"这个名字是另一个名字的别名",如果同时有 A 记录,解析时会产生歧义。但子域名可以,比如 example.com 用 A 记录,www.example.com 用 CNAME 指向 CDN。)

MX 记录专门给邮件用,指定这个域名的邮件服务器是哪台。发邮件到 xxx@example.com 时,发件服务器会查 example.com 的 MX 记录,找到收件服务器的地址。

NS 记录指定这个域名的权威 DNS 服务器是谁。

TXT 记录存一些文本信息,常用来做域名所有权验证、SPF 邮件反垃圾配置这些。

DNS在解析时

  • 客户端查本地DNS服务器这里是递归,代表着我不管你如何查询,反正你要给我结果
  • 本地服务器查根/顶级/权威DNS服务器时是迭代,他的目的就是需要对方告知下一步我该问谁。

客户端之所以递归,是因为客户端能力弱(没有根服务器列表,对于网络不稳定的客户端递归逐级查询需要多次网络往返,查询延迟较高)

本地服务器之所以迭代查询,是因为本地服务器通常是运营商提供的,而运营商通常需要服务上亿人,如果用递归,那内存早就爆掉了。

因此DNS解析式采用递归+迭代的方式,减少客户端复杂度,减少整体网络延迟,即保证客户端能够尽快获得解析结果,有保证DNS服务器不会递归打爆


CDN

CDN简单点来说其实就是缓存。

对于正常的业务数据,我们一般会选择存储在Mysql中,但由于Mysql支持的qps并不算很高,为了获取更高的读写性能,引入了Redis缓存。

而对于图片这种数据,一般不会直接放在Mysql中,而是放在专门的对象存储的数据库中,比如阿里云的OSS。

而CDN则是针对于图片这类静态文件的一种缓存策略。

CDN服务的提供商,会在多个地理位置建设CDN服务器,来缓存这些静态资源,比如图片,视频,JS文件等等。

当用户发起请求时,CDN 利用 DNS 重定向的方式,将用户的请求引导到距离用户最近的、具有该内容缓存的边缘服务器。

正常情况下,当我们输入网址浏览网站时,会先通过DNS解析域名,拿到目标服务器IP,然后请求对应的网站数据。浏览器拿到数据后将页面渲染出来。因此影响首页渲染速度的关键就在于两点:DNS解析速度,以及浏览器渲染的速度。

而CDN主要就是用于去解决“浏览器渲染速度”这个点的。他主要通过将一些不常变化的静态资源如图片,视频,JS文件等,缓存到多个地理位置的服务器上。用户请求时,优先就近返回缓存内容。

CDN 怎么知道该把用户请求分配给哪个节点?这就要靠 GSLB 全局负载均衡器。GSLB 根据用户 IP 判断地理位置,再结合各节点的负载情况,选一个最合适的节点返回给用户。

实现调度有三种方式:基于 DNS 解析、基于 HTTP 重定向、基于 IP 路由。业界主流是基于 DNS 解析,也就是CNAME的方式。

为什么用 DNS?因为 DNS 天然有缓存能力。用 HTTP 302 重定向也能实现,但每次请求都要先访问 GSLB 拿重定向地址,GSLB 就成瓶颈了。DNS 不一样,解析结果会被浏览器、本地 DNS 服务器缓存,缓存期内用户再访问这个域名,压根不会打到 GSLB,直接去对应的缓存节点。

具体实现最常用的是 CNAME 方式。比如网站域名是 www.example.com,配置一条 CNAME 记录指向 CDN 的调度域名 www.example.cdn.com。用户访问时,DNS 解析先走 CNAME 跳转到 CDN 的调度系统,调度系统再返回一个最优节点的 IP。

当域名配置了CNAME后,DNS解析时权限域名服务器返回的不再是IP而是CNAME指向的域名(CDN的实现里,指向的就是CDN域名)。

拿到了这个CDN的域名后,负责管理他的权限域名服务器,就会根据用户的IP,运营商,地理位置,当前节点的负载,网络情况等。为你返回对你最友好的IP。

CDN的加速原理可以归纳为以下几点

1) 内容缓存:CDN将内容缓存到离用户更近的边缘服务器上,减少了数据传输的距离和时间,从而加快了访问速度。

2) 负载均衡:CDN通过将访问流量分散到多个服务器上,避免了单点服务器的过载,提高了服务的稳定性和响应速度。

3) 智能路由:利用智能算法选择最优路径,使数据传输更加高效,避开网络拥堵。

4) 减少回源请求:通过减少对源服务器的请求频率,降低源服务器的压力,增强整体系统的可靠性。

回源指的就是:缓存不存在或失效后,请求直接打进了源服务器(类比Redis和Mysql的关系)

CDN 不是万能的。

1)对实时性要求高的场景帮助有限,比如股票行情、实时聊天,数据变化太快,缓存没什么意义

2)小众资源命中率低,如果一个资源几乎没人访问,缓存了也是白占空间

3)HTTPS 场景下 CDN 节点需要部署证书,配置和管理成本会高一些

4)调试排查问题变复杂了,请求经过多层节点,出问题要一层层排查是源站问题还是 CDN 节点问题


FTP

FTP即File Transfer Protocol(文件传输协议),是一种用于在网络上进行文件传输的标准网络协议。它基于客户机-服务器模型,允许用户上传、下载、删除、重命名和移动服务器上的文件。FTP通过TCP/IP网络(例如互联网)运行,默认端口为21。FTP主要用途包括网站文件管理、软件更新部署以及文件共享等任务。

简单点来说FTP就是在应用层基于TCP协议的专门用来上传和下载文件的协议。主要的作用就是:

  • 把本地文件上传到服务器
  • 从服务器下载文件
  • 浏览服务器目录
  • 删除、重命名服务器文件

FTP的默认端口

  • 21端口 -> 负责控制连接(发送命令,cd,ls,登陆等)
  • 20端口 -> 负责数据连接(传文件)

FTP的核心特点就是有两条连接,一条连接负责发送命令,另一条负责真正传输文件。

这里的端口21是固定的,而数据连接的端口不一定是20

在主动模式下:服务端的数据连接端口是20,客户端是随机的

而在被动模式下:服务端和客户端都是随机端口。

这也是为什么FTP最后会渐渐被SFTP(基于SSH)给取代

FTP工作模式

  • 主动模式(Active Mode)

    • 客户端打开一个随机非特权端口并向FTP服务器的控制端口(默认21端口)发送PORT命令,服务器随后通过数据端口与客户端指定的端口建立数据连接。这种模式可能会被现代防火墙阻挡。

      简单来说就是客户端告诉服务器:你来连我的某个端口传数据。但如果客户端在NAT后面,服务端可能连不过来

  • 被动模式(Passive Mode)

    • 客户端通过控制连接向服务器发送PASV命令,服务器回复客户端它将用于数据连接的随机端口。客户端随后连接到服务器指定的这个端口,适用于穿越防火墙和NAT的情况。

      相对于主动模式,让服务端连接客户端。被动模式让客户端主动连接服务端更适合现在的NAT网络环境。

FTP的问题

FTP现在用的很少,其原因在于FTP是明文传输。用户名明文,密码明文,数据也是明文。非常不安全感

因此后来出现了

协议说明
FTPSFTP + SSL/TLS
SFTP基于 SSH 的文件传输(不是 FTP)

现在基本都用SFTP,默认端口22。

因为FTPS尽管加了加密协议,但是他仍是双连接+动态随机端口,仍然有主动/被动模式,在NAT环境下依然需要额外配置,很麻烦。加上TLS/SSL只会让他变得更加复杂。更像是给老协议打补丁

而SFTP则是重新设计,只用一个端口22,没有主动/被动模式,不需要额外开放端口,对NAT也更友好。并且SSH本身就有身份验证并且支持密码登录以及更安全的公钥登陆,加密,完整性验证。不需要额外加TLS

详细讲一下为什么现在都用SFTP

首先SFTP基于SSH,SSH支持密码登录/公钥登录(更安全)。所谓公钥登录就是将客户端的公钥保存在服务器中,登录时用私钥签名,服务端用对应公钥验签。而私钥永远不会发布在网络上,所以非常安全

其次SSH建立连接时会通过非对称加密交换密钥,生成对称加密的会话密钥,然后后续传输都适用对称加密进行数据加密

SSH第一次连接服务器时还会记录下服务器指纹,如果下次连接变了,会报错,一定程度上能防止中间人攻击

并且SSH只有一条TCP连接,并且永远是客户端主动连接服务端,这对NAT网络天然友好

这里再补充一个TFTP,他也是文件传输协议,但是它相对于FTP更简陋,更轻,更快

TFTP基于UDP,面向无连接,并且没有加密,没有登录认证,没有目录操作。仅用于传文件

默认使用端口69,连接时客户端向服务端69端口发请求,服务端会分配一个临时UDP端口,双方通过这个端口传文件(因此69只是个入口,真正传数据的端口时随机的)

常用于嵌入式系统


SMTP/IMAP

SMTP 和 IMAP 是电子邮件传输和存储的两种协议。SMTP(Simple Mail Transfer Protocol)主要用于发送邮件,而IMAP(Internet Message Access Protocol)主要用于接收和管理邮件。

SMTP 主要特点:

1)主要用于发送邮件。

2)运行在TCP端口25上(也有587和465端口用于加密通信)。

3)发送邮件后,将邮件从客户端传输到服务器。

4)邮件从一个服务器传输到另一个服务器。

IMAP 主要特点:

1)主要用于接收邮件。

2)运行在TCP端口143上(IMAP4有时用993用于加密通信)。

3)可以在服务器上查看和管理邮件,而不必下载到本地。

4)适合在多个设备上访问邮箱,因为邮件存储在服务器上。

SMTP 详细解释

SMTP 是一个传输协议,用于在电子邮件客户端和邮件服务器之间传递邮件。

1)发送邮件流程:邮件客户端通过 SMTP 将邮件传送到邮件服务器。服务器接收到邮件后,再通过 SMTP 将邮件发送到目标邮件服务器。

2)发送的特点:SMTP 通常仅用于发送邮件而不会处理接收,主要工作是在服务器之间传递的过程。

3)需要身份验证:为了预防垃圾邮件和提升安全性,现代 SMTP 传输过程通常需要实施身份验证机制。

IMAP 详细解释

IMAP 是一个访问协议,让用户能够在邮件服务器上访问和管理邮件。

1)访问模式:与 POP3 不同的是(POP3必须要下载邮件),IMAP 允许在服务器上操作邮件,并且这些操作可以在不同设备之间同步(如标记已读未读、分类、删除等)。

2)带宽和存储的优势:由于邮件保存在服务器上,只需下载需要查看的部分,所以在有限带宽环境更方便。

3)适用场景:适合多设备同步访问邮箱,例如你可以在手机、平板和电脑上同时访问同一个邮箱而不丢失邮件状态。

实际应用场景

在选择电子邮件协议时可以根据实际需求来选用 SMTP 和 IMAP:

1)企业邮件系统:通常使用 SMTP 发送邮件,而对于员工多设备访问需求,建议结合 IMAP。

2)个人邮件使用:如果需要在多个设备上访问和管理邮件,IMAP 是一个更好的选择。

3)简单邮件发送应用:如自动化通知和报警邮件发送, SMTP 可以承担其传输角色。

SMTP在发送时,比如qq发送到gmail,邮件会先通过SMTP发送到qq邮件的服务器,再由qq邮件服务器通过SMTP发送到gmail服务器

qq在发送时会进行DNS解析:

  1. 查询 gmail.com 的 MX
  2. 得到 mail server 域名
  3. 再查这个域名的 A 记录
  4. 得到 IP
  5. 建立 TCP 连接(25 端口)
  6. 用 SMTP 发送

这个MX记录是DNS的一种记录类型,表示这个域名的邮件应该发给谁。MX记录解析后返回的是服务器域名,然后再去解析A记录或者AAAA记录得到服务器IP,这样才能建立TCP连接。MX 记录本质上是 一个域名对应的邮件服务器域名 + 优先级。就是“发邮件的指路牌”,告诉你“发邮件去哪个服务器”,实际发送还需要解析成 IP。

post.comments