udp 订阅
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。RFC 768 [1]  描述了 UDP。Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。 [2] 展开全文
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。RFC 768 [1]  描述了 UDP。Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。 [2]
信息
外文名
User Datagram Protocol
特    点
无连接、不可靠、快速传输
类    别
传输层协议
用    途
发送IP数据包
中文名
用户数据报协议
基    础
IP数据包服务上增加一点功能
UDP协议简介
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768 [1]  是UDP的正式规范。UDP在IP报文的协议号是17。UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但即使在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。许多应用只支持UDP,如:多媒体数据流,不产生任何额外的数据,即使知道有破坏的包也不进行重发。当强调传输性能而不是传输的完整性时,如:音频和多媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择。 [3]  UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成 [4]  ,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。常用的UDP端口号有:53(DNS)、69(TFTP)、161(SNMP),使用UDP协议包括:TFTP、SNMP、NFS、DNS、BOOTP。UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。为了在给定的主机上能识别多个目的地址,同时允许多个应用程序在同一台主机上工作并能独立地进行数据包的发送和接收,设计用户数据报协议UDP。  UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序、及流量控制等功能。UDP Helper可以实现对指定UDP端口广播报文的中继转发,即将指定UDP端口的广播报文转换为单播报文发送给指定的服务器,起到中继的作用。
收起全文
精华内容
下载资源
问答
  • Linux| |对于UDP的学习

    万次阅读 多人点赞 2019-01-07 08:51:10
    UDP # 前序 UDP(用户数据报协议)没有连接的,是面向数据报的,是不可靠 # 套接字 就是IP地址+端口号 IP地址:4字节 端口号:2字节,也就是说范围是0~65536 端口号分为 知名端口号 0--1023...

    UDP


    # 前序

    UDP(用户数据报协议)没有连接的,是面向数据报的,是不可靠

    # 套接字

    就是IP地址+端口号

    IP地址:4字节

    端口号:2字节,也就是说范围是0~65535

    • 端口号分为

    • 知名端口号

      • 0--1023:http,ssh,ftp,telnet等一些协议端口号都是固定的,对于操作系统来说是不能对其进行分配的

      • 一些固定的端口号

      1. ssh服务器,使用22端口

      2. ftp服务器,使用21端口

      3. telnet服务器,使用23端口

      4. http服务器,使用80端口

      5. https服务器,使用443端口

    • 操作系统动态分配的端口号

      • 客户端服务器的端口号,这个范围的端口号操作系统可以对其进行分配

    • 查看端口号

    • less /etc/services
       //就可以查看Linux下所有的端口号了

       

    IP地址的理解:

    • IP地址用来标识一个主机

    端口号的理解:

    • 端口号就是用来告诉操作系统要对于那一个进程进行操作,也就是说端口号就是用来标识一个进程

    • 一个端口号只可被一个进程所占用,但是一个进程可以拥有多个端口号,也就是进程和端口号是一对多的关系

    • 当我们写一个程序使用端口号的时候,要避开这些知名端口号

    【问题】

    1. 一个进程是否可以bind多个端口号呢?

      • 可以,因为一个进程可以打开多个文件描述符,而每一个文件描述符都对应着一个端口号,所以一个进程可以绑定多个端口号

    2. 一个端口号是否可以被多个进程bind?

      • 不可以

      • 如果一个进程先绑定一个端口号,然后再fork一个子进程,这样的话就实现了多个进程绑定一个端口号,但是不同的进程绑定同一个端口号是不可以

      • TIME_WAIT状态,服务器不能立即重启也说明不用进程不能同时绑定同一个端口号

    3. 多个进程可以监听同一个端口号吗?

      • 可以。监听之前要进行创建套接字->绑定ip::端口号->监听。我们可以在bind之前使用setsockopt函数,设置套接字选项,其中就包括REUSEADDR这个选项,表明多个进程可以复用bind函数中指定的地址和端口号

    所以套接字就可以准确的标识一台主机上的一个进程,从而完成计算机之间的通信

    计算机之间的通信:

    • 主机A的某个进程与主机B上的另一个进程进行通信

     

    # 网络字节序转换

    对于数据在网络中传输的时候有着自己遵循的传输规则大端传输

    对于主机上的数据的传输序列有着两种:

    • 大端:即高位字节序放在低地址上

    • 小端:即低位字节序放在低地址上

    • 传输:均是先传输低地址上的数据然后是高地址上的数据

    所以对于主机上的数据传输的时候传输到网络上的时候有可能导致数据错误(例如主机上是小端的时候,所以需要进行转换)

    转换函数:

    #include <arpa/inet.h>
    ​
    uint32_t htonl(uint32_t hostlong);
    uint16_t htons(uint16 hostshort);
    uint32_t ntohl(uint32_t netlong);
    uint16_t ntohs(uint16_t netshort);

    h:表示主机host name

    n:表示网络network

    l:表示4字节long

    s:表示2字节short

     

    # 地址转换函数

    • 字符串转化为in_addr

      • in_addr_t inet_addr(const char* strptr)

    • in_addr转化为字符串

      • char* inet_ntoa(struct in_addr inaddr)

      • 具有不可重入性,也就是不可多次调用,因为该函数自己在静态区开辟一块空间用来存放IP地址字符串的

     

    # UDP协议

    UDP协议端格式

    插图:UDP协议端格式

    • 16为UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度(64KB)

    • 检验和:如果校验和出错,就会直接丢弃(检验的是把首部和数据部分一起都检验)

      • 校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还要在重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检验是否出错。

    • 源端口号:在对方回信是选用,不需要时可用全0

    • 目的端口号:在终点交付报时必须要用到

    • 长度:UDP用户数据报的长度,其最小值是8(仅有首部)

    UDP的特点

    • 无连接:直到对端的IP和端口号就直接进行传输,不需要建立连接

    • 不可靠:没有确认机制,没有重传机制;因为没有网络故障该段无法发送到对方,UDP协议层也不会给应用层返回任何错误信息

    • 面向数据报:不能够灵活的控制读写数据的次数和数量

    • 控制选项较少,数据传输过程中延迟小,数据传输效率高

    面向数据报

    • 应用层交给UDP多长的报文,UDP原样发送,既不会拆分也不会合并

    • 例:用UDP传输100个字节的数据

      • 如果发送端调用一次sendto,发送100个字节。那么接收端也必须调用对应的一次recvfrom,接收100字节;而不能循环调用10次recvfrom,每次发送10个字节

    UDP的缓存区

    • UDP没有发送缓存区,调用sendto之后会直接交给内核,由内核·将数据传给网络层协议进行后续的传输动作。因为UDP是不面向连接的,所以没有重发机制,也就不需要发送缓存区将已经发送的数据保存下来为了发送失败进行重传做准备

    • UDP具有接收缓存区。但是这个接收缓存区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓存区满了,在到达的UDP数据就会被丢弃

    UDP的Socket既能读,也能写,全双工

    UDP的使用注意事项

    • UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据的最大长度是64K(包含UDP首部)。但是64K在当今的互联网环境下,是一个非常小的数字。如果我们需要传输的数据超过64K,就需要应用层手动的分包,多次发送,并在接收端拼装

    • UDP首部中校验和的计算方法有些特殊。在计算校验和时,要在UDP用户数据报之前增加12个字节的伪首部

    • 伪首部既不向下传输也不想上递送,而仅仅是为了计算校验和

    • 与IP数据报的校验和只检验IP数据报的首部不同,UDP的校验和是把首部和数据部分一起都检验

    伪首部:

    插图:伪首部

    基于UDP的应用层的协议

    • NFS:网络文件系统

    • TFTP:简单文件传输文件协议

    • DHCP:动态主机配置协议

    • DNS:域名解析协议

    面试题用UDP实现可靠传输?

    参考TCP的可靠性机制,在应用层实现类似的逻辑

    • 引用序列号,保证数据顺序

    • 引入确认应答,确保对端收到了数据

    • 引入超时重传,如果隔一段时间没有应答,就重发数据

     

    1. 对于socket函数的使用

    1.1 函数原型

    int socket(int domain, int type, int protocol);
    ​
    domain: 领域
        AF_INET:IPV4
        AF_INET6:IPV6
    type: 类型
        SOCK_STREAM
        SOCK_DGARM
    protocol: 协议

    1.2 函数的作用

    在通信领域中创建一个未被绑定的套接字,并且返回一个文件描述符,可以在以后对套接字进行操作的函数调用中使用

     

    2. 对于bind函数的使用

    2.1 函数原型

    int bind(int socket, const struct sockaddr* address, socklen_t address_len);

    2.2. 函数的作用

    该函数采用先前创建好的套接字来对于IP地址以及端口号进行绑定,也就是表示该套接字可以标识出在一个网络中一台确定的主机并且主机中的进程

     

    3. 对于recvfrom函数的使用

    3.1 函数原型

    ssize_t recvfrom(int socket, void* restrict buffer, size_t length, 
                     int flags, struct sockaddr* restrict address, 
                    socklen_t* restrict address_len);
    ​
    socket:要接受那一个套接字的消息
    buffer:用来接收消息的缓存区
    length:接收的消息的长度
    flags:类型
    address:空指针或者存储发送信息的sockaddr结构
    addless_len:指定地址参数指向的sockaddr结构的长度
    3.2 函数的作用

    3.2 函数的作用  

    用来接收从socket套接字发送来的消息。该套接字的sockaddr结构也知道

     

    4. 对于sendto函数的使用

    4.1 函数原型

    ssize_t recvfrom(int socket, const void* message, size_t length, 
                     int flags, const struct sockaddr* dest_addr, 
                    socklen_t* dest_len);

    4.2 函数的作用

    该函数是socket套接字从dest_addr出接收消息

     

    5. 扩展知识

    5.1 netstat

    netstat是一个用来监控TCP/IP网络非重要工具

    语法:netstat [选项]

    功能:查看网络状态

    选项:

    • -a,显示所有连线的Socket

    • -c,持续列出网络状态

    • -n,直接使用ip地址,而不通过域名服务器,也就是显示为数字

    • -l,显示监控中的服务器的Socket,仅列出监听(Listen)状态下的Socket

    • -p,显示正在使用Socket的程序的识别码和名称(PID/Program name)

    • -t,显示TCP传输协议的连线状况

    • -u,显示UDP传输协议的连线状况

    • -v,显示指令执行过程

    • -V,显示版本信息

    • -x,显示UNIX传输协议的连线状况

    • -s,显示网络工作信息统计表

    • -h,在线帮助

     

    5.2 pidof

    查看服务器进程id是非常方面

    语法:pisdof [进程名]

    功能:通过进程名,查看进程id

     

    5.3 scp命令

    基于ssh登录进行的网络安全的远程文件拷贝命令

    例:要将自己当前路径下的clinet文件发送到主机IP为192.168.153.140的home目录下

    scp ./clinet root@192.168.153.140:/home

     

     

    5.4 关于防火墙的命令

    • 启动:systemctl start firewalld

    • 关闭:systemctl stop firewalld

    • 查看状态:systemctl status firewalld

    • 开机禁用:systemctl disable firewalld

    • 开机启用:systemctl enable firewalld

    # 对于UDP书写服务器的思路

    由于UDP是无连接的,所以对于两个处于同一局域网下计算机的进程之间通信,所以是不需要两台计算机之间的进程进行连接的,对于UDP使用的接口是需要包含知道从哪里接收消息的,要发送消息到哪里的。

    • 实现本地通信

      • 服务器

        • 只需要服务器创建一个套接字

        • 使该套接字对于本地地址(127.0.0.1)进行绑定,并且绑定一个端口号(1024--65535)就行了

          • 绑定本地地址是为了对于本地计算机的两个进程进程通信,而绑定端口号是为了绑定一个进程,是为了对于客户端进行发送消息到服务器的时候,可以找到服务器

        • 然后就接受客户端发来的消息

        • 对于客户端的消息进行处理然后就可以再次将处理后的消息进行返回

        • 插图:服务器流程

      • 客户端

        • 绑定一个套接字

          • 为了绑定一个进程,可以和服务器进行通信,将消息发送过去的时候要让服务器知道是哪一个进程再和他进程通信

        • 客户端只需要向服务器发送消息

        • 然后再次从客户端接收消息就好了,不需要考虑要进行连接

        • 插图:客户端流程

    • 实现处于同一局域网下的不同主机间进行通信

      • 服务器

        • 和本地通信的一致,只是对于套接字绑定的ip地址不一样了

        • 也对于套接字要绑定该局域网的ip地址以及一个端口号不需要在绑定本地地址(127.0.0.1)

          • 这样的话处于同一局域网下的计算机的进程就可以进行通信了

      • 客户端

        • 对于客户端来说没有任何改变,仍然是只需要知道服务器的ip和端口号就行了

     

    # 对于UDP服务器要注意的问题

    • 启动客户端

      • 启动客户端的时候必须给客户端输入一个ip地址和端口号,这个ip地址和端口号也就是要知道客户端要发送消息给哪一个服务器进行发送

    • 启动服务器

      • 必须要给服务器绑定一个ip地址和端口号,也就是要注意该服务器处于该计算机上的哪一个进程上

    展开全文
  • UDP

    千次阅读 2018-08-13 22:54:34
     用户数据保协议(User Datagram Protocol,UDP)是开放系统互联模型(Open System Interconnection,OSI)中传输层协议的一种,是一种保留消息边界的简单的面向数据报的协议。UDP不提供差错纠正、队列管理、重复...

    概述

           用户数据保协议(User Datagram Protocol,UDP)是开放系统互联模型(Open System Interconnection,OSI)中传输层协议的一种,是一种保留消息边界的简单的面向数据报的协议。UDP不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制,但提供差错检测(包含我们在传输层中碰到的第一个真实的端到端(end-to-end)校验和)。这种协议自身提供最小功能,因此使用它的应用程序要做许多关于数据报如何发送和处理的控制工作。想要保证数据被可靠传递或正确排序,应用程序必须自己实现这些保护功能。一般来说,每个被应用程序请求的UDP输出操作只产生一个UDP数据报,从而发送一个IP数据报。而对于面向数据流的传输层协议(例如TCP),应用程序写入的全部数据与真正在单个IP数据报里传送的或接收方接收的内容可能没有联系。

            UDP把数据报发送出去,但并不保证它们能够到达目的地。另外,没有协议机制防止告诉UDP流量对其他网络用户的消极影响。这种可靠性和保护性的缺失需要上层协议来代替UDP完成,但因为UDP的无连接特性,它要比其他传输协议使用更少的开销。另外,广播和组播更多直接使用像UDP这样的无连接传输。最后,应用程序可选择自己的重传单元的能力(因为上层协议可以自主决定要提供多大的可靠性)是一项重要的考虑。

    UDP校验和

           UDP校验和覆盖了UDP头部、UDP数据和一个伪头部。它由初始的发送方计算得到,由最终的接收方校验。它在传送中不会被修改(除非通过NAT)。传输层协议(如TCP、UDP)使用校验和来覆盖它们的头部和数据。对于UDP来说,校验和是可选的(尽管强烈推荐使用),而其他的则是强制的。当UDP在IPv6中使用时,校验和的计算和使用时强制的,因为在IP层没有头部校验和。为了给应用程序提供无差错数据,像UDP这样的传输层协议,在投递数据到接收方应用程序之前,必须计算校验和或者使用其他差错检测机制。

           UDP校验和的计算方法与普通互联网校验和(Internet checksum)类似,但要注意两点。首先,UDP数据报长度可以使奇数个字节,而校验和算法只相加16位字(总是偶数个字节)。UDP的处理过程是在奇数长度的数据报尾部追加一个值为0的填充(虚)字节,这仅仅是为了校验和的计算与验证,实际上填充字节不会被传送出去,因此是虚的。

           第二点是UDP(也包括TCP)计算校验和时包含了衍生自IPv4头部的一个12字节的伪头部(如上图所示)或衍生自IPv6头部字段的一个40字节的伪头部。这个伪头部也是虚的,仅用于校验和的计算与验证,不会被传送出去。这个伪头部包含了来自IP头部的源IP地址和目的IP地址以及协议或下一个头部字段(值应该是17)。它的目的是让UDP验证数据是否已经到达正确的目的地。对于伪头部的操作违反了互联网协议的分层规则(UDP作为传输层协议直接操作网络层的数据),但这只产生微小的影响(不像NAT),因为一般来说,当数据传送到(或来自于)UDP时,网络层(IP)数据已经是现成的了,UDP不过是将其作为检验的一部分而已,不会修改。

           UDP数据报校验和虽然在原始UDP规范中是可选的,但它们还是被要求在主机中默认使用。因为当数据通过路由器时,总会存在有软件和硬件漏洞的路由器在转发数据报时会修改其中的数据。如果校验和被关闭,这些错误就无法被检测到。而在IPv6中,IP层的头部校验和时不存在的,因此传输层的校验和是必须的。

    UDP-Lite

           有些应用程序可以容忍在发送和接收数据里引入的比特差错。通常,为了避免建立连接的开销或为了使用广播或组播地址,这类应用程序都会选择使用UDP,但是UDP使用的校验和要么覆盖整个负载,要么就干脆没有校验和。一个称为UDP-Lite的协议通过修改传统的UDP协议,提供了部分校验和来解决这个问题。这些校验和可以只覆盖UDP数据报里的一部分负载。UDP-Lite有它自己的IPv4协议和IPv6下一个头部字段,因此它实际上算是一种独立的传输层协议。UDP-Lite用一个校验和覆盖范围(Checksum Coverage)字段代替了冗余的长度字段来修改传统UDP头部。如下图:

           校验和覆盖字段是被校验和覆盖的字节数(从UDP-Lite头部的第1个字节开始)。除了特殊的值以外,最小值是8,因为UDP-Lite头部自身总是要求被校验和覆盖。值0表示整个负载都被校验和覆盖,这就和传统UDP一样了。而对于IPv6超长数据报,因为用于存放校验和覆盖范围字段的空间有限(只有16位),对于这类数据报,被覆盖范围最多可以是64KB或整个数据报(值为0即全覆盖)。

    最大UDP数据报长度

           理论上,一个IPv4数据报的最大长度是65535字节,这由IPv4头部的16位总长度字段决定。除去20字节不带选项的IPv4头部和一个8字节的UDP头部,就剩下最大65507字节留个UDP数据报的数据部分。而对于IPv6,假设没有使用超长数据报,16位负载长度字段可允许655535字节的UDP数据报长度(除去8字节被用于UDP头部后只剩下655527字节)。虽然理论上可以达到这些数值,但这些大小满额的数据报多数不能被端到端投递。因为可能系统本地协议实现有一些限制(可通过API套接字修改能处理的最大数据报长度),还有可能是应用程序没法处理这么大的数据报。

    数据报截断

           UDP/IP能发送和接收一个指定大小的数据报并不意味着接收数据报的应用程序能够读取这种大小的数据报。UDP编程接口允许应用程序指定每次读操作完成时返回的最大字节数。如果接收的数据报超过应用程序的限定值,大多数情况下会发生API截断(truncate),丢弃这个数据报里超过接收应用程序指定字节数的任何超额数据。但所谓“丢弃”,每种实现的具体操作是不同的,一些系统把这些超额数据放到下一次读操作中,另一些则通知调用者多少数据被截断了(或只报告有数据截断)。

    流量和拥塞控制的缺失

           大多数UDP服务器是迭代(iterative)服务器,即单个服务器线程(或进程)在单个UDP端口处理所有客户请求。通常一个应用程序使用的每个UDP端口均有一个大小有限的队列与之对应。也就是说来自不同客户机多个请求会被UDP自动排入队列里以一定策略排序(最简单的实现是FCFS,先来先服务),接收到的UDP数据报中排在最前的一个先被传送给应用程序。

           然而,这个队列有可能会溢出,使得UDP丢弃进入的数据报。因为UDP不提供流量控制(flow control),也就是说服务器无法让客户机减慢速率。因为UDP是一个无连接协议,自身没有可靠机制,应用程序无法得知什么时候UDP输入队列产生了溢出,超额的数据报仅仅是被丢弃而已。

           当网络节点(比如路由器)中发生类似的满队列的情况时,就说网络发生了拥塞(congested)。拥塞会影响所有流量经过拥塞发生地点的网络用户,这与前面提到的UDP输入情况不一样,那里作为端点,只有单个应用程序服务受影响。然而UDP无连接的特性意味着当网络正在拥塞时,不能通知对端降低发送率。

     

                                                                                  本文部分内容摘自《TCP/IP详解 卷1:协议(中文版)第2版》

    展开全文
  • TCP、UDP数据包大小的限制

    万次阅读 多人点赞 2016-05-29 10:27:34
    1、概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。 其中以太网(Ethernet...它们的关系是 数据帧{IP包{TCP或UDP包{Data}}} 不同的协议层对数据包有不同的称谓,在传输层叫做段(se

    一、概述

    首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。   
    其中以太网(Ethernet)的数据帧在链路层   
    IP包在网络层   
    TCP或UDP包在传输层   
    TCP或UDP中的数据(Data)在应用层   
    它们的关系是 数据帧{IP包{TCP或UDP包{Data}}}   

        不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。

    在应用程序中我们用到的Data的长度最大是多少,直接取决于底层的限制。   
    我们从下到上分析一下:   
    1.在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;  
    2.在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480; 
    3.在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;   
    所以,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。   
    从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。   
    但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。

    二、TCP、UDP数据包最大值的确定     

            UDP和TCP协议利用端口号实现多项应用同时发送和接收数据。数据通过源端口发送出去,通过目标端口接收。有的网络应用只能使用预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP和TCP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。动态端口的范围是从1024到65535。  

            MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64Bytes最大不能超过1518Bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。

            由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bits=6Bytes+SMAC源MAC地址48bits=6Bytes+Type域2Bytes)14Bytes和帧尾CRC校验部分4Bytes那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。

    UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
    TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)

    注*PPPoE所谓PPPoE就是在以太网上面跑“PPP”。随着宽带接入(这种宽带接入一般为Cable Modem或者xDSL或者以太网的接入),因为以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的,所以引入PPPoE。PPPoE导致MTU变小了以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492。不过目前大多数的路由设备的MTU都为1500。

            如果我们定义的TCP和UDP包没有超过范围,那么我们的包在IP层就不用分包了,这样传输过程中就避免了在IP层组包发生的错误;如果超过范围,既IP数据报大于1500字节,发送方IP层就需要将数据包分成若干片,而接收方IP层就需要进行数据报的重组。更严重的是,如果使用UDP协议,当IP层组包发生错误,那么包就会被丢弃。接收方无法重组数据报,将导致丢弃整个IP数据报。UDP不保证可靠传输;但是TCP发生组包错误时,该包会被重传,保证可靠传输。

            UDP数据报的长度是指包括报头和数据部分在内的总字节数,其中报头长度固定,数据部分可变。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节(64K)。

           我们在用Socket编程时,UDP协议要求包小于64K。TCP没有限定,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需讲SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。 

           不过鉴于Internet(非局域网)上的标准MTU值为576字节,所以建议在进行Internet的UDP编程时,最好将UDP的数据长度控制在548字节 (576-8-20)以内。

    三、TCP、UDP数据包最小值的确定

         在用UDP局域网通信时,经常发生“Hello World”来进行测试,但是“Hello World”并不满足最小有效数据(64-46)的要求,为什么小于18个字节,对方仍然可用收到呢?因为在链路层的MAC子层中会进行数据补齐,不足18个字节的用0补齐。但当服务器在公网,客户端在内网,发生小于18个字节的数据,就会出现接收端收不到数据的情况。

           以太网EthernetII规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是6+6+2+46+4=64。除去4个字节的FCS,因此,抓包时就是60字节。当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以满足数据帧长不小于64字节。由于填充数据是由MAC子层负责,也就是设备驱动程序。不同的抓包程序和设备驱动程序所处的优先层次可能不同,抓包程序的优先级可能比设备驱动程序更高,也就是说,我们的抓包程序可能在设备驱动程序还没有填充不到64字节的帧的时候,抓包程序已经捕获了数据。因此不同的抓包工具抓到的数据帧的大小可能不同。下列是本人分别用wireshark和sniffer抓包的结果,对于TCP 的ACK确认帧的大小一个是54字节,一个是60字节,wireshark抓取时没有填充数据段,sniffer抓取时有填充数据段。

    四、实际应用

            用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535- IP头(20) - UDP头(8)=65507字节。用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误。  

            用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小),这是指在用send函数时,数据长度参数不受限制。而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,会被分段发送,如果比较短,可能会等待和下一次数据一起发送。

    参考链接:http://blog.csdn.net/yaopeng_2005/article/details/6706739

    参考链接:http://blog.csdn.net/naturebe/article/details/6712153

    原创不易,转载请标明出处:https://blog.csdn.net/caoshangpa/article/details/51530685

    展开全文
  • 终于懂了TCP和UDP协议区别

    万次阅读 多人点赞 2020-03-26 12:03:28
    终于懂了TCP和UDP协议区别

    老样子先认识一下这俩伙计

    TCP和UDP都是来自传输层协议

    传输层是位于第2层的,如下图所示。

    传输层位于应用层和网络层之间,负责位于不同主机中进程之间的通信。
    在这里插入图片描述

    之前一位老哥问我:不同电脑之间是如何通信的呢?是不是还要自己开发协议什么的。

    分析:这位老哥觉得如果开发一个应用需要自己定义协议。其实也并不是没有道理的,协议是什么?协议就是双方通信共同遵守的规则,被称之为协议。像怎么使用的HTTP,FTP这些都属于应用服务,为什么叫应用服务?因为是专门服务其他人的应用。像QQ、微信、淘宝、浏览器这些通常称之为应用客户端,当然了这些的服务端咱们是看不到摸不着的,除非你是参与其中开发的人员。QQ使用的是OICQ协议,HTTP服务则使用的HTTP协议,这些协议肯定都是自定义的。如果你使用HTTP服务器的话,你就必须遵守这个规则,否则人家是不认你的。其实都是基于TCP或UDP的。

    在这里插入图片描述
    Internet的传输层提供两种不同的服务,应用开发者必须选择其中的一种

    • TCP

    面向连接的可靠的传输层协议。

    • UDP

    无连接的不可靠的传输层协议。

    何来可靠和不可靠之说?

    UDP相对于IP来说,只添加了process到process的分发服务和错误检验机制,因为,提供的也是不可靠的服务。
    而TCP为应用提供了包括可靠数据传输、流量控制和拥塞控制等在内的服务。

    有了可靠的TCP,为什么还要UDP?

    • 应用可以更精细控制何时发送何种数据
    • 无需事先建立连接就可以发送数据
    • 无连接状态,实现简单
    • 头部开销小

    扩展:

    • 1、应用可更好控制何时发送何种数据:无须建立连接,UDP可尽快将消息发给网络层;TCP可能需要重传在规定时间内没有收到确认的Segment。UDP没有建立连接所引入的延迟,这可能是DNS选择UDP而不是TCP的最主要原因。
    • 2、实现简单:UDP因为是无连接的,Host因而无须维护连接状态,实现简单;
    • 3、头部开销小:UDP的Segment头部字段共8个字节;而TCP的头部共包括20个字节.

    UDP被多数多媒体应用使用。但是…

    • UDP通常被认为是不负责任
    • UDP流量通常不容易穿透防火墙
    • 因此TCP的多媒体应用越来越多了…

    总结

    TCP的优点:

    • 可靠,稳定。
    • TCP的可靠体现在TCP在传输数据之前会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

    TCP的缺点:

    • 慢,效率低,占用资源高,易被攻击;TCP在传递数据之前要先建立连接,这会消耗时间,而且在数据传递时,确认机制,重传机制,拥塞控制机制等都会消耗大量的实践,而且要在每台设备上维护所有的传输连接。事实上每个连接都会占用系统的CPU、内存等硬件资源。
    • 因为TCP有确认机制、三次握手机制,这些优点在成了缺陷,导致TCP容易被人利用,实现DOS、DDOS、CC、猜测攻击等。

    UDP的优点:

    • 快,比TCP稍安全。
    • UDP没有TCP的握手、确认、窗口、重传、拥塞控制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。
    • 没有TCP的这些机制(如:三次握手),攻击者利用UDP的漏洞就要少一些。但是UDP也是无法避免攻击的,比如:UDPFlood等。

    UDP的缺点:

    • 不可靠,不稳定。
    • 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

    在UDP和TCP协议面前,如何选择并使用?

    基于上面的优点和缺点的分析

    什么时候应该使用TCP传输协议:

    当网络通讯有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些可靠的应用,比如:HTTP,HTTPS,FTP等传输文件的协议,POP、SMTP等邮件传输协议。

    什么时候应该使用UDP:

    当网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。比如:QQ语言、QQ视频等。

    面试经常会问道:TCP和UDP协议的区别是什么?

    简化很多字的总结

    • 1、TCP面向连接,UDP无连接;
    • 2、TCP占用系统资源较多,UDP少;
    • 3、TCP结构复杂,UDP较简单;
    • 4、TCP基于流模式,UDP时数据报模式;
    • 5、TCP保证数据正确性,UDP可能丢包;
    • 6、TCP保证数据顺序,UDP不保证。
    展开全文
  • TCP 和 UDP 的区别

    万次阅读 多人点赞 2018-08-04 21:57:42
    UDP TCP TCP 的三次握手 TCP 四次挥手 累计确认 顺序问题和丢包问题 流量控制的问题 拥塞控制的问题 总结及面试问题 前言 前端的面试中经常问的 TCP 和 UDP 的区别,网上也有好多内容,比如 TCP 和 ...
  • 计算机网络协议(三)——UDP、TCP、Socket

    万次阅读 多人点赞 2019-09-04 08:39:53
    底层网络知识详解:最重要的传输层概述一、UDP协议二、TCP协议2.1 TCP的三次握手 概述 这个专栏的计算机网络协议,我是在极客时间上学习 已经有三万多人购买的刘超老师的趣谈网络协议专栏,讲的特别好,像看小说...
  • UDP协议

    万次阅读 多人点赞 2017-06-21 12:31:05
    UDP协议UDP协议简介UDP(User Datagram Protocol),用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768...
  • UDP理解及UDP的MATLAB实现 Matlab UDP

    千次阅读 2020-04-14 16:04:01
    UDP理解及UDP的MATLAB实现一、UDP通信方式理解1、什么是UDP2、TCP和UDP区别3、个人对UDP的理解二、UDP的MATLAB实现1、单窗口实现2、多窗口实现参考 一、UDP通信方式理解 1、什么是UDP UDP是User Datagram Protocol的...
  • UDP协议的详细解析

    万次阅读 多人点赞 2018-12-26 17:16:34
    UDP数据报 一、UDP的概述 二、UDP的首部格式 UDP校验
  • UDP通信

    千次阅读 2019-05-29 16:14:59
    UDP通信UDP简介UDP协议特性UDP协议与TCP协议的主要区别TCP协议简介TCP协议特性主要区别UDP协议应用场景UDP通信代码Linux系统下的UDP通信代码发送端接收端(阻塞模式)接收端(非阻塞模式)Windows系统下的UDP通信...
  • UDP介绍

    万次阅读 2018-11-25 16:39:43
    目录UDP介绍UDP协议介绍UDP数据包格式IP协议介绍用户数据、 UDP、 IP、 MAC 四个报文的关系 本篇是专门介绍UDP协议的,为后面的UDP实例做准备。 UDP介绍 UDP协议介绍 UDP 是 User Datagram Protocol 的简称, 中文...
  • 深入理解TCP、UDP协议及两者的区别

    万次阅读 多人点赞 2018-11-14 13:03:24
     二、UDP协议: 无连接协议,也称透明协议,也位于传输层。 两者区别: 1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。 2) TCP提供可靠的传输...
  • TCP和UDP的区别和优缺点

    万次阅读 多人点赞 2017-08-06 20:32:16
    1、TCP与UDP区别总结: 1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接 2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;...
  • UDP简介

    万次阅读 2018-03-20 19:09:43
    UDP介绍:用户数据报协议,属于传输层的协议,无连接,不保证传输的可靠性。对于来自应用层的数据包,直接加上UDP报头然后传送给IP。UDP头部中有一个校验和字段,可用于差错的检测,但是UDP是不提供差错纠正的。此外...
  • UDP协议详解

    千次阅读 2020-12-25 14:39:47
    UDP(UserDatagramProtocol)是一个简单的面向消息的传输层协议,尽管UDP提供标头和有效负载的完整性验证(通过校验和),但它不保证向上层协议提供消息传递,并且UDP层在发送后不会保留UDP 消息的状态。因此,UDP...
  • 一、用户数据报协议(UDP)简介 UDP是一种保留消息边界的简单的面向数据报的传输层协议 UDP特性 它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制 不提供差错纠正:它把应用程序传给IP层的数据发送...
  • UDP头部结构,UDP校验和计算

    千次阅读 热门讨论 2018-12-16 23:32:44
    Udp:用户数据报协议 特点: 1.无连接,传输数据时不需要建立链接 2.尽最大努力传输,不可靠 3.面向报文的,接收到应用程序的数据时,只往数据前面加一个UDP头部就传给网络层,收到网络层传来的UDP数据时,只把UDP头部去掉...
  • UDP协议 用户数据报协议(User datagram Protocol) UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否...
  • UDP通信——通过UDP进行转发

    万次阅读 2019-05-16 01:02:07
    UDP通信——通过UDP通信进行数据转发 想象一下这样的应用场景:我要从设备A向设备B发送数据,B根据接收到的数据信息向设备C发送数据(当然不一定分别是3个不同的设备),如何用UDP通信实现呢? 可以由易到难的试验...
  • UDP首部

    千次阅读 2019-03-17 18:14:31
    UDP (User Datagram Protocol)用户数据包协议 UDP首部字段很简单,只有8个字节,由4个字段组成,每个字段的长度都是两个字节。 源端口:源端口号。在需要对方回信时选用。不需要时可用全0。 目的端口:目的端口号。...
  • 浅谈 Qt 中 UDPUdpSocket通信实例

    万次阅读 多人点赞 2018-06-23 03:35:00
    浅谈 Qt 中 UDP 写这篇博客的原因是Java大作业最近完成了一个简单的聊天室。也是基于UDP的。正好我们在学习Qt。所以我想能不能再qt中同样实现这样一个问题。于是我进行的代码的编辑。以及其他等方面的思考和学习。...
  • TCP和UDP的最完整的区别

    万次阅读 多人点赞 2016-08-04 11:30:30
    TCP和UDP两种协议的比较汇总
  • 【LwIP - UDP】 - udp_bind和udp_connect分析

    千次阅读 2018-09-07 16:53:27
    udp_bind和udp_connect两者具体的工作原理,笔者在网上找不到正确的说法。对此,笔者主要对UDP中的这两个接口进行分析。 1 udp_bind udp_bind将一个UDP PCB与IP和端口进行绑定。当然不是简简单单的把该IP和端口...
  • UDP中connect操作与TCP中connect操作有着本质区别.TCP中调用connect会引起三次握手,client与server建立连结.UDP中调用connect内核仅仅把对端ip&port记录下来 使用connect建立的udp连接相比于普通udp连接有两个...
  • Android UDP通讯工具

    千次下载 热门讨论 2012-11-07 11:47:52
    一个简单的Android UDP通讯工具
  • 终于把TCP协议与UDP协议给整明白了

    万次阅读 多人点赞 2020-07-04 21:35:16
    网络编程有三个要素,分别是IP地址、端口号和通信协议,本文主要讲述的是TCP与UDP这两种通信协议,以及编程的实现。
  • UDP协议格式以及在java中的使用

    万次阅读 热门讨论 2020-11-20 11:38:18
    UDP协议格式以及在java中的使用 UDP是面向无连接的通讯协议,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。 UDP...
  • UDP 检验和

    万次阅读 多人点赞 2019-02-26 17:11:52
    参考:《计算机网络-自顶向下》 ...对发送方的 UDP 报文段的所有 16 比特字的和进行反码运算,当求和遇见溢出的时候,进行回卷(回卷的补充在下面),得到的结果放在 UDP 报文段中的检验和字段 什么是回卷 所谓 “...
  • TCP VS UDP

    千次阅读 2021-01-08 09:08:09
    目录 01、简介 02、各自的特点 03、TCP和UDP的区别 04、TCP的应用 05、UDP的应用 ...建立连接后,数据传输开始,传输过程完成后,通过四次挥手关闭已...UDP还假定错误检查和更正在应用程序中并不重要,UDP提供数据完.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,041
精华内容 46,016
关键字:

udp