问题产生:

  在进行客户端向服务端发送数据时,每次发送一定数量数据后发送端就等不到send函数的返回,导致程序一直卡死在send函数。

  通过抓包发现:发送端发送过快而接收端处理速度过慢,导致快速发送一定量数据后wireshark显示发送端发送数据有window full提醒,几次之后接收端会发送zero window消息,发送缓冲区数据无法发出导致堆积满发送缓冲区,从而导致send无法将数据拷贝进发送缓冲区,进而形成send函数无法返回,程序阻塞无法运行。

分析:

recv端表现:在刚开始发送数据时,接收端处于慢启动状态,滑动窗口值越来越大,但是由于接收端不处理接收缓冲区内的数据,其滑动窗口越来越小(因为接收端回应发送端中的win大小表示接受端还能够接受多少数据,发送端下次发送的数据大小不能超过回应中win的大小),最后发送端回应给接受端的ACK中显示的win大小为0,表示接收端不能够再接受数据。

send端表现:发送端一直不能返回,如果接收端一直回应win为0的情况下,发送端的send就会一直不能返回,这种僵局一直持续到接收端的缓冲区数据被处理完成空出足够接收一定量数据的空间。

原因分析:首先需要明白几个事实,阻塞式I/O会一直等待,直达这个操作完成;发送端接受到接收端的回应后才能将发送缓冲区中的数据进行清空。

那么接收端的接收缓冲区满,导致滑动窗口为0,发送端不能发送数据。但是send操作为何不能返回呢?send操作只是将应用缓冲区的数据拷贝到发送缓冲区,但是发送缓冲区的数据并没有完全得到接收端的ACK回应,所以暂时不能将发送缓冲区中的数据丢弃,导致发送缓冲区的被填满,这样应用层中的数据也就不能拷贝到内核发送缓冲区内,也就会一直阻塞在这里,直到可以继续将应用层的数据拷贝到发送缓冲区中,何时触发这个操作呢?等到发送端回应win大于0时才有这样的操作。

遗留问题:

  接收端一直在接收数据,将缓冲区数据处理写入本地文件,但是问题产生后程序将会一直阻塞基本未见好转情况。同时抓包数据显示recv端一直有zero window消息,send端一直发送心跳包检测。为什么程序一直卡死,并且接收端缓冲区不见减小?

-->>解答:

  接收端使用ET模式,而且每次接收数据buff设置小于发送的buff,导致每次收到ET消息后只会处理部分缓冲区内数据,导致缓冲区数据持续增长直至窗口缩小为0。

  至此,发送端不能再发送数据,接收端将不会收到ET信号。从而缓冲区数据将不会减少,窗口一直保持为0的状态。程序死锁,一直hang住。

转载于:https://www.cnblogs.com/edver/p/9347227.html

socket 接收和发送缓冲区相关推荐

  1. socket接收与发送缓冲区大小

    1.查看默认设置 转自:https://www.cnblogs.com/x_wukong/p/8444557.html cat /proc/sys/net/core/rmem_max 212992ca ...

  2. TCP/UDP的接收缓冲区和发送缓冲区

    转载自:https://blog.csdn.net/Swallow_he/article/details/84392285 1.TCP. SO_RCVBUF & TCP. SO_SNDBUF ...

  3. UDP Socket接收缓冲区与netstat Recv-Q

    我们通常使用netstat查看网络的诸多状态,其中包含Send-Q与Recv-Q. 我们知道: 每一个Socket对象在系统中都被映射为一个Socket文件: 每一个Socket对象在系统中都关联有两 ...

  4. gprs发送信号对方如何接收_和接收缓冲区比较:Netty发送缓冲区是如何设计的,why?...

    点击上方蓝字关注我吧! 本篇文章大概3300字,阅读时间大约10分钟 前面文章,透彻分析了Netty的接收缓冲区优化的套路和实现细节,以及写数据和刷新数据的宏观流程和细节: 从源码出发:在宏观上把握N ...

  5. 搞了半天,终于弄懂了TCP Socket数据的接收和发送,太难~

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 本文将从上层介绍Linux上的TCP/IP栈是如何工作的,特别是s ...

  6. qt tcp接收缓冲区设置_TCP的发送缓冲区

    (一)基础知识 IPv4 数据报最大大小是65535(16位),包括IPv4头部. IPv6 数据报最大大小是65575,包括40个字节的IPv4头部 MTU,这是由硬件规定的,如以太网的MTU是15 ...

  7. java使用Socket类接收和发送数据

    java使用Socket类接收和发送数据 网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接 ...

  8. python - udp socket通信循环发送和接收数据

    运行结果:(在测试的过程中udp_client.py中的send_addr要设置为:接收方的IP地址) udp_client.py: #coding=utf-8 import socketdef ma ...

  9. c pc 和android通讯,Android 客户端与PC服务端socket通信接收与发送图片(终结者)

    前言 这个解决方案是我和队友在<物联网>比赛的集训中得到的.在socket中Android客户端接收图片是相当的棘手(反正我当时就是这样觉得),接收文字还算简单.在刚开始接触socket接 ...

  10. java socket发送定长报文_java使用Socket类接收和发送数据

    网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论 ...

最新文章

  1. 【神经网络】(13) ShuffleNetV2 代码复现,网络解析,附Tensorflow完整代码
  2. 【Java小工匠聊密码学】--base58编码
  3. Qt5.9 OpenCV3.2.0测试例程(Win10)
  4. 面试题总结-算法部分
  5. 使用opencv训练cascade分类器进行目标检测
  6. 本机速度文件支持的“纯” Java大数据存储
  7. 5008.vs2015创建c++动态库
  8. 基于BS模式的航材电子商务交易平台(2)
  9. 世界备份日——如果您丢失了所有文件
  10. STM32:GPIO四种输入输出模式。
  11. LeetCode简单题目(#27 #28 #35 #38)-2019.10.23-4道
  12. Ubuntu 下升级git到最新版
  13. python查看数据大小_python 监控文件大小
  14. APP支付和H5网页支付有哪些不同?
  15. 鸿蒙OS分布式任务调度,鸿蒙子系统解读-分布式任务调度篇(下)
  16. 【算法与数据结构】分治(Divid Conquer)算法——以快排,归并排序,二分查找为例
  17. 云服务器(Centos7)搭建jdk环境
  18. 前端开发中遇到常见问题总结
  19. 量子通信——量子的概念与量子力学
  20. JFIF-JPEG文件

热门文章

  1. pypy mysql 兼容_PyPy运行Django+MySQL简单教程
  2. MATLAB每个字母等宽,等宽文本文件的导入选项对象
  3. Yii需要php版本,yii框架2.0.9版本发布了
  4. SparkSession对象
  5. zabbix-proxy+cacti+nagios基本安装配置
  6. 细粒度图像分析进展综述(转)
  7. ROS机器人程序设计(原书第2版)2.4.1 ROS文件系统导览
  8. Git--分布式版本控制系统
  9. onfling滑动界面进行Activity切换
  10. Android中文API(98)—— ContextMenu.ContextMenuInfo