Python中的TCP套接字行为
我在用Python做客户端和服务器之间的通信。如果我从服务器一次性发送10MB的数据给客户端,客户端能处理这么大的数据包吗?假设客户端在1分钟后才开始读取数据。比如,我建立了连接,然后把10MB的信息发送给客户端,但客户端只能在1分钟后或更久才收到这个消息。TCP的缓冲区有多大?会不会出现数据丢失(缓冲区溢出)?这样会不会导致服务器卡住?
time.sleep(60)
self.request.recv( 20480 )
1 个回答
3
TCP是一种面向流的协议,而不是面向数据包的协议,所以在TCP中谈论“一个数据包”是没有意义的。虽然数据在网络的底层确实会以IP数据包的形式发送,但TCP层会确保你无法知道数据是如何被分割成数据包并在接收端重新组装的。
TCP的缓冲区大小并没有一个标准的规定,但如果服务器在缓冲区满的时候不从套接字读取数据,客户端就会停止发送数据。换句话说,TCP会进行流量控制。在这种情况下,可能会导致客户端“挂掉”。
你应该做的是不断地从客户端发送一些可管理大小的数据块(比如8k),同时在服务器上不断读取数据。如果你需要这些数据,应该在服务器端的程序中进行缓冲。正如我所说,TCP并不是处理数据包的。