网络基础知识和常用数据帧格式

2023-05-16

网络基础知识和常用数据帧格式

  • 1 IP路由相关
    • 1.1 网络分层
    • 1.2 网络分段
    • 1.3 子网掩码
    • 1.4 网关功能
    • 1.5 数据路由
  • 2 常用帧格式
    • 2.1 ARP帧格式
    • 2.2 ICMP帧格式
    • 2.3 UDP帧格式
    • 2.4 TCP帧格式

本文主要介绍网络分层、网络分段、子网掩码、网关功能、数据路由等基础知识和UDP、TCP、ARP等常用数据帧格式。

1 IP路由相关

1.1 网络分层

ISO提出的OSI(Open System Interconnection)模型将网络分为七层,即物理层(Physical)、数据链路层(Data Link)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(Presentation)和应用层(Application)。

  • 物理层:参考模型的最低层,该层是网络通信的数据传输介质,由连接不同结点的电缆与设备共同构成。主要功能是:利用传输介质为数据链路层提供物理连接,负责处理数据传输并监控数据出错率,以便数据流的透明传输。
  • 数据链路层:主要功能是在物理层提供的服务基础上,在通信的实体间建立数据链路连接,传输以“帧”为单位的数据包,并采用差错控制与流量控制方法,使有差错的物理线路变成无差错的数据链路。
  • 网络层:主要功能是为数据在结点之间传输创建逻辑链路,通过路由选择算法为分组(packet, 也称数据包)通过通信子网选择最适当的路径,以及实现拥塞控制、网络互联等功能。
  • 传输层:主要功能是向用户提供可靠的端到端(End-to-End)服务,处理数据包错误、数据包次序,以及其他一些关键传输问题。传输层向高层屏蔽了下层数据通信的细节,因此,它是计算机通信体系结构中关键的一层。
  • 会话层:主要功能是负责维护两个结点之间的传输链接,以便确保点到点传输不中断,以及管理数据交换等功能。
  • 表示层:主要功能是用于处理在两个通信系统中交换信息的表示方式,主要包括数据格式变换、数据加密与解密、数据压缩与恢复等功能。
  • 应用层:主要功能是为应用软件提供了很多服务,例如文件服务器、数据库服务、电子邮件与其他网络软件服务。

物理层实际上就是布线、光纤、网卡和其它用来把两台网络通信设备连接在一起的东西。第2层是以太网等协议,如果你在谈论有关MAC地址、交换机或者网卡和驱动程序,你就是在第2层的范畴。如果你在谈论一个IP地址,那么你是在处理第3层的问题,这是“数据包”问题,而不是第2层的“帧”。有关路由的一切事情都在第3层处理,地址解析和路由是3层的重要目的。第4层的数据单元也称作数据包(packets)。但是,当你谈论TCP等具体的协议时又有特殊的叫法,TCP的数据单元称为“段(segments)”而UDP的数据单元称为“数据报(datagrams)”。有一些应用程序和协议在5层和6层。但是,对于理解网络问题来说,谈论这些问题没有任何益处。第7层是“一切”。7层称作“应用层”,是专门用于应用程序的。

1.2 网络分段

A类地址用于少量的网络(最多127个)主机数大于2¹⁶的大型网,每个A类网络可容纳最多2²⁴台主机;B类地址用于主机数介于2⁸~2¹⁶之间数量不多不少的中型网,B类网络最多2¹⁴个;C类地址用于每个网络只能容纳2⁸台主机的大量小型网,C类网络最多2²¹个。

A类表示的地址范围是1.0.0.0到127.255.255.255;B类表示的地址范围是128.0.0.0到191.255.255.255;C类表示的地址范围是192.0.0.0到223.255.255.255。A、B、C分别分配给特别大的网络,中型网络和小型网络使用,比如局域网就是用C类地址。A类网络的默认子网掩码是255.0.0.0,B类网络的默认子网掩码是255.255.0.0,C类网络的默认子网掩码是255.255.255.0。将子网掩码和IP地址按位进行逻辑“与”运算,得到IP地址的网络地址,剩下的部分就是主机地址,从而区分出任意IP地址中的网络地址和主机地址。

1.3 子网掩码

子网掩码(Netmask)是一个32位的2进制数, 其对应网络地址的所有位都置为1,对应于主机地址的所有位置都为0。子网掩码告知路由器,地址的哪一部分是网络地址,哪一部分是主机地址,使路由器正确判断任意IP地址是否是本网段的,从而正确地进行路由。网络上,数据从一个地方传到另外一个地方,是依靠IP寻址。从逻辑上来讲,是两步的。第一步,从IP中找到所属的网络;第二步,再从IP 中找到主机在这个网络中的位置。

子网掩码工作过程是:将32位的子网掩码与IP地址进行二进制形式的按位逻辑“与”运算得到的网络地址,将子网掩码二进制的非的结果和IP地址二进制进行逻辑“与”运算,得到的就是主机地址。如:192.168.10.11与 255.255.255.0,结果为192.168.10.0,其表达的含义为:该IP地址属于192.168.10.0这个网络,其主机号为11,即这个网络中编号为11的主机。

