本地实验目的
通过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命令查看
image.png客户端与服务端建立了连接,客户端端口32796,服务端端口8080 .
其中第二列就是表示接收缓冲区, 第三列表示发送缓冲区
接下来我们在服务端向客户端发送数据
image.png服务端向客户端发送了PythonTest这10个字符,这时候我们再通过ss命令查看下
image.png我们发现,客户端的TCP接收缓冲区里面有10个字符,还没有读取.接下来客户端读取这10个字符
image.png客户端使用1024大小的buf读取了TCP接收缓冲区里面的10个字符数据.
我们再通过ss命令查看下
发现客户端TCP接收缓冲区里面没有数据了,因为客户端已经读取了.
接下来服务端继续发送数据,但是客户端只读取部分数据情况
image.png服务端发送了PythonNotAll这12个字符,我们在客户端只读取6个字符看一下会是什么情况
image.png这一次客户端只读取了6个字符,也成功读取到了.我们通过ss命令再看下客户端TCP接收缓冲区的情况
image.png我们发现,显示了6,这个6的含义是,客户端还有6个字节没有读取,还在TCP接收缓冲区待着呢
接下来客户端继续读取
image.png我们发现,客户端已经把剩下的数据也读取到了,这个时候,再通过ss命令观察下
image.png之前的数字6不存在了,毕竟客户端已经读取走了.
网友评论