gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:50:14 30 4
gpt4 key购买 nike

我正在学习套接字并在SOCK_SEQPACKET 通信协议(protocol)中找到数据或记录边界一词?任何人都可以简单地解释什么是数据边界以及 SOCK_SEQPACKETSOCK_STREAMSOCK_DGRAM 有何不同?

最佳答案

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

将该答案扩展到 SOCK_SEQPACKET:

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

  • 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 中作为一个单元接收。也就是说,两个逻辑消息之间的消息边界没有被保留,因此string1 将经常包含两个一起运行的 block :'FOOBAR'

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

关于sockets - TCP 和 UDP 协议(protocol)意义上的记录或数据边界是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661519/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com