使用子网掩码划分子网后,子网内可以通信,跨子网不能通信,子网间通信应该使用路由器,并正确配置静态路由信息。划分子网,就应遵循子网划分结构的规则。就是用连续的1在IP地址中增加表示网络地址,同时减少表示主机地址的位数。例如,IP地址为130.39.37.100,网络地址为130.39.37.0、子网地址为130.39.37.0、子网掩码为255.255.255.0,网络地址部分和子网标识部分为“1”所对应,主机标识部分为“0”所对应。 使用CIDR表示为:130.39.37.100/24即IP地址/ 掩码长度。其中第三个字节上的255 所对应的8位二进制数值就是将主机地址位数借给了网络地址部分,充当了划分子网的位数。

另外,通过VLAN可以进一步的划分通信范围。VLAN技术的出现,使得管理员根据实际应用需求,把同一物理局域网内的不同用户逻辑地划分成不同的广播域,每一个VLAN都包含一组有着相同需求的计算机工作站,与物理上形成的LAN有着相同的属性。由于它是从逻辑上划分,而不是从物理上划分,所以同一个VLAN内的各个工作站没有限制在同一个物理范围中,即这些工作站可以在不同物理LAN网段。由VLAN的特点可知,一个VLAN内部的广播和单播流量都不会转发到其他VLAN中,从而有助于控制流量、减少设备投资、简化网络管理、提高网络的安全性。

1.4 网关功能

网关(Gateway)本质上不是一个产品而是一个网络层的概念,网关就是一个网络连接到另一个网络的“关口”。 计算机本身不具备路由寻址能力,所以计算机要把所有的IP包发送到一个默认的中转地址上面进行转发,也就是默认网关。这个网关可以在路由器上,可以在三层交换机上,可以在防火墙上,可以在服务器上,所以和物理的设备无关。按照不同的分类标准,网关也有很多种。TCP/IP 协议里的网关是最常用的,下文所讲的“网关”均指TCP/IP协议下的网关。

比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1-192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。TCP/IP 协议会根据子网掩码(255.255.255.0)与主机的IP地址作 “与” 运算的结果,判定两个网络中的主机处是否在同一的网络里。在没有路由器的情况下,两个网络之间是不能进行 TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上。而要实现这两个网络之间的通信,则必须通过网关。

如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。

一台主机可以有多个网关。默认网关的意思是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。现在主机使用的网关,一般指的是默认网关。网关的IP必须要和局域网在同一网段,比如一个局域网网段为192.168.2.0/24,那么网关可以是192.168.2.1-192.168.2.244之间任意一位,其中192.168.2.255是广播地址,所以不能选择。但是,在选择默认网关的时候,一般选择192.168.2.1或者是192.168.2.244,因为这样比较好认,如果选择中间区域,在划分IP的时候,很容易冲突,选择两端的IP作为默认网关是最合适的,也是约定俗成的。但在实际使用是,默认网关最后一位总是习惯设置为1。

现实生活中,很多人也会把具有网关功能的设备称作是网关,比如路由器。网关是网络中的一个概念,指的是一个“网络”中的出口,是一个逻辑概念,并不是具体某种设备。路由器是一种设备,路由器可以实现网关的功能,但是路由器功能不仅仅是实现网关。网关可以由路由器实现,但是也不仅仅是由路由器实现,其他设备也可以实现网关功能。

1.5 数据路由

路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程。路由通常与桥接来对比,它们的主要区别在于桥接发生在OSI参考模型的第二层(数据链路层),而路由发生在第三层(网络层)。路由器能够连接不同类型的局域网和广域网,如以太网、ATM网、FDDI网、令牌环网等。不同类型的网络,其传送的数据单元(包)的格式和大小是不同的。数据从一种类型的网络传输至另一种类型的网络,必须进行帧格式转换。路由器就有这种能力。实际上,我们所说的“互联网”,就是指各种路由器将各种不同的网络类型互相连接起来。

路由器是第三层网络设备。集线器工作在第一层(即物理层),没有智能处理能力,当一个端口的电流传到集线器中时,它只是简单地将电流传送到其他端口,不关心其他端口连接的计算机是否接收这些数据。交换机工作在第二层(即数据链路层),它要比集线器智能一些,对它而言,网络上的数据就是MAC地址的集合,它能分辨出帧中的源MAC地址和目的MAC地址,因此可以在任意两个端口间建立联系,但是交换机并不懂得IP地址,它只知道MAC地址。路由器工作在第三层(即网络层),它比交换机还要“聪明”一些,它能理解数据中的IP地址,如果它接收到一个数据包,就检查包中的目标网络地址以判断该包的目的地址在当前的路由表中是否存在(即路由器是否知道到达目标网络的路径)。如果发现包的目标地址与本路由器的某个接口所连接的网络地址相同,那么马上将数据转发到相应接口;如果发现包的目标地址不是自己的直连网段,路由器会查看自己的路由表,查找包的目的网络所对应的接口,并从相应的接口转发出去;如果路由表中记录的网络地址与包的目标地址不匹配,则根据路由器配置转发到默认接口,在没有配置默认接口的情况下会给用户返回目标地址不可达的ICMP信息。

