计算机里面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 个字节的首部要短。

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、不同的端口发送不同的内容。

UDP、TCP 协议区别?
udp 和tcp 是 OSI 模型中的运输层中的协议。tcp 提供可靠的通信传输,而 udp 则常被用于让广播和细节控制交给应用的通信传输。两者的区别大致如下: tcp 面向连接,udp 面向非连接即发送数据前不需要建立链接;tcp 提供可靠的服务(数据传输),udp 无法保证;tcp 面向字节流,udp 面向报文;tcp 数据传输慢,udp 数据传输快;tcp 为什么要三次握手,两次不行吗?为什么? 我们假设A和B是通信的双方。我理解的握手实际上就是通信,发一次信息就是进行一次握手。第一次握手:A给B打电话说,你可以听到我说话吗?第二次握手:B收到了A的信息,然后对A说:我可以听得到你说话啊,你能听得到我说话吗?第三次握手:A收到了B的信息,然后说可以的,我要给你发信息啦!在三次握手之后,A和B都能确定这么一件事:我说的话,你能听到;你说的话,我也能听到。这样,就可以开始正常通信了。注意:HTTP是基于TCP协议的,所以每次都是客户端发送请求,服务器应答,但是TCP还可以给其他应用层提供服务,即可能A、B在建立链接之后,谁都可能先开始通信。 如果采用两次握手,那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务器端的请求,那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源。若采用三次握手,服务器端没有收到来自客户端的再此确认,则就会知道客户端并没有要求建立请求,就不会浪费服务器的资源。
TCP/IP协议是一个协议簇。里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议,就用他两命名了。 TCP/IP协议集包括应用层,传输层,网络层,网络访问层。

用UDP进行通信要连接网络吗?
当然需要!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();

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/46366.html。