我所认识的Socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层(百度百科的解释:网络上两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket)
1)支持TCP/IP协议的网络通信的操作单元,是对TCP/IP协议的封装,它本身不是一个协议,而是一个调用接口(API)
2)Socket位于应用层和传输层之间,可用指定传输层所使用的协议,TCP(Transimission Control Protocol)或UDP(User Datagram Protocol)
3)Socket一旦建立起连接,通信的双方可以互相发送数据(推送),直到断开连接
4)由于网络通信要经过多个中间节点,如路由器、网关、防火墙等,大部分防火墙会默认关闭长时间处于非活跃状态的连接而导致Socket连接中断,虽然Socket是长连接
5)定时发送数据包(又名心跳包)以避免长时间不活跃而被关闭的Socket连接
6)利用三元组(ip地址、协议、端口号)就可以标识网络的进程
7)如果一个程序创建了Socket,并让其监听80端口(创建时会为其分配一个端口),其实是向TCP/IP协议栈声明了其对80端口的占用,之后,所有目标是80端口的TCP数据包都会转发给该应用程序
结构图
Socket的通信连接过程
1)服务端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept方法阻塞,等待客户端的连接。
2)客户端初始化Socket,然后连接服务(connect),如果连接成功(三次握手成功),这时客户端就和服务端建立了连接
3)客户端发送数据请求,服务端接收请求并处理请求,然后把数据响应给客户端,客户端读取数据,最后关闭连接,一次交互结束
通信连接过程
Socket数据传输过程
1)当连接成功时,客户端和服务端都会拥有一个Scoket实例,每个实例都有一个InputStream和OutputStream,正是通过这两个对象类交换数据
2)网络I/O操作都是字节流传输的,当Socket对象创建时,操作系统会为InputStream和OutputStream分别分配一定大小的缓冲区,数据的写入和写出都是通过缓冲区完成的
3)写入端将数据写到OutputStream对应的SendQ队列中,当队列填满时,数据将被发送到另一端的InputStream的RecvQ队列中
4)如果此时RecvQ队列已经满了,那么OutputStream的write方法将会阻塞直到RecvQ队列有足够的空间容纳SendQ发送的数据
5)该注意的是,缓冲区的大小以及写入端的速度和读取速度非常影响这个连接的数据传输效率,有可能发送阻塞