套接字的类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mottohlm/article/details/80993481

套接字类型

    套接字的类型其实是指套接字的一种传输数据的方式,它们就是面向连接和面向消息。

1.面向连接的套接字

    代号SOCK_STREAM。它的特征就是传输的数据是什么顺序接收的时候就是什么顺序;当在传输的过程中出现问题,那么问题点的数据就会停止传输并阻塞后面的数据,等问题解决了再从该点继续传输,这样保证了数据在传输过程中不会丢失;按这种排序的方式一直传输下去的话,数据是可以没有边界的(只要传的人有那么多数据,接收的人也有那么多空间,两端条件满足)。
    这种传输方式还有一个特点,就是传输的数据量大时,传输这边觉得一次传不了那么多(每次传输的数据大小不能没法没天啊,是有限制的),那么就会把数据分成几份,先后传出去。而接收这边,有一个地方专门放接收到的数据(接数据到达的顺序存放)的地方(人称缓冲区),当要从这个存放的地方取数据的时候可不一定按你发来的是几份我就取几次,我可能觉得我能力大,一次就从里面取完了,也可能没错得取两次也行。这完全取决于接收者。
    像上面说的,你也发现了,它每一个传输数据者都会对应一个数据接收者。也就是两端的套接字是一一对应的。
    人们总结这种传输方式:可靠、按顺序的、基于字节的面向连接传输方式。

2.面向消息的套接字

    代号SOCK_DGRAM。它的特征就是非顺序、还有可能丢失传输过程中的数据、有传输边界但是速度快的传输方式。
为什么它的速度比面向连接的要快呢。不从原理上看,单类比一个常景:要从五袋米到一个地方,五个人同时出发送总比五个人按顺序一个送完一个接着这种要快吧。

总结

    面向连接的套接字是比较耗资源的,耗的是哪些资源呢:时间、传输通道。它的前提是两端的套接字必需连接好了之后才进行数据传输。在传输的过程中就一直占着此传输通道(可以把网线想像成由五条管子扎成一扎组成,两个连接的套接字就相当于在传输的这段时间占着其中一根)。又因为它要保证顺序又要保证失败重传,所以它的传输过程有很多规矩,大家都知道,按规矩办事肯定是慢的。要顺序,那肯定得一个传完再传一个;要失败重传,那必需要一个传完之后等特对方应答后再看情况传输。
    面向消息的套接字则快了,因为它不需要事先连接,更没有保证顺序和重传这么规矩。数据一个个传出去就不管了,哪个先到看自己造化了。所以显得效率更高,但是它的责任少了,你的责任就大了。很简单的道理,有一个要求,传数据-保证不丢失。面向连接的套接字两个都帮你做了,你什么都不用管;面向消息的只帮你做了前一个,那么后一个就得你自己想办法做。所以单纯评论两种方式的好坏是没意义的,按情景使用即可。守恒定律在哪都适用。

猜你喜欢

转载自blog.csdn.net/mottohlm/article/details/80993481