UDP与TCP的区别

TCP提供一种面向链接的、可靠的字节流服务。其中,面向链接意味着两个使用TCP的应用(一般是一个客户和一个服务器)在彼此交换数据以前必须先创建一个TCP链接。在一个TCP链接中,仅有两方进行彼此通讯;而字节流服务意味着两个应用程序经过TCP连接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。java

  对于可靠性,TCP经过如下方式进行保证:编程

  • 数据包校验:
    目的是检测数据在传输过程当中的任何变化,若校验出包有错,则丢弃报文段而且不给出响应,这时TCP发送数据端超时后会重发数据;

  • 对失序数据包重排序:
    既然TCP报文段做为IP数据报来传输,而IP数据报的到达可能会失序,所以TCP报文段的到达也可能会失序。TCP将对失序数据进行从新排序,而后才交给应用层;

  • 丢弃重复数据:
    对于重复数据,可以丢弃重复数据;

  • 应答机制:
    当TCP收到发自TCP链接另外一端的数据,它将发送一个确认。这个确认不是当即发送,一般将推迟几分之一秒;

  • 超时重发:
    当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。若是不能及时收到一个确认,将重发这个报文段;

  • 流量控制:
    TCP链接的每一方都有固定大小的缓冲空间。TCP的接收端只容许另外一端发送接收端缓冲区所能接纳的数据,这能够防止较快主机导致较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。


1、UDP与TCP

UDP(User Datagram Protocol用户数据报协议)是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无链接的传输层协议,提供面向事务的简单不可靠信息传送服务。浏览器

TCP(Transmission Control Protocol 传输控制协议)是一种面向链接的、可靠的、基于字节流的传输层通讯协议。TCP采用了流量控制、拥塞控制、连续ARQ(Automatic Repeat Request自动重传请求)等技术来保证它的可靠性。安全

Redis客户端与Redis服务器之间使用TCP协议进行链接,极光推送内部原理也是基于TCP的长链接。服务器

二:UDP应用场景

一、面向数据报方式;二、网络数据大多为短消息;三、拥有大量Client;四、对数据安全性无特殊要求;五、网络负担很是重,但对响应速度要求高。网络

三:TCP链接与套接字

TCP链接是一种抽象的概念,表示一条能够通讯的链路。每条TCP链接有且仅有两个端点,表示通讯的双方。且双方在任意时刻均可以做为发送者和接收者。socket

一条TCP链接的两端就是两个套接字。套接字=IP地址:端口号。所以,TCP链接=(套接字1,套接字2)=(IP1:端口号1,IP2:端口号2)函数

四:TCP与UDP的基本区别

一、TCP面向链接(如打电话要先拨号创建链接);UDP是无链接的
二、TCP提供可靠的服务。也就是说,经过TCP链接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
三、TCP面向字节流,TCP把数据当作一连串无结构的字节流;UDP是面向报文的
四、UDP没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降(对实时应用颇有用,如IP电话,实时视频会议等),但网络拥塞时有些报文可能会丢失(因此不可靠)
五、每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯
六、TCP首部开销20字节;UDP的首部开销小,只有8个字节
七、要求比较高的服务通常使用TCP协议,如FTP、Telnet、HTTP、SMTP(Simple Mail Transfer Protocol简单邮件传输协议)、POP3等,而UDP是面向无链接的,使用这个协议的常见服务有DNS(Domain Name System,域名系统)、SNMP(Simple Network Management Protocol,简单网络管理协议).net

TCP对应的协议:

(1) FTP:定义了文件传输协议,使用21端口
(2) Telnet:一种用于远程登录的端口,使用23端口,用户能够以本身的身份远程链接到计算机上,可提供基于DOS模式下的通讯服务
(3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口
(4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口
(5) HTTP:是从Web服务器传输超文本到本地浏览器的传送协议视频

UDP对应的协议:

(1) DNS:用于域名(主机名)解析服务,将域名地址转换为IP地址。DNS用的是53号端口
(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。因为网络设备不少,无链接的服务就体现出其优点

五:编程区别

一般咱们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数建立一个socket用于TCP通信,函数参数咱们一般填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示创建一个socket用于流式网络通信。
SOCK_STREAM这种的特色是面向链接的,即每次收发数据以前必须经过connect创建链接,也是双向的,即任何一方均可以收发数据,协议自己提供了一些保障机制保证它是可靠的、有序的,即每一个包按照发送的顺序到达接收方。
而SOCK_DGRAM这种是User Datagram Protocol协议的网络通信,它是无链接的,不可靠的,由于通信双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方创建一个socket之后就能够用sendto发送数据,也能够用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特色是通信速度比较快。你们都知道TCP是要通过三次握手的,而UDP没有。

socket编程:

Socket用在哪呢,主要用在进程间,网络间通讯。所谓socket 一般也称做”套接字“,用于描述IP地址和端口,是一个通讯链的句柄。应用程序一般经过”套接字”向网络发出请求或者应答网络请求。一条TCP链接的两端就是两个套接字(套接字=IP地址:端口号)
Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是创建网络链接时使用的。在链接成功时,应用程序两端都会产生一个Socket实例,操做这个实例,完成所需的会话。对于一个网络链接来讲,套接字是平等的,并无差异,不由于在服务器端或在客户端而产生不一样级别。不论是Socket仍是ServerSocket它们的工做都是经过SocketImpl类及其子类完成的。
Accept方法用于产生”阻塞”,直到接受到一个链接,而且返回一个客户端的Socket对象实例。”阻塞”是一个术语,它使程序运行暂时”停留”在这个地方,直到一个会话产生,而后程序继续;一般”阻塞”是由循环产生的。
getInputStream方法得到网络链接输入,同时返回一个InputStream对象实例。
getOutputStream方法链接的另外一端将获得输入,同时返回一个OutputStream对象实例。

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

TCP:

TCP编程的服务器端通常步骤是:

一、建立一个socket,用函数socket();
二、设置socket属性,用函数setsockopt(); * 可选
三、绑定IP地址、端口等信息到socket上,用函数bind();
四、开启监听,用函数listen();
五、接收客户端上来的链接,用函数accept();
六、收发数据,用函数send()和recv(),或者read()和write();
七、关闭网络链接;
八、关闭监听;

TCP编程的客户端通常步骤是:

一、建立一个socket,用函数socket();
二、设置socket属性,用函数setsockopt();* 可选
三、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
四、设置要链接的服务器的IP地址和端口等属性;
五、链接服务器,用函数connect();
六、收发数据,用函数send()和recv(),或者read()和write();
七、关闭网络链接;

UDP:

UDP编程的服务器端通常步骤是:

  一、建立一个socket,用函数socket();

  二、设置socket属性,用函数setsockopt();* 可选

  三、绑定IP地址、端口等信息到socket上,用函数bind();

  四、循环接收数据,用函数recvfrom();

  五、关闭网络链接;

UDP编程的客户端通常步骤是:

  一、建立一个socket,用函数socket();

  二、设置socket属性,用函数setsockopt();* 可选

  三、绑定IP地址、端口等信息到socket上,用函数bind();* 可选

  四、设置对方的IP地址和端口等属性;

  五、发送数据,用函数sendto();

  六、关闭网络链接;

相关文章
相关标签/搜索