UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都产生一个UDP数据报,并组装成一份待发送的IP数据报。UDP数据报是要依赖IP数据报传送的。UDP协议并不可靠,它不能保证发出去的包会被目的端接收。

UDP首部的前8个字节:
16bit的源端口号、16bit的目的端口号、16bit的UDP长度、16bit的UDP检验和
1. 端口号可以代表用户的程序,分别表示发送进程和接收进程。
2. UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为8字节(发送一份0字节的UDP数据报是OK)。这个UDP长度是有冗余的。IP数据报长度指的是数据报全长(包括IP首部和数据部分,这个数据部分可能就是UDP的),因此UDP数据报长度是全长减去IP首部的长度。
3. UDP的检验和:UDP和TCP的检验和是包括首部和数据部分的。此前的IP检验和只是计算IP首部的,而不包括数据部分。
求检验和的算法和IP检验和类似,但也有不同。UDP的长度可以是奇数字节,就是说可能不够16bit的倍数,算法要求是每16bit进行求和,这样就需要填充一些字节0,满足达到16位的倍数,当然这只是为了计算检验和的动作,而真正的UDP传输是不会有这些填充0的。
再一个不同于IP求检验和的是,为了计算UDP或者TCP的校验和,需要有个伪首部,伪首部要参与计算检验和。

伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地(ps这块理解的不太好..例如,IP没有接受地址不是本主机的数据报,以及IP没有把应传给另一高层的数据报传给UDP)。格式如图:

可以发现,UDP数据报的长度在检验和计算过程中出现两次,首部和伪首部中都有。
如果检验和的计算结果为 0,则存入的值为全1,这在二进制反码计算中是等效的。如果传送的检验和为0,说明发送端没有计算检验和。
UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为发现UDP首部和数据在发送端到接收端之间发生的任何改动。
从计算检验和的算法中可以发现,既然是每个16bit的和,那么即便是交换两个端口号,交换伪首部的两个ip,也不影响检验和。表明UDP检验和(事实上,TCP/IP协议簇中所有的检验和)是简单的16bit和。它们检测不出交换两个16bit的差错。

- IP分片:

IP层到链路层发送帧的时候,又或者IP层收到一份IP数据报的时候,要查询往哪个接口转发(路由选路),当发现这个数据报的长度超过了这个链路或者说接口的MTU(路由每个接口都可能有各自的MTU),就会发生分片。也就表示分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
IP分片后,只有到达了目的端才进行重组。已经分片过的数据报有可能会再次进行分片(可能不止一次)。IP首部中包含的数据为分片和重新组装提供了足够的信息。
在IP首部中,讲到过16bit标识,3bit标志和13bit片偏移。标识唯一标识了一个数据报。被分片以后,每个片(分组)都拷贝下这个标识。标志有个保留位,有个不分片位(1为不分片,0为可以分片),有个更多片位(分片后,除了最后一个分片为0,其它片都是1,为了告诉接收端啥时候组装完这个数据报)。
几个术语: IP数据报是指IP层端到端的传输单元(在分片之前和重新组装之后),分组是指在IP层和链路层之间传送的数据单元。显然一个分组可以是一个完整的 IP数据报,也可以是IP数据报的一个分片。
如图:   值得注意的是,任何传输层首部只出现在第1片数据中。

看一下分片时,tcpdump出来的内容。如图:

前两行可以看出来没有经过ip分片。第三行开始分片。第三行说明一下:

upd 1473 (frag 26304:1480@0+)

1473表示UDP数据的长度(除掉了UDP头部的长)

26304表示是IP首部中的标识。

1480表示UDP的长度(包括了UDP首部的8个字节长,表示数据长是1472,注意只有这个第一片有UDP首部,同一个标识里其它分片没有...)

@后边这个0表示偏移量。+号表示更多片位,出了最后一个分片分组没有,其它分片都要有。

第四行同理。

- ICMP不可达差错(需要分片)
发生ICMP不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特。
这个ICMP报文的类型是3,代码是4。
从这个特性中看出来,可以做一个程序,用来判断到达目的端的路途中最小MTU是多少--这称作路径MTU发现机制。
利用traceroute程序可以确定路径的MTU。路由器可以设置是否在ICMP不分片差错中返回下一跳的MTU值,不返回的话MTU就置为0。

-UDP和ARP之间的交互:

