Python在发送时优化数据包。如何预防?

Python在发送时优化数据包。如何预防?,python,python-2.7,sockets,tcp,tcp-ip,Python,Python 2.7,Sockets,Tcp,Tcp Ip,我试图用python套接字一个接一个地发送3个数据包。 Python将其优化为一个或两个数据包。 我通过sleep命令阻止了它,但它需要太长的时间。 我想打开TCP urg标志,有人知道怎么做吗 或者你有另一个独奏 客户端: import socket from time import sleep IP = '127.0.0.1' PORT = 5081 BUFFER_SIZE = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_STR

我试图用python套接字一个接一个地发送3个数据包。 Python将其优化为一个或两个数据包。 我通过sleep命令阻止了它,但它需要太长的时间。 我想打开TCP urg标志,有人知道怎么做吗

或者你有另一个独奏

客户端:

import socket
from time import sleep

IP = '127.0.0.1'
PORT = 5081
BUFFER_SIZE = 1024


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, PORT))

s.send('1'*5)
#sleep( 1)
s.send('2'*5)
#sleep( 1)
s.send('3'*5)

s.close()
服务器端:

import socket

IP = '0.0.0.0'
PORT = 5081
BUFFER_SIZE = 1024


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((IP, PORT))
s.listen(1)

connection, address = s.accept()
while 1:
    #Here I expected to get the 1nd value
    data1 = connection.recv(BUFFER_SIZE)
    #end of communication
    if not data1:
        break
    print 'data1', data1

    #Here I expected to get the 2nd value,but both inputs arrived here, 22222 and 33333
    data2  = connection.recv(BUFFER_SIZE)
    print 'data2', data2

    #Here I expected to get the 3nd value
    data3  = connection.recv(BUFFER_SIZE)
    print 'data3', data3

connection.close()
谢谢
Avinoam

你甚至不应该尝试。TCP是一种流协议,应该用作表示单个字节序列的流协议。即使在系统上使用localhost时能够保持数据包的分离,但如果在不同的主机之间使用它,或者仅仅在升级TCP/IP堆栈之后使用它,数据包分离也可能会中断。一旦您的数据包通过代理或软件过滤器,任何事情都可能发生


分离流上不同对象的正确方法是使用上层协议对对象发送方进行编码,并在客户端对其进行解码。例如,如果大小后跟相关字节的字节超过一个,则网络顺序为一个或两个字节。或者您可以想象一个包含命令、标题和数据的文本协议,或者[在此处放置任何您想要的内容]

当您将缓冲区大小设置为1024时,为什么希望得到5个字节?禁用NAGLE算法:s.setsockoptsocket.IPPROTO_TCP,socket.TCP_NODELAY, 1@thebjorn-recv接受最大缓冲区大小,但如果套接字的接收缓冲区中只有这些,则它很乐意返回更小的块。它不等待1024字节。@SteffenUllrich-这还不足以停止缓冲区的聚合。TCP是一种流协议,它将同时折叠发送方和接收方的缓冲区。@tdelaney:关于应用程序或内核中的缓冲区,你是对的,但问题是关于网络上的数据包。禁用NAGLE后,发送者内核至少会尝试立即将数据作为数据包发送,而不会等待更多数据。但是,如果内核套接字缓冲区中仍有数据要发送,则会出现一个小窗口。。。它当然会将新数据与仍然未发送的数据合并。当然,TCP是流式传输的,因此您不能使用send/recv单独处理消息,但您需要实现自己的消息封装。交换机不会更改数据包。路由器可能会在IP层对TCP数据包进行分段,但不会导致TCP数据包大小的变化,因为IP片段也会在IP层的内核中重新组装,即在TCP下面。但代理之类的东西可能会在更高的层上引起变化,从而改变数据包的大小。MTU设置和PMTU也可能影响数据包大小。除此之外,我完全同意你的观点,即TCP不应被视为消息协议,而应被视为字节流。@SteffenUllrich:谢谢你的评论。我用它编辑了我的帖子。。。