Skip to content

Socket 缓冲区

  • send buffer(发送缓冲区):用户发送消息的时候实际写入的地方
    • 直接 send 之后,数据只是拷贝到了缓冲区,实际发送时机和数量由操作系统决定
    • 如果缓冲区满了或空间不足执行发送:
      • 如果 socket 创建的时候是非阻塞的,会立刻返回 EAGAIN 错误信息,提示等会儿再尝试。
      • 如果 socket 创建的时候是阻塞的,程序会一直等待到有新的空间,将数据拷进去然后返回
  • recv buffer(接收缓冲区):用户接收消息的时候实际读取的地方
    • 如果缓冲区为空执行接受,和发送类似
  • 在 linux 环境下执行 netstat -nt 命令进行查看
  • 对 socket 执行 close 操作,如果缓冲区
    • 没有数据,执行四次挥手的第一次挥手
    • 有数据
      • 如果是接受缓冲区,会把接受缓冲区的数据清空,并给对端发送一个 RST
      • 如果是发送缓冲区,会将数据发送完,执行四次挥手的第一次挥手(如果接受缓冲区有数据,会走上面的逻辑)
  • UDP 也有缓冲区(缓冲区是 socket 自带的,和协议无关),但是 UDP 一般不用,一般都是直接发送

正在精进