15 不问收没收到,就问快不快 - UDP¶
我们前两小节学习了传输层的 TCP,其实在同一层上存在着两名王者,另一位就是 UDP。一山不容二虎,为什么在同一层需要 TCP 和 UDP 两个类似的协议呢?那他们的区别和优势又各是什么呢?
还是那句老话,存在即合理,我们之前讲的 TCP 在传输数据之前需要通过三次握手来确保稳定的连接,然后再开始传输数据,而 UDP 却不然。UDP 是客户端说我需要数据 ABC,服务器会直接发送过来,所以这个传输自然是没有任何的保证。他们之间没有任何的会话连接,只是说我需要数据,然后服务器就会给数据,就是这么简单,就是这么“美好”。所以这里没有三次握手,没有可靠的通信,没有序列号,没有确认号。UDP 就是用于有效率的传输,当然大多数时候,你不需要选择,因为你没得选,比如 HTTP,你只能使用 TCP。
客户就是上帝,客户是怎么选择的¶
TCP 和 UDP 作为传输层的两大支柱,选择权当然是在更上层的客户手里,也就是应用层。我们来看一下应用层是怎么抉择的。下面是一个列表
- HTTP
- HTTPS
- Telnet
- SSH
- FTP
- SFTP
- POP3
- IMAP
- SMTP
- DNS
- SNMP
- TFTP
通过列表的形式把这些表示层的协议列出来,让你看的更清楚一点。我们现在一起来看一下这些并应用程序层协议以是如何使用 TCP 或 UDP 的。这些名词可能有点抽象,因为你不会“直接使用”http 或 Telnet。通常,你打开浏览器并访问网站,所有这些事情都是在幕后发生的。这也是我们整个网络学习的重点,这样你就可以了解那些幕后不为人知的故事。我们来一起大致过一下这些协议。Http 和 https 用于网络的传输。Telnet 和 SSH 用于远程的连接。Telnet 是没有加密的,SSH 是加密的版本。FTP 是文件传输协议和 SFTP 是安全文件传输协议。也是同一样东西的未加密和加密版本。POP3,IMAP,SMTP 这三种协议是邮件相关协议。用于接收和发送邮件。POP3 用于读取 Email,SMTP 用于发送邮件。IMAP 是一种协议用于读取和发送邮件以及一些其他的功能。我们现在的现代邮箱系统,比如 OUTLOOK 和这个 Gmail 都是使用 IMAP 而不是 POP3。然后这个 DNS 可以看做是我们的 Internet 电话簿。下面的这个 SNMP 全称是 Simple Network management protocol,这个协议是用于收集有关我们网络上设备的信息,以填充监视服务器。最后 TFTP 叫做 Trivial File Transfer Protocol,可以看做是 FTP,它是用于传输小的文件和简单的传输。
以上的每一个协议,我们都赋予了一个传输层的端口,比如常见的 HTTP 是 80,HTTPS 是 443。Telnet 是 23,SSH 是 22,FTP 有两个端口,分别是 20,21,SFTP 是 22。POP3 使用 110 和 995 取决于不加密还是加密。同理 IMAP 143 端口用于不加密,993 用于加密。SMTP 25 用于不加密,587 用于加密,DNS 使用 53,SNMP 使用 161, TFTP 使用 69。
这些协议不是使用 TCP,就是 UDP,或者是同时使用。
TCP¶
TCP 基本上被以上大多数的协议所使用。TCP 是非常常见的。基本上在 DNS 之前的所有的协议都是使用 TCP。这不是由你来决定的,而是那些指定和编码这些协议的创作者决定的。他们选择的就是 TCP。
UDP¶
DNS,SNMP 和 TFTP 都是使用 UDP,实际上 DNS 和 SNMP 既可以使用 TCP 也可以使用 UDP。即使是这种情况,你还是没有选择权,那谁决定呢,一般来说是由协议的创建者,或者是去实现这个协议的编码人员来决定使用什么协议。基本上大多数的情况下 DNS 和 SNMP 都是使用 UDP 来进行通信。
不管你使用 TCP 还是 UDP,在下一层都是 IP,对不对
一句话来形容 UDP 那就是-UDP 为我们提供了效率,这也是我们使用它的重要原因之一。TCP 在使用中有太多的开销,当然这也取决于我们要完成的工作。还记得我们讲 TCP 的那个图像传输的例子的时候,TCP 具有序列号和可靠通信的机制,我们可以通过 TCP 中的这些确认号来索取我们遗失的部分图像。但是在其他一些场景中,我们并不总是需要这些开销。DNS 就是这个例子。
DNS 是 Domain Name System 域名系统。可以看做是 IP 地址和名字对应的数据库。DNS 拥有一个主机名或具有映射到 IP 地址的域名的主机名的数据库,以便我们可以访问 \
你现在只需要知道 DNS 就是当你想获取 \
- 你首先要使用 ping \
- DNS 服务器给你回复,嘿, CSDN 的 IP 地址是 8.8.8.8 通过 UDP,你只需要这么两个消息,一个询问一个回答。问题就已经解决了。
如果你使用的是 TCP 呢? 假设你可以重写这个 DNS 的查找,你只允许使用 TCP 来完成这项工作。
- 客户端要先发 SYN 消息
- DNS 服务器发回 SYN-ACK 消息
- 客户端又发送 ACK 消息
- 然后客户端发送,嘿,CSDN 的 IP 地址是多少
- DNS 服务器给你回复,嘿, CSDN 的 IP 地址是 8.8.8.8
- 然后关闭这个会话,客户端发送 FIN 消息
- DNS 服务器发回 FIN-ACK 消息
- DNS 服务器发另一个 FIN 消息
- 然后客户端发回 FIN-ACK 消息
你来对比一下 TCP 和 UDP 之前差了多少步。所以说要安全是有代价的。UDP 只需要两个消息,而 TCP 需要 9 个消息。你也许会问,那如果使用 UDP,这个 DNS 的查询消息丢失了怎么办?它可以发送另一个请求呀。即使是发送四次,一共也才 8 个消息吧。效率还是比 TCP 要高呀。所以不管什么技术没有完美的,要看你的场景和你 PM 的需求。