链路层、网络层、传输层、应用层长度

article/2025/10/13 14:01:04

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字节以内。

  • MSS的主要作用是限制另一端主机发送的数据的长度,同时,主机本身也控制自己发送数据报的长度,这将使以较小MTU连接到一个网络上的主机避免分段。

  • MTU的含义: MAC帧内的数据(Payload)字段的最大长度。

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。

链路层帧的大小 1500(不包括帧头、帧尾)
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抓取时有填充数据段。

4、实际应用

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

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

  • 也就是说以链路数据帧的长度必须在46-1500字节之间,这个1500字节被称为链路层的MTU(最大传输单元)。

  • 超过1500字节怎么办?

  • 这也就是说IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片(fragmentation).
    把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.
    这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便
    无法重组数据报.将导致丢弃整个UDP数据报。

  • 进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值.
    如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机
    制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作。鉴于Internet上的标准MTU值为576字节,

  • 所以我建议在进行Internet的UDP编程时. 最好将UDP的数据长度控件在548字节(576-8-20)以内.

IP层:

  • 对于IP协议来说,IP包的大小由MTU决定(IP数据包长度就是MTU-28(包头长度)。 MTU值越大,封包就越大,理论上可增加传送速率,但 MTU值又不能设得太大,因为封包太大,传送时出现错误的机会大增。一般默认的设置,PPPoE连接的最高MTU值是1492, 而以太网 (Ethernet)的最高MTU值则是1500,而在Internet上,默认的MTU大小是576字节。
  • 那么就一个问题, 用wireshark捕包。 为什么frame那一行是1514bytes?
  • 以太网封装IP数据包的最大长度是1500字节,也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和1字节的帧开始定界符,具体就是:7字节前导同步吗+1字节帧开始定界符+6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的CRC校验。

按照上述,最大帧应该是1526字节,但是实际上我们抓包得到的最大帧是1514字节,为什么不是1526字节呢?原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、CRC校验之外的数据,其最大值是6+6+2+1500=1514。
如下图:

PreambleDestination MAC addressSource MAC addressType/LengthUser DataFrame Check Sequence (FCS)
866246~15004

注意:

  • MSS 是 传输层 概念, 在建立TCP连接过程, 双方的SYN 报文中定义的 , 通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
  • 后面的数据传输都是按照确定的MSS进行传输。 MSS会根据物理接口的MTU计算得出 (MSS=MTU-IP头长度-TCP头长度)
    在这里插入图片描述

MTU (max transfer unit) 是是 数据链路层 中的概念,需要在 网卡中设置 的,如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。

对于一个以太网来说,TCP的最大报文段长度即MSS一般是1460字节(1500(MTU) - 20(IP head) - 20(TCP head) = 1460 Byte),减去12字节的TCP timestamp option,留给TCP正文数据是 1448字节 。另外,TCP流量控制采用了滑动窗口机制,发送窗口的大小要小于min(接收端通告的接收窗口大小,发送端拥塞窗口大小)。

google得知Linux 2.6.39内核之前的TCP实现中,发送端初始拥塞窗口为3,单位是MSS (server机器内核版本未知,估计是2.6.39以前的)。也就是说TCP连接建立后,初始拥塞窗口限制第一次发送的数据长度要小于等于 1448 * 3 = 4344 字节,所以客户端 第一次recv 调用只收到了4344字节 数据。


http://chatgpt.dhexx.cn/article/xYgRlqWb.shtml

相关文章

计算机网络原理 - 网络层、链路层总结笔记

计算机网络原理 - 网络层、链路层 ##4.网络层 网络层主要是利用IP上的传输,在路由器中最高达到的层次为网络层,分组交换机只到链路层;IP准确来说不是一个主机的地址,而是一个接口的地址。 4.1 概述 网络层的作用:将分…

【计算机网络】链路层

链路层和局域网 1、链路层概述1.1链路层提供的服务1.2链路层在何处实现 2、差错检测和纠正技术2.1奇偶校验2.2检验和方法2.3循环冗余检测 3、多路访问链路和协议3.1信道划分协议3.2随机接入协议3.2.1时隙ALOHA3.2.2ALOHA3.2.3载波侦听多路访问CSMA3.2.4具有碰撞检测的载波侦听多…

BLE 链路层(LL)的数据结构

一 链路层的数据结构 在链路层上传输的数据格式如下图所示: 广播报文和数据报文都包含 Preamble(前导码), AccessAddress(接入地址),PDU(数据),CRC。其中Constant Tone Extension是可选的。 前导码接入地址PDU HeaderLengthpayloadMIC(可选…

计算机网络自顶向下-链路层

链路层和局域网 两台主机之间,数据报跨越一系列通信链路传输,一些是有线链路一些是无线链路,从源主机起,通过一些了分组交换机在目的主机结束。在链路层中有两种不同的链路层信道, 第一种是广播信道,这种信…

链路层信道详解

文章目录 一、链路层概述链路层提供的服务链路层在何处实现 二、差错检验和纠正技术奇偶校验检验和方法循环冗余检测 三、多路访问协议信道划分协议时分多路复用(TDM):频分多路复用(FDM):码分多址&#xff…

计算机网络-链路层

一、概述 1.相关概念 节点:运行链路层协议的任何设备。链路:沿着通信路径连接相邻几诶单的通信信道。 2.提供的服务 2.1 成帧 几乎所有的链路层协议都要将数据报用链路层帧封装起来。一个帧由一个数据字段和若干首部字段组成,其中网络层…

链路层协议

文章目录 1. 链路层协议1.1 链路层协议与IP协议 2. 以太网帧与IP数据包2.1 以太网帧2.1.1 实用地位2.1.2 以太网帧格式 2.2 串行接口链路层协议 S L I P2.2.1 实用地位2.2.2 链路帧格式 2.3 串行接口链路层协议 P P P2.3.1 实用地位2.3.2 PPP 帧格式 2.4 环回接口2.4.1 环回定义…

链路层---->MAC地址,链路层与网络层对比

链路层 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> . 链路层和网络层…

链路层数据帧格式总结

创作人QQ:851301776,邮箱:lfr890207163.com,欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发。 2.你可以学…

蓝牙相关学习:4.3.BLE协议链路层

BLE协议链路层 一、链路层二、信道分类跳频(Hopping) 三、状态机状态机的五种状态主还是从一对多 四、空口协议(Air Interface Protocol)空口包(Air Interface Packet)以白名单(White List&…

数据链路层简介

文章目录 一、基本概念二、主要功能1.封装成帧2.透明传输3. 差错控制4. 流量控制5. 链路管理认识MTU 三、相关协议1. PPP协议2. ARP协议 一、基本概念 链路(Link):一个节点到另一个相邻节点的一段物理线路,中间没有任何其他节点。链路由传输介质和物理设…

计算机网络 —— 链路层详解

文章目录 一,数据链路层基本概念1. 为什么要设置数据链路层2. 数据链路的主要功能1)链路管理2)帧同步3)流量控制4)差错控制5)透明传输6)寻址 3. 链路层的三个基本问题1)封装成帧2&am…

