2018/12/8 什么是socket,socket做了什么?

占坑,晚上


 什么是socket?

socket是操作系统内核提供给开发者的信息传输接口

比如c#中的socket、Java中的socket封装类,都是通过调用底层操作系统的套接字,为开发者提供网络传输的能力。

 

socket做了什么,

所有的数据网络传输都是通过套接字完成的,无论是发送TCP请求、UDP请求还是HTTP请求。套接字是网络传输的基础设施,操作系统内核提供的接口。

 

socket传输的原理,

socket的实例是由操作系统维护的,我们日常调用的socket对象只是对这底层操作系统套接字内核的封装,是为开发者编程提供的接口,真正在传输数据的是系统内核中的套接字实例。为什么要反复强调是系统内核中的套接字呢,因为我们需要知道套接字的网络传输是需要与计算机硬件打交道的,它需要与缓存、网卡等硬件打交道,所以socket的底层实际上是系统内核调用读取硬件数据,调用硬件资源实现网络传输。

socket有一个readbuffer,和writerbuffer两个缓冲区,网卡接收的数据放入read buffer中,由一个读线程负责不断地从read buffer中检查是否有新的数据,并读取数据,然后交给上层调用者。当用于发送数据时,将数据放入writerbuffer中,由一个写线程负责将写入的数据传输给网卡发送出去。

 

为什么传输数据必须要先序列化呢?

因为一般传输的数据为一个数据对象,而数据对象有一定的数据结构,而数据传输过程以数据流的形式传输,也就是说按顺序传输,将数据以二进制的形式排列成一队,像在一个管道中一样顺序传输,数据对象的复杂形态明显无法通过这种有先后顺序的管道传输,因为你无法确定这个数据结构的传输顺序,无法将它以一字排开地形式传输,比如一个tree结构,你如何确定传输中,哪个分支在前,如何一字展开,到达传输目的地后,如何恢复为原来的数据结构形态呢。而序列化就完成了这样一个转换,因为字符串本身是有顺序可以通过二进制一字传输然后还原的,将数据结构以某种规则将对象序列化成一个字符串,就可以将该对象序列化的对象进行网络数据流的传输了,而因为序列化存在一定的序列化规则,比如xml、json,当目标地址接收数据后,可以按照这种规则反序列化为原来的数据结构,这样就能对复杂数据结构进行网络传输了,无论多么复杂的数据结构都可以无缝的实现跨机器、跨位置的转移。而对于字符串,它本身的结构决定了它可以直接进行网络传输。

 

这里也揭示了数据流的重大意义,

当对象进行位置转移时,无论是本地还是远程,无论是文件还是其它资源,因为传输一定是管道这种先进先出,顺序排队传输的形式,所以将所有的传输数据可以抽象为数据流,封装的数据流类正是用于方便地处理这种数据,进行方便的读和写操作。比如文件,为什么不直接访问文件数据非要用流一个个byte地读取呢,因为读取文件就是将本地磁盘的文件读取到内存中的过程,本质上和网络中传输数据是一样地,它也是一次数据的转移传输,用数据流处理这种读取过程太正常了,否则,在磁盘中的数据你怎么直接访问呢,一定是有一个管道顺序读取的过程。

并且将所有的数据源都抽象为数据流后,你就可以使用input stream同一套接口读取任何来源的数据了,这就是抽象为流的好处,也是抽象的好处。

类似于jdbc,无论是何种结构的数据库你不必关心,你只需要这一套接口去调用,然后决定一下使用何种数据库驱动就可以了。而此处你只需决定使用FileInputStream还是NetInputStream、byteArrayStream.等不同来源的流对象。

posted @ 2018-12-08 09:41  BaizLi  阅读(735)  评论(0编辑  收藏  举报