课程来源 :实验楼
UDP(User Datagram Protocol)用户数据报协议
1 主要特点:
(1).UDP 是无连接的,发送数据之前不需要建立连接(而 TCP 需要),减少了开销和时延。
(2).UDP尽最大努力交付,不保证交付可靠性。
(3).UDP 是面向报文的,对于从网络层交付下来的 IP 数据报,只做很简单的封装(8 字节 UDP 报头),首部开销小。
(4).UDP 没有拥塞控制,出现网络拥塞时发送方也不会降低发送速率。这种特性对某些实时应用是很重要的,比如 IP 电话,视频会议等,它们允许拥塞时丢失一些数据,因为如果不抛弃这些数据,极可能造成时延的累积。
(5).UDP 支持一对一、一对多、多对一和多对多的交互通信。
2 报文格式
UDP 数据报可分为两部分:UDP 报头和数据部分。其中数据部分是应用层交付下来的数据。UDP 报头总共 8 字节,而这 8 字节又分为 4 个字段:
3 发送并抓取UDP数据报
需要一个小程序,用于向 指定 IP 地址(192.168.1.1) 的 指定端口(7777) 发送一个 指定内容 (“hello”)的 UDP 数据报,(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;
struct sockaddr_in server;
char msg[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.1");
server.sin_port = htons(7777);
strncpy(msg,"hello",sizeof("hello"));
printf("send message:%s\n",msg);
if (sendto(sockfd,msg,20,0,(struct sockaddr *)&server,sizeof(server)) != 20) {
perror("sendto error!\n");
exit(-1);
}
exit(0);
在终端监听7777号端口
sudo tcpdump -vvv -X udp port 7777
之后编译并运行发送报文程序,即可在监听终端得到报文信息。
4 Question:
当切换目标IP和目标端口时,只需要改变监听端口即可,为何不用监听IP只需要监听端口号就可以得到UDP报文?