对于每一个TCP的SOCKET来说,都有一个发送缓冲区和接受缓冲区与之对应,下面举个例子说说发送缓冲区、接受缓冲区、滑动窗口协议之间的关系。
一、recv端
在监听套接字上准备accept,在accept结束以后不做什么操作,直接sleep很久,也就是在recv端并不做接收数据的操作,在sleep结束之后再recv数据。
二、send端
通过查看本系统内核支持的发送缓冲区大小,cat/proc/sys/net/ipv4/tcp_wmem,三个参数分别最小值、默认值和最大值。接收缓冲区的配置文件在tcp_rmen中。
将套接字设置为阻塞,一次发送的buffer大于发送缓冲区所能容纳的数据量,一次send结束,在发送返回后接着打印发送的数据长度。
测试结果:
阶段一:
recv端表现:在刚开始发送数据时,接收端处于慢启动状态,滑动窗口值越来越大,但是由于接收端不处理接收缓冲区内的数据,其滑动窗口越来越小(因为接收端回应发送端中的win大小表示接受端还能够接受多少数据,发送端下次发送的数据大小不能超过回应中win的大小),最后发送端回应给接受端的ACK中显示的win大小为0,表示接收端不能够再接受数据。
send端表现:发送端一直不能返回,如果接收端一直回应win为0的情况下,发送端的send就会一直不能返回,这种僵局一直持续到接收端的sleep结束。
原因分析:首先需要明白几个事实,阻塞式I/O会一直等待,直达这个操作完成;发送端接受到接收端的回应后才能将发送缓冲区中的数据进行清空。
在接收端不recv&#x