.net socket的个人理解(1)

以下内容均属于个人理解,如有误差,欢迎指正,不甚感激,希望对于初学者有些帮助,少些弯路。拒绝谩骂,毕竟来博客园大多是文明的人。

网络套接字(Socket)是基于TCP/IP协议的程序实现协议。实际上,我们所有的网络编
程都是基于Socket而实现的。

1.Socket的分类 tcp和udp

  其实socket的分类,也就是使用的协议不同,他们的区别也就是协议的不同。tcp协议和udp协议。

  ①tcp

  tcp是面向连接的,也就是说相互之间通信需要先建立连接,基于数据流传输数据。举个例子,就相当于打电话,A想与B打电话,那么首先A必须有电话机(客户端socket),然后需要知道B的电话号码(远程主机的ip地址和端口号),并且B也要有个电话机(服务端socket),并且是处于监听状态的(listen)。有了这些条件,A就可以拨号,建立一个连接(connet),接通了之后,A和B之间就可以进行通讯(send和receive)了。等他们通讯完毕,挂上电话(关闭socket),连接释放。整个socket的通讯就相当于一个打电话的过程。在.Net中声明tcp socket如下:

    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    addressFamily就是寻址方案,大多数就选择InterNetwork(IPV4)。SocketType就是数据传输的方式,流模式(Stream)。最后一个就是协议了。

  tcp的主要优点在于数据发送的可靠性和安全性,数据发送都是有序的,遵循先进先出的原则,保证数据能够安全的到达目的地。但是可靠和安全都是需要代价的,代价就是需要建立连接,但是连接的过程和维护这个连接都是十分消耗资源的,带来的不利面就是消耗系统资源,系统响应的速度相对来说会慢些。

  ②udp是无连接的,基于报文发送数据。所以udp不需要连接,只需要知道远程主机的地址就可以了。就像写信,我们知道对方的地址,我们就可以把我们的信寄出去,但是至于对方什么时候收到,能不能收到,就无法保证了。而且udp将数据以数据报文发送,有可能一段数据被分成1,2,3,4数据报文,但是收到的顺序有可能3先到,也有可能中途丢失了一个包。所以收到的一方还要进行数据排序和完整性的验证。看起来好像缺点一大堆,但是你想,人家牺牲了这么多,肯定能带给我们其他的优势。优点就是不需要建立和维护连接,消耗的系统资源较少,并且传输的效率和响应速度较高。在.Net中声明udp socket如下:

    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

很多东西都是共通的,没有什么东西是十全十美的,需要进行取舍,时间换空间,安全换效率,到达最平衡点。所有也没有说是tcp好还是udp好,只有适不适合。适合就是最好的。下面的图简单了描述了通讯的过程。(网上找到的图片,非本人画的)

2. 同步,异步,阻塞,非阻塞。

其实关于这个,我本来不愿谈及,因为自己对于这四个的区别也难以把握,怕误导别人,但是不说,又怕很多初学者会看到网上铺天盖地的同步,异步的区别。还是自己的浅显的谈一谈吧。

  ①同步和异步

  这个其实还算比较好理解一些,因为你如果做web开发,ajax就会使用到同步和异步。举个例子,我们向远程服务器请求数据,同步就是我们一直等啊等啊,直到服务器把数据给我们。异步就是,我们向服务器请求数据,并告诉服务器我就不等着了,我先去做其他的事情了,你到时候数据好了,通知我啊,我在来取。当然异步有多种方式,简单的说一下,

  1)等待直到结束模式。即一直等待到另一个线程把结果返回,其实在我看来和同步没多大区别(也有可能是我理解不正确)

  2)轮询模式,就是定时轮询,过一段时间问一下,有没有完成,直到问到已经完成。

  2)回调模式,应该是用的最多的一种,其他两种效率都不高,即完成了你就调用回调的方法。

  在举个现实中列子,比如你去银行办理业务,有很多的人,同步就相当于大家排队,排在那里一个个站着等,办完再下一个,中途你也不能走开,不然位置可能就被人占了。而异步就相当于取号,你可以取了号之后,去坐着等或者做点其他事情,到时候银行会通知你什么时候可以去办业务了。

  ②阻塞和非阻塞

  可能很多人会这样理解,同步就是阻塞,异步就是非阻塞,我开始也觉得是这样。但是看了些文章之后,逐渐有些了解。还是上面银行办业务的例子。

  我把别人文章的地址放上,大家可以参考http://www.cppblog.com/converse/archive/2009/05/13/82879.html

  这篇主要放在了理论上,下一篇主要就是参考的代码了。

posted @ 2013-08-08 14:47  小小糊涂神god  阅读(309)  评论(0编辑  收藏  举报