接收缓冲区、发送缓冲区、读状态、写状态他们之间的关系

接收缓冲区:

  • 位于接收端(通常是服务端或客户端)的套接字中的缓冲区,用于暂存来自发送端的数据。
  • 当发送端发送数据时,数据首先到达接收端的接收缓冲区。

发送缓冲区:

  • 位于发送端(通常是服务端或客户端)的套接字中的缓冲区,用于暂存即将发送的数据。
  • 当发送端准备发送数据时,数据会被放入发送缓冲区。

读状态(EPOLLIN):

  • 标记为“可读”状态意味着接收端的接收缓冲区中有数据可供读取。
  • 通常用于接收数据。

写状态(EPOLLOUT

  • 标记为“可写”状态意味着发送端的发送缓冲区有足够的空间来发送数据,并且接收端的接收缓冲区有足够的空间来接收数据。
  • 通常用于发送数据。

具体解释

1. 发送数据

假设服务端(A)需要发送数据给客户端(B):

  • 服务端A

    • 将数据放入发送缓冲区。
    • 关注客户端B连接的写状态(EPOLLOUT),以确认客户端B的接收缓冲区有足够的空间来接收数据。
    • 当客户端B的接收缓冲区有足够的空间时,服务端A可以发送数据。
  • 客户端B

    • 接收数据时,关注服务端A连接的读状态(EPOLLIN),以确认服务端A有数据可以读取。
    • 当服务端A发送数据后,客户端B的接收缓冲区将包含这些数据,此时客户端B可以通过读操作获取这些数据。
2. 接收数据

假设客户端(B)需要接收数据:

  • 服务端A

    • 发送数据到客户端B时,数据会先进入客户端B的接收缓冲区。
    • 客户端B需要关注服务端A连接的读状态(EPOLLIN),以确认服务端A有数据可以读取。
  • 客户端B

    • 从接收缓冲区读取数据。
    • 通过读操作获取数据。

总结

就有点绕,从常识来讲,服务端往客户端发送数据,一般会觉得服务端是写状态,客户端是读状态,这里的状态是指可读、可写,不是写和读,这样就好理解了。

读状态就是确保有数据,写状态就是确保有地方接受数据。
要实时查看Linux发送缓冲区接收缓冲区状态,可以使用以下命令: 1. 查看发送缓冲区状态: ``` watch -n 1 'cat /proc/net/tcp | grep -e "^[0-9]\+:.*:[0-9A-F]\{4\} [0-9A-F]\{8\}:[0-9A-F]\{4\} [0-9A-F]\{8\}:[0-9A-F]\{4\}.*:[0-9]\{4\} [0-9]\{8\}:[0-9]\{8\} [0-9]\{2\}.*:[0-9]\{8\} [0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}" ``` 2. 查看接收缓冲区状态: ``` watch -n 1 'cat /proc/net/tcp | grep -e "^[0-9]\+:.*:[0-9A-F]\{4\} [0-9A-F]\{8\}:[0-9A-F]\{4\} [0-9A-F]\{8\}:[0-9A-F]\{4\}.*:[0-9]\{4\} [0-9]\{8\}:[0-9]\{8\} [0-9]\{2\}.*:[0-9]\{8\} [0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}.*:[0-9]\{1,2\}" ``` 这两个命令都可以实时查看TCP连接的状态,包括发送缓冲区接收缓冲区的大小、已使用的空间以及剩余空间等信息。其中,watch命令可以让命令实时刷新显示,-n参数指定了刷新间隔。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值