出于安全和管理方便的考虑,主要是为了减小广播风暴的危害,必须把大型局域网按功能或地域等因素划成一个个小的局域网,这就使VLAN技术在网络中得以大量应用,而各个不同VLAN间的通信都要经过路由器来完成转发,随着网间互访的不断增加。单纯使用路由器来实现网间访问,不但由于端口数量有限,而且路由速度较慢,从而限制了网络的规模和访问速度。基于这种情况三层交换机便应运而生,三层交换机是为IP设计的,接口类型简单,拥有很强二层包处理能力,非常适用于大型局域网内的数据路由与交换,它既可以工作在协议第三层替代或部分完成传统路由器的功能,同时又具有几乎第二层交换的速度,且价格相对便宜些。在企业网和教学网中,一般会将三层交换机用在网络的核心层,用三层交换机上的千兆端口或百兆端口连接不同的子网或VLAN。不过应清醒认识到三层交换机出现最重要的目的是加快大型局域网内部的数据交换,所具备的路由功能也多是围绕这一目的而展开的,所以它的路由功能没有同一档次的专业路由器强。毕竟在安全、协议支持等方面还有许多欠缺,并不能完全取代路由器工作。在实际应用过程中,典型的做法是:处于同一个局域网中的各个子网的互联以及局域网中VLAN间的路由,用三层交换机来代替路由器,而只有局域网与公网互联之间要实现跨地域的网络访问时,才通过专业路由器。三层交换技术的本质就是由二层交换技术结合了三层转发技术而研发出的新型技术。

路由工作包含两个基本的动作:确定最佳路径和通过网络传输信息。在路由的过程中,后者也称为(数据)交换。交换相对来说比较简单,而选择路径很复杂。

  • 路径选择:metric是路由算法用以确定到达目的地的最佳路径的计量标准,如路径长度。为了帮助选路,路由算法初始化并维护包含路径信息的路由表,路径信息根据使用的路由算法不同而不同。路由算法根据许多信息来填充路由表。目的/下一跳地址对告知路由器到达该目的最佳方式是把分组发送给代表“下一跳”的路由器,当路由器收到一个分组,它就检查其目标地址,尝试将此地址与其“下一跳”相联系。路由表比较metric以确定最佳路径,这些metric根据所用的路由算法而不同。路由器彼此通信,通过交换路由信息维护其路由表,路由更新信息通常包含全部或部分路由表,通过分析来自其它路由器的路由更新信息,该路由器可以建立网络拓扑图。路由器间发送的另一个信息是链接状态广播信息,它通知其它路由器发送者的链接状态,链接信息用于建立完整的拓扑图,使路由器可以确定最佳路径。
  • 交换算法:交换算法相对而言较简单,对大多数路由协议而言是相同的,多数情况下,某主机决定向另一个主机发送数据,通过某些方法获得路由器的地址后,源主机发送指向该路由器的物理(MAC)地址的数据包,其协议地址是指向目的主机的。路由器查看了数据包的目的协议地址后,确定是否知道如何转发该包,如果路由器不知道如何转发,通常就将之丢弃。如果路由器知道如何转发,就把目的物理地址变成下一跳的物理地址并向之发送。下一跳可能就是最终的目的主机,如果不是,通常为另一个路由器,它将执行同样的步骤。当分组在网络中流动时,它的物理地址在改变,但其协议地址始终不变。ISO定义了用于描述此过程的分层的术语。在该术语中,没有转发分组能力的网络设备称为端系统(ES–end system),有此能力的称为中介系统(IS–intermediate system)。IS又进一步分成可在路由域内通信的域内IS(intradomain IS)和既可在路由域内又可在域间通信的域间IS(interdomain IS)。