计算机网络---数据链路层

(一)基本概念 数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自物理层来的数据可靠地传输到相邻节点的目标机网络层。 换言之&#x…

计算机网络之链路层

两台主机之间,数据报跨越一系列通信链路传输,一些是有线链路一些是无线链路,从源主机起,通过一些了分组交换机在目的主机结束。在链路层中有两种不同的链路层信道, 第一种是广播信道,这种信道用于有线局域…

tcp粘包 java_详说tcp粘包和半包

tcp服务端和客户端建立连接后会长时间维持这个连接,用于互相传递数据,tcp是以流的方式传输数据的,就像一个水管里的水一样,从一头不断的流向另一头。 理想情况下,发送的数据包都是独立的, 现实要复杂一些&a…

php处理粘包,Swoole怎么处理粘包

什么是 TCP 粘包? TCP 粘包是指发送方发送的若干包数据 到 接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。 TCP 出现粘包的原因? 发送方:发送方需要等缓冲区满才发送出去,造成…

什么是粘包和拆包,Netty如何解决粘包拆包?

Netty粘包拆包 TCP 粘包拆包是指发送方发送的若干包数据到接收方接收时粘成一包或某个数据包被拆开接收。 如下图所示,client 发送了两个数据包 D1 和 D2,但是 server 端可能会收到如下几种情况的数据。 上图中演示了粘包和拆包的三种情况:…

tcp的拆包和粘包

tcp的拆包和粘包 简介 拆包和粘包是在socket编程中经常出现的情况,在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包。而如果通讯的一端发送的数据…

TCP粘包现象

TCP粘包现象 在socket网络编程中,都是端到端通信,由客户端端口服务端端口客户端IP服务端IP传输协议组成的五元组可以明确的标识一条连接。在TCP的socket编程中,发送端和接收端都有成对的socket。发送端为了将多个发往接收端的包,更…

粘包问题及解决方法

如何解决粘包问题 粘包就是连续向对端发送两个或者两个以上的数据包,对端在一次收取中受到的数据包数量可能大于1个,当大于1个时,可能时几个包加上某个包的部分,这这干脆几个完整的包在一起。当然,也可能收到的数据只…