TCP 和 UDP 协议意义上的记录或数据边界是什么意思?

2023-12-07

我正在学习套接字并在中找到了“数据或记录边界”一词SOCK_SEQPACKET通讯协议?任何人都可以用简单的话解释什么是数据边界以及如何SOCK_SEQPACKET不同于SOCK_STREAM & SOCK_DGRAM ?


这个答案https://stackoverflow.com/a/9563694/1076479对消息边界有很好的简洁解释(“记录边界”的不同名称)。

将该答案扩展到SOCK_SEQPACKET:

  • SOCK_STREAM提供可靠、有序的通信streams两个对等点之间的数据。它不维护消息(记录)边界,这意味着应用程序必须在提供的流之上管理自己的边界。

  • SOCK_DGRAM提供不可靠的数据报的传输。数据报是独立的胶囊,并且它们的边界得到维护。这意味着如果您在对等点 A 上发送 20 字节缓冲区,对等点 B 将收到一条 20 字节消息。但是,它们可能会被丢弃或乱序接收,并且由应用程序来解决并处理它。

  • SOCK_SEQPACKET是一项尚未广泛使用的新技术,但试图将上述两者的优点结合起来。也就是说,它提供可靠、有序的通信,并将整个“数据报”作为一个单元进行传输(并因此保持消息边界)。

通过展示忽略消息边界时会发生什么来演示消息边界的概念是最简单的。初学者经常在 SO 上发布这样的客户端代码(为了方便使用 python):

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.4.122', 9000))
s.send(b'FOO')        # Send string 1
s.send(b'BAR')        # Send string 2
reply = s.recv(128)   # Receive reply

和服务器代码类似:

lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
lsock.bind(('', 9000))
lsock.listen(5)
csock, caddr = lsock.accept()
string1 = csock.recv(128)    # Receive first string
string2 = csock.recv(128)    # Receive second string <== XXXXXXX
csock.send(b'Got your messages') # Send reply

他们不明白为什么服务器挂在第二个recv调用,而客户端则自行挂起recv称呼。发生这种情况是因为客户端发送的两个字符串(可能)捆绑在一起并在第一个中作为单个单元接收recv在服务器端。也就是说,两个逻辑消息之间的消息边界是not保存下来,等等string1通常会包含一起运行的两个块:'FOOBAR'

