首页 > 其他分享 >TCP与UDP数据包分析

TCP与UDP数据包分析

时间:2025-01-14 15:01:51浏览次数:3  
标签:UDP 字节 数据 IP TCP 数据包 以太网

注意:帧规定最小为64bytes,最大为1518byte;

帧头部+尾部占18bytes(6(DesMAC)+6(SrcMAC)+2(type)+4(CRC32校验))

IP包中包头占20bytes

TCP包中包头占20bytes(TCP的大小没有规定,主要靠在IP层中分片)

UDP包中包头占8bytes(在lntent中规定UDP包大小为556byte,在局域网内可以达到64k)

1、概述

首先要看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字节以内。

 

2、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)以内。

3、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,字节,数据,IP,TCP,数据包,以太网
From: https://blog.csdn.net/ghx19940812/article/details/145139167

相关文章

  • 基于DPDK的用户态协议栈(2)基于DPDK实现UDP的数据接收
    注:本文只实现了数据接收部分一、使用DPDK实现UDP的数据接收流程1.1初始化EALmain(intargc,char*argv[]){//main函数的标准参数,用于接收命令行参数。argc表示参数的数量,argv是一个指向字符串数组的指针,这些字符串是传递给程序的命令行参数。//初始化EAL。if(......
  • tcp 粘包问题及其解决
    tcp粘包问题及其解决tcp粘包问题及其解决tcp及粘包介绍粘包原因粘包造成的现象粘包问题复现1.小数据包合并复现复现结果2.大数据包拆分复现复现结果粘包解决粘包的解决方式解决代码读写部分封装网络通信部分服务器端客户端编译运行结果结尾参考链接tcp......
  • 【详解】SQLServerJDBC到主机的TCP/IP连接失败
    目录SQLServerJDBC到主机的TCP/IP连接失败错误描述原因分析解决步骤1.检查SQLServer服务状态2.检查网络连接3.检查端口4.配置SQLServer接受TCP/IP连接5.检查JDBC驱动版本6.检查连接字符串解释:常见问题排查:1.0x2749(10061)-无法建立连接......
  • 网络原理一>UDP协议详解
    UDP和TCP都是应用层中的重要协议,如果做基础架构开发,会用得多一些。  这一篇我们先简单聊一下的UDPTCP格式呈现:我们知道UDP是一种无连接,面向数据报,全双工,不可靠传输特性的网络协议。   基本格式如图:  可以这样看:  也可以这样看:1.源端口和目的端口:我......
  • 什么是TCP重传率,有什么用?如何查看?
    TCP重传率是一个衡量TCP网络性能的重要指标,它指的是在TCP通信过程中,由于数据包丢失、损坏或确认(ACK)未按预期到达而导致的数据包重传的比例或率。TCP协议通过重传机制来保证数据传输的可靠性,但过高的重传率通常意味着网络质量问题,如网络拥、链路不稳定或质量差,从而导致网......
  • 【pcap文件】TCP重传与重叠碎片
    #pcap文件网络流量数据包捕获是网络安全领域的重要部分,而pcap文件则是这一过程的常见载体。为了深入解析pcap文件中潜在的可疑网络流量,我们需要运用强大的网络安全威胁评估与审计工具。这些工具能够帮助我们捕捉、记录、检测和诊断网络中的数据传输问题,及时发现异常活动,保护我们......
  • 【DNS攻防】深入探讨DNS数据包注入与DNS中毒攻击检测 (C/C++代码实现)
    DNS数据包注入和DNS中毒攻击是网络安全领域中的两个重要主题。DNS(域名系统)是互联网中的一项核心服务,负责将域名转换为与之相对应的IP地址。DNS数据包注入是指攻击者通过篡改或伪造DNS请求或响应数据包来干扰或破坏DNS服务的过程。攻击者可通过注入恶意数据包来改变DNS解析结果,将......
  • 《网络安全必备:Wireshark助力解析数据包,防范网络风险于未然》
    Wireshark安装入门之软件介绍软件简介Wireshark是一款开源的网络数据包分析软件,广泛应用于网络故障排除、网络安全分析、协议开发和教学等领域。它能够捕获和分析网络上的数据包,帮助用户理解网络通信的细节。平台支持WindowsLinuxmacOS安装步骤Windows安装访问Wireshark......
  • python 代码实现了一个结合数据包络分析(DEA)和粒子群优化(PSO)算法的模型,主要用于寻找一
    importnumpyasnpimportpandasaspdimportpickleimportrefromscipy.optimizeimportminimizeimportrandomimportmatplotlib.pyplotaspltimportscipy.statsasstatsfromconcurrent.futuresimportThreadPoolExecutor#加载数据,添加文件存在性验证......
  • NGINX--HTTP&TCP负载均衡
    一、HTTP负载均衡1、基本介绍在多应用实例中,通常可以用nginx来做负载均衡器来分发流量,以达到提高应用吞吐量、降低时延、调优性能、提供容错性等。2、http负载均衡最简单的配置如下http{upstreammyapp1{serversrv1.example.com;serversrv2.......