TCP、UDP基础知识
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送,可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP对应的则是可靠性要求低,传输经济的应用。TCP支持的应用层协议主要有:Telnet、FTP、SMTP等;UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
面向连接的TCP
"面向连接"就是在正式通信前必须与对方建立连接。比如你给别人打电话,必须等线路接通了,对方拿起话筒才能相互通话。TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次"对话"才能建立起来,其中的过程非常复杂,这里只做简单、形象的介绍,只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:"我想给你发送数据,可以吗?",这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:"可以,你什么时候?",这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:"我现在就发,你接着吧!",这是第三次对话。三次"对话"的目的是使数据包的发送和接收同步,进过三次"对话"之后,主机A才向主机B正式发送数据。
面向非连接的UDP
"面向非连接"就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。与手机短信非常相似:你在发短信的时候,只需要输入对方号码就OK了。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过来!
UDP适用于一次只传少量数据,对可靠性要求不高的应用环境。比如,经常使用"ping"命令来测试两台主机之间TCP/IP通信是否正常,其实"ping"命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
TCP与UDP区别
TCP | UDP | |
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠的 | 不可靠的 |
应用场合 | 传输大量的数据 | 少量数据 |
速度 | 慢 | 快 |
Java中实现TCP和UDP
在Java的API中,Socket是连接套接字,Java分别为TCP和UDP提供了相应的类,TCP是java.net.ServerSocket(用于服务器端)和java.net.Socket(用于客户端);UDP是java.net.DatagramSocket。在API明显的区别是:UDP的Socket编程是不提供监听功能的,也就是双方更为平等,面对的接口是完全一样的。但是为了用于UDP实现C/S结构,在使用UDP时可以使用DatagramSocket.receive()来实现类似于监听的功能。因为receive()是阻塞的函数,即等待数据接收,如果没有收到数据就会进入等待状态,程序停在receive()函数这里,如果接收数据,程序就会继续执行。因而可以根据读入的数据报来决定下一步的动作,这就达到了跟网络监听相似的效果。
UDP不连接就send()和receive(),TCP需要获得一个OutputStream和InputStream才能读写,在获得流时就等于在建立连接。
在DatagramSocket方法中有connect(SocketAddress addr)和disconnect()。
- connect()方法实际不建立TCP意义上的连接。这里连接只是将DatagramSocket指定远程主机和远程端口发包。此时试图向另外的主机和端口发包将会抛出异常IllegalArgumentException异常。
- disconnect():中止已连接DatagramSocket的"连接",这样可以再次收发任何主机和端口的包。