udp需要建立连接吗(UDP连接是否需要IP)

      最后更新:2023-09-04 12:51

      计算机里面udp报文作用是什么?

      计算机里的UDP报文协议只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。UDP的主要特点是:(1)UDP 是无连接的。即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。(2)UDP 使用尽最大努力交付。即不保证可靠交付,因此主机不需要维护复杂的连接状态表(这里面有许多参数)。(3)UDP 是面向报文的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不分拆,而是保留这些报文的边界。这就是说,应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文,如图 5-4 所示。在接收方的 UDP,对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程。也就是说,UDP 一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。若报文太长,UDP 把它交给 IP 层后,IP 层在传送时可能要进行分片处理,这会降低 IP 层的效率。反之,若报文太短,UDP 把它交给 IP 层后,会使 IP 数据报的首部的相对长度太大,这也降低了 IP 层的效率。(4)UDP 没有拥塞控制。因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很多的实时应用(如:IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络出现拥塞时丢失一部分数据,但却不允许数据有太大的时延。UDP 协议正好适合这种要求。(5)UDP 支持一对一、一对多、多对一和多对多的交互通信。(6)UDP的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
      计算机里面udp报文作用是什么?

      tcp和udp的区别

      tcp和udp的区别如下:1、TCP面向连接(如打电话要先拨号建立连接),UDP是无连接的,即发送数据之前不需要建立连接。2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,即不保证可靠交付。Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。4、每一条TCP连接只能是点到点的,UDP支持一对一,一对多,多对一和多对多的交互通信。5、TCP对系统资源要求较多,UDP对系统资源要求较少。
      tcp和udp的区别

      计算机网络-运输层-用户数据报协议UDP

      用户数据报协议UDP只在IP的数据报服务之上增加的功能:复用和分用的功能以及差错检测的功能。 UDP的主要特点是:(1) UDP是无连接的 ,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此了开销和发送数据之前的时延。(2) UDP使用尽最大努力交付 ,即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里面有许多参数)。(3) UDP是面向报文的 。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文,如图5-4所示。在接收方的UDP,对IP层交上来的UDP用户数据报,在去除首部后就原封不动地交付上层的应用进程。也就是说,UDP一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文,若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率。反之,若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,这也降低了IP层的效率。(4)UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很多的实时应用(如P电话、实时祝频会议等)要求源主机以恒定的速率发递数据,并且允许在网铬发生拥塞时丢失一些数据,但却不允许数据有太大的时延。UDP正好适合这种要求。(5)UDP支持一对一、一对多、多对一和多对多的交互通信.(6)UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。(7)网络环境差的情况下,丢包严重。虽然某些实时应用需要使用没有拥塞控制的UDP,但当很多的源主机同时都向网络发送高速率的实时视领流时,网铬就有可能发生拥塞。结果大家都无法正常接收。因此,不使用拥塞控制功能的UDP有可能会引起网络产生严重的拥塞问题。还有一些使用UDP的实时应用,需要对UDP的不可靠的传输进行适当的改进,以减少数据的丢失。在这种情况下,应用进程本身可以在不影响应用的实时性的前提下,增加一些提高可靠性的措施,如采用前向纠错或重传己丢失的报文。用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节(图5-5),由四个字段组成,每个字段的长度都是两个字节。各字段意义如下:(1)源端口   源端口号。在需要对方回信时选用。不需要时可用全0。(2)目的端口   目的端口号。这在终点交付报文时必须使用。(3)长度    UDP用户数据报的长度,其最小值是8(仅有首部)。(4)检验和    检测UDP用户数据报在传输中是否有错。有错就丢弃。伪首部的第3字段是全零;第4字段是P首部中的协议字段的值,对于 UDP协议字段值为17 ;第5字段是UDP用户数据报的长度。当运输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交最后的终点一应用进程。如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由 网际控制报文协议ICMP发送“端口不可达”差错报文 给发送方。“ICMP的应用”中的traceroute时,就是让发送的UDP用户数据报故意使用一个非法的UDP端口,结果ICMP就返回“端口不可达”差错报文,因而达到了测试的目的。请注意,虽然在UDP之间的通信要用到其端口号,但由于UDP的通信是无连接的,因此不需要使用套接字(TCP之间的通信必须要在两个套接字之间建立连接)。UDP用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。所谓“伪首部”是因为这种伪首部并不是UDP用户数据报真正的首部。只是在计算检验和时,临时添加在UDP用户数据报前面,得到一个临时的UDP用户数据报。检验和就是按照这个临时的UDP用户数据报来计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。UDP计算检验和的方法 和计算IP数据报首部检验和的方法相似。但不同的是:IP数据报的检验和只检验IP数据报的首部,但UDP的检验和是把首部和数据部分一起都检验。 在发送方 ,首先是先把全零放入检验和字段。再把伪首部以及UDP用户数据报看成是由许多16位的字串接起来的。若UDP用户数据报的数据部分不是偶数个字节,则要填入一个全零字节(但此字节不发送)。然后按二进制反码计算出这些16位字的和。将此和的二进制反码写入检验和字段后,就发送这样的UDP用户数据报。 在接收方 ,把收到的UDP用户数据报连同伪首部(以及可能的填充全零字节)一起,转为8位数二进制,然后按二进制反码求这些16位字的和。当无差错时其结果应为全1。否则就表明有差错出现,接收方就应丢弃这个UDP用户数据报(也可以上交给应用层,但附上出现了差错的警告)。 检验和 ,既检查了UDP用户数据报的源端口号和目的端口号以及UDP用户数据报的数据部分,又检查了IP数据报的源P地址和目的地址。 这里假定用户数据报的长度是15字节,因此要添加一个全0的字节。这种简单的差错检验方法的检错能力并不强,但它的好处是简单,处理起来较快。
      计算机网络-运输层-用户数据报协议UDP

      udp连接两个电脑

      关于UDP:将数据及源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k内;因无连接,是不可靠协议;不需要建立连接,速度快 使用udp协议主要涉及到两个类:DatagramSocket,DatagramPacketDatagramSocket: 用于建立一个数据包的出口或入口,构造方法中有IP的都是用于接收方的DatagramPacket: 用于包装数据,构造方法中有IP的都是用于发送方的可以将其比作发送包裹,DatagramSocket就是快递公司,选择哪一个快递公司并不会影响包裹的发送;而DatagramPacket则是你的包裹,上面必须写明地址(IP)和门牌号(port:端口号).下面的程序,两台电脑各运行一个,只需要将IP改为接收方的IP,端口号改为你电脑上面空余的端口号(电脑的端口号是0--65535,1024以内是系统的,所以一般建议使用1024以外的端口号) import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;import java.util.Scanner;public class Chat { public static void main(String[] args) { DatagramSocket sendsocket = null; DatagramSocket receiceSocket = null; try { sendsocket = new DatagramSocket(); receiceSocket = new DatagramSocket(8888,InetAddress.getByName("127.0.0.1")); } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } new Thread(new Send(sendsocket)).start(); new Thread(new Receive(receiceSocket)).start(); }}class Send implements Runnable{ DatagramSocket socket = null; public Send(DatagramSocket socket) { this.socket = socket; } @Override public void run() { byte[] buf = new byte[1024]; DatagramPacket packet = null; Scanner scanner = new Scanner(System.in); while(true) { String data = scanner.nextLine(); if("over".equalsIgnoreCase(data)) { break; } buf = data.getBytes(); try { //接收方的IP和端口号 packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 9999); socket.send(packet); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } scanner.close(); }}class Receive implements Runnable{ DatagramSocket socket; public Receive(DatagramSocket socket) { this.socket = socket; } @Override public void run() { while(true) { byte[]buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); try { socket.receive(packet); } catch (IOException e) { e.printStackTrace(); break; } String text = new String(packet.getData(), 0, packet.getLength()); String ip = packet.getAddress().getHostAddress(); if("over".equalsIgnoreCase(text)) { break; } System.out.println(ip+" : "+text); } socket.close(); } } 在发送端,要在数据包对象中明确目的地IP及端口 DatagramSocket ds = new DatagramSocket();byte[] by = “hello,udp”.getBytes();DatagramPacket dp = new DatagramPacket(by,0,by.length, InetAddress.getByName(“127.0.0.1”),10000);ds.send(dp);ds.close(); 在接收端,要指定监听的端口 DatagramSocket ds = new DatagramSocket(10000);byte[] by = new byte[1024];DatagramPacket dp = new DatagramPacket(by,by.length);ds.receive(dp);String str = new String(dp.getData(),0,dp.getLength());System.out.println(str+"--"+dp.getAddress());ds.close();
      udp连接两个电脑

      22TCP IP 网络协议基础入门--传输层:UDP协议

      通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址。但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此严格地讲,通信双方不是主机,而是主机中的进程。主机中常常有多个应用进程同时在与外部通信(比如你的浏览器和 QQ 在同时运行),下图中,A 主机的 AP1 进程在与 B 主机的 AP3 进程通信,同时主机 A 的 AP2 进程也在与 B 主机的 AP4 进程通信。两个主机的传输层之间有一个灰色双向箭头,写着“传输层提供应用进程间的逻辑通信”。逻辑通信:看起来数据似乎是沿着双向箭头在传输层水平传输的,但实际上是沿图中的虚线经多个协议层次而传输。TCP/IP 协议栈传输层有两个重要协议——UDP 和 TCP,不同的应用进程在传输层使用 TCP 或 UDP 之一。在第一节我们已经了解过端口的概念,端口的作用体现在传输层。刚才的图中,AP1 与 AP3 的通信与 AP2 与 AP4 的通信可以使用同一个传输层协议来传输(TCP 或 UDP),根据 IP 地址或 MAC 地址都只能把数据传到正确的主机,但具体需要传到哪一个进程,是通过端口来辨认的。比如同时使用浏览器和 QQ,浏览器占用 80 端口,而 QQ 占用 4000 端口,那么发送过来的 QQ 消息便会通过 4000 端口显示在 QQ 客户端,而不会错误地显示在浏览器上。端口号有 0 ~ 65535 的编号,其中:编号 0 ~ 1023 为系统端口号,这些端口号可以在网址www.iana.org查询到,它们被指派给了 TCP/IP 最重要的一些应用程序,以下是一些常见的系统端口号:下面使用 netstat -luant 命令列出了监听中的端口:可以看到都是 TCP 协议的。不过后面我们会编写一个程序来模拟发送 UDP 报文,并使用 tcpdump 工具抓包,来帮助大家理解 UDP 协议。UDP(User Datagram Protocol)用户数据报协议,它只在 IP 数据报服务之上增加了很少一点功能,它的主要特点有:UDP 是无连接的,发送数据之前不需要建立连接(而 TCP 需要),减少了开销和时延。UDP尽最大努力交付,不保证交付可靠性。UDP 是面向报文的,对于从应用层交付下来的 IP 数据报,只做很简单的封装(8 字节 UDP 报头),首部开销小。UDP 没有拥塞控制,出现网络拥塞时发送方也不会降低发送速率。这种特性对某些实时应用是很重要的,比如 IP 电话,视频会议等,它们允许拥塞时丢失一些数据,因为如果不抛弃这些数据,极可能造成时延的累积。UDP 支持一对一、一对多、多对一和多对多的交互通信。从应用层到传输层,再到网络层的各层次封装:UDP 数据报可分为两部分:UDP 报头和数据部分。其中数据部分是应用层交付下来的数据。UDP 报头总共 8 字节,而这 8 字节又分为 4 个字段:这个 C 程序会向 IP 地址 192.168.1.1 的 7777 端口发送一条 "hello" 消息。你可以用编辑器修改程序,向不同的 IP 发送不同的内容。编译完成后先别运行,我们还需要使用一个知名的抓包工具 tcpdump,依次输入以下命令安装,并运行 tcpdump:新开一个终端,输入以下命令运行刚才编译好的 C 程序 test:test 程序运行结束,返回刚才运行 tcpdump 的终端查看抓包结果:蓝色框为 16 进制目的端口,绿色框为 16 进制目的 IP,红色框为 20 字节 IP 报头,橘色下划线为 8 字节 UDP 报头,红色下划线为 hello 的 ASCII 码。从 4500 到 0101 都是 IP 报头,IP 报文在之前已经讲过,这里就不赘述了。后面的部分就是 UDP 报文。我们知道 UDP 报头一共 8 字节,所以从 eb39 到 ac82 是 UDP 报头的部分。eb39:源端口,2 字节,换成十进制也就是 328301e61:目的端口,2 字节,十进制为 7777001c:包长度,单位为字节,换为十进制可知包长度为 28 字节ac82:校验和后面的就是数据内容的 ASCII 码。使用 tcpdump 抓取 UDP 数据报,解读报文。修改 C 程序,向不同的 IP、不同的端口发送不同的内容。
      22TCP IP 网络协议基础入门--传输层:UDP协议

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类