TCP 是Transmission Control Protocol(传输控制协议)的简称,是TCP/IP 体系中面向连接的运输层协议,在网络中提供全双工的和可靠的服务。一旦通信双方建立了TCP 连接,连接中的任何一方都能向对方发送数据和接收对方发送来的数据。发送数据时,程序员可以通过程序不断将数据流陆续写入TCP 的发送缓冲区中,然后TCP 自动从发送缓冲区中取出一定数量的数据,将其组成TCP 报文段逐个发送给IP 层,再通过IP 层发送出去。接收端从IP 层接收到TCP 报文段后,将其暂时保存在接收缓冲区中,这时程序员就可以通过程序依次读取接收缓冲区中的数据,从而达到相互通信的目的。
TCP 协议最主要的特点是:
1) 是一种基于连接的协议。
2) 保证数据准确到达。
3) 保证各数据到达的顺序与数据发出的顺序相同。
4) 传输的数据无消息边界。
利用TCP 协议开发应用程序时,.NET 框架提供有两种工作方式,一种是同步工作方式,另一种是异步工作方式。
同步工作方式是指利用TCP 协议进行编程时程序执行到发送、接收和监听语句时,在未完成工作前不再继续往下执行,即处于阻塞状态,直到该语句完成某个工作后才继续执行下一条语句;异步工作方式是指程序执行到发送、接收和监听语句时,不论工作是否完成,都会继续往下执行。例如对于接收数据来说,在同步工作方式下,接收方执行到接收语句后将处于阻塞方式,只有接收到对方发来的数据后才继续执行下一条语句;而如果采用异步工作方式,则在程序执行到接收语句后,无论接收方是否接收到对方发来的数据,程序都会继续往下执行。
与同步工作方式和异步工作方式相对应,利用Socket 类进行编程时系统也都提供有相应的方法,采用相应的方法进行编程分别称为同步套接字编程和异步套接字编程。但是使用套接字编程比较复杂,涉及到很多底层的细节。为了简化套接字编程,.NET 框架又专门提供了两个类:TcpClient 类与TcpListener 类。由于这两个类与套接字一样也分别有各自的同步和异步工作方式及其对应的方法,而我们在编程时,三个类都有可能使用,因此为简化起见,无论使用的是哪个类,我们统统从工作方式上将其称为同步TCP 和异步TCP,所以其编程方式也有两种,一种是同步TCP 编程,另一种是异步TCP 编程。
注意这里的同步TCP 和异步TCP 仅仅指工作方式,它和线程间的同步不是一个概念。线程间的同步指不同线程或不同线程使用的某些资源具有先后关联的关系,它决定着逻辑执行的顺序。比如有A 和B 两个资源,实际应用中要求只有对资源A 处理后才能处理资源B,就说A 和B 存在同步关系。如果执行顺序不正确,变为先处理资源B 再处理资源A,得到的结果就是错误的。所以,线程间的同步主要关注的是一种逻辑关系。而同步TCP 和异步TCP 则仅仅指TCP 协议编程中采用那种工作方式而言,即是从执行到发送、接收和监听语句时,程序是否继续往下执行这个角度来说的。
从逻辑关系上看,无论是同步TCP 应用编程还是异步TCP 应用编程,在实际应用中既可能要求不同线程间的同步,也可能不要求同步。