通过Python验证TCP接收缓冲区消息积压问题
2020-05-18 本文已影响0人
赵信信官属
本地实验目的
通过Python构建一个服务端和客户端通信,服务端向客户端发送数据,客户端接收数据,但是我们让客户端每次接收读取部分数据,通过ss命令观察客户端TCP接收缓冲区的大小变化.
环境
Ubuntu 5.3.0-51-generic
补充
使用命令ss可以观察TCP接收(Recv-Q)和发送(Send-Q)缓冲区
我们首先来编写服务端代码
$ python3
>>> import socket
>>> import sys
>>> server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> server.bind(('127.0.0.1',8080))
>>> server.listen(5)
>>> cli,addr=server.accept()
此时服务端会阻塞,等待客户端连接
继续编写客户端代码
$ python3
>>> import socket
>>> import sys
>>> cli = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> cli.connect(('127.0.0.1',8080))
客户端连接到服务端,我们通过ss命令查看
![](https://img.haomeiwen.com/i7779174/685bb4ac9da72eee.png)
客户端与服务端建立了连接,客户端端口32796,服务端端口8080 .
其中第二列就是表示接收缓冲区, 第三列表示发送缓冲区
接下来我们在服务端向客户端发送数据
![](https://img.haomeiwen.com/i7779174/c861c0c6bc96a156.png)
服务端向客户端发送了PythonTest这10个字符,这时候我们再通过ss命令查看下
![](https://img.haomeiwen.com/i7779174/9c65815dd6797f02.png)
我们发现,客户端的TCP接收缓冲区里面有10个字符,还没有读取.接下来客户端读取这10个字符
![](https://img.haomeiwen.com/i7779174/2ed582bf8ed0e837.png)
客户端使用1024大小的buf读取了TCP接收缓冲区里面的10个字符数据.
我们再通过ss命令查看下
![](https://img.haomeiwen.com/i7779174/626c73a8a1782f04.png)
发现客户端TCP接收缓冲区里面没有数据了,因为客户端已经读取了.
接下来服务端继续发送数据,但是客户端只读取部分数据情况
![](https://img.haomeiwen.com/i7779174/18c8960116233f04.png)
服务端发送了PythonNotAll这12个字符,我们在客户端只读取6个字符看一下会是什么情况
![](https://img.haomeiwen.com/i7779174/59e992fa8262b5c8.png)
这一次客户端只读取了6个字符,也成功读取到了.我们通过ss命令再看下客户端TCP接收缓冲区的情况
![](https://img.haomeiwen.com/i7779174/91c039dbf27c9ff9.png)
我们发现,显示了6,这个6的含义是,客户端还有6个字节没有读取,还在TCP接收缓冲区待着呢
接下来客户端继续读取
![](https://img.haomeiwen.com/i7779174/3b73d02a5d524e34.png)
我们发现,客户端已经把剩下的数据也读取到了,这个时候,再通过ss命令观察下
![](https://img.haomeiwen.com/i7779174/99fa1864c38060c1.png)
之前的数字6不存在了,毕竟客户端已经读取走了.