Skip to content

Commit

Permalink
Site updated: 2024-07-30 09:26:47
Browse files Browse the repository at this point in the history
  • Loading branch information
Encounter005 committed Jul 30, 2024
1 parent 1448fbe commit a45ebac
Show file tree
Hide file tree
Showing 5 changed files with 325 additions and 323 deletions.
17 changes: 9 additions & 8 deletions 2024/07/26/tcp-packet/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,20 @@
<meta property="og:site_name" content="Raven&#39;s blog">
<meta property="og:description" content="什么是粘包TCP粘包问题是指在使用TCP协议进行网络通信时,客户端和服务器之间发送的数据包可能会被TCP协议栈在底层进行合并或者拆分,导致客户端接收到的数据不再是单独、完整的数据包,而是多个数据包的内容被粘在一起或者多个数据包的内容被拆分到不同的接收缓冲区中。 粘包原因1. 因为TCP是面向字节流的协议传输的数据是以流的形式,而流数据是没有明确的开始结尾边界,所以 TCP 也没办法判断哪一段流属于">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="https://s2.loli.net/2024/07/26/KCeXVIhci8MZTo6.png">
<meta property="og:image" content="https://s2.loli.net/2024/07/30/FLGRpuP6DyoK4vQ.png">
<meta property="og:image" content="https://s2.loli.net/2024/07/26/3q8MRKOo9YD7z4S.png">
<meta property="og:image" content="https://s2.loli.net/2024/07/26/blhFoOsUPANJQa2.png">
<meta property="og:image" content="https://s2.loli.net/2024/07/26/mr2BgQoTFJe4EYK.png">
<meta property="article:published_time" content="2024-07-26T13:11:21.000Z">
<meta property="article:modified_time" content="2024-07-26T13:11:21.397Z">
<meta property="article:modified_time" content="2024-07-30T01:26:31.199Z">
<meta property="article:author" content="Raven005">
<meta property="article:tag" content="C&#x2F;C++">
<meta property="article:tag" content="网络编程">
<meta property="article:tag" content="socket">
<meta property="article:tag" content="计算机网络">
<meta property="article:tag" content="Linux">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://s2.loli.net/2024/07/26/KCeXVIhci8MZTo6.png">
<meta name="twitter:image" content="https://s2.loli.net/2024/07/30/FLGRpuP6DyoK4vQ.png">


<!--- Icon Part-->
Expand Down Expand Up @@ -475,8 +475,8 @@ <h1 class="article-title-regular text-second-text-color tracking-tight text-4xl

<span class="article-date article-meta-item">
<i class="fa-regular fa-wrench"></i>&nbsp;
<span class="desktop">2024-07-26 21:11:21</span>
<span class="mobile">2024-07-26 21:11:21</span>
<span class="desktop">2024-07-30 09:26:31</span>
<span class="mobile">2024-07-30 09:26:31</span>
<span class="hover-info">Updated</span>
</span>

Expand Down Expand Up @@ -556,11 +556,12 @@ <h1 class="article-title-regular text-second-text-color tracking-tight text-4xl
<div class="article-content markdown-body px-2 sm:px-6 md:px-8 pb-8">
<h1 id="什么是粘包"><a href="#什么是粘包" class="headerlink" title="什么是粘包"></a>什么是粘包</h1><p>TCP粘包问题是指在使用TCP协议进行网络通信时,客户端和服务器之间发送的数据包可能会被TCP协议栈在底层进行合并或者拆分,导致客户端接收到的数据不再是单独、完整的数据包,而是多个数据包的内容被粘在一起或者多个数据包的内容被拆分到不同的接收缓冲区中。</p>
<h1 id="粘包原因"><a href="#粘包原因" class="headerlink" title="粘包原因"></a>粘包原因</h1><h2 id="1-因为TCP是面向字节流的协议"><a href="#1-因为TCP是面向字节流的协议" class="headerlink" title="1. 因为TCP是面向字节流的协议"></a>1. 因为TCP是面向字节流的协议</h2><p>传输的数据是以流的形式,而流数据是没有明确的开始结尾边界,所以 TCP 也没办法判断哪一段流属于一个消息;TCP协议是流式协议;所谓流式协议,即协议的内容是像流水一样的字节流,内容与内容之间没有明确的分界标志,需要认为手动地去给这些协议划分边界。</p>
<p>例如客户端每次发送N个字节给服务端,N取决于当前客户端的发送缓冲区是否有数据,比如发送缓冲区总大小为10个字节,当前有5个字节数据(例如上次要发送的数据‘loveu’)未发送完,那么此时只有5个字节的空闲空间,客户端调用发送接口发送“hello world!”其实就是只能发送“hello”给服务器,那么服务器一次性得到的数据就是“loveuhello”,而剩余的“world!”只能留给下一次发送,下一次服务器收到的就是“world!”<br><img
<p>例如客户端每次发送N个字节给服务端,N取决于当前客户端的发送缓冲区是否有数据,比如发送缓冲区总大小为10个字节,当前有5个字节数据(例如上次要发送的数据‘loveu’)未发送完,那么此时只有5个字节的空闲空间,客户端调用发送接口发送“hello world!”其实就是只能发送“hello”给服务器,那么服务器一次性得到的数据就是“loveuhello”,而剩余的“world!”只能留给下一次发送,下一次服务器收到的就是“world!”</p>
<p><img
lazyload
src="/images/loading.svg"
data-src="https://s2.loli.net/2024/07/26/KCeXVIhci8MZTo6.png"
alt="tcp-packet-1.png"
data-src="https://s2.loli.net/2024/07/30/FLGRpuP6DyoK4vQ.png"
alt="tlv1.png"
></p>
<h2 id="2-数据发送和接收速率不匹配"><a href="#2-数据发送和接收速率不匹配" class="headerlink" title="2. 数据发送和接收速率不匹配"></a>2. 数据发送和接收速率不匹配</h2><p>如果发送方发送数据的速度比接收方处理数据的速度快,就可能导致多个消息被一次性读取。比如客户端1s内发送了两次“hello world!”,服务器过了2s才接收到数据,那一次性就会读出两个“hello world”</p>
<h2 id="3-tcp底层的安全和效率机制不允许字节数特别少的小包发送频率过高"><a href="#3-tcp底层的安全和效率机制不允许字节数特别少的小包发送频率过高" class="headerlink" title="3. tcp底层的安全和效率机制不允许字节数特别少的小包发送频率过高"></a>3. tcp底层的安全和效率机制不允许字节数特别少的小包发送频率过高</h2><p>tcp会在底层累计数据长度到一定大小才一起发送,比如连续发送1字节的数据要累计到多个字节才发送,可以了解下tcp底层的<a class="link" target="_blank" rel="noopener" href="https://blog.csdn.net/m0_61567378/article/details/130886149" >Nagle算法 <i class="fa-regular fa-arrow-up-right-from-square fa-sm"></i></a></p>
Expand Down
6 changes: 3 additions & 3 deletions atom.xml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion content.json

Large diffs are not rendered by default.

Loading

0 comments on commit a45ebac

Please sign in to comment.