(学习笔记)如何理解TCP是面向字节流的协议,UDP是面向报文的协议?

news/2024/2/27 22:27:20

如何理解字节流?

之所以会说TCP是面向字节流的协议,UDP是面向报文的协议,是因为操作系统对TCP和UDP协议的发送方的机制不同,也就是问题原因在发送方

为什么UDP协议是面向报文的协议?

 当用户消息通过UDP协议传输时,操作系统不会对消息进行拆分,在组装好UDP头部后就交给网络层来处理,所以发出去的UDP报文中的数据部分就是完整的用户消息,也就是每个UDP报文就是一个用户消息的边界,这样接收方在接收到UDP报文后,读取一个UDP报文就能读取到完整的用户消息。

操作系统在接收到UDP报文后,会将其插入到队列里,队列里的每一个元素都是一个UDP报文,这样当用户调用recvfrom()系统调用读数据的时候,就会从队列中取出一个数据,然后从内核里拷贝给用户缓冲区。

 为什么说TCP是面向字节流的协议?

当用户消息通过TCP协议传输时,消息可能会被操作系统分组成多个的TCP报文,也就是一个完整的用户消息被拆分成多个TCP报文进行传输。

这时,接收方的程序如果不知道发送方发送的消息长度,也就是不知道消息的边界时,是无法读出一个有效的用户消息的,因为用户消息被拆分成多个TCP报文后,并不能像UDP那样,一个UDP报文就能代表一个完整的用户消息。

eg:

发送方准备发送[Hi][I am Xiaolin]两个消息。

在发送端,当我们调用send函数完成数据“发送”后,数据并没有真正从网络上发送出去,只是从应用程序拷贝到了操作系统的内核协议栈中。

至于什么时候真正被发送,取决于发送窗口、拥塞窗口以及当前发送缓冲区的大小等条件。也就是说,我们不能认为每次send调用发送的数据,都会作为一个完整的消息被发出。

如果考虑实际网络传输过程中的各种影响,假设发送端陆续调用send函数先后发送[Hi][I am Xiaolin]报文,那么实际的发送情况可能是以下几种:

1. 两个消息被分到同一个TCP报文

2. [I am Xiaolin]报文的部分随[Hi]在一个TCP报文中发送出去

3. [Hi]的部分随[I am Xiaolin]报文中发送出去

因此,不能认为一个用户消息对应一个TCP报文,正因为这样,TCP是面向字节流的协议。

当两个消息的某个部分内容被分到同一个TCP报文时,就是常说的TCP粘包问题,这时,接收方不知道消息的边界的话,是无法读出有效消息的。


如何解决粘包

粘包的问题出现是因为不知道一个用户消息的边界在哪,如果知道了边界在哪,接收方就可以通过边界来划分出有效的用户消息。

一般有三种方式:

  • 固定长度的消息
  • 特殊字符作为边界
  • 自定义消息结构


http://www.ppmy.cn/news/980080.html

相关文章

华为数通HCIP-ISIS原理与配置

IS-IS的基本概念 isis(中间系统到中间路由协议) 链路状态路由协议、IGP、无类路由协议; IS-IS是一种链路状态路由协议,IS-IS与OSPF在许多方面非常相似:运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此,然后建…

java8新特性精简版

文章目录 前言——用于个人cv一.java8新特性二.常用api写法1.Lambda:表达式2.方法引用3.接口中的默认方法和静态方法4.强大的Stream API1.创建Stream的常用方法——创建2.中间操作——加工3.终止操作——取出并行流与顺序流 5.Optional类6.日期时间APIDate与LocalDateTime、Loc…

端到端的视频编码方法及码率控制算法

文章目录 基于卷积神经网络的的端到端的视频编码方法自编码器 基于端到端学习的图像编码研究及进展变换量化熵编码 面向视频会议场景的 H.266/VVC 码率控制算法研究基于强化学习的视频码率自适应决策研究自适应流媒体传输技术码率自适应算法研究现状强化学习深度强化学习算法介…

【技术面试】Java八股文业余选手-下篇(持续更新)

文章目录 5. RocketMQ 消息中间件、RabbitMQ、ActiveMQ【√】5.1 RocketMQ 6. Kafka 大数据量消息中间件、ElasticSearch、ZooKeeper【√】6.1 Kafka【√】6.2 ElasticSearch 7. 分布式、研发提效、高并发、线程安全【√】7.1 分布式与集群【√】7.2 高并发、线程安全【】7.3 研…

AI数字人为千行百业赋能,具有哪些优势?

AI产业的发展迅速,促使AI数字人产业也迎来了高速发展,数字人凭借愈发逼真的形象,开始在更多的场景、行业中进行赋能,为千行百业注入新的灵魂。 现阶段,数字人理论和技术正在不断成熟,应用范围也在不断扩大&…

【Java|golang】860. 柠檬水找零

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,…

