计算机网络协议,UDP数据报的分析
一、UDP数据报的特点
1.基本特性
UDP是在IP数据报的基础上增加了复用和分用以及差错检测的功能
UDP的主要特点如下:
- UDP是无连接的;即发送数据之前不需要建立连接
- UDP使用尽最大努力交付,不保证可靠交付
- UDP面向报文;不会拆分、合并报文。
即在UDP对应用层返回的报文加首部,对IP层提交的报文去首部的过程中,处理的是这个报文的整体,即一次处理一个完整的报文

- UDP没有拥塞控制;
即网络的堵塞并不会导致发送UDP数据的一端采取任何措施(比如减慢速度以减轻网络拥塞),这种特性被一些实时性的应用钟爱,例如现场直播
- UDP支持一对一、一对多、多对一、多对多的交互通信
- UDP首部 8byte ;即首部开销较小
2.注意事项
- 当运输层从IP层解包得到UDP数据报后,就通过UDP首部中提供的目的端口,提供给当前系统的某个进程(我们知道进程或服务很多情况下是通过端口进行区分与进行作业的)
- 虽然在UDP之间的通信要用到其端口号,但由于UDP的通信是无连接的,因此不需要使用套接字(TCP的通信要在套接字已连接的前提下进行)。
- UDP进行检验时。需要在数据报之前增加12个字节的“伪首部”。这些数据并不是数据报中真正的首部,只是在计算检验和时需要用到的临时数据。伪首部既不向下提供封装功能,也不向上提供解包功能,一旦检验完成,数据就失效。
二、UDP数据报结构

UDP的首部长8字节,其中分为源端口、目的端口、长度、校验和四部分,每部分2字节
- 源端口 ===> 数据报发送方的端口号;在需要对方回信时选用,不需要时可以设全0
- 目的端口 ===> 数据报接收方的端口号;
- 长度 ===> UDP数据报的长度;最小为8字节(即只有UDP首部)
- 校验和 ===> 检测UDP数据在传输中是否有错,出现错误就丢弃
三、UDP数据报分析之实战训练
我们利用Python写一个udp聊天程序,然后再利用wireshark抓取到其中的udp数据报。这样我们就可以更直观的分析udp数据报的特点了
1.实现代码
服务器端代码:
import socket
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server.bind(('', 8866)) # 绑定端口,接受这个端口的消息
#端口自己决定,第一个参数为空默认代表抓取本机数据
while True:
data = udp_server.recvfrom(1024)
#因为
clientAddr = data[1]
clientIp = clientAddr[0]
clientPort = clientAddr[1]
clientData = data[0]
clientData = str(clientData)
clientData = clientData.replace("'","")
clientData = clientData.replace(clientData[0],"")
print(clientData)
udp_server.close()
客户端代码:
import socket
udp_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
data = raw_input("please input the data: ")
data = str(data)
udp_client.sendto(data.encode('utf-8'),('xxx.xxx.xxx.xxx',8866))
#上面需要绑定接收端的IP地址和端口
udp_client.close()
接着我们运行客户端和服务端程序,然后利用客户端向服务端发送数据:
客户端发送与服务器端接收:

wireshark抓取:

2.数据报分析
(1)udp首部

从上文中我们得知udp首部包括源端口、目的端口、长度、校验和,我们在wireshark中也可以看到这些数据

可以看到确确实实是8个字节,前两个字节对应的二进制分别如下:
1001 1111 0110 1001
0010 0010 1010 0010
(1001111101101001)B = (40809)D
(0010001010100010)B = (8866)D
言外之意就是说该UDP数据报的原端口为40809,目的端口为8866,这与wireshark分析出来的结果是一致的:

接下来我们看UDP首部的第三个字节

我们知道
(000E)H = (14)D,所以整个UDP数据报长14字节,而UDP首部固定长8字节,因此UDP数据部分为6字节,值如下:

