learn-tech/专栏/全解网络协议/15不问收没收到,就问快不快-UDP.md
2024-10-16 06:37:41 +08:00

75 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
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是安全文件传输协议。也是同一样东西的未加密和加密版本。POP3IMAPSMTP这三种协议是邮件相关协议。用于接收和发送邮件。POP3用于读取EmailSMTP用于发送邮件。IMAP是一种协议用于读取和发送邮件以及一些其他的功能。我们现在的现代邮箱系统比如OUTLOOK和这个Gmail都是使用IMAP而不是POP3。然后这个DNS可以看做是我们的Internet电话簿。下面的这个SNMP全称是Simple Network management protocol这个协议是用于收集有关我们网络上设备的信息以填充监视服务器。最后TFTP叫做Trivial File Transfer Protocol可以看做是FTP它是用于传输小的文件和简单的传输。
以上的每一个协议我们都赋予了一个传输层的端口比如常见的HTTP是80HTTPS是443。Telnet是23SSH是22FTP有两个端口分别是20,21SFTP是22。POP3使用110和995取决于不加密还是加密。同理IMAP 143端口用于不加密993用于加密。SMTP 25用于不加密587用于加密DNS使用53SNMP使用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地址的域名的主机名的数据库以便我们可以访问 WWW.CSDN.net 并获取一些与之对应的IP地址以便我们构建数据包和将信息发送到该网络上。
你现在只需要知道DNS就是当你想获取 www.csdn.net 的主机名DNS为你提供它的IP地址。就像电话簿一样当我们有一个人的名字并且我们尝试查找他的电话号码的时候。DNS使用UDP端口53来进行查找。这意味着当我的工作站将消息发送到网络上以查找CSDN的IP地址时我们将使用UDP和端口53进行查找。让我们看看它是如何工作的。
你首先要使用 ping www.csdn.net然后发送这个ping的消息就好像说CSDN的IP地址是多少这个请求就会被发送给DNS。
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的需求。