ric*_*ick 4 c++ sockets network-programming tcp
如果我有一个TCP连接,在200字节/秒的数据传送,但我只read()/ recv()从插座每秒一次,其中是那些200 KB的数据存储在同时?
据我所知,数据在ack被发送到发送者之后会离开TCP套接字的读缓冲区,而且它仍然太小而无法容纳200KB的数据,它在哪里等待,直到它可以read()/ recv()由我的客户端?
谢谢!!
以下答案声称数据在被识别后立即离开TCP读缓冲区,然后再读取()/ recv()d:
"接收器的套接字接收缓冲区的大小决定了在没有确认的情况下可以传输多少数据"
可能是我的假设是错误的,只有在用户空间程序读取()/ recv()d之后数据才会被确认?
在将ack发送给发送方之后,数据将离开TCP套接字的读缓冲区
不,它在您阅读,通过recv(), recvfrom(), read(),等时会离开接收缓冲区.
以下答案声称数据一旦被确认就会离开TCP读缓冲区
木竿.我写了它,它积极地,绝对不"声称"任何这样的事情.
您正在考虑发送缓冲区.当接收方确认数据时,数据将从发送方的发送缓冲区中删除.那是因为发件人现在知道它已经到达并且不需要它再进行任何重新发送.
可能是我的假设是错误的,只有在用户空间程序读取()/ recv()d之后数据才会被确认?
是的,你的假设是错误的,这种替代推测也是错误的.数据在到达时被确认,并被删除read()/recv().
您的操作系统将缓冲一定数量的传入 TCP 数据。例如,在 Solaris 上,该值默认为 56K,但如果预计会有大量突发,则可以合理配置为最多几个 MB。Linux 的默认值似乎要小得多,但您可以在此网页上查看有关增加这些默认值的说明:http://www.cyberciti.biz/faq/linux-tcp-tuning/