tcp send函数会一直阻塞吗

在while循环内,无时间间隔的发送大包数据(30多万字节),会导致send函数一直阻塞吗?

关键要看接收端处理速度和传输带宽,
30万字节 = 300000 byte = 300KB。 按局域网100M的带宽,除去开销,实际传输速率大概在10MB,这个通常不会成为瓶颈。
接收端处理速度,就跟是否阻塞相关了,如果接收端处理速度低于发送速度,send就会阻塞。
所以,建议如果是大数据量的传输,一定要确定接收端的处理能力,发送时做好流控,也就是在while循环中sleep一会儿。

tcp的发送是否阻塞是跟接收端有关系,如果接收端接收的慢,你发送快是没有用的,会阻塞的。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/245512
  • 你也可以参考下这篇文章:从TCP协议到TCP通信的各种异常现象和分析(下)
  • 除此之外, 这篇博客: 计算机网络笔记(6) 传输层 TCP协议中的 TCP协议 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    机制:

    • 点对点方式
      • 一个发送方,一个接收方
    • 传输可靠的、按序的字节流机制
    • 流水线机制
      • TCP拥塞控制和流量控制机制来设置窗口尺寸
    • 发送方与接收方都能够缓存
    • 全双工(full-duplex)
      • 同一连接中能够传输双向数据流
    • 面向连接
      • 通信双方在发送数据之前必须建立连接
      • 连接状态只在连接的两端中维护
      • 在沿途节点中不维护

    TCP格式

    • 序列号:

      • 表示本报文段所发送数据的第一个字节的编号。
      • 在 TCP 连接中所传送的字节流的每一个字节都会按顺序编号。
      • 建立TCP连接时,双方随机选择序列号
    • ACK确认号:表示接收方希望收到发送方下一个报文段的第一个字节数据的编号(序列号),也就是告诉发送方:我希望你(指发送方)下次发送给我的 TCP 报文段的序列号字段的值是这个确认号。

      • 累计确认:该序列号之前的所有字节均已被正确接收到
    • TCP连接包括

      • 两台主机上的缓存
      • 连接状态变量
      • socket等

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^