K8S初级入门系列之五-Pod的高级特性

一、前言 前一篇我们了解了Pod的基本概念和操作,本篇我们继续研究Pod的一些高级特性,包括Pod的生命周期,pod探针,pod的调度等。 二、生命周期 1、Pod的生命周期 Pod的生命周期示意图如下: 挂起(Pending)&#xff0c…

面试题-TS(五):TypeScript 中的模块是什么?如何导入和导出模块?

面试题-TS(5):TypeScript 中的模块是什么?如何导入和导出模块? 在TypeScript中,模块(Modules)是一种用于组织和管理代码的概念。模块提供了一种封装代码的方式,允许我们将相关的功能和数据组织…

基于AOP实现登录日志和操作日志(新手入门版)

基于AOP实现登录日志和操作日志 目录结构代码PostMan测试代码控制台查看输出解析成JSON如果你觉得对你有帮助的话,请点赞收藏 目录结构 代码 package com.demo.mymaintest.constants;import java.lang.annotation.Documented; import java.lang.annotation.ElementT…

【Linux】解压缩文件命令(7z、zip,tar等)

【Linux】简洁的解压缩文件命令(7z、zip,tar等) 文章目录 【Linux】简洁的解压缩文件命令(7z、zip,tar等)1. ZIP 压缩和解压:2. 7z 压缩和解压:3. GZIP4. TAR5. BZIP2 1. ZIP 压缩和…

如何在 Outlook 中将导航栏从左侧移动到底部?

对于最新版本的 Outlook 的用户,这是 Microsoft 365 MSO(版本 2211 内部版本 16.0.15831.20098),您可以更快地完成工作。 Office 刚刚在最新版本的 Outlook 365 中添加了一个选项。由于这次更新,您只需单击几下即可将导…

无需一行代码,轻松分析微信小程序产品体验

前言 最近一直在优化产品指标,主要围绕提升小程序提升拉新、留存、付费转化率三个方面。主要方法是使用 We 分析数据平台做数据埋点,然后做漏洞分析和事件分析,针对性去调整优化,但是对于我来说数据颗粒度还是不够细(…

【通讯录】--C语言

通讯录--C语言 一、初始版本二、动态扩容版本三、文件版(可长期保存数据) 用c语言实现一个通讯录的系统,并且存储若干人的信息,每个人的信息包括: 姓名,性别,年龄,电话号码&#xff…

国外资深iOS开发者对 WWDC 2022 的三大愿望

随着 Apple宣布今年 6 月 6 日至 10 日的 WWDC 周,让我们深入了解我希望看到的新框架、API 和工具,以及通过示例使用它们的感觉。 每年都有一个非常特殊的时期,特定的一群人正在许愿,并对各种事情抱有希望。有些人与他人分享他们的愿望,有些人只是将他们隐藏在脑海中,如果…

通过 EXPLAIN 分析 SQL 的执行计划

通过 EXPLAIN 分析 SQL 的执行计划 EXPLAIN SELECTleave_station_area_id,ROUND( ( SUM( station_dist ) / 1000 ) / ( SUM( station_travel_time ) / 60 ), 2 ) evnPeakAvgSpeedFROMV3_SHIFT_ANALYSISWHERESTAT_DATE DATE_SUB( CURRENT_DATE, INTERVAL 1 DAY )AND LEAVE_STA…

ChatGLM-6B 部署与 P-Tuning 微调实战-使用Pycharm实战

国产大模型ChatGLM-6B微调部署入门-使用Pycharm实战 1.ChatGLM模型介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本…

C++-stack 和 queue

stack 和 queue介绍 两者分别是C当中的 栈和队列,只不过在C当中,这两者没有用传统的方式,比如顺序存储和链式存储来实现了,两者现在使用的是一种权限的方式来实现; 都是用容器适配器来实现,开发者考虑到&a…

SpringBoot复习:(2)Tomcat容器是怎么启动的?

SpringApplication的run方法包含如下代码: 其中调用的refreshContext代码如下: 其中调用的refresh方法片段如下: 其中调用的refresh方法代码如下: 其中调用的super.refresh方法代码如下: public void refresh() th…

VDD_NETS电压如何设置

ir drop如何计算 redhawk: static analysis(含功耗计算公式) # user guide语法: VDD_NETS {<Vdd_domain_net_name> <value_Volts> {<equiv_Vdd_net_name1> … } … } where <Vdd_domain_net_name>:specifies DEF na

商城-学习整理-基础-前端(四)

目录 一、技术栈介绍二、ES61、简介2、什么是ECMAScript3、ES6 新特性1、let 声明变量2、const 声明常量&#xff08;只读变量&#xff09;3、解构表达式1&#xff09;数组解构2&#xff09;对象解构 4、字符串扩展1&#xff09;、几个新的 API2&#xff09;、字符串模板 5、函…
最新文章