UDP:user datagram protocol

1.引言
1.1 简介

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

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

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

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

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

1.2 端口号(16位:65535)

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

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

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

  1. 服务器端端口号最重要的一类是熟知端口号(well-known port number)又称系统端口号,0~1023,IANA需要为每一种应用层协议制定一个熟知端口号,常用如下:
    • 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首部格式有四个字段,每个字段两个字节:源端口、目的端口、长度和检验和。格式如下:

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

[注]

  • “n个数求和取反”=校验码,“n个数+校验码”求和取反=校验码+校验码取反=1;
  • TCP使用同样的校验方式;
点赞
收藏

评论区

加载中...

相关推荐

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:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0