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. react-router与react-router-dom使用时的区别

    1.React-router与React-router-dom的API对比 React-router:提供了router的核心api.如Router.Route.Switch等,但没有提供有关dom操 ...

  2. Berlekamp-Massey算法学习笔记

    Berlekamp-Massey算法 很久之前就听说过这个算法,当时六校联考的时候Day1T1是一道很有意思的递推,神仙zzx不会做于是就拿BM算法艹出了递推式Orzzzzzzzzzzx 推荐一篇讲的 ...

  3. wx python 基本控件

    一.静态文本控件 wx.StaticText(parent, id, label, pos=wx.DefaultPosition,    size=wx.DefaultSize, style=0, n ...

  4. [HDFS_4] HDFS 的 Java 应用开发

    0. 说明 在 IDEA下 进行 HDFS 的 Java 应用开发 通过编写代码实现对 HDFS 的增删改查操作 1. 流程 1.1 在项目下新建 Moudle 略 1.2 为 Moudle 添加 M ...

  5. Django框架的使用教程--视图和路由[二]

    视图和路由 1.创建一个django_test应用 2.setting中设置django_test INSTALLED_APPS = [ 'django.contrib.admin', 'django ...

  6. CentOS7.4下编译Hadoop-2.7.6

    1. 使用系统和软件 操作系统:CentOS Linux release 7.4.1708 (Core) 64位 使用软件如下: jdk1.8.0_112.tar.gz hadoop-2.7.6-sr ...

  7. Java设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

  8. keil uvision4不能显示中文

    打开编辑-配置 选择字体和颜色如下图 去掉右边 在注释中使用颜色 就可以了

  9. 【美妙的Python之三】Python 对象解析

    美妙的Python之Python对象         简而言之: Python 是能你无限惊喜的语言.与众不同.         Python对象概念的理解,是理解Python数据存储的前提.Pyth ...

  10. 解决eclipse中Tomcat服务器的server location选项不能修改的问题

    在Eclipse菜单栏中选择window — show view — server 可以看到服务的面板,服务面板中可看到已配置的Tomcat以及Tomcat下的项目 双击tomca进入设置界面,如果看 ...