关于TCP发送缓冲区的困惑?

silence_02 2019-02-02 10:15:43
最近遇到一个TCP通信的工程现象,一直没有找到合理的解释依据。请论坛大神帮助分析。
交代背景:
现场有一台客户端设备,经过通信网与远方服务器实现连接。采用TCP/IP协议方式。
客户端定时周期性发送数据给服务器,服务器接收数据,数据流量约1.2Mbps,通信网给客户端分配的网络带宽约2Mbps。
异常现象:
该通信网络频繁会出现拥塞现象,客户端发送的tcp数据帧RTT时间在拥塞期间,会达到200+ms,正常情况下在30ms左右。
客户端应用程序每20ms写一帧数据给tcp发送缓冲区(write socket),我的在应用程序里设置SO_SNDBUF为一个较大值(符合内核参数要求,确认生效了),根据我的估算,即使出现这种程度的网络拥塞,导致tcp发送窗口中的已发送数据由于收不到ack而无法清除,tcp发送缓冲区也能够缓存至少5秒的数据。
但是,实际上发现,当网络延迟较大时,仅仅过了几百毫秒,客户端的应用程序write socket就出错了,打印 Resource temporarily unavailable(我的客户端socket是非阻塞的),我认为这是因为tcp的发送缓冲区已经满了,write出错导致的。但是经过抓包计算,从write出错计算往前推,发送缓冲区中应该只有40kB左右的数据(未发送的和未得到ack确认的),而设置的缓冲区大小为256KB。
为什么256KB大小的发送缓冲区,仅仅塞了40KB左右的数据,就满了?
虽然发送缓冲区并不仅仅存储应用数据内容,还有其它开销,但是不至于占比这么大吧?还是我对TCP协议机制的理解有其它问题?

...全文
301 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Simple Simple 2021-07-28
  • 打赏
  • 举报
回复

有查看过Send-Q是多少吗?

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