主机A与主机B通信,首先主机A肯定要封装这些需要发给主机B的数据包,这个数据包路径部分需要:主机A的IP和MAC,目标主机B的IP和MAC,可根本没有目标主机B的MAC地址,所以需要通过ARP报文在网路内查询目标主机的MAC地址。对于同一网段和不同网段的两台主机,其路由的过程不同。主机A会比较源IP和目标IP,通过子网掩码计算一下,查看源IP和目标IP是否在同一个IP网段内。

  • 相同网段:首先主机A就向本网段发一个ARP(地址转换协议)请求,这个ARP请求包中包括主机A的源IP地址,源MAC地址,目标主机B的IP地址,而目标MAC地址为广播MAC地址(全部为F),因为我们要找的就是目标MAC,所以这里用广播MAC地址,所以整个局域网的所有主机都能收到这个请求MAC地址的数据包,当主机B收到此ARP请求后,立即构建一个包括自己的MAC地址的ARP回应包,回应给主机A,当主机A收到这个ARP回应后,完成了找寻目标MAC,从而把目标主机B的MAC地址正确封装进上面还未封装结束的正准备发给主机B的数据包,在这时,源IP和源MAC以及目标IP和目标MAC都已正确存在于数据包中,那么这里主机A向网络内发出这些数据包,因为目标地址在本网段,所以本网段所有主机都能收到这个数据包(这是以太网的特性),最后只有真正的目标主机B能够打开这些数据包。
  • 不同网段:两个主机在不同网段,就要用到网关了,主机A在准备发向主机B的数据中,封装好自己的IP地址和MAC地址,同时也封装好目标主机B的IP地址,数据包封装到这里,同样也是用ARP去广播,因为网关必须和本机在同一网段,理所当然,网关能够收到这个ARP请求并能正确回应给主机A,这时主机A在数据包中封装好自己的IP地址和MAC地址,同时也封装好目标主机B的IP地址和网关的MAC地址,把数据包从网卡发出去,因为目标MAC是网关的,所以网关收到这个数据包后,发现目标MAC是自己,而目标IP却是别人,所以它不可以再往上打开这个数据包,它要做的工作就是把这些数据包发给下一跳路由器(如果网关自身就是一台路由器的话),如果网关是一台普通PC,那么它就发给路由器,让路由器把这些数据包正确传输到远程目标网络,到达远程网络后,它们的网关再将数据包发给数据包中的目标IP,即源主机A寻找的目标主机B,从而真正结束不同网络之间的通信,回应的数据包也是用同样的方法到达目的地,在这里,还需要注意的是,当网关把数据包发给下一跳路由器时,这个数据包必须由网关把目标MAC改成下一跳路由器的MAC地址(通过ARP得到),而源端MAC改成发出端口的MAC地址,否则下一跳路由器收到目标MAC不是自己的数据包,会丢弃不予理睬,下一跳路由器再发给下一跳路由器同样要把目标MAC地址改为下一跳路由器的MAC地址再发出去。

2 常用帧格式

2.1 ARP帧格式

当一个应用层的数据在网络中传输时,会被逐步封装成链路层的帧,而帧是通过链路层的MAC地址进行定位传输的,那么一个初次通信的主机如何知道对方的MAC地址呢,这时候就需要ARP地址解析协议来获取对方的MAC地址,ARP是提供网络层地址(IP地址)到相关硬件地址(MAC)的映射。ARP工作在网络层,其格式如下图所示,每个字段的说明如下:

  • MAC层
    • 目的地址:数据包的目的MAC地址。
    • 源地址:数据包的源MAC地址。
    • 类型:上层协议类型,0x0800表示上层协议为IP协议,0x0806表示ARP协议,0x835表示RARP协议。
    • 数据:数据负载。
    • 校验码:检测数据是否在传输过程中出错。
  • ARP层
    • 硬件类型:指出硬件地址类型,对于以太网,该值为1。
    • 协议类型:指出映射的协议地址类型,对于IPv4地址,该值为0x0800。
    • 硬件大小:指出硬件地址的字节数,对于以太网中使用IPv4地址的ARP请求或应答,他的值为6。
    • 协议大小:指出协议地址的字节数,对于以太网中使用IPv4地址的ARP请求或应答,他的值为4。
    • 操作类型:指出该操作是ARP请求(值为1)、ARP应答(值为2)、RARP请求(3)、或者RARP应答(4)。
    • 源硬件地址:发送方以太网的MAC地址。
    • 源协议地址:发送方的协议地址(一般是IPv4协议地址)。
    • 目的硬件地址:接收方以太网的MAC地址。
    • 目的协议地址:接收方的协议地址(一般是IPv4协议地址)。

在这里插入图片描述
这里存在着一些重复的信息,以太网的头部和ARP消息中都存在发送方的硬件地址。对于一个ARP请求,除了需要获取的目的硬件地址为0之外,其他字段都需要填充,当一个系统收到一个ARP请求,它填充自己的硬件地址,将两个发送方地址和两个接收方的地址互换,把操作类型字段设置为2,然后发送生成的应答。ARP的基本工作流程如下:

  • 当目的地址和发送方在同一网段
    • ARP帧头部的目的MAC地址是FF:FF:FF:FF:FF:FF(广播地址,注意是头部中的目的MAC地址,而不是ARP消息中的目的MAC地址),同一广播域中的主机都可以收到这个广播帧。这包括运行任何协议的系统(IPV4或IPV6等),但不包括位于不同VLAN中的系统,因为VLAN划分了广播域。
    • 同一网段中的所有主机都会解析这一帧,如果发现这个帧中的目的IP地址就是自己时,就会以单播的形式响应。如果其他主机解析后发现不是发给自己的,则丢弃这个帧。这时接收的这个主机会记下发送方的IP地址到MAC地址的映射,以方便下次通信时使用。
  • 当目的地址和发送方在不同网段
    • 这时候需要网关介入,主机会先发送一个广播帧来获取网关的MAC地址,网关收到帧后会响应给主机自己的MAC地址。
    • 主机收到网关的MAC地址后,又封装了一个带有目标IP的帧以单播的形式给网关,网关收到这个帧后会解析其中的IP地址,根据自己的路由表来决定怎么转发这个包,网关会把源IP地址和源MAC地址改为自己的地址,目的IP不变来生成一个新的ARP帧转发给下一跳。
    • 经过一次或数次转发后这个数据包会到达目标主机所在的子网中,发送给对应的目标主机,目标主机响应一个帧来回应。

