linux socket接收缓存区,socket的发送和接收缓冲区

本文探讨了Linux TCP socket的发送和接收缓冲区,以及它们与滑动窗口协议的关系。当接收端不接收数据时,发送端的send会阻塞,直到接收端的接收缓冲区有空间。滑动窗口大小受socket的接收缓冲区(SO_RCVBUF)影响,必须在listen或connect前设置。理解这些机制有助于优化TCP通信的效率。
摘要由CSDN通过智能技术生成

对于每一个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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值