文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/程序员
在上一篇博客中我详细介绍了809协议的内容。809协议规范了通讯的报文,通讯的规则等,可是并没限制通讯使用的传输协议。这里,我将分别介绍利用TCP和UDP传输协议来实现的809协议对接的方法。ajax
TCP协议和UDP协议均是面向传输层的一种协议。而咱们常说的HTTP协议则是面向应用层的一种协议。算法
咱们常说的TCP/IP协议,则是一个协议簇,其中TCP、UDP协议均包含于这个协议簇。至于这个协议为何叫TCP/IP,是由于TCP和IP协议是其中最重要的两个协议。数据库
TCP(Transmission Control Protocol,传输控制协议)是面向链接的协议,也就是说,在收发数据前,必须和对方创建可靠的链接。一个TCP链接必需要通过三次“对话”才能创建起来,其中的过程很是复杂,只简单的描述下这三次对话的简单过程:主机A向主机B发出链接请求数据包:“我想给你发数据,能够吗?”,这是第一次对话;主机B向主机A发送赞成链接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工做)的数据包:“能够,你何时发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我如今就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,通过三次“对话”以后,主机A才向主机B正式发送数据。编程
总结上面这段话,主要包含了两个关键词:三次握手、可靠链接: 浏览器
如创建链接通常复杂,TCP协议断开也相对复杂,须要进行四次挥手:服务器
UDP(User Data Protocol),即用户数据报协议,其包含的特征主要以下:
a.UDP是一个非链接的协议,传输数据以前,源端和终端不创建链接,当它想传送时就简单地去抓取来自应用程序的数据,并尽量快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每一个消息段放在队列中,应用程序每次从队列中读一个消息段。
b.因为传输数据不创建链接,所以也就不须要维护链接状态,包括收发状态等,所以一台服务机可同时向多个客户机传输相同的消息。
c.UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
d.吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
e.UDP使用尽最大努力交付,即不保证可靠交付,所以主机不须要维持复杂的连接状态表(这里面有许多参数)。
f.UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,所以,应用程序须要选择合适的报文大小。
咱们常用“ping”命令来测试两台主机之间TCP/IP通讯是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,而后对方主机确认收到数据包,若是数据包是否到达的消息及时反馈回来,那么网络就是通的。微信
总结UDP协议,其最大的特色是其无链接性,支持广播通讯(支持一对多、多对多通讯)。广播地址(Broadcast Address)是专门用于同时向网络中全部工做站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的全部计算机。例如,对于10.1.1.0 (255.255.255.0 )网段,其广播地址为10.1.1.255 (255 即为2 进制的11111111 ),当发出一个目的地址为10.1.1.255 的分组(封包)时,它将被分发给该网段上的全部计算机。网络
TCP与UDP区别总结:
a.TCP面向链接(如打电话要先拨号创建链接);UDP是无链接的,即发送数据以前不须要创建链接。
b.TCP提供可靠的服务。也就是说,经过TCP链接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付 。
c.TCP面向字节流,其实是TCP把数据当作一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降(对实时应用颇有用,如IP电话,实时视频会议等)。
d.每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯 。
e.TCP首部开销20字节;UDP的首部开销小,只有8个字节。
f.TCP的逻辑通讯信道是全双工的可靠信道,UDP则是不可靠信道。多线程
网络上的两个程序经过一个双向的通讯链接实现数据的交换,这个链接的一端称为一个socket。
创建网络通讯链接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员作网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通讯的能力。
目前各大主流语言基本都支持socket编程。C#基于socket封装了TCPClient以及UDPClient类,使得socket编程更加简单。
在进行网络编程时,咱们经常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
同步:所谓同步,就是在发出一个功能调用时,在没有获得结果以前,该调用就不返回。也就是必须一件一件事作,等前一件作完了才能作下一件事。例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事。
异步:异步的概念和同步相对。当一个异步过程调用发出后,调用者不能马上获得结果。实际处理这个调用的部件在完成后,经过状态、通知和回调来通知调用者。 例如 ajax请求(异步): 请求经过事件触发->服务器处理(这是浏览器仍然能够做其余事情)->处理完毕。
阻塞:阻塞调用是指调用结果返回以前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在获得结果以后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不一样的。对于同步调用来讲,不少时候当前线程仍是激活的,只是从逻辑上当前函数没有返回而已。 例如,咱们在socket中调用recv函数,若是缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各类各样的消息。
非阻塞:非阻塞和阻塞的概念相对应,指在不能马上获得结果以前,该函数不会阻塞当前线程,而会马上返回。
对象的阻塞模式和阻塞函数调用:
对象是否处于阻塞模式和函数是否是阻塞调用有很强的相关性,可是并非一一对应的。阻塞对象上能够有非阻塞的调用方式,咱们能够经过必定的API去轮询状 态,在适当的时候调用阻塞函数,就能够避免阻塞。而对于非阻塞对象,调用特殊的函数也能够进入阻塞调用。函数select就是这样的一个例子。
总结为:
a.同步,就是我调用一个功能,该功能没有结束前,我死等结果。
b.异步,就是我调用一个功能,不须要知道该功能结果,该功能有结果后通知我(回调通知)。
c.阻塞,就是调用我(函数),我(函数)没有接收完数据或者没有获得结果以前,我不会返回。
d.非阻塞,就是调用我(函数),我(函数)当即返回,经过select通知调用者。
实现非阻塞通讯有两种方式,一种是利用异步方式,另外一种使用多线程方式实现。二者的原理也是各不相同:
a.线程本质上是进程中一段并发运行的代码,因此线程须要操做系统投入CPU资源来运行和调度;
b.异步本质上是计算机硬件功能,其操做无须消耗CPU时间的I/O操做;
编写异步操做的复杂程度较高,程序主要使用回调方式进行处理,处理函数能够没必要使用共享变量;
c.多线程是顺序执行,编程简单。可是线程的使用(滥用)会给系统带来上下文切换的额外负担。而且线程间的共享变量可能形成死锁的出现。
当须要执行I/O操做时,使用异步操做比使用线程+同步 I/O操做更合适。I/O操做不只包括了直接的文件、网络的读写,还包括数据库操做、Web Service、HttpRequest以及.net Remoting 等跨进程的调用。
线程适用那种须要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。
因为TCP是长链接,因此这里须要用非阻塞方式通讯,选择多线程方法解决:
UDP不需保持链接状态,因此监听端口完成操做便可,因为接受消息后操做基本不耗时,因此没有启用多线程:
在研究生期间时,研究过一段时间的socket通讯。当时对P2P模式,以及UDP打洞都还挺感兴趣。之后有机会和你们在一块儿探讨。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^