BIO、NIO、

什么是 Socket?

Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口,一般由操作系统提供。
在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议处理和 通信缓存管理等等都隐藏在 Socket 接口后面,对用户来说,使用一组简单的接口就能进行 网络应用编程,让Socket 去组织数据,以符合指定的协议。主机 A 的应用程序要能和主机 B 的 应用程序通信,必须通过 Socket 建立连接。 客户端连接上一个服务端,就会在客户端中产生一个 socket 接口实例,服务端每接受 一个客户端连接,就会产生一个 socket 接口实例和客户端的 socket 进行通信,有多个客户 端连接自然就有多个 socket 接口实例。
image.png

多路复用

多个socket连接,由一个线程处理。(即多个socket公用一个线程)。

TCP 的 Socket 内核缓存区

在所有的网络通信和应用程序中,每个 TCP 的 Socket 的内核中都有一个发送缓冲区 (SO_SNDBUF)和一个接收缓冲区(SO_RECVBUF),可以使用相关套接字选项来更改该缓冲区大小。
当某个应用进程调用 write 时,内核从该应用进程的缓冲区中复制所有数据到所写套接字的发送缓冲区。如果该套接字的发送缓冲区容不下该应用进程的所有数据(或是应用进程 的缓冲区大于套接字的发送缓冲区,或是套接字的发送缓冲区中已有其他数据),假设该套 接字是阻塞的,则该应用进程将被投入睡眠。 内核将不从 write 系统调用返回,直到应用进程缓冲区中的所有数据都复制到套接字发 送缓冲区。
因此,从写一个 TCP 套接字的 write 调用成功返回仅仅表示应用系统可以重新使用原 来的应用进程缓冲区,并不表明对端的 TCP 或应用进程已接收到数据。
image.png