UDP:user datagram protocol

Wesley13
• 阅读 247
1.引言
1.1 简介

运输层提供了端到端(主机中的进程)的服务;网络层提供了主机到主机之间的服务;

一个运输层协议可能对应着多个应用层协议,因此它具备一个非常重要的功能 ==**复用(multiplexing)和分用(demultiplexing)**==:

  • 复用multiplexing指发送方应用进程可以使用同一个传输层协议发送数据(加上适当的首部端口号);
  • 分用demultiplexing指接收方方的运输层去掉运输层协议的报文后将数据交给目的“应用进程”-根据去掉报文的端口;
  • 示意图: UDP:user datagram protocol

传输成还需要提供差错检验——校验和;

运输层有两种协议:UDP(user datagram proportal)和TCP(transmission control portocol),其对应的应用层协议和应用一般如下(每个应用层协议也有自己默认的端口号): UDP:user datagram protocol

1.2 端口号(16位:65535)

运输层的multiplexing和demultiplexing功能需要对应用层的每个应用进程做唯一标识:

  • 进程标识符不能作为标识,因为网络上种类繁多的计算机各有不同格式的进程标识符;
  • 协议端口号 protocol port number简称prot端口:标识应用进程;
  • 端口是软件端口,同硬件端口作区分;
  • 端口号分源端口和目的端口:应用层的某种协议的请求目的端口需要用默认端口,但是源端口号随意。源端口号只有本地意义,相同端口号没有关联

端口号分为两种:服务器端端口号和客户端端口号:

  1. 服务器端端口号最重要的一类是熟知端口号(well-known port number)又称系统端口号,0~1023,IANA需要为每一种应用层协议制定一个熟知端口号,常用如下:
    • UDP:user datagram protocol
    • 1024~49151:未登记的服务器端口号;
  2. 客户端使用的端口号范围为4915265535,又称“短暂端口号”,请求报文中的源端口号;
2. UDP用户数据报协议

UDP只在IP的数据报上增加了 复用/分用 和差错检测的功能,其主要特点有:

  1. 无连接的:发送数据不需要建立连接;
  2. UDP尽最大女里交付;
  3. UDP面向报文的(TCP面向字节流),即UDP将应用层报文加上首部后就交给网络层,比拆分也不合并。面向字节流的TCP会在发送窗口中对应用层数据做拆分;使用UDP协议的应用层应该采用大小合适的报文,因为UDP将完整的报文交给IP层后,报文太大会拆分导致IP层效率不报,IP层太小导致首部相对较大也会降低传输效率;
  4. UDP没有拥塞控制,即网络出现拥塞(congestion)不会使得源主机降低发送速率。TCP有相应的机制防止过多的数据出发送到网络中导致网络中路由器等节点过载;
  5. UDP支持一对一、一对多、多对一和多对多的交互通信。TCP是面向连接的,因此只支持一对一;
  6. UDP首部只有8个字节,TCP有20个字节并且有40字节的可选长度;
2.1 首部格式及其差错检验和

UDP首部格式有四个字段,每个字段两个字节:源端口、目的端口、长度和检验和。格式如下: UDP:user datagram protocol

  • source port:如果不需要对方回信可全置为0;
  • des port:标识应用进程。如果接收方UDP发现收到的报文中的端口号不正确即不存在,则会丢弃报文,并由ICMP发送“端口不可达”的差错报文给发送方;
  • length:UDP用户数据包的长度,单位字节,最小值是只有头部是的8,最大值是2^16b-8b=2^6kb-8b=64kb-8bit;
  • Checksum:有错则丢弃;

IP层的校验只校验数据报首部,但是UDP将首部和数据部分一块校验了,甚至包括了源IP和目的IP。校验方式如下:

  1. 首先会在UDP首部前边加上伪首部,结构如下 UDP:user datagram protocol
  2. checksum初始值全0
  3. 把伪首部和UDP数据报(包括数据部分)当做16位的01字串分割求和(不够16位则末尾补8个0):求和后进位的地方加到末尾,最后求反码;
  4. ==接收端,同上求和、高位补低位、取反,== ==最后结果如果全为1则视为正确== ;

[注]

  • “n个数求和取反”=校验码,“n个数+校验码”求和取反=校验码+校验码取反=1;
  • TCP使用同样的校验方式;
点赞
收藏
评论区
推荐文章
Jacquelyn38 Jacquelyn38
1年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。 1、使用解构获取json数据let jsonData   id: 1, status: "OK", data: ['a', 'b'] ; let  id, status, data: number   jsonData; console.log(id, status, number )
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
Wesley13 Wesley13
1年前
Java爬虫之JSoup使用教程
title: Java爬虫之JSoup使用教程 date: 2018-12-24 8:00:00 +0800 update: 2018-12-24 8:00:00 +0800 author: me cover: [https://img-blog.csdnimg.cn/20181224144920712](https://www.oschin
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Wesley13 Wesley13
1年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表: **时辰** **时间** **24时制** 子时 深夜 11:00 - 凌晨 01:00 23:00 - 01 :00 丑时 上午 01:00 - 上午 03:00 01:00 - 03 :00 寅时 上午 03:00 - 上午 0
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Stella981 Stella981
1年前
Angular material mat
Icon Icon Name mat-icon code _add\_comment_ add comment icon <mat-icon> add\_comment</mat-icon> _attach\_file_ attach file icon <mat-icon> attach\_file</mat-icon> _attach\
Wesley13 Wesley13
1年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数`NOW()`相同的格式返回日期和时间? 我知道如何使用`date()`做到这一点,但是我问是否有一个仅用于此的函数。 例如,返回: 2009-12-01 00:00:00 * * * ### #1楼 使用此功能: function getDatetimeNow() {
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为