我们对这6个字节分别转换成十进制:
(6c)H = (108)D
(61)H = (97)D
(6e)H = (110)D
(79)H = (121)D
(75)H = (117)D
(65)H = (101)D
我们通过查阅ASCII码表:
| ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
|---|---|---|---|---|---|---|---|
| 0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
| 1 | SOH | 33 | ! | 65 | A | 97 | a |
| 2 | STX | 34 | " | 66 | B | 98 | b |
| 3 | ETX | 35 | # | 67 | C | 99 | c |
| 4 | EOT | 36 | $ | 68 | D | 100 | d |
| 5 | ENQ | 37 | % | 69 | E | 101 | e |
| 6 | ACK | 38 | & | 70 | F | 102 | f |
| 7 | BEL | 39 | , | 71 | G | 103 | g |
| 8 | BS | 40 | ( | 72 | H | 104 | h |
| 9 | HT | 41 | ) | 73 | I | 105 | i |
| 10 | LF | 42 | * | 74 | J | 106 | j |
| 11 | VT | 43 | + | 75 | K | 107 | k |
| 12 | FF | 44 | , | 76 | L | 108 | l |
| 13 | CR | 45 | - | 77 | M | 109 | m |
| 14 | SO | 46 | . | 78 | N | 110 | n |
| 15 | SI | 47 | / | 79 | O | 111 | o |
| 16 | DLE | 48 | 0 | 80 | P | 112 | p |
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q |
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r |
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s |
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t |
| 21 | NAK | 53 | 5 | 85 | U | 117 | u |
| 22 | SYN | 54 | 6 | 86 | V | 118 | v |
| 23 | TB | 55 | 7 | 87 | W | 119 | w |
| 24 | CAN | 56 | 8 | 88 | X | 120 | x |
| 25 | EM | 57 | 9 | 89 | Y | 121 | y |
| 26 | SUB | 58 | : | 90 | Z | 122 | z |
| 27 | ESC | 59 | ; | 91 | [ | 123 | { |
| 28 | FS | 60 | < | 92 | / | 124 | | |
| 29 | GS | 61 | = | 93 | ] | 125 | } |
| 30 | RS | 62 | > | 94 | ^ | 126 | ` |
| 31 | US | 63 | ? | 95 | _ | 127 | DEL |
可以清楚地得知这六个字节便是 “lanyue”,即我们在客户端通过Udp协议发送的数据:

最后,我们再来分析udp首部的第7、8个也是最后两个字节 ===> 校验和,其在UDP中的数据值如下:

我们知道,UDP检验和的方法比较特殊。在计算检验和时,要在UDP数据报之前增加12个字节的“伪首部”。所谓“伪首部”是因为这种伪首部并不是UDP用户数 据报真正的首部,只是在计算检验和时,临时添加在UDP用户数据报前面,得到一个临时的 UDP用户数据报。检验和就是按照这个临时的UDP用户数据报来计算的。伪首部既不向下提供封装功能,也不向上提供解包功能,而仅仅是临时的为了计算检验和的数据。

具体检验方法如下:
UDP的检验和把首部和数据部分一起都检验。
在发送方:
首先,把全零放入检验和字段。
然后,把伪首部以及UDP用户数据报看成是由许多16位的字串接起来的。若UDP用户数据报的数据部分不是偶数个字节,则要填入一个全零字节(但此字节不发送)。
最后,按二进制反码计算出这些16位字的和。将此和的二进制反码 写入检验和字段后,就发送这样的UDP用户数据报。
在接收方:
首先,把收到的UDP用户数据报连同伪首部(以及可能的填充全零字节)一起,按二进制反码求这些16位字的和。
当无差错时其结果应为全1。否则就表明有差错出现,接收方就应丢弃这个UDP用户数据报(也可以上交给应用层,但附上出现了差错的警告)
计算机网络协议,UDP数据报的分析的更多相关文章
- 计算机网络协议,TCP数据报的分析
一.TCP协议的特点 TCP是面向连接的运输层协议:即应用程序在使用TCP协议通信之前,要先建立TCP连接,通信结束后必须释放已建立的TCP连接 每一条TCP连接只能有两个端点:即TCP是点对点(一对 ...
- 计算机网络协议包头赏析-UDP
之前我们已经针对以太网.IP.TCP协议,进行了包头赏析.本次,我们继续UDP协议包头赏析. 提到TCP,想必大家会有所了解,它早已是家喻户晓的一个网络协议了,而UDP远没有他的大哥那么的有名,所以, ...
- 一些重要的计算机网络协议(IP、TCP、UDP、HTTP)
一.计算机网络的发展历程 1.计算机网络发展 与其说计算机改变了世界,倒不如说是计算机网络改变了世界.彼时彼刻,你我都因网络而有了交集,岂非一种缘分? 计算机与网络发展大致经历如下过程:
- 运输层2——用户数据报协议UDP
目录 1. UDP概述 2. UDP首部格式 3. UDP首部检验和计算方法 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议U ...
- 【转帖】计算机网络协议(三)——UDP、TCP、Socket
计算机网络协议(三)——UDP.TCP.Socket 2019年09月04日 11:09:41 to_be_better_one 阅读数 28794 文章标签: 计算机网络UDPTCPSocket 更 ...
- 【计算机网络】-传输层-Internet传输协议-UDP
[计算机网络]-传输层-UDP 简介 Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,UserDatagram Protocol) .UDP为应用程序提供了一-种无需 ...
- Android程序员必知必会的网络通信传输层协议——UDP和TCP
1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...
- java 网络通信传输层协议——UDP和TCP
本文原文由作者“zskingking”发表于:jianshu.com/p/271b1c57bb0b,本次收录有改动. 1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯网专注的即时通 ...
- 网络协议UDP
------------------------------互联网协议与协议族------------------------------tcp/ip协议介绍:计算机网络协议,不同类型不同厂家之间的终 ...
随机推荐
- 仿flash实现图片轮换播放
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Python进阶学习之面向对象
目录 面向对象 私有属性 面向对象 python也有面向对象的编程,它与C++中的类有点相似.它也只是运算符重载,继承. class Test: num=0 def __init__(self): ...
- Airport Simulation (数据结构与算法 – 队列 / Queue 的应用)
Airport Simulation 是数据结构与算法教材中用于演示Queue的一个小程序(大多数教师似乎会跳过这个练习).主程序会通过输入总的运行时间.队列里可以等待的最多飞机数量,平均每个时间单元 ...
- 14. LiveBos编号自动生成
(1) var temp="Apex"; var no=""+ABS_DYNSERIALNO(true,temp); var len=no.length; va ...
- 3. webdriver的常用方法
WebDriver常用方法: clear(): 清除文本. send_keys (value): 模拟按键输入. click(): 单击元素. submit():用于提交表单 from seleniu ...
- 强智教务系统验证码识别 Tensorflow CNN
强智教务系统验证码识别 Tensorflow CNN 一直都是使用API取得数据,但是API提供的数据较少,且为了防止API关闭,先把验证码问题解决 使用Tensorflow训练模型,强智教务系统的验 ...
- Hive架构原理
什么是Hive Hive是由Facebook开源用于解决海量结构化日志的数据统计:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射 成一张表,并提供类SQL查询功能,底层计算引 ...
- 七大Github机器学习热门项目
译者 | 小韩 来源 | analyticsvidhya.com[磐创AI导读]:让我们一起来看下近期热门的机器学习Github仓库,包括了自然语言处理(NLP).计算机视觉(CV)与大数据等多个领域 ...
- Centos7部署k8s[v1.16]高可用[keepalived]集群
实验目的 一般情况下,k8s集群中只有一台master和多台node,当master故障时,引发的事故后果可想而知. 故本文目的在于体现集群的高可用,即当集群中的一台master宕机后,k8s集群通过 ...
- 模块 string 常用序列字符
自从知道string模块后再也不用abcd了 >>> string.digits #数字 '0123456789' >>> string.ascii_letters ...