在这里插入图片描述
在这里插入图片描述

2.2 ICMP帧格式

ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成数据报发送出去。其格式如下图所示,每个字段的说明如下:

  • MAC层:同ARP帧
  • IP层
    • 版本:IP协议版本,IPv4为0x4。
    • 首部长度:IP首部长度,单位长度为4个byte,下图所示为5,即20byte。
    • 服务类型:前3bits优先级字段(现在已经不用了),后4bits TOS字段, 最后1bit备用位。4bits TOS位分别代表D(delay)最小时延、T(throughput)最大吞吐量、R(reliability)最高可靠性和C(cost)最小费用,只能设置其中1bit,如果所有 4bits均为0,那么就表示是一般服务。
    • 总长度:包括首部和数据部分,能表示的最大长度为 65535(216-1)。不过由于链路层的MTU限制。超过1480字节后就会被分片(以太帧MTU为1500的情况下,除去20字节的包头)。
    • 标识:用来唯一标识主机发送的每一份数据报,IP软件会在存储器中维持一个计数器,每产生一个数据段,计数器就加1,并将此值赋给标志字段。如数据报由于超过网络的MTU(最大传送单元)而必须分片时,这个标志字段的值就会被复制到所有的数据报的标识字段中,相同的标识字段的值使分片后各数据报片能正确的重装成为原来的数据报。
    • 标志:第一位0bit保留;中间位DF(Don’t Fragment),DF为0 表示能分片,DF为1 表示不能分片。最低位为MF(More Fragment) ,MF为1表示后面还在传输数据报的分片,MF为0表示最后一个报文段。
    • 片偏移:用于数据包分片和重组。13位(片)偏移字段,较长的分组在分片后,某片在原来分组中的相对位置。分片偏移以8bytes做为计量单位,第一个分片偏移为0。所以当片偏移为0时,表示这个数据报文没有分片,或者第一个分片。
    • 生存时间:用来设置数据报最多可以经过的路由器数,由发送数据的源主机设置,通常为32、64、128等,每经过一个路由器,其值减1,直到0,该数据报被丢弃。
    • 协议:指明IP数据字段中的数据采用上层什么协议封装的,常见的有ICMP(1)、IGMP(2)、TCP(6)、UDP(17)。
    • 首部校验和:填充根据IP头部计算得到的校验和码。计算方法是:对头部中每个16比特进行二进制反码求和,但不含涉及头部后的数据字段。
    • 源IP地址:数据包的源IP地址。
    • 目的IP地址:数据包的目的IP地址。
    • 数据:数据负载。
  • ICMP层:ICMP所有报文的前4个字节都是一样的,其它字段根据ICMP报文类型不同而不同。
    • 类型(type):ICMP报文类型,用于标识错误类型的差错报文或者查询类型的报告报文。
    • 代码(code):根据ICMP差错报文的类型,进一步分析错误的原因,代码值不同对应的错误也不同,例如:类型8、代码0表示回显请求(ping请求);类型0、代码0表示回显应答(ping应答);类型11、代码0代表超时。
    • 校验和(checksum):包括数据在内的整个ICMP数据包的检验和;其计算方法和IP头部检验和的计算方法一样的。
    • 标识符(Identifier):对于每一个发送的数据报进行标识。
    • 序列号(Sequence number):对于发送的每一个数据报文进行编号,发送的第一个数据报序列号为1,第二个序列号为2。
    • 数据:数据负载。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 UDP帧格式

UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。一个完整的UDP帧也包含MAC层和IP层的字段,UDP层包含的字段如下图所示,各字段含义如下:

  • 源端口号:由基于UDP应用程序的用户进程随机选择。
  • 目的端口号:接收者所用的端口号,一般由应用程序来指定。
  • UDP长度:标明UDP头部和UDP数据的总字节长度。
  • UDP校验和:用来对UDP头部和UDP数据进行校验。
  • 数据:数据负载。

在这里插入图片描述

2.4 TCP帧格式

