一、udp报文有数据的字节是什么?
首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层. UDP属于运输层,下面我们由下至上一步一步来看: 以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的. 这个1500字节被称为链路层的MTU(最大传输单元).但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区. 并不包括链路层的首部和尾部的18个字节. 所以,事实上,这个1500字节就是网络层IP数据报的长度限制. 因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节. 而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的.又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节. 这个1472字节就是我们可以使用的字节数。:)
二、udp的ip报文是什么意思?
这要从它们的工作特点来谈起了:
udp是面向报文的,发送方的udp对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层,也就是说无论应用层交给udp多长的报文,它统统发送,一次发送一个。而对接收方,接到后直接去除首部,交给上面的应用层就完成任务了。因此,它需要应用层控制报文的大小
tcp是面向字节流的,它把上面应用层交下来的数据看成无结构的字节流来发送,可以想象成流水形式的,发送方tcp会将数据放入“蓄水池”(缓存区),等到可以发送的时候就发送,不能发送就等着,tcp会根据当前网络的拥塞状态来确定每个报文段的大小。
三、UDP报文头和TCP报文头,最小长度是多少?
没有正确答案,TCP报头长20字节,UDP报头8字节 TCP报头如下:源端口、目的端口各2字节序列号 4字节确认号 4字节头部长度4位,保留6位,控制字段6位,框口大小2字节校验和、紧急指针各2字节 UDP报头如下:源端口、目的端口各2字节长度、校验和各2字节 附:1字节=8位
四、tcp和udp报文头对比区别?
UDP和TCP的不同
1 TCP是面向连接的,UDP是面向无连接的
2 TCP是可靠的,UDP是不可靠的
3 TCP是面向字节流的,UDP是面向报文的
4 TCP只有一对一的传输方式,而UDP不仅可以一对一,还可以一对多,多对多
5 UDP的头部开销小,TCP的头部开销大
6 TCP会产生粘包问题,UDP会产生丢包问题
五、udp报文有mac地址信息吗?
UDP (User Datagram Protocol) 报文本身并不包含 MAC 地址信息。MAC 地址是网络层(OSI 模型中的第二层)以下的地址,通常用于识别网络硬件设备,例如以太网卡的地址。而 UDP 是应用层(OSI 模型中的第七层)协议,它不包含底层硬件地址信息。
当数据包在 OSI 模型中向下传递时,每一层都会添加一些信息。在数据链路层(OSI 模型的第二层),数据包会添加一个 MAC 地址,以标识发送和接收设备的硬件地址。然后,当数据包到达网络层(OSI 模型的第三层)时,会添加 IP 地址以标识网络上的设备。然而,到了传输层(OSI 模型的第四层),如 UDP,只会添加源端口和目标端口,不会添加 MAC 地址。
当 UDP 数据报在网络上进行传输时,网络设备(如路由器)会在网络层添加 IP 地址,并在数据链路层添加 MAC 地址。这些地址信息是在数据包到达目标设备时由目标设备的硬件(如网卡)从数据包中提取出来的。
六、udp如何处理出错报文?
处理方法:
1、首先网络报文通过物理网线发送到网卡
2、网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个过程使用 DMA(Direct Memory Access),不需要 CPU 参与
3、内核从 ring buffer 中读取报文进行处理,执行 IP 和 TCP/UDP 层的逻辑,最后把报文放到应用程序的 socket buffer 中
4、应用程序从 socket buffer 中读取报文进行处理
七、如何分析udp报文,从而获取源地址?
、写了一个UDP 的小程序,有一个UDP 的server,而且有UDP的client。
然后执行server和client,然后用tcpdump将该端口的UDP数据报文抓取出来。
执行的过程是这样的。
client向server发送"xiyou"
server向client应答"wangzhe"
client程序在主机example上运行(192.168.1.144)
server程序在主机linux上运行(192.168.1.101)
------------------------------------------------------------------------------------------------------------
2、UDP数据报文。
linux@linux:~$ sudo tcpdump -vvv -X udp port 7777
[sudo] password for linux:
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:03:01.923227 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 48)
example.local.43521 > linux.7777: [udp sum ok] UDP, length 20
0x0000: 4500 0030 0000 4000 4011 b677 c0a8 0190 E..0..@.@..w....
0x0010: c0a8 0165 aa01 1e61 001c 4c34 7869 796f ...e...a..L4xiyo
0x0020: 7500 0000 0000 0000 0000 0000 0000 0000 u...............
11:03:01.923343 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 48)
linux.7777 > example.local.43521: [bad udp cksum 6869!] UDP, length 20
0x0000: 4500 0030 0000 4000 4011 b677 c0a8 0165 E..0..@.@..w...e
0x0010: c0a8 0190 1e61 aa01 001c 8473 7761 6e67 .....a.....swang
0x0020: 7a68 6500 0000 0000 0000 0000 0000 0000 zhe.............
由上面的报文可知,有两个UDP数据报文。
第一个报文是example主机上的client向server发送数据。
4500 0030 0000 4000 4011 b677 c0a8 0190 c0a8 0165 这20个数据是IP首部。
aa01 1e61 001c 4c34 这8个字节是UDP的首部。
7869 796f 7500 0000 0000 0000 0000 0000 0000 0000 这20个数据是我用sendto函数发送的
数据。
而将char req[20] = "xiyou" 的ASCII码(16进制)就是:
78 69 79 6f 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
第二个报文是linux向主机example做出的应答。
4500 0030 0000 4000 4011 b677 c0a8 0165 c0a8 0190 这20个数据是IP首部。
1e61 aa01 001c 8473 这8个字节是UDP首部。
7761 6e67 7a68 6500 0000 0000 0000 0000 0000 0000 这20个数据是应用层的数据。
而将char reply[20] = "wangzhe"的ASCII码(16进制)就是:
77 61 6e 67 7a 68 65 0 0 0 0 0 0 0 0 0 0 0 0 0
由此看出,应用层的数据没有夹杂其他的参数,全部是数据,均是字符的ASCII码。
-----------------------------------------------------------------------
附带网络程序:
udp_server.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
int main(void)
{
struct sockaddr_in server,client;
int sockfd;
int cli_len = 0,n;
char req[20] = {0},reply[20] = {0};
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (sockfd < 0) {
perror("socket error!\n");
exit(-1);
}
memset(&server,0,sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(7777);
if (bind(sockfd,(struct sockaddr *)&server,sizeof(server)) < 0) {
perror("bind error!\n");
exit(-1);
}
for (;;) {
cli_len = sizeof(struct sockaddr_in);
n = recvfrom(sockfd,req,20,0,(struct sockaddr *)&client,&cli_len);
if (n < 0) {
perror("recvfrom error!\n");
exit(-1);
}
printf("hello!\n");
strncpy(reply,"wangzhe",sizeof("wangzhe"));
if (sendto(sockfd,reply,20,0,(struct sockaddr *)&client,sizeof(client)) != 20) {
perror("sendto error!\n");
exit(-1);
}
}
return 0;
}
-----------------------------------------------------------------------------------------------------------
udp_client.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
int main(void)
{
int sockfd,n;
struct sockaddr_in server;
char req[20]={0},reply[20]={0};
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (sockfd < 0) {
perror("socket error!\n");
exit(-1);
}
memset(&server,0,sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("192.168.1.101");
server.sin_port = htons(7777);
strncpy(req,"xiyou",sizeof("xiyou"));
printf("sendto req to server:%s\n",req);
if (sendto(sockfd,req,20,0,(struct sockaddr *)&server,sizeof(server)) != 20) {
perror("sendto error!\n");
exit(-1);
}
if ((n = recvfrom(sockfd,reply,20,0,(struct sockaddr *)NULL,(int *)NULL)) < 0) {
perror("recvfrom error!\n");
exit(-1);
}
printf("recv reply from server :%s\n",reply);
exit(0);
八、udp报文字段长度怎么看?
UDP报文的头部只有8个字节,相对TCP的20字节。 报头长度字段:占4比特。是头部占32比特的数字,包括可选项。普通IP数据报(没有任何选项),该字段的值是5,即160比特=20字节。此字段最大值为60字节。TCP报文头必须大于等于20byte,最大为60byte意味着Option选项部分取值范围0-40bits 报文就是网络传输的单位,传输过程中会不断的封装成分组、包、帧来传输,封装的方式就是添加一些信息段,那些就是报文头。
九、ip报文里有域名信息吗?
有
ip地址和域名是一对多的关系,一个ip地址可以有多个域名,但是相反,一个域名只能有一个ip地址;
IP是英文Internet Protocol的缩写,意思是“网络之间的互连协议”,即为计算机网络相互通信而设计的协议;
IP地址用于向Internet上的计算机提供数字;域名是互联网上计算机或计算机组的名称,由一系列用点分隔的名称组成。
十、udp合法域名是什么意思?
“UDP合法域名”可能是指“统一资源定位符”(Uniform Resource Locator, URL)中的协议部分为“udp://”的字符串。然而,这种表示方式是不常见的,因为通常来说,UDP协议的URL并不常见。
在互联网中,URL是一种资源的定位符,它指定了资源在互联网中的位置。通常,URL的协议部分为“http://”或“https://”,表示使用的是HTTP或HTTPS协议。
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的网络协议,它允许应用程序发送和接收数据报,而无需建立和维护一个稳定的连接。
然而,一般来说,我们并不会见到以“udp://”开头的URL,因为UDP协议并不支持像HTTP和HTTPS那样进行大量的数据传输。大多数互联网应用都使用HTTP或HTTPS,而不是UDP。
因此,“udp合法域名”这个概念可能是不正确的或者是在特殊上下文中使用的。如果你有更详细的上下文信息,我可能能够给出更准确的解释。