通过生活用例学习UDP协议并实际抓包分析

上一篇文章我们用打电话来描述TCP协议,那么针对UDP我觉得广播是一个比较形象的描述,广播一响,播音员就开始说话,至于谁听不听他不care,而校园的同学们也是想听就听,这种方式没有人去阻止播音员,他可以一直播完要说的话不会被阻塞。

一.UDP特点
UDP(User Datagram Protocol)用户数据报协议,他远没有TCP那么复杂,它只在 IP 数据报服务之上增加了很少一点功能,类似的我们可以得出UDP的主要特点有:

(1).UDP 是无连接的,发送数据之前不需要建立连接(而 TCP 需要),减少了开销和时延。

(2).UDP尽最大努力交付,不保证交付可靠性。

(3).UDP 是面向报文的,对于从网络层交付下来的 IP 数据报,只做很简单的封装(8 字节 UDP 报头),首部开销小。

(4).UDP 没有拥塞控制,出现网络拥塞时发送方也不会降低发送速率。这种特性对某些实时应用是很重要的,比如 IP 电话,视频会议等,它们允许拥塞时丢失一些数据,因为如果不抛弃这些数据,极可能造成时延的累积。

(5).UDP 支持一对一、一对多、多对一和多对多的交互通信。

二.UDP报文数据结构

这里写图片描述

(1)源端口 2 字节 在对方需要回信时可用,不需要时可以全 0;

(2)目的端口 2 字节 必须,也是最重要的字段;

(3)长度 2 字节 长度值包括报头和数据部分;

(4)校验和 2 字节 用于检验 UDP 数据报在传输过程中是否有出错,有错就丢弃。

三.tcpdump 抓取 UDP 报文

测试操作系统为ubutun

test.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);
}

启动第二个终端下载并启动tcpdump工具

sudo apt-get install tcpdump
sudo tcpdump -vvv -X udp port 7777

编译:

gcc -o test test.c

启动test

./test

这里写图片描述

可以看出来,使用UDP协议导致所抓到的协议包只有一个。

猜你喜欢

转载自blog.csdn.net/suresand/article/details/79593293