相关疑难解决方法(0)

当tcp/udp服务器发布速度超过客户端消耗时会发生什么?

我试图了解当服务器发布(通过tcp,udp等)比客户端可以使用数据更快时会发生什么.

在一个程序中,我理解如果队列位于生产者和消费者之间,它将开始变大.如果没有队列,那么生产者将无法生产任何新的东西,直到消费者可以消费(我知道可能有更多的变化).

我不清楚当数据离开服务器(可能是不同的进程,机器或数据中心)并发送到客户端时会发生什么.如果客户端根本无法足够快地响应传入数据,假设服务器和消费者耦合非常松散,那么飞行中数据会发生什么?

我在哪里可以阅读以获取有关此主题的详细信息?我只需要阅读TCP/UDP的低级细节吗?

谢谢

sockets networking udp tcp

23
推荐指数
2
解决办法
9589
查看次数

增加TCP窗口大小

我对应用程序中增加TCP窗口大小有一些疑问.在我的C++软件应用程序中,我们使用TCP/IP阻塞套接字从客户端向服务器发送大小约为1k的数据包.最近我遇到了这个概念TCP窗口大小.所以我尝试使用setsockopt()for SO_SNDBUF和for 将值增加到64K SO_RCVBUF.增加此值后,我在WAN连接的性能方面有所改进,但在LAN连接方面却没有.

根据我对TCP窗口大小的理解,

客户端将数据包发送到服务器.在达到此TCP窗口大小时,它将等待确保从服务器接收到窗口大小中第一个数据包的ACK.在WAN连接的情况下,由于RTT的延迟大约100ms,ACK从服务器延迟到客户端.因此,在这种情况下,增加TCP窗口大小可以补偿ACK等待时间,从而提高性能.

我想了解我的应用程序中性能如何提高.

在我的应用程序中,即使使用setsockopt套接字级别增加TCP窗口大小(发送和接收缓冲区),我们仍然保持相同的数据包大小1k(即我们在单个套接字发送中从客户端发送到服务器的字节).我们还禁用了Nagle算法(内置选项将小数据包合并到一个大数据包中,从而避免频繁的套接字调用).

我的怀疑如下:

  1. 由于我使用阻塞套接字,对于每个1k的数据包发送,如果ACK不是来自服务器,它应该阻止.那么仅在WAN连接中改进TCP窗口大小后,性能如何提高?如果我误解了TCP窗口大小的概念,请纠正我.

  2. 为了发送64K数据,我相信我仍然需要调用套接字发送功能64次(因为我通过阻塞套接字发送每次发送1k),即使我将TCP窗口大小增加到64K.请确认一下.

  3. 使用RFC 1323算法启用Windows缩放时,TCP窗口大小的最大限制是多少?

我的英语不太好.如果您无法理解上述任何内容,请告诉我.

c++ sockets tcp

15
推荐指数
1
解决办法
2万
查看次数

标签 统计

sockets ×2

tcp ×2

c++ ×1

networking ×1

udp ×1