python 2.7 socket.send() 通用合约

标签 python sockets networking tcp

有人可以向我解释一下 python 的 socket.send() 方法的一般契约吗? 作为教育项目的一部分,我正在制作某种流量生成器。

每当 socket.send() 方法执行时,我都会进行简单的日志记录,我会发送一些流量并记下方法完成的时间(除其他外,我会记录)。这些日志显示我发送的消息比 wireshark 显示的多,当我的传出流量相对较高时会发生这种情况。

我读过: https://docs.python.org/2/howto/sockets.html#socket-howto

如我提供的链接中所述:'它们不一定处理您交给它们(或期望从它们那里得到)的所有字节,因为它们的主要重点是处理网络缓冲区。通常,当关联的网络缓冲区已填满(发送)时,它们会返回。

如果我没理解错的话,不能保证我的消息会被准确发送。我可以读取 socket.send() 已处理 的字节数,但我想知道“已处理”究竟意味着什么。

谁能给我解释一下:

  • 我提供的链接中的网络缓冲区是什么(TCP 窗口、我网卡上的某种队列,还是其他什么?)
  • 通俗地说,socket.send() 是如何在 python 中实现的,以便我可以更好地利用它。它如何与我的硬件/操作系统交互?

最佳答案

当您使用 TCP 时,网络层确实保证您传递给 send() 的所有字节都将被实际发送(如果没有,套接字将被关闭)。但是,听起来您在计算数据包而不是字节。

您调用send() 的次数与发送的数据包数之间并不总是有关系。网络层可以自由地将您传递给 send() 的数据合并或拆分为不同大小的数据包,只要所有数据都以与发送时相同的顺序到达远程端。

如果您想更好地控制发送的数据包的数量,请使用 UDP 而不是 TCP。

关于python 2.7 socket.send() 通用合约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23922357/

相关文章:

python - 属性错误: <class> instance has no attribute

python - 如何修复open-ai健身房的环境错误?

python - 如何保持 Neo4j bolt session 打开?

ios - 如何在 RPGLE 中构建 APNS 通知?

c++ - VS2008 在网络驱动器上构建 C++ 项目

python - 如何在 PYMC3 中添加确定性向量运算?

windows - 什么是 SO_SNDBUF 和 SO_RCVBUF

Python 套接字从服务器接收到不一致的消息

iPhone 间歇性网络测试