一、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数据报的分析的更多相关文章

  1. 计算机网络协议,TCP数据报的分析

    一.TCP协议的特点 TCP是面向连接的运输层协议:即应用程序在使用TCP协议通信之前,要先建立TCP连接,通信结束后必须释放已建立的TCP连接 每一条TCP连接只能有两个端点:即TCP是点对点(一对 ...

  2. 计算机网络协议包头赏析-UDP

    之前我们已经针对以太网.IP.TCP协议,进行了包头赏析.本次,我们继续UDP协议包头赏析. 提到TCP,想必大家会有所了解,它早已是家喻户晓的一个网络协议了,而UDP远没有他的大哥那么的有名,所以, ...

  3. 一些重要的计算机网络协议(IP、TCP、UDP、HTTP)

    一.计算机网络的发展历程 1.计算机网络发展 与其说计算机改变了世界,倒不如说是计算机网络改变了世界.彼时彼刻,你我都因网络而有了交集,岂非一种缘分? 计算机与网络发展大致经历如下过程:

  4. 运输层2——用户数据报协议UDP

    目录 1. UDP概述 2. UDP首部格式 3. UDP首部检验和计算方法 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议U ...

  5. 【转帖】计算机网络协议(三)——UDP、TCP、Socket

    计算机网络协议(三)——UDP.TCP.Socket 2019年09月04日 11:09:41 to_be_better_one 阅读数 28794 文章标签: 计算机网络UDPTCPSocket 更 ...

  6. 【计算机网络】-传输层-Internet传输协议-UDP

    [计算机网络]-传输层-UDP 简介 Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,UserDatagram Protocol) .UDP为应用程序提供了一-种无需 ...

  7. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

  8. java 网络通信传输层协议——UDP和TCP

    本文原文由作者“zskingking”发表于:jianshu.com/p/271b1c57bb0b,本次收录有改动. 1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯网专注的即时通 ...

  9. 网络协议UDP

    ------------------------------互联网协议与协议族------------------------------tcp/ip协议介绍:计算机网络协议,不同类型不同厂家之间的终 ...

随机推荐

  1. postgresql自增字段初始值的设定

    在实际开发中会有这样的需求,想要自己设置表中自增字段的初始值. 比如:有一个your_table表中有一个自增字段id,我们知道,插入数据后,默认是从1开始自增的. 但是假如现在有一个需求,是要求id ...

  2. MySQL第三章知识第一部分

    SQL的特点:是一个综合的.功能极强并且简洁容易学的语言. SQL的功能:数据查询.数据操纵.数据定义.数据控制. 数据库系统的主要功能是通过数据库支持的数据语言来实现. 菲关系模型(层次模型.网状模 ...

  3. 建议13:禁用Function构造函数

    定义函数的方法包括3种:function语句,Function构造函数和函数直接量.不管用哪种方法定义函数,它们都是Function对象的实例,并将继承Function对象所有默认或自定义的方法和属性 ...

  4. Linux 应用领域

    与Windows操作系统软件一样,Linux也是一个操作系统软件.但与Windows不同的是,Linux是一套开放源代码程序的,并可以自由传播的类UNIX操作系统软件,随着信息技术的更新变化,Linu ...

  5. 【问题记录】记一次ConnectionTimeout问题排查

    最近做性能测试时,发现连接第三方系统时会有约1%的交易提示如下错误 nested exception is org.apache.commons.httpclient.ConnectTimeoutEx ...

  6. DS博客作业02--栈和队列

    0.PTA得分截图 1.本周学习总结 1.1总结栈和队列内容 栈的存储结构及操作 栈的顺序存储结构 typedef struct { ElemType data[MaxSize]: int top: ...

  7. Natas31 Writeup(Perl 远程命令执行)

    Natas31: 源码如下: my $cgi = CGI->new; if ($cgi->upload('file')) { my $file = $cgi->param('file ...

  8. 是时候了解Java Socket底层实现了

    在Java中,提供了一系列Socket API,可以轻松建立两个主机之间的连接.读取数据,那底层到底怎么实现,很少人去关心.这其实最终还是通过调用操作系统提供得Socket接口完成(TCP/IP是由操 ...

  9. 大数据软件安装之Flume(日志采集)

    一.安装地址 1) Flume官网地址 http://flume.apache.org/ 2)文档查看地址 http://flume.apache.org/FlumeUserGuide.html 3) ...

  10. The instance of entity type 'manager' cannot be tracked because another instance with the same key value for {'id'} is already being tracked. When attaching existing entities, ensure that only one ent

    最近在用ASP.NET CORE时遇到一些问题,现记录下: 出现上述错误,即在更新实体数据时出现的错误 services.AddDbContext<StoreContext>(c => ...