网络编程(一)--基本概念

.面向连接的传输协议--Tcp

     关于TCP协议(传输控制协议),属于计算机基础理论。这里仅仅只讲与编程紧密相关的TCP协议的一些特点。首先要知道TCP是面向连接的,也就是说两个远程主机(或者叫进程,远程通信实际上是进程之间的通信,进程是指运行中的程序)必须首先进行一次握手过程,确认连接成功会才能传输实际的数据。比如,进程A想将字符串"It's a fine day today"发送给进程B,它首先要建立连接。在这一过程中,进程A首先需要知道进程B的位置(主机地址和端口号)。随后发送一个不包含实际数据的请求报文,可以将这个报文称为"hello“。如果进程B接受到了这个“hello”,向进程A回复一个“hello”,进程A随后才发送实际的数据“It's a fine day today”。

     关于TCP,还需要了解的就是它是全双工的,也就是说,如果两个主机上的进程,即进程A和进程B之间建立好链接,那么数据可以由A流向B,也可以由B流向A。另外,TCP还是点对点的,意思说一个TCP连接总是两者之间的,在发送中,通过一个连接将数据发送给多个接收方是不可能的。如果想要数据发给多个接受者,就需要建立多个连接。

      TCP传递的数据都是可靠数据。意思是说连接建立后,数据的发送一定能够到达,并且是有序的。也就说,如果发送方发送了ABC,接收方收到的也是ABC,而不会是BCA或者AC。

     再具体编程中,与TCP相关的一个很重要的概念就是套接字Socket。大家应该学习过OSI网络七层协议。知道TCP属于传输层协议,那么如何从应用程序中获取来自传输层的数据呢?那就是通过套接字。套接字像是传输层打开的一扇门,应用程序通过这扇门向远程发送数据,或者接收远程数据。这个门后面的事情,比如消息是如何传递的,如何保证可靠性,开发者是不需要关心的。这属于网络底层的事情。开发者要关心的处理的是经过这个门传递到应用程序中的数据。

    我们使用下图来表示套接字的使用。

   

       如图所示,两个主机是对等的,但为了叙述方便,将发起请求的一方称为客户端,另一端称为服务器。可以看出两个应用程序之间的对话是通过套接字这个出入口来完成的,实际上套接字包含的最重要的就是两个信息:发出连接的本地IP地址和端口号,连接到的远程IP地址和端口号。

       端口(Port):一般来说计算机同时运行着非常多的应用程序,他们可能都需要同远程主机打交道,所以远程主机需要有一个ID来标识它想与本地机器上的哪个应用程序打交道,这里的ID就是端口。将端口分配给一个应用程序,这样来自这个端口的数据总是针对这个应用程序的。

      在.net中,提供了System.Net。Sockets.Socket类,通过它可以直接对套接字进行编程。同时.Net还提供了两个帮助类对套接字进行了包装,使得操作变得简单。这两个类是TcpClient和TcpListener,它与套接字的关系下图所示。

     

从上图可以看出,TcpClient和TcpListener对套接字进行了包装,从中也可以看出,TcpListener用于接受连接请求,而TcpClient用于接受和发送数据。TcpListener持续地保持对端口的侦听,一旦收到一个连接请求后,就可以获得一个TcpClient对象,而数据的发送和接受都由TcpClient完成的。此时,TcpListener并没有停止工作,它继续地保持对端口的侦听,以应对新的请求。(总是服务端使用TcpListener类,因为它需要建立起一个初始的连接。


二.即时通信程序的三种模式

     即时通信有三种常见的模式:点对点模式

 当采用这种模式时,每台计算机即是客户端也是服务端,因为它需要进行端口的侦听。实现这个模式的难点是:各个主机之间如何知道其他主机的存在?通常的解决办法是当其中一个主机上线时,通过UDP协议进行一个IP广播,使用这种方式来通知其他主机自己已经上线并说明位置,收到广播的主机发回一个应答,此时主机便知道其他主机的存在,然后就可以进行连接和通信。



第二种方式是引入服务器。此方式很好的解决了有多少主机在线的问题。由服务器进行专门的广播。服务器持续保持对端口的监听,每天有主机上线时,首先连接至服务器,服务器在收到连接后,将该主机的Ip地址和端口号发往其他在线主机(这样其他主机便知道该主机已上线,并知道其所在位置,图中用虚线表示)。从而可以进行连接和对话。在服务器进行了广播之后,因为各个主机已经知道了其他主机的位置,因此主机之间的对话不再通过服务器,而是直接连接(图中用实线)。因此,在这种模式时,各个主机依然需要保持对端口的侦听。

     


第三种模式是作者认为最简单也最实用的一种,主机的登陆与离线与第二种模式类类似,由服务器进行广播。如下图所示,但是区别是每台主机在上线时就与服务器建立了连接,彼此并不建立连接,那么当从主机A向主机B发送消息时,就需要一条路径,主机A---服务器--主机B,通过这种方式,各个主机不需要再对端口进行侦听,只需要服务器对端口进行侦听就行了。


对于一些较大的文件,比如图片或者文件,如果想由主机A发往主机B,以服务器作为中介进行传输效率比较低,此时可以临时搭建一个主机A至主机B之间的连接,用于传输大文件。当文件传输结束后再关闭连接(图中虚线表示)。

     除此之外,由于消息都经过服务器,因此服务器还可以缓存主机间的对话,即当主机A发往主机B时,如果主机B已经离线,则服务器可以对消息进行缓存,当主机B下次连接到服务器时,服务器自动将缓存的消息发送给B。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值