社区
C++ 语言
帖子详情
TCP的接收缓冲区满了,收到数据后会向发送方发送ACK吗?
adamwyb
2012-03-17 02:42:12
TCP的发送缓冲区中的数据,如果收不到接收方的ACK就不会删除,导致发送缓冲区溢出。如果接收方的缓冲区满了,收到数据后会不会向发送方发ACK呢?如果不发ACK,那么就没有接收缓冲区溢出的概念了,只要控制住发送方,就不会丢包;如果发ACK,那发送方就没办法控制是否继续发送了,接收缓冲区就会造成溢出,导致丢包。事实是怎样的呢?我这样理解正确吗?谢谢!
...全文
1624
15
打赏
收藏
TCP的接收缓冲区满了,收到数据后会向发送方发送ACK吗?
TCP的发送缓冲区中的数据,如果收不到接收方的ACK就不会删除,导致发送缓冲区溢出。如果接收方的缓冲区满了,收到数据后会不会向发送方发ACK呢?如果不发ACK,那么就没有接收缓冲区溢出的概念了,只要控制住发送方,就不会丢包;如果发ACK,那发送方就没办法控制是否继续发送了,接收缓冲区就会造成溢出,导致丢包。事实是怎样的呢?我这样理解正确吗?谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
youqika
2012-03-22
打赏
举报
回复
4L正解
nossiac
2012-03-18
打赏
举报
回复
[Quote=引用 11 楼 adamwyb 的回复:]
那如果我使用的是异步send呢?这时就会返回-1吗?还是将这些数据暂存到发送端的缓存,等待接收端的缓存未满后再发?然后如果这时候又有几次 send,将发送缓冲区也填满,再返回-1?
[/Quote]
1、发送方也有一个缓冲区。不管是异步还是同步,send函数只负责将数据放入发送缓冲区就返回。并不是说send返回就表示对方就已经收到。TCP协议栈负责将缓冲区数据发送出去,并等待ACK。
2、如果发送缓冲区已经满,同步模式下,send会阻塞,直到有空间为止;异步模式下,send直接返回-1。
3、send函数其实不会理会接收方的buffer够不够,它只关心发送方的buffer有无空间。上面说的window值为0什么的,都是由发送方的TCP协议层负责处理的,上层是不用知道。你只需要调用send把数据往里塞就是了。这就是网络分层模型的理念,每层各司其职。
PS,你看的哪本书?这么多简单问题都没有讲到?
学网络编程一定要好好看《TCPIP详解卷一》,并学会动手实验。
adamwyb
2012-03-17
打赏
举报
回复
[Quote=引用 9 楼 nossiac 的回复:]
引用 7 楼 adamwyb 的回复:
也就是说,如果服务端的程序不调用recv,接收缓冲区就会满,然后客户端再发数据就会丢包,而且客户端的发送缓冲区中这个数据也将删除?
不会丢包的。
客户缓冲区的数据在收到ACK后才删除。
假设某时刻,服务器缓冲区只能放下最后一个包,这时发送方发出一个包,服务器接收了,并ACK给客户端。注意,这个ACK会指明服务器window大小为0。客户端收……
[/Quote]
那如果我使用的是异步send呢?这时就会返回-1吗?还是将这些数据暂存到发送端的缓存,等待接收端的缓存未满后再发?然后如果这时候又有几次 send,将发送缓冲区也填满,再返回-1?
adamwyb
2012-03-17
打赏
举报
回复
[Quote=引用 8 楼 gpshq 的回复:]
接收方的缓冲满了,发送方凭什么还能发送数据? 有点没有理解你的逻辑, TCP是有连接的、 不是一端说了算
[/Quote]
也就是说,TCP接收端缓冲满了,发送端就不能发数据了?这个是通过什么控制的?我以为接收端缓冲满了,就不响应ACK了,这时候发送端的数据就不能从缓存中删除,但发送端的缓存满的时候,send就返回-1?是这样吗?谢谢
我还有个帖子,也帮忙看下,你可能会明白我的意思:
http://topic.csdn.net/u/20120317/20/3baf6b71-69c4-48a7-b775-55d48000ac75.html
nossiac
2012-03-17
打赏
举报
回复
[Quote=引用 7 楼 adamwyb 的回复:]
也就是说,如果服务端的程序不调用recv,接收缓冲区就会满,然后客户端再发数据就会丢包,而且客户端的发送缓冲区中这个数据也将删除?
[/Quote]
不会丢包的。
客户缓冲区的数据在收到ACK后才删除。
假设某时刻,服务器缓冲区只能放下最后一个包,这时发送方发出一个包,服务器接收了,并ACK给客户端。注意,
这个ACK会指明服务器window大小为0
。客户端收到这个信息后就会暂停发送数据,转而启动前面所说的试探机制。参考”坚持定时器“
氰客
2012-03-17
打赏
举报
回复
接收方的缓冲满了,发送方凭什么还能发送数据? 有点没有理解你的逻辑, TCP是有连接的、 不是一端说了算
nossiac
2012-03-17
打赏
举报
回复
1. 只要收到了包,就会ACK。
2. TCP在ACK的同时会带有window大小值,表示这边能接受的数据量。发送方会根据这个调整数据量。
3. 接收方缓冲区满时,回给发送方的window值就是0。
4. 发送方看到window为0的包,会启动一个定时器,隔一段时间发一个包试探。
5. 一旦接收方缓冲区有足够空间了,就会给window赋上非0值。发送方就又开始发送了。
adamwyb
2012-03-17
打赏
举报
回复
[Quote=引用 6 楼 gpshq 的回复:]
引用 5 楼 adamwyb 的回复:
引用 1 楼 pathletboy 的回复:
接收方收到正确帧即会向发送方发送ACK
接收缓存满了也发ACK?发送缓存收到ACK就从发送缓存中删除了,这样发送缓存不就永远不能满了?
为什么不会 ack不是发出去就能收到了 如果没收到ack当然会选择重传而不是删除
[/Quote]
也就是说,如果服务端的程序不调用recv,接收缓冲区就会满,然后客户端再发数据就会丢包,而且客户端的发送缓冲区中这个数据也将删除?
氰客
2012-03-17
打赏
举报
回复
[Quote=引用 5 楼 adamwyb 的回复:]
引用 1 楼 pathletboy 的回复:
接收方收到正确帧即会向发送方发送ACK
接收缓存满了也发ACK?发送缓存收到ACK就从发送缓存中删除了,这样发送缓存不就永远不能满了?
[/Quote]
为什么不会 ack不是发出去就能收到了 如果没收到ack当然会选择重传而不是删除
氰客
2012-03-17
打赏
举报
回复
接收方接收到数据回复ACK的时候也会通告一个窗口给发送方, 表明自己还能接收多少数据、发送方如果收到通告窗口为0的情况 会主动发送探测包询问接收方能否接收数据了(详细见 坚持定时器)
adamwyb
2012-03-17
打赏
举报
回复
[Quote=引用 1 楼 pathletboy 的回复:]
接收方收到正确帧即会向发送方发送ACK
[/Quote]
接收缓存满了也发ACK?发送缓存收到ACK就从发送缓存中删除了,这样发送缓存不就永远不能满了?
quwei197874
2012-03-17
打赏
举报
回复
会发的,tcp协议封装好了,楼主不用操心这个
pathletboy
2012-03-17
打赏
举报
回复
接收方收到正确帧即会向发送方发送ACK
TCP
的
接收缓冲区
满
了,
收到
数据
后会
向
发送
方
发送
ACK
吗?该怎么解决
问题:
TCP
的
接收缓冲区
满
了,
收到
数据
后会
向
发送
方
发送
ACK
吗?
TCP
的
发送
缓冲区中的
数据
,如果收不到接收
方
的
ACK
就不会删除,导致
发送
缓冲区溢出。如果接收
方
的缓冲区
满
了,
收到
数据
后会
不会向
发送
方
发
ACK
呢?如果不发
ACK
,那么就没有
接收缓冲区
溢出的概念了,只要控制住
发送
方
,就不会丢包;如果发
ACK
,那
发送
方
就没办法控制是否继续
发送
了,
接收缓冲区
就会造成溢出,导致丢包。事实是怎样的呢?我这样理解...
tcp
socket的
发送
与
接收缓冲区
1) 应用程序可通过调用send(write, sendmsg等)利用
tcp
socket向网络
发送
应用
数据
,而
tcp
/ip协议栈再通过网络设备接口把已经组织成struct sk_buff的应用
数据
(
tcp
数据
报)真正
发送
到网络上,由于应用程序调用send的速度跟网络介质
发送
数据
的速度存在差异,所以,一部分应用
数据
被组织成
tcp
数据
报之后,会缓存在
tcp
socket的
发送
缓存队列中,等待网络空闲时再
发送
出去。同时,
tcp
协议要求对端在
收到
tcp
数据
报后,要对其序号进行
ACK
,只有当
收到
一个
tcp
数据
报的
tcp
清空
发送
缓冲区_关于性能优化 从
tcp
传输过程的角度 (缓冲区 与 拥塞控制)...
关于缓冲区 滑动窗口主要是为了处理能力不足时限制
发送
方
的速度linux下 每一个
tcp
连接 都会占用4k左右的内存 -- 和缓冲区设置相关, 在 buff/cache当中.
tcp
连接由内核维护. 内核为每个连接建立内存缓冲区
tcp
需要保证每个报文都能达到对
方
server. 没有
收到
对应
ack
的时候需要重传 知道
收到
ack
报文位置. 所以
tcp
报文发出后 不会直接从内存中删除.在这里...
调整
TCP
缓冲区
调整
TCP
缓冲区
TCP
连接是由内核维护的,内核为每个连接建立的内存缓冲区,为网络传输服务,也要充当进程与网络间的缓冲桥梁。如果连接的内存配置过小,就无法充分使用网络带宽,
TCP
传输速度就会很慢;如果连接的内存配置过大,那么服务器内存会很快用尽,新连接就无法建立成功。本文就对Linux
TCP
缓冲区的机制及调整
方
法进行分析。 滑动窗口是如何影响传输速度的? 我们知道
TCP
提供了可靠的传输,主要的机制就是在报文发出后,必须
收到
接收
方
返回的
ACK
确认报文,如果在RTO内还没
收到
,就会重新
发送
这个报文。由
qt
tcp
接收缓冲区
设置_
TCP
的
发送
缓冲区
(一)基础知识IPv4
数据
报最大大小是65535(16位),包括IPv4头部。IPv6
数据
报最大大小是65575,包括40个字节的IPv4头部MTU,这是由硬件规定的,如以太网的MTU是1500字节,IPv4要求最小MTU是68字节,IPv6要求最小MTU是576字节path MTU: 指两台主机间的路径上最小MTU分片(fragmentation):指ip
数据
报大小超过相应链路的MTU,IP...
C++ 语言
65,209
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章