发送一个超过MTU大小的UDP包,因此是要分片的。当没有目的主机ARP缓存的时候,发送帧的时候要获取硬件地址。
比较意想不到的是,每一个分片都发送了一个ARP请求。。在大多数的协议实现中,在等待一个ARP应答时,只将最后一个报文(从tcpdump输出结果可以发现这个报文在更多片位中是没有+号的)发送给特定目的主机,其它的就被丢弃了。
在目的端收到第一个分片的时候,就开始生成一个计时器,大约在30或者60s的时候,如果这个数据报的所有分片没全部集齐,就舍弃掉这些分片(如果不舍弃,那接收端缓存早晚挤爆了哈哈)。
这里接收端只收到了一个最后的分片,为什么在发送端没接收到ICMP组装超时类型的报文呢?原因可能有两个:1. 计时器超时了就舍弃,压根就产生这个ICMP报文。2. 如果接收端接收的不是第一个分片,那么就不会产生ICMP报文(因为第一个分片才有传输层首部,才知道端口号,对应哪个用户进程。ICMP报文当然是需要这个首部了~)。

- ICMP源站抑制差错

当接收端的处理速度小于接收速度了,接收端就可能(不一定)返回一个ICMP源站抑制差错报文。

新的协议规定,不太建议有这个ICMP报文发送。UDP协议接到这个抑制差错报文时,一般会忽略掉。。部分原因是,导致这个抑制差错报文产生的进程可能已经完事了,意思就是我这个源端产生的UDP数据报都已经发完了,你再给我这个差错报文提醒也没啥用了哈哈。

-

TCP/IP协议---UDP协议的更多相关文章

  1. http与https与socket tcp/IP与UDP 协议等

    网络由下往上分为:   物理层--                       数据链路层-- 网络层--                       IP协议 传输层--               ...

  2. 网络协议: TCP/IP 和UDP/IP

    网络协议: TCP/IP 和UDP/IP TCP/IP TCP/IP(Transmission Control Protocol/Internet Protocol)是一种可靠的网络数据传输控制协议. ...

  3. 传输层协议(tcp ip和udp 三次握手 四次握手)

    1 TCP/IP协议介绍 TCP/IP协议:Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议. TCP/IP是一个Proto ...

  4. TCP/IP 和HTTP 协议基础知识

    来源:http://www.myhack58.com/Article/60/63/2014/50072.htm 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过 ...

  5. python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)

    先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...

  6. (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制

    1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...

  7. (1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

    1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将 ...

  8. python语法基础-网络编程-TCP协议和UDP协议

    ###############    网络编程    ############## """ 网络编程 学习了Python基础之后,包括函数,面向对象等,你就可以开发了,你 ...

  9. TCP/IP 5层协议簇/协议栈

    TCP/IP 5层协议簇/协议栈 数据/PDU 应用层 PC.防火墙 数据段/段Fragment 传输层 防火墙 报文/包/IP包packet 网络层 路由器 帧Frame 数据链路层 交换机.网卡 ...

  10. TCP协议和UDP协议基础介绍

    TCP协议和UDP协议区别 标签(空格分隔): TCP,udp TCP的三次握手 TCP被称为可靠的数据传输协议,主要是通过许多机制来实现的其中最主要的就是三次握手的功能,当然,TCP传送数据的机制非 ...

随机推荐

  1. a标签禁止跳转或者不跳转的几种实现方式

    1.onclick事件中返回false <a href="http://www.baidu.com"  onclick="return false" &g ...

  2. 自定义ScrollView 实现上拉下拉的回弹效果--并且子控件中有Viewpager的情况

    onInterceptTouchEvent就是对子控件中Viewpager的处理:左右滑动应该让viewpager消费 public class MyScrollView extends Scroll ...

  3. Python类继承,方法重写及私有方法

    # -*- coding: utf-8 -*- """ Created on Mon Nov 12 15:05:20 2018 @author: zhen "& ...

  4. MVC| 路由测试代码

    using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System.Web; using ...

  5. MySQL--eq_range_index_dive_limit参数学习,MYSQL 5.6 5.7处理数据分布不均的问题

    官方文档如下描述:This variable indicates the number of equality ranges in an equality comparison condition w ...

  6. linux之在当前目录下按照文件大小进行排序的三种方法

    当前目录下按照文件大小排序 [root@test23 script]# ls -lSh 总用量 44K -rw-r--r-- 1 root root 2.4K 12月 8 17:24 test.con ...

  7. 解决LINUX 只读文件系统的问题

    mount -o rw,remount /dev/mapper/vg_nips-lv_root /

  8. c++のurlmon实现下载文件并进度回调

    主文件: #include "stdafx.h" #include <UrlMon.h> #pragma comment(lib, "urlmon.lib&q ...

  9. 有关科学计算方面的python解决

    在科学计算方面,一般觉得matlab是一个超强的东西.此外还有R. 至于某种语言来说,一般都要讲究一些特别的算法,包含但不限于: 矩阵方面的计算 指数计算 对数计算 多项式运算 各类方程求解 总之.仅 ...

  10. openssl交叉编译记录

    本次任务是要完毕嵌入式Linux下对openssl程序的支持.     我的开发环境:ARM9开发板 和 嵌入式Linux操作系统.装有Linux系统(我的是ubuntu9.04)的PC机一台.串口和 ...