TCP协议与UDP协议在同一层,一个完整的TCP帧也包含MAC层和IP层的字段。TCP是一种网络传输协议,它可以确保数据在网络中传输的可靠性。它使用可靠的传输机制来确保数据在网络中传输的完整性和可靠性。TCP层包含的字段如下图所示,每个字段的含义如下所述:

  • 源端口号:由基于UDP应用程序的用户进程随机选择。
  • 目的端口号:接收者所用的端口号,一般由应用程序来指定。
  • 序号:用来标识从TCP源端向TCP目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的序号。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数,序号是32bit的无符号数,序号达到 232-1 后又从0开始。比如我们收到一个数据报中序号为0,数据报内容为20字节,那么下一个数据报的序号就应该是21。当建立一个新的连接时,控制位中SYN标志变为1,序号字段包含由这个主机选择的该连接的初始顺序号ISN。
  • 确认序号:包含发送确认的一端所期待收到的下一个顺序号。因此,确认序号应该是上次已经成功收到数据字节顺序号加1 。比如我们收到的一个数据报的序号0 ,数据报内容为20字节,那么我们的确认序号应该是21,用来表明序号为0,内容为20字节的数据报已经收到,接下来期望收到的是序号为21的数据报。只有控制位中ACK标志为1时确认序号字段才有效。
  • 首部长度:给出报头中4个byte字的数目(没有“选项”字段时为4’d5),需要这个值是因为“选项”字段的长度是可变的,这个字段占4bit,即TCP最多有60(15*4)字节的首部。
  • 保留:保留给将来使用,目前必须置为0。
  • 控制位:控制位包括
    • URG:为1表示紧急指针有效,为0则忽略紧急指针值。
    • ACK:为1表示确认号有效,为0表示报文中不包含确认信息,忽略确认号字段。
    • PSH:为 1 表示是带有PUSH标志的数据,表示发送端缓存中已经没有待发送的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
    • RST:用于复位由于主机崩溃或其他原因而出现错误的连接。它还可以用于拒绝非法的报文段和拒绝连接请求。一般情况下,如果收到一个RST为1的报文,那么一定发生了某些问题。
    • SYN:同步序号,为1表示连接请求,用于建立连接和使序号同步。
    • FIN:用于释放连接,为1表示发送方已经没有数据发送了,即关闭本方数据流。
  • 窗口大小:表示从确认序号开始,本报文的源方可以接收的字节数,即源方接收窗口的大小。窗口大小是一个16bit字段,因而窗口大小最大为216-1 。
  • 校验和:对整个的TCP报文段(包括TCP头部和TCP数据以及伪报文头)进行校验和计算。这是一个强制性的字段,要求由发送方计算和存储,并由接收端进行验证(接收端要与发送端数值结果完全一样,才能证明数据是有效的)。
  • 紧急指针:是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式,只有当URG标志置为1时紧急指针才有效。
  • 选项:n*4字节,常见的可选字段是最长报文大小MSS(Maximum Segment Size)。每个连接方通常都在通信的第一个报文段 (为建立连接而设置 SYN 标志的那个段)中指明这个选项,它指明本端所能接收的最大长度的报文段。选项长度不一定是32位字的整数倍,所以需要添加填充位,使得报文长度为32位字的整数倍。
  • 数据:数据负载。

