面向报文(UDP)和面向字节流(TCP)的区别

面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。
面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。

下图是TCP和UDP协议的一些应用。

下图是TCP和UDP协议的比较。

这里再详细说一下面向连接和面向无连接的区别:

  • 面向连接举例:两个人之间通过电话进行通信;
  • 面向无连接举例:邮政服务,用户把信函放在邮件中期待邮政处理流程来传递邮政包裹。显然,不可达代表不可靠。
从程序实现的角度来看,可以用下图来进行描述。 从上图也能清晰的看出,TCP通信需要服务器端侦听listen、接收客户端连接请求accept,等待客户端connect建立连接后才能进行数据包的收发(recv/send)工作。而UDP则服务器和客户端的概念不明显,服务器端即接收端需要绑定端口,等待客户端的数据的到来。后续便可以进行数据的收发(recvfrom/sendto)工作。
在前面讲解UDP时,提到了UDP保留了报文的边界,下面我们来谈谈TCP和UDP中报文的边界问题。在默认的阻塞模式下,TCP无边界,UDP有边界。
  • 对于TCP协议,客户端连续发送数据,只要服务端的这个函数的缓冲区足够大,会一次性接收过来,即客户端是分好几次发过来,是有边界的,而服务端却一次性接收过来,所以证明是无边界的;
  • 而对于UDP协议,客户端连续发送数据,即使服务端的这个函数的缓冲区足够大,也只会一次一次的接收,发送多少次接收多少次,即客户端分几次发送过来,服务端就必须按几次接收,从而证明,这种UDP的通讯模式是有边界的。
TCP无边界,造成对采用TCP协议发送的数据进行接收比较麻烦,在接收的时候易出现粘包,即发送方发送的若干包数据到接收方接收时粘成一包。由于TCP是流协议,对于一个socket的包,如发送 10AAAAABBBBB两次,由于网络原因第一次又分成两次发送, 10AAAAAB和BBBB,如果接包的时候先读取10(包长度)再读入后续数据,当接收得快,发送的慢时,就会出现先接收了 10AAAAAB,会解释错误 ,再接到BBBB10AAAAABBBBB,也解释错误的情况。这就是TCP的粘包。 在网络传输应用中,通常需要在网络协议之上再自定义一个协议封装一下,简单做法就是在要发送的数据前面再加一个自定义的包头,包头中可以包含数据长度和其它一些信息,接收的时候先收包头,再根据包头中描述的数据长度来接收后面的数据。详细做法是:先接收包头,在包头里指定包体长度来接收。设置包头包尾的检查位( 比如以0xAA开头,0xCC结束来检查一个包是否完整)。对于TCP来说:
  • 1)不存在丢包,错包,所以不会出现数据出错 ;
  • 2)如果包头检测错误,即为非法或者请求,直接重置即可。
为了避免粘包现象,可采取以下几种措施。
一、对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;
二、对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;
三、由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。
TCP 面向 字节流 UDP 面向 报文 之前对于 tcp udp 只是记住了一个 面向 字节流 ,一个是 面向 报文 的,但是并没有真正的理解,经过中间找工作的压力中间不停的面试和笔试,现在终于对于这两个概念有了一个全新的认识。 通俗的解释: 可以将 tcp 和upd看成不同公司的出租车, tcp 这个公司的出租车司机( tcp 头)在拉客的时候,一个来了一个乘客,可是自己车上还有三个位置,司机就会继续等,直到自己车上去同一个目的地的乘客坐满了才开车,因为 tcp 公司认为遵循Nagle算法可以提高效率,节省能源,从socket学校走出来三个团
一、 UDP 简介 UDP (User Datagram Protocol,用户数据报协议)是一个简单地 面向 数据报的运输层协议,为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。 UDP 的主要特点: UDP 是无连接的,即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。 UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。 UDP 面向 报文 的,发送方的 UDP 对应用程序交下来的 报文 ,在添加首部后就向下交付IP层。 UDP 对应用层交下来的报
一. 概述 (2) 打个比方比喻 TCP ,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子、矿泉水瓶、锅碗瓢盆)接水。 上面的例子中,往水池里倒几次水和接几次水是没有必然联系的,也就是说你可以只倒一次水,然后分10次接完。另外,水池里的水接多少就会少多少;往里面倒多少水,就会增加多少水,但是不能超过水池的容量,多出的水会溢出。 结合T...
1. 报文 (message) 我们将位于应用层的信息分组称为 报文 报文 是网络中交换与传输的数据单元,也是网络传输的单元。 报文 包含了将要发送的完整的数据信息,其长短不需一致。 报文 在传输过程中会不断地封装成分组、包、帧来传输,封装的方式就是添加一些控制信息组成的首部,那些就是 报文 头。 2. 报文 段(segment) 通常是指起始点和目的地都是传输层的信息单元。 3.分组/包(packet) 分组是在网络中传输的二进制...
如何理解 字节流 ? 之所以会说 TCP 面向 字节流 的协议, UDP 面向 报文 的协议,是因为操作系统对 TCP UDP 协议的发送方的机制不同,也就是问题原因在发送方。 先来说说为什么 UDP 面向 报文 的协议? 当用户消息通过 UDP 协议传输时,操作系统不会对消息进行拆分,在组装好 UDP 头部后就交给网络层来处理,所以发出去的 UDP 报文 中的数据部分就是完整的 计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。 TCP /IP 是互联网相关的各类协议族的总称。比如: TCP UDP ,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP /IP 族内的协议。 TCP (Transmission Control Protocol,传输控
UDP 面向 报文 的,因为它在发送数据时,将数据封装成一个个独立的数据包(即 报文 ),每个数据包都有自己的标识符,可以独立地发送、接收和处理。 UDP 不会对数据包进行拆分和合并,也不会对数据包进行排序和重传,因此它的传输效率比较高,但可靠性较差。 而 TCP 面向 字节流 的,因为它在发送数据时,将数据流分割成一个个固定大小的数据块(即 报文 段),每个 报文 段都有自己的序号和确认号,可以按照序号进行排序和重传。 TCP 会对数据进行拆分和合并,以保证数据的完整性和可靠性,但传输效率相对较低。