本博文主要简述TCP/UDP的比较和应用场景,以及java.net包下基于DatagramSocket/DatagramPacket的编程和源码分析
TCP与UDP
作为传输层两个重要的协议,得到广泛的使用。
TCP
1. 面向连接,速度较慢,证明:连接双方的一方主动断开连接之后,另一方的recieve()会立即作出响应。
2. 面向字节流,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节。流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。
3. 通信方式:全双工通信(发送缓存&接收缓存)。
4. 保证数据正确性。
5. 具备流量控制和拥塞控制。
6. 应用场景:浏览器surfing(Http)、文件传输(FTP)、接发邮件(SMTP,POP)、远程登录(telnet、ssh)。
UDP
1. 面向非连接,速度较快,证明:连接双方的一方主动断开连接之后,另一方的recieve()仍然阻塞。
2. 面向数据包,UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。
3. 通信方式:一对一、一对多、多对一、多对多。
4. 可能丢包,譬如我们看视频时失帧就是丢包的结果。
5. 无流量控制和拥塞控制。
6. 应用场景:即时聊天(QQ)、视频流(Youku的视频)、语音流(YY语音)等,适用于多播和广播的应用场景。
DatagramSocket/DatagramPacket
有人把DatagramSocket比作码头,把DatagramPacket比作集装箱,前者只是存放各种数据包的地方,而后者决定数据包的内容和目的地址。这种