有人可以向我解释一下 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/