(通常,代码中还有其他与时间相关的方面,会影响何时/是否实际发生。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP 和 UDP 协议意义上的记录或数据边界是什么意思? 的相关文章

  • 使用 NSOutputStream 通过套接字发送数据的正确方法

    我刚刚开始在 iOS 上进行套接字编程 我正在努力确定 的使用NSStreamEventHasSpaceAvailable活动为NSOutputStreams 一方面 苹果官方文档 清单2 https developer apple com
  • TCP 校验和可能无法检测到错误吗?如果是的话,这件事是如何处理的?

    如果 TCP 有效负载在传输过程中被损坏 则重新计算的校验和将与传输的校验和不匹配 太好了 到目前为止一切都很好 如果 TCP 校验和在传输过程中损坏 则重新计算的校验和将与现在损坏的校验和不匹配 太好了 到目前为止一切都很好 当有效负载和
  • PHP Socket Java 消息交换

    我正在尝试在 PHP 页面和正在运行的 Java 服务器之间进行通信 只是通过套接字进行简单的字符串交换 这是我处理连接的线程的 Java 代码 InputStream in clientSocket getInputStream Buff
  • Chrome 开发者工具中“网络”选项卡中的“连接”是什么意思?为什么它仅在某些网站上显示?

    我一直试图在网上寻找解释 但似乎找不到 如果您在 Chrome 上访问像 youtube com 这样的网站 并将鼠标悬停在与文件名 http www youtube com 相对应的蓝色条上 您会看到四种不同的内容 阻塞 Sending
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • 如何使用 HTML5 与 UDP 套接字通信?

    我拥有的 正在运行的 C 应用程序服务器 准备将数据发送到应该发送到 HTML5 页面或应用程序的客户端 我想要的是 考虑到 c 服务器和 HTML5 应用程序都是系统本地的 有没有办法使用 udp 端口 与 HTML5 进行通信 我知道的
  • lua-socket:unix 域套接字?

    我使用的是 lua socket 3 0rc1 3 Ubuntu Trusty 附带的 和 lua 5 1 我正在尝试监听 unix 域套接字 我能找到的唯一示例代码是this http lua users org lists lua l
  • Retrofit + Rxjava 服务器连接失败时调用onError需要很长时间

    我正在使用 Retrofit Rxjava 从服务器获取实体列表 根据我的设计 当任务失败时 它首先检查互联网连接 然后检查与服务器的连接doOnError的方法Observable 当客户端没有连接到互联网时doOnError在合理的时间
  • 当我退出应用程序时,如何删除 UNIX 域套接字文件?

    我有一个服务器应用程序 它在特定路径中创建一个 UNIX 域套接字 其名称和bind 到它 仅当我有意从应用程序代码中关闭 停止应用程序时 我才需要删除套接字 否则需要打开 我该怎么做呢 Thanks Edit 考虑一下我从终端内部启动并运
  • Android设备到PC的socket连接

    我面临着建立从 Android 设备到 PC 的特定端口的套接字连接的问题 例如8080 我只想创建一个套接字 它将连接到特定端口并在该端口上写入一些数据流 我为此目的编写了一些代码 但代码给了我一个例外 TCP Error java ne
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 多个客户端如何同时连接到服务器上的一个端口(例如 80)? [复制]

    这个问题在这里已经有答案了 我了解端口工作原理的基础知识 但是 我不明白的是多个客户端如何同时连接到端口 80 我知道每个客户端都有一个唯一的 对于他们的机器 端口 服务器是否从可用端口回复客户端 并简单地声明回复来自 80 这是如何运作的
  • 使用Powershell在断开的网卡上设置静态IP,可能吗?

    我需要在 Windows 10 上未连接到网络时设置网卡的 IP 地址 我试过了 Set NetIPAddress InterfaceAlias Ethernet IPAddress 192 168 5 10 PrefixLength 24
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • Docker 容器与主机网络的网络性能非常慢

    我遇到了 Docker 容器和主机网络之间网络性能缓慢的问题 我在 Docker 论坛上提出了这个问题 但到目前为止还没有收到答案 Problem 设置 同一本地网络上的两台 Mac 第一个运行 MQTT 代理 mosquitto 第二个运
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 最好的 Flash 音频/视频 + 交互服务器?

    我正在寻找有关 Flash 实时服务器的建议 目前 我们使用 Moock 的组合Unity http www moock org unity and Red5 http osflash org red5 但有几个问题 首先 我们正在转向 A
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成

随机推荐

  • 如何通过分页从我的mysql数据库表中每页仅显示5条记录?

    我要显示通过分页每页五个记录 mysql php html css 直到显示所有记录 导航到页面必须是这样的 页码 1 2 3 4 5 6 7 7 8 最后 这是我的代码 用于查看 emp master 表中的所有记录 我是 PHP 新手
  • 使用ajax调用php函数

    我试图在单击 HTML 按钮时调用 php 函数 我做了一些搜索 发现直接执行此操作是不可能的 我应该使用 ajax 所以这是我到目前为止的尝试 但不起作用 这是我的 test php 该函数也在这个页面中
  • 如何在 Spring MVC 控制器中处理不同的日期格式?

    是否可以在 Spring MVC 控制器中处理不同的日期格式 我知道设置这样的东西 InitBinder protected void initBinder WebDataBinder binder SimpleDateFormat dat
  • Python 文件重命名

    我的目录中有一些文件 文件 IL txt文件 IL csv文件 NY txt文件 NY csv 我将不得不重命名它们 以便它们获得序列号 例如 文件 IL txt 001文件 IL csv 001文件 NY txt 002file NY c
  • SharePoint 中的 VBA MKDIR 失败

    这是我的问题 我正在尝试在 SharePoint 共享文档库中创建一个文件夹 但它仅在我使用 使用 Windows 资源管理器打开 菜单项输入凭据后才有效 如果我告诉我的用户他们需要先这样做 他们将不会理解 所以 我的问题是 A 有没有办法
  • 安装人员绑定

    我有一些安装程序 例如 JDK 阿帕奇雄猫 MySQL MySQL GUI 等 我想将所有这些安装程序捆绑在一起成一个 exe文件 以便单个 exe 将一一遍历所有安装程序 结果将 希望 使用户尽可能轻松地安装许多软件包 MySQL 安装程
  • WebView 上的 NullPointerException (WebView.requestFocus())

    我有一个问题 在我的 Android 应用程序中 有一个 Activity 包含WebView This WebView包含播放的 Flash 内容 当我从该应用程序切换到主屏幕时 Flash 内容在后台流畅运行 当我切换到主屏幕然后关闭屏
  • file_exists 不适用于本地主机 URL

    我有这段 PHP 代码 if file exists POST current folder do something But file exists总是返回 false 传递给该函数的值是 echo POST current folder
  • 数据框中列表的 Pandas 平均值

    我有一个 pandas DataFrame 其中包含包含列表的列 我正在尝试获取本专栏中列表的含义 这是我的 DataFrame 的示例 Loc Background 0 115227854 0 000120481927711 1 1152
  • mysql C++ 中的连接崩溃

    目前 我已经实现了一个写入 mysql 数据库的程序 我也使用 Xcode 和 c 我已正确导入所有库 但在这一行收到 BAD EXCESS 错误消息 con driver gt connect tcp 127 0 0 1 3306 roo
  • 用Java解析JSON数据

    我想解析此页面中的一些数据 http www bbc co uk radio1 programmes schedules england 2013 03 1 json 我想要解析的数据是标题 但我不确定如何提取数据 这是我到目前为止所做的
  • Apache Spark 中的数据集

    Dataset
  • 如何隐藏 Firefox 窗口(Selenium WebDriver)?

    当我同时执行多个测试时 我不想让 Firefox 浏览器窗口保持可见 我可以使用以下命令将其最小化selenium minimizeWindow 但我不想这样做 有什么办法可以隐藏 Firefox 窗口吗 我正在使用 FireFox Web
  • 删除日期字符串中的前导零

    我有一个如下所示的日期字符串 2011 02 03 我想删除字符串的日期和月份部分中的前导零 我该怎么做呢 2011 02 03 replace 0 g gt 2011 2 3 Update 根据 Lucky的问题 您可以考虑其他可能有前导
  • 将单元素数组传递给 SendInput 是一个错误吗?

    给出以下代码 void foo INPUT input input type INPUT MOUSE input mi dwFlags MOUSEEVENTF LEFTDOWN SendInput 1 input sizeof input
  • Jquery - 单击文档上任意位置时隐藏

    我有一个 div 只要您在其外部单击 它就会隐藏 但我在使 div 内的某些链接正常工作 而不是隐藏 div 时遇到了一些麻烦 document click function fav hide theDiv click function e
  • 如何获取尽可能多的有关 OpenGL 上下文的信息

    世界你好 感谢您花时间阅读本文 我正在用 GTK2 3 OpenGL 编写一个程序 我运行了该程序的两个版本 a GTK 2 GtkGlext 扩展 gt 效果很好 b GTK 3 LibX11 gt 工作得很好 一切看起来都很好 除了 a
  • 为什么 Jekyll 将类别中的大写单词转换为小写字母

    graphics3d word cloud math se 这是我的类别 为什么都是小写 我怎样才能将它们变成大写 因为我计算机中的目录是大写的 enter image description here 1 还有我的头衔 WordList
  • Ejabberd sbin/ejabberdctl start(没有这样的文件或目录)

    当我安装Ejabberd时 它给出一个错误 说它没有安装成功 但后来我有了文件夹 my ejabberd 及其中的所有文件夹 我不确定这是否已 100 安装 但是当我尝试使用命令行 sbin ejabberdctl start 启动服务器时
  • TCP 和 UDP 协议意义上的记录或数据边界是什么意思?

    我正在学习套接字并在中找到了 数据或记录边界 一词SOCK SEQPACKET通讯协议 任何人都可以用简单的话解释什么是数据边界以及如何SOCK SEQPACKET不同于SOCK STREAM SOCK DGRAM 这个答案https st