learn.lianglianglee.com/专栏/全解网络协议/15 不问收没收到,就问快不快 - UDP.md.html
2022-05-11 18:57:05 +08:00

825 lines
20 KiB
HTML
Raw Permalink 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.

<!DOCTYPE html>
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link rel="icon" href="/static/favicon.png">
<title>15 不问收没收到,就问快不快 - UDP.md.html</title>
<!-- Spectre.css framework -->
<link rel="stylesheet" href="/static/index.css">
<!-- theme css & js -->
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
<div class="book-brand">
<a href="/">
<img src="/static/favicon.png">
<span>技术文章摘抄</span>
</a>
</div>
<div class="book-menu uncollapsible">
<ul class="uncollapsible">
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/专栏/全解网络协议/01 我应该站在谁的肩膀上 - OSI vs TCPIP模型.md.html">01 我应该站在谁的肩膀上 - OSI vs TCPIP模型.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/02 万丈高楼平地起- 物理层 + 数据链路层.md.html">02 万丈高楼平地起- 物理层 + 数据链路层.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/03 OSI的灵魂就是我 - 网络层.md.html">03 OSI的灵魂就是我 - 网络层.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/04 要快还是要稳你说好了 - 传输层.md.html">04 要快还是要稳你说好了 - 传输层.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/05 是时候展现真正的技术了 - 应用层.md.html">05 是时候展现真正的技术了 - 应用层.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/06 重回小学课堂 - 二进制101.md.html">06 重回小学课堂 - 二进制101.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/07 1+1 = 2吗 - 二进制的计算.md.html">07 1+1 = 2吗 - 二进制的计算.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/08 16进制又是个什么鬼 - 16进制的讲解.md.html">08 16进制又是个什么鬼 - 16进制的讲解.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/09 我想有个家 - 什么是IP地址.md.html">09 我想有个家 - 什么是IP地址.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/10 我可是住二环的人 - IP地址的组成和分类.md.html">10 我可是住二环的人 - IP地址的组成和分类.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/11 我已经没地方住了吗 - IPv6.md.html">11 我已经没地方住了吗 - IPv6.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/12 向左还是向右 - IP路由.md.html">12 向左还是向右 - IP路由.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/13 我能给你安全感 - TCP.md.html">13 我能给你安全感 - TCP.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/14 我那不为人知的秘密是什么 - TCP.md.html">14 我那不为人知的秘密是什么 - TCP.md.html</a>
</li>
<li>
<a class="current-tab" href="/专栏/全解网络协议/15 不问收没收到,就问快不快 - UDP.md.html">15 不问收没收到,就问快不快 - UDP.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/16 我为什么与众不同 - TCP高级篇拥塞模型.md.html">16 我为什么与众不同 - TCP高级篇拥塞模型.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/17 来,先看看我的家谱 - HTTP的身世.md.html">17 来,先看看我的家谱 - HTTP的身世.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/18 我都这么成功了,你却说我不行 - HTTP 的特点和缺点.md.html">18 我都这么成功了,你却说我不行 - HTTP 的特点和缺点.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/19 我老了,让我儿子来吧 - HTTP2.md.html">19 我老了,让我儿子来吧 - HTTP2.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/20 稳重的大外甥 - HTTPS.md.html">20 稳重的大外甥 - HTTPS.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/21 HTTP的高级篇 - HTTPClientJava.md.html">21 HTTP的高级篇 - HTTPClientJava.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/22 想来我家,你自己查呀 - DNS.md.html">22 想来我家,你自己查呀 - DNS.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/23 来的早,不如来得巧 - NAT.md.html">23 来的早,不如来得巧 - NAT.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/24 辛苦的邮政 - SMTP.md.html">24 辛苦的邮政 - SMTP.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/25 你就是看不见我 - VPN.md.html">25 你就是看不见我 - VPN.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/26 黑客的好帮手 - SSH.md.html">26 黑客的好帮手 - SSH.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/27 你可以得到我的心,却得不到我的人 - 物理安全设备.md.html">27 你可以得到我的心,却得不到我的人 - 物理安全设备.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/28 你怎么证明你就是你 - 身份验证和访问控制.md.html">28 你怎么证明你就是你 - 身份验证和访问控制.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/29 我要怎么藏好我的考研资料 - 网络攻击(一).md.html">29 我要怎么藏好我的考研资料 - 网络攻击(一).md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/30 我要怎么藏好我的考研资料 - 网络攻击(二).md.html">30 我要怎么藏好我的考研资料 - 网络攻击(二).md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/31 如何保护我的考研资料 - 网络攻击防范.md.html">31 如何保护我的考研资料 - 网络攻击防范.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/32 Linux网络安全 - 安全实战.md.html">32 Linux网络安全 - 安全实战.md.html</a>
</li>
<li>
<a href="/专栏/全解网络协议/33 结语.md.html">33 结语.md.html</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
let sidebar = document.querySelector('.book-sidebar')
let content = document.querySelector('.off-canvas-content')
if (sidebar_toggle.classList.contains('extend')) { // show
sidebar_toggle.classList.remove('extend')
sidebar.classList.remove('hide')
content.classList.remove('extend')
} else { // hide
sidebar_toggle.classList.add('extend')
sidebar.classList.add('hide')
content.classList.add('extend')
}
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.add('show')
overlay.classList.add('show')
}
function hide_canvas() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.remove('show')
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
<div class="column col-12 col-lg-12">
<div class="book-navbar">
<!-- For Responsive Layout -->
<header class="navbar">
<section class="navbar-section">
<a onclick="open_sidebar()">
<i class="icon icon-menu"></i>
</a>
</section>
</header>
</div>
<div class="book-content" style="max-width: 960px; margin: 0 auto;
overflow-x: auto;
overflow-y: hidden;">
<div class="book-post">
<p id="tip" align="center"></p>
<div><h1>15 不问收没收到,就问快不快 - UDP</h1>
<p>我们前两小节学习了传输层的TCP其实在同一层上存在着两名王者另一位就是UDP。一山不容二虎为什么在同一层需要TCP和UDP两个类似的协议呢那他们的区别和优势又各是什么呢</p>
<p>还是那句老话存在即合理我们之前讲的TCP在传输数据之前需要通过三次握手来确保稳定的连接然后再开始传输数据而UDP却不然。UDP是客户端说我需要数据ABC服务器会直接发送过来所以这个传输自然是没有任何的保证。他们之间没有任何的会话连接只是说我需要数据然后服务器就会给数据就是这么简单就是这么“美好”。所以这里没有三次握手没有可靠的通信没有序列号没有确认号。UDP就是用于有效率的传输当然大多数时候你不需要选择因为你没得选比如HTTP你只能使用TCP。</p>
<h3>客户就是上帝,客户是怎么选择的</h3>
<p>TCP和UDP作为传输层的两大支柱选择权当然是在更上层的客户手里也就是应用层。我们来看一下应用层是怎么抉择的。下面是一个列表</p>
<ul>
<li>HTTP</li>
<li>HTTPS</li>
<li>Telnet</li>
<li>SSH</li>
<li>FTP</li>
<li>SFTP</li>
<li>POP3</li>
<li>IMAP</li>
<li>SMTP</li>
<li>DNS</li>
<li>SNMP</li>
<li>TFTP</li>
</ul>
<p>通过列表的形式把这些表示层的协议列出来让你看的更清楚一点。我们现在一起来看一下这些并应用程序层协议以是如何使用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它是用于传输小的文件和简单的传输。</p>
<p>以上的每一个协议我们都赋予了一个传输层的端口比如常见的HTTP是80HTTPS是443。Telnet是23SSH是22FTP有两个端口分别是20,21SFTP是22。POP3使用110和995取决于不加密还是加密。同理IMAP 143端口用于不加密993用于加密。SMTP 25用于不加密587用于加密DNS使用53SNMP使用161 TFTP使用69。</p>
<p>这些协议不是使用TCP就是UDP或者是同时使用。</p>
<h3>TCP</h3>
<p>TCP基本上被以上大多数的协议所使用。TCP是非常常见的。基本上在DNS之前的所有的协议都是使用TCP。这不是由你来决定的而是那些指定和编码这些协议的创作者决定的。他们选择的就是TCP。</p>
<h3>UDP</h3>
<p>DNS,SNMP和TFTP都是使用UDP实际上DNS和SNMP既可以使用TCP也可以使用UDP。即使是这种情况你还是没有选择权那谁决定呢一般来说是由协议的创建者或者是去实现这个协议的编码人员来决定使用什么协议。基本上大多数的情况下DNS和SNMP都是使用UDP来进行通信。</p>
<p>不管你使用TCP还是UDP在下一层都是IP对不对</p>
<p>一句话来形容UDP那就是-UDP为我们提供了效率这也是我们使用它的重要原因之一。TCP在使用中有太多的开销当然这也取决于我们要完成的工作。还记得我们讲TCP的那个图像传输的例子的时候TCP具有序列号和可靠通信的机制我们可以通过TCP中的这些确认号来索取我们遗失的部分图像。但是在其他一些场景中我们并不总是需要这些开销。DNS就是这个例子。</p>
<p>DNS是Domain Name System域名系统。可以看做是IP地址和名字对应的数据库。DNS拥有一个主机名或具有映射到IP地址的域名的主机名的数据库以便我们可以访问 WWW.CSDN.net 并获取一些与之对应的IP地址以便我们构建数据包和将信息发送到该网络上。</p>
<p>你现在只需要知道DNS就是当你想获取 www.csdn.net 的主机名DNS为你提供它的IP地址。就像电话簿一样当我们有一个人的名字并且我们尝试查找他的电话号码的时候。DNS使用UDP端口53来进行查找。这意味着当我的工作站将消息发送到网络上以查找CSDN的IP地址时我们将使用UDP和端口53进行查找。让我们看看它是如何工作的。</p>
<ol>
<li>你首先要使用 ping www.csdn.net然后发送这个ping的消息就好像说CSDN的IP地址是多少这个请求就会被发送给DNS。</li>
<li>DNS服务器给你回复嘿, CSDN的IP地址是8.8.8.8 通过UDP你只需要这么两个消息一个询问一个回答。问题就已经解决了。</li>
</ol>
<p>如果你使用的是TCP呢 假设你可以重写这个DNS的查找你只允许使用TCP来完成这项工作。</p>
<ol>
<li>客户端要先发SYN消息</li>
<li>DNS服务器发回SYN-ACK消息</li>
<li>客户端又发送ACK消息</li>
<li>然后客户端发送CSDN的IP地址是多少</li>
<li>DNS服务器给你回复嘿, CSDN的IP地址是8.8.8.8</li>
<li>然后关闭这个会话客户端发送FIN消息</li>
<li>DNS服务器发回FIN-ACK消息</li>
<li>DNS服务器发另一个FIN消息</li>
<li>然后客户端发回FIN-ACK消息</li>
</ol>
<p>你来对比一下TCP和UDP之前差了多少步。所以说要安全是有代价的。UDP只需要两个消息而TCP需要9个消息。你也许会问那如果使用UDP这个DNS的查询消息丢失了怎么办它可以发送另一个请求呀。即使是发送四次一共也才8个消息吧。效率还是比TCP要高呀。所以不管什么技术没有完美的要看你的场景和你PM的需求。</p>
</div>
</div>
<div>
<div style="float: left">
<a href="/专栏/全解网络协议/14 我那不为人知的秘密是什么 - TCP.md.html">上一页</a>
</div>
<div style="float: right">
<a href="/专栏/全解网络协议/16 我为什么与众不同 - TCP高级篇拥塞模型.md.html">下一页</a>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"7099763cfdd53cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
</body>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
var path = window.location.pathname
var cookie = getCookie("lastPath");
console.log(path)
if (path.replace("/", "") === "") {
if (cookie.replace("/", "") !== "") {
console.log(cookie)
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
}
} else {
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
}
</script>
</html>