在这里插入图片描述
TCP可靠传输机制使用三次握手机制来确保数据的可靠传输。在三次握手机制中,客户端和服务器之间会发送三个报文段,以确认连接的建立。在第一次握手中,客户端发送一个SYN报文段,表示客户端准备建立连接。在第二次握手中,服务器会发送一个SYN/ACK报文段,表示服务器已经收到客户端的请求,并准备建立连接。在第三次握手中,客户端会发送一个ACK报文段,表示客户端已经收到服务器的确认,并准备建立连接。此外,TCP可靠传输机制还使用确认机制来确保数据的可靠传输。在确认机制中,每当客户端发送一个数据报文段,服务器都会发送一个ACK报文段,表示服务器已经收到客户端发送的数据报文段。如果客户端没有收到服务器发送的ACK报文段,客户端会重新发送数据报文段,直到收到服务器发送的ACK报文段为止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络基础知识和常用数据帧格式 的相关文章

  • 相机成像模型、内参矩阵、外参矩阵

    相机针孔成像模型 基本的小孔成像过程 xff1a X坐标系是针孔所在坐标系 xff0c Y坐标系为成像平面坐标系 xff0c P为空间一点 xff0c 小孔成像使得P点在图像平面上呈现了一个倒立的像 xff0c 俯视图如下 xff1a 由三
  • 韦东山学习笔记——UART(串口)的使用

    基于jz2440的串口使用 搬砖的文章概述UART的发送和接收串口之间的数据传输UART的用途串口的数据帧参数说明起始位数据位奇偶校验位停止位波特率 怎么发送一字节数据 xff0c 比如 A UART的优缺点优点缺点 UART相关配置寄存器
  • C++源文件的编译流程简介

    概述 C 43 43 C源文件 xff0c 包含 c h cpp hpp等格式的文件 xff0c 经过预处理 编译 汇编 链接后 xff0c 形成可执行文件 xff0c 也就是 exe文件 以一个简单项目MyProject为例 xff0c
  • 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系

    使用 sudo apt get install 安装软件时 xff0c 出现错误 无法修正错误 xff0c 因为您要求某些软件包保持现状 xff0c 就是它们破坏了软件包间的依赖关系 错误的主要原因是 xff0c 系统中已经安装了被依赖的包
  • kalibr工具的编译与安装

    安装 kalibr提供了两种安装使用的方法 一 直接使用打包好的程序 下载地址 xff0c 选择CDE packages下载 xff08 需要访问Google xff09 使用注意事项 xff1a 只有64位系统可以使用 二 源码编译 安装
  • TCP/IP协议栈协议头

    目录 OSI与TCP IP模型UDP发送数据过程以太网协议头IP协议头UDP协议头UDP包 OSI与TCP IP模型 UDP发送数据过程 以太网协议头 把上面的以太网头用一个结构体表示如下 xff1a span class token ma
  • VLAN标签

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是VLAN标签 我们知道 xff0c 以太网交换机根据MAC地址表来转发数据帧 MAC地址表中包含了端口和端口所连接终端主机MAC地址的
  • fastjson的一些用法

    一般情况下 xff0c 在进行redis集群写入时 xff0c 使用jedisCluster set key value value为String类型 xff0c 那么就用到了fastjson进行序列化 以下是一些要点 xff1a 1 序列
  • 【视觉SLAM十四讲】第12讲 回环检测

    12 1 回环检测概述 前面已经介绍过了前端和后端 xff0c 前端用于特征点的提取以及轨迹 地图的初始值 xff0c 而后端负责对这部分数据进行优化 考虑到误差的存在 xff0c 每一个时刻存在的误差会不断累积 xff0c 从而产生累积误
  • LVGL——PC模拟器仿真模拟+VS2017

    目录 LVGL介绍移植说明资源下载环境搭建编译运行 本文只针对当时的LVGL v7 xff0c LVGL迭代过程中变化较大 xff0c 部分接口有可能做调整 本文仅供参考 LVGL介绍 官网 xff1a https lvgl io 官方在线
  • LVGL 优化帧率技巧

    目录标题 前文未优化版本LVGL帧率限制刷屏方法效率代码优化等级编译器版本LVGL显存单buffer非全尺寸双buffer全尺寸双buffer 本文只针对当时的LVGL v7 xff0c LVGL迭代过程中变化较大 xff0c 部分接口有可
  • CMAKE 里PRIVATE、PUBLIC、INTERFACE属性示例详解

    闲扯 cmake 里面target include directories xff0c target link libraries这两个命令里面有三种属性PRIVATE PUBLIC INTERFACE cmake PRIVATE PUBL
  • C++11 返回值优化、移动语义及函数返回值构造的重载决议

    局部变量unique ptr能否作为返回值 记得自己之前在哪写过一篇返回值优化的博客 xff0c 翻了半天csdn xff0c 居然没找到 xff0c 也不知道写在哪了 被问到一个unique ptr 局部变量能不能做返回值的问题 xff0
  • C++ 面试八股分享

    一年半 xff0c 估计又要跳槽了 xff0c 本来还想再积累一两年的 xff0c 结果公司业务线调整 xff0c 同部门三四个同事n 43 1裁了 xff0c 我也要换工作内容 xff0c 现在在来这么一出 xff0c 就准备骑驴找马 x
  • c++ makefile + clangd 生成 compile_command.json

    补充vscode 43 clangd 开发 c c 43 43 一个项目用makefile管理 xff0c 工程很大 xff0c vscode的ms cpp tools代码跳转功能基本处于残废状态 xff0c 有想将makefile 迁移至
  • stm32 串口+DMA+环形FIFO缓存收发数据

    cos环境例程 freertos环境例程 重要几点 1 配置DMA xff0c 串口及环形buff之间的关系 xff1b 2 USART IT IDLE空闲中断接收完一帧数据 xff0c 处理环形buff入口指针 通知用户程序接收完一次数据
  • VScode 中 C或C++ 结构体提示,代码补全不准确的 解决方案

    1 找到项目工作区的 settings json文件 2 修改 C Cpp intelliSenseEngine Tag Parser 为 C Cpp intelliSenseEngine Default 解释 Tag Parser 提供非
  • C/C++ 避免重复定义

    加入宏定义 第一种 xff1a span class token macro property span class token directive keyword ifndef span STUDENT H span span class
  • vscode文件标签栏显示多行

    设置步骤 xff1a 按下 ctrl 43 shift 43 p xff0c 如下图 xff1a 输入 open workspace settings xff0c 打开工作区设置 输入 workbench editor wrapTabs x
  • ::在C++中的意思

    表示作用域 xff0c 和所属关系 class A int A test 表示test是属于A类的 关于 的具体解析 xff1a 是运算符中等级最高的 xff0c 它分为三种 1 global scope 全局作用域符 xff09 xff0

