03.05 哪些方法可以提高socket的传输效率?

wlaiwangling


“我是哟哟吼说科技,专注于数据网络的回答,欢迎大家与我交流数据网络的问题”

socket俗称套接字,用来描述IP地址和端口,常在网络通信建立连接时使用。

如题,哪些方法可以提高socket的传输效率?

哟哟认为有三方面可以提升传输效率:

1、网络方面;

2、服务器方面;

3、程序方面;

下面哟哟来简单介绍一下具体实现:

1、网络方面

就网络方面来说,主机至服务器端的链路稳定性、时延性特别重要,另外就是主机的带宽是多大,若使用千兆带宽的网速,那么在建立多个连接后,可以在一定程度上提升socket的传输效率;

2、服务器方面

服务器的限速和限连接数,在一定程度上会影响socket的传输效率,因此在服务器方面提升连接用户的上下行速率和连接数,可以在一定程度上提升socket的传输效率;

3、程序方面

在程序设计方面,若较大的文件用一个线程去传输就会出现很多问题,如:网络问题或主机故障造成通信中断,那么文件需要进行重新传输,严重影响传输效率。因此可以将文件分割成数据模型,开启多个线程,根据网络情况去调整每条线程传输数据的大小,实现断点续传的方式,提升socket传输效率;

欢迎大家多多关注我,在下方评论区说出自己的见解。


哟哟吼说科技


Socket的传输效率不同的I/O模型效率千差万别,首先介绍一下unix的5种I/O模型,分别是:

1.阻塞I/O

在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用程序的缓冲区或者发生错误才返回,在此期间进程 进入睡眠或者挂起状态。(进程挂起了)

2.非阻塞I/O

非阻塞I/O模型:recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个ewouldblock错误,用户进程便在成功返回数据之前一直在调用recv操作询问数据可读性,轮询的操作方式。(轮询占用CPU)

3.I/O复用

I/O复用(select,poll,epoll等支持I/O多路复用):进程通过将一个或多个连接传递给select或poll系统调用,I/O复用实现了多个连接或者多种连接(TCP,UDP等)共用了同一种等待机制,select会返回某个连接的可读条件,调用recv/recvfrom把所读的数据报拷贝到应用进程的缓冲区中。(多个连接注册同一个select,nio是基于I/O复用模型实现的)

4.信号驱动I/O

通过sigaction系统调用实现了SIGIO信号的捕获与处理函数,它是非阻塞的。当有数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据。(捕获内核发送过来的信号)

5.异步I/O

异步I/O:告知内核启动某个操作,并让内核在整个操作完成后通知我们,包括将数据从内核拷贝到用户空间(异步的)。

前面四种情况都是同步的,最后一种是异步;已java为例对应的api有ServerSocket,ServerSocketChannel,AsynchronousServerSocketChannel;


我觉得可以从以下几个方面着手:

1.选择合适的I/O模型

2.线程模型

3.高效的协议


1.选择合适的I/O模型

如上介绍的五种I/O模型,不同的I/O模型效率千差万别;比如早期的网络连接使用阻塞的方式,然后每个请求对应一个线程的方式,到现在普遍使用的多路复用模式,使用很小的线程可以处理大量的连接


2.线程模型

有对应的单线程模型,多线程模型,主从线程模型;主从线程模型现在在很多通信框架中普遍使用,大致就是连接的建立和读写分成多个线程池来处理;


3.高效的协议

既然是基于socket传输数据,那必然需要在其基础上设计合适的协议,比如说我们常用的协议格式如下:

协议{协议头(header)协议数据(data)}

另外在协议的基础上我们往往需要对数据进行序列化处理,不同的序列化方式性能上也差距很大,比如protobuf在性能上和数据量上都有优秀;当然往往也需要用到压缩格式,不同的压缩方法性能上也差距很大;


总结

本文从三个方面介绍了如何提高socket的传输效率;当然除了以上说的几种情况,也和一些外部环境的配置有关,比如服务器的连接数设置,网络带宽等等


分享到:


相關文章: