一个UDP用户数据报的首部的16进制表示是: 06 32 00 45 00 1C E2 17
(要求,以下填空时,如果为数字,请使用十进制)
(1)源端口是_
(2)目的端口是_
(3)数据部分的长度(不包括首部)是_字节
(4)这个UDP数据报是从客户机发给服务器,还是服务器发给客户机
A 从客户机发给服务器
B. 从服务器发给客户机
__(填A或B即可)
在UDP首部中,源端口占2个字节,即06 32 ,化为十进制是1586.
目的端口占2字节,即00 45 ,化为十进制是69.
用户数据报总长度也占2个字节,即00 1C ,十进制为:28。
数据部分为数据报总长度减去首部长度8字节,28-8=20。
因为目的端口=69<1023,所以是从客户发送给服务器的,服务器程序是TFTP。
UDP用户数据报的首部包含以下信息:
16进制表示内容如下:
字段 | 长度 | 含义 |
---|---|---|
0 ~ 1 字节 | 2 字节 | 源端口号 |
2 ~ 3 字节 | 2 字节 | 目的端口号 |
4 ~ 5 字节 | 2 字节 | UDP数据报长度 |
6 ~ 7 字节 | 2 字节 | 校验和 |
在该问题中,16进制表示所代表的内容包括源端口、目的端口、数据部分长度和数据来源等相关信息。具体方法如下:
// 目标端口号
int srcPortNum = ((bytes[0] & 0xff) << 8) | (bytes[1] & 0xff);
// 源端口号
int dstPortNum = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff);
// 数据部分长度
int length = ((bytes[4] & 0xff) << 8) | (bytes[5] & 0xff);
if (dstPortNum == 9998) {
System.out.println("数据来源:server");
} else {
System.out.println("数据来源:" + datagramPacket.getAddress().getHostName() + ",端口号为:" + dstPortNum);
}