UDP协议与TCP/IP协议

一、UDP与TCP协议

UDP(User Datagram Protocol)协议是无面向连接的、不可靠的、无序的、无流量控制的传输层协议,UDP发送的每个数据报是记录型的数据报,所谓的记录型数据报就是接收进程可以识别接收到的数据报的记录边界。TCP(Transmission Control Protocol 传输控制协议)协议是面向连接的、可靠的、有序的、拥有流量控制的传输层协议,它是字节流的协议,无记录边界。

1.记录与字节流

UDP协议:发送进程在发送每个数据报的时候并不等待多个数据报集中在一起以一个较大数据报发送出去,而是立即发送出去,它是记录型的协议。并且接收进程每次通过readrecv……获得的数据报必定是发送进程所发送的那个数据报。不可能是多个数据报,接收进程可以识别到发送进程所发送的每个数据报的记录边界。

TCP协议:发送进程在发送每个数据报的时候在内核处理过程中有可能并不立即发送出去,而是会将多个数据报集中在一起以一个较大的数据报来发送,它是字节流的协议。而接收进程每次通过read来读取发送进程发送过来的数据报并不一定是发送进程原先发送数据报,接收进程无法识别每个数据报的记录边界,所以TCP协议就是字节流的、无记录边界的协议。

例如:QQ聊天所用到的协议就应该是有记录边界的,聊天过程中是以“消息”为单位,消息可以看成一个记录,所以QQ聊天协议采取UDP协议而不是TCP协议。

 

2.有序与无序

UDP协议:发送进程所发送的每个数据报并不按照原先发送的顺序到达接收进程,有可能早发送的数据报较后到达接收进程。因为数据报在经过中间路径的传送时会因为各个数据报传送的路径不同或者其它原因而造成这些数据报到达的顺序不同,UDP协议是无序的传输协议。所以为了使基于UDP协议的应用程序有序,必须在应用程序中设置序号、确认机制来使其有序。

TCP协议:有序协议,有超时、序号、重传、确认机制。

例如:FTP协议是用于传送文件的协议,为了确保在传送文件内容的时候,传送的每个数据报协议有序接收,所以FTP协议是基于TCP协议。 

那为什么FTP协议不是是基于UDP协议?因为为了保证有序,FTP协议中引入了确认、序号字段。

这里还有一个问题,FTP协议中的控制连接传送的内容好像都是基于消息形式,客户端在控制连接上发出一个请求消息,服务器端返回一个请求结果消息,感觉应该FTP控制连接采取UDP协议,为什么采取TCP协议?因为控制连接上是交互式的消息传送,客户端在发送一个请求之后,在服务器端的响应消息未到达之前,客户端是不会发送第二个请求消息,所以不用担心这两个请求消息会叠加在一起。也就是对于交互式的消息传递也可以采用TCP协议。

 

3.流量控制

UDP协议:没有流量控制机制,如果发送进程发送数据报塞满了接收进程的接收缓冲区,就会丢弃数据报。出现这种情况,UDP协议不会通知发送进程减缓数据的发送速率。

TCP协议:拥有流量控制。


4.客户端通信过程比较

4.1 客户端的连接过程比较

UDP协议在创建端口之后,可以同多个服务器端建立通信,而TCP协议只能与一个服务器端建立通信,TCP不允许目的地址是广播或多播地址,UDP允许。UDP协议客户端同服务器端的通信关系可以是一对多的关系,而TCP协议只能是一对一的关系。

通过UDP协议可以给同一个端口指定多次connect操作,而TCP协议不可以,TCP只能指定一次connect操作。UDP协议指定第二次connect操作之后会先断口第一次的连接,然后建立第二次的连接

4.2 服务器端的连接过程比较

对于UDP协议客户端与服务器端没有什么本质的区别,每个UDP协议的客户端也是服务器端。TCP协议就不同了,TCP协议必须通过listen 来申请监听,然后通过accept来接收一个客户端的连接,当接收客户端的连接会再创建一个单独的端口用来同客户端之间进行数据通信,也就是说服务器端由一个单独的监听端口负责监听客户端的连接请求,当接收到一个来自客户端的连接请求之后,服务器会另外创建一个端口负责同客户端之间进行连接通信。


5.TCP与UDP应用:

1、TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。

 2,UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。

二、Socket是什么

  Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。网络上的两个程序通过一个双向的通讯管道连接实现数据的交换,这个双向链路的一端称为一个Socket,一个Socket由一个IP地址和一个端口号唯一确定应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 Socket是TCP/IP协议的一个十分流行的编程界面,但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

  Socket通讯过程:服务端监听某个端口是否有连接请求,客户端向服务端发送连接请求,服务端收到连接请求向客户端发出接收消息,这样一个连接就建立起来了。客户端和服务端都可以相互发送消息与对方进行通讯。

  Socket的基本工作过程包含以下四个步骤:

  1、创建Socket;

  2、打开连接到Socket的输入输出流;

  3、按照一定的协议对Socket进行读写操作;

  4、关闭Socket。

三、Java中的Socket

  在java.net包下有两个类:Socket和ServerSocket。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

列出几个常用的构造方法:

Socket(InetAddress address,int port);//创建一个流套接字并将其连接到指定 IP 地址的指定端口号

Socket(String host,int port);//创建一个流套接字并将其连接到指定主机上的指定端口号

Socket(InetAddress address,int port, InetAddress localAddr,int localPort);//创建一个套接字并将其连接到指定远程地址上的指定远程端口

Socket(String host,int port, InetAddress localAddr,int localPort);//创建一个套接字并将其连接到指定远程主机上的指定远程端口

Socket(SocketImpl impl);//使用用户指定的 SocketImpl 创建一个未连接 Socket

 

ServerSocket(int port);//创建绑定到特定端口的服务器套接字

ServerSocket(int port,int backlog);//利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号

ServerSocket(int port,int backlog, InetAddress bindAddr);//使用指定的端口、侦听 backlog 和要绑定到的本地 IP地址创建服务器

 

构造方法的参数中,address、host和port分别是双向连接中另一方的IP地址、主机名和端 口号,stream指明socket是流socket还是数据报socket,localPort表示本地主机的端口号,localAddr和bindAddr是本地机器的地址(ServerSocket的主机地址),impl是socket的父类,既可以用来创建serverSocket又可以用来创建Socket。count则表示服务端所能支持的最大连接数。

注意:必须小心选择端口号。每一个端口提供一种特定的服务,只有给出正确的端口,才 能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。

几个重要的Socke方法:

1

2

3

public InputStream getInputStream();//方法获得网络连接输入,同时返回一个IutputStream对象实例

public OutputStream getOutputStream();//方法连接的另一端将得到输入,同时返回一个OutputStream对象实例

public Socket accept();//用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。


"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。

注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。


这篇文章没有涉及到如何使用java来实现网络编程。如果想知道java是如何实现的,请关注我的另一篇文章:Java实现的网络编程——基础篇http://blog.csdn.net/lulei1217/article/details/50266125

发布了45 篇原创文章 · 获赞 31 · 访问量 24万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章