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