随机推荐

  • 【Linux问题解决】操作系统用C语言多线程编程 对‘pthread_create’未定义的引用 报错解决办法

    操作系统用C语言多线程编程 对 pthread create 未定义的引用 报错解决办法 今天写操作系统作业 在Ubuntu Linux系统中用C语言编写多线程程序 在命令行进行编译 没通过编译 报错如下 xff1a In file inc
  • linux 服务器执行post请求 curl命令详解

    什么是curl xff1f curl是一个命令行访问URL的计算机逻辑语言的工具 xff0c 发出网络请求 xff0c 然后得到数据并提取出 xff0c 显示在标准输出 stdout 上面 xff0c 可以用它来构造http request
  • open-falcon 监控cpu指标及含义

    user 30512019 从系统启动开始累计到当前时刻 xff0c 用户态的CPU时间 xff0c 不包含nice值为负进程 nice 2905 从系统启动开始累计到当前时刻 xff0c nice值为负的进程所占用的CPU时间 syste
  • [Unity] 串口读取数据错误 IOException: 拒绝访问。

    错误内容 IOException 拒绝访问 System IO Ports WinSerialStream ReportIOError System String optional arg at lt 14e3453b740b4bd690e
  • px4仿真无法起飞问题(Failsafe enabled: no datalink)

    报错信息 问题描述 xff1a 使用JMAVSim和gazebo仿真px4起飞时报错如下 xff1a WARN commander Failsafe enabled no datalink 说不安全 解决方法 打开QGC 就可以起飞了
  • TCP (传输控制协议)和 UDP

    传输控制协议 xff08 TCP xff0c Transmission Control Protocol xff09 是一种面向连接的 可靠的 基于字节流的传输层通信协议 是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输
  • 全网第一篇 Jetson AGX Xaiver + Jetpack5.0.2(Ubuntu20.04) + ROS2 + ORB-SLAM3 + ZED2

    本机系统 xff1a Jetpack5 0 2 Ubuntu 20 04 LTS 注意事项 xff1a 想要避坑 xff0c 务必按照文中版本准备各种环境 一 安装软件 1 Pangolin 0 5 网址 xff1a https githu
  • java中char转化为int的几种方法

    java中char转化为int的几种方法总结 方法一 xff1a 在char后面 0 span class token keyword public span span class token keyword class span span
  • 大疆 RoboMaster 3508/2006/GM6020 电机使用教程

    19年开始使用大疆的电机 xff0c 刚开始接触有很多东西不懂 xff0c 网上除了RM官网提供的一些资料外没有很多其他的资料 xff0c 现在使用大疆电机近一年了 xff0c 想分享一下自己的经验 1 硬件部分 1 C610电调只能连接M
  • DBC文件解析及CAN通信矩阵

    一般的 DBC 文件中包含了如下的8种信息 xff1a 1 版本与新符号 2 波特率定义 3 网络节点的定义 4 报文帧的定义 5 信号的定义 6 注解部分 7 特征部分 8 数值表部分 VERSOIN 34 34 版本信息 xff0c 为
  • 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图

    文章目录 前言一 ROS分布式通信 xff08 配置多机通信 xff09 1 简介2 步骤2 1 准备2 2 修改配置文件2 3配置主机IP2 4配置从机IP 二 RPlidar的使用教程1 创建环境2 下载激光雷达的功能包3 编译4 启动
  • TCP连接建立的步骤

    TCP连接建立的步骤 一 客户端向服务器端发送连接请求后 xff0c 就被动地等待服务器的响应 典型的TCP客户端要经过下面三步操作 xff1a 1 创建一个Socket实例 xff1a 构造函数向指定的远程主机和端口建立一个TCP连接 x
  • 能否在头文件中放置函数定义?

    语法上是可以这样做的 xff0c 但是在编程规范中并不鼓励这样做 成员函数一般是不可以在头文件中定义的 xff0c 只能在头文件中声明 因为函数只能有一次定义 xff0c 而可以有多次声明 xff0c 当头文件被多次包含的时候 xff0c
  • 万能的sprintf

    0 前言 先推荐一本书 xff0c 政治书籍 政治的人生 xff0c 算是一本日记题材 是现任 xff0c 作者大家百度一下就知道了 xff0c 这里不宜过多说明 从这本书里 xff0c 可以看出来现在的社会 这本书是30年前的 大佬就是大
  • 串口通讯UART/RS232/RS485/RS-422笔记

    串口通讯详解笔记 串口通讯概述串口通讯传输数据帧的结构UARTRS232RS485RS 422RS 232 RS 422和RS 485的主要区别 xff08 重要 xff09 串口通讯概述 串口通讯是指数据按位 xff08 bit xff0
  • Stm32 hal库 usart2与hc-08透传模块通讯

    Stm32 hal库 usart2与hc 08透传模块通讯 xff08 附数据解析 xff09 一 stm32cubeMX配置 1 配置RCC为外部晶振 2 配置时钟树 3 配置usart1 usart2 xff0c 其中usart1将作为
  • darknet分类网络,训练,C++调用分类器

    Darknet 分类器 出于对Darknet框架下YOLO结构的火热 xff0c 网络上一堆关于目标检测的C 43 43 调用形式和模板 xff0c 但是未曾存在C 43 43 调用分类器的模板 xff0c 故采用如下形式 xff0c 展开
  • zed2 win10 采集数据

    环境 xff1a win10 cuda10 2 zed2相机 zed sdk 3 7 python3 7 1 标定 参考的博客 2 配置环境 1 xff09 win10安装cuda cudnn 如何查看windows的cuda版本 win1
  • 链表指针赋值

    总结来说 xff0c 就是等号赋值右边的指针 xff08 节点地址 xff09 不变 xff0c 左边的地址变成右边的 即左边的指针移到右边指针的位置 xff08 PS 指针命名时不要用next xff0c 会搞混 xff09 span c
  • 网络基础知识和常用数据帧格式

    网络基础知识和常用数据帧格式 1 IP路由相关1 1 网络分层1 2 网络分段1 3 子网掩码1 4 网关功能1 5 数据路由 2 常用帧格式2 1 ARP帧格式2 2 ICMP帧格式2 3 UDP帧格式2 4 TCP帧格式 本文主要介绍网