TCP,UDP,IP数据包格式详解

前言:TCP/UDP为传输层,IP/ICMP为网络层。

(1)应用层:DNS(基于UDP)、ping(基于ICMP)、telnet(TCP)
注:应用层负责梳理应用程序的逻辑。
(2)传输层:TCP、UDP
注:传输层为两台主机上的应用程序提供端到端(end to end)的通信。传输层只关心通信的起始端和目的端,而不在乎数据包中转的过程。
(3)网络层:IP、ICMP(IP的重要补充:1)回应网络错误2)查询网络信息)
注:网络层实现数据包的路由和转发,强调的是逐跳的中转。通常数据包不能直接发送给目标主机,IP协议做的就是为他寻找合适的下一跳。
(4)数据链路层:以太网、ARP、RARP
注:实现了网卡接口的网络驱动程序,处理数据在物理媒介上的传输;驱动隐藏不同物理硬件的电气特性,为上层提供统一接口。

一、TCP:

2字节源端口号 + 2字节目标端口号 

4字节序列号

4字节确认应答号

4bits数据偏移+6bits保留位+6bits控制位  +  2字节窗口大小

2字节校验和 + 2字节紧急指针 

包头累计20字节。

二、UDP:

2字节(16位)源端口号

2字节(16位)目标端口号

2字节(16位)包长度

2字节(16位)校验和  2^16=65536字节。

包头累计8字节。

注:实际上udp协议的收包长度上限大概也就是这个65536在减去各环节的包头长度,大概在6k多。实际测试下来也确实如此。

使用303203.py脚本工具通过udp发送请求,并接受回包数据。测试结果是拉取24条是能成功返回的,此时数据长度如下。

 但是尝试拉取25条就不行了。具体表现就是迟迟收不到回包相应。

三、IP:

        在 TCP/IP 协议中,使用 IP 协议传输数据的包被称为 IP 数据包,每个数据包都包含 IP 协议规定的内容。IP 协议规定的这些内容被称为 IP 数据报文(IP Datagram)或者 IP 数据报

IP 数据报文由首部(称为报头)和数据两部分组成。首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。

每个 IP 数据报都以一个 IP 报头开始。源计算机构造这个 IP 报头,而目的计算机利用 IP 报头中封装的信息处理数据。IP 报头中包含大量的信息,如源 IP 地址、目的 IP 地址、数据报长度、IP 版本号等。每个信息都被称为一个字段。

IP 数据报头字段如图所示。

IP数据报格式示意图


IP 报头的最小长度为 20 字节,上图中每个字段的含义如下:

1) 版本(version)

占 4 位,表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。目前广泛使用的IP协议版本号为 4,即 IPv4。

2) 首部长度(网际报头长度IHL)

占 4 位,可表示的最大十进制数值是 15。这个字段所表示数的单位是 32 位字长(1 个 32 位字长是 4 字节)。因此,当 IP 的首部长度为 1111 时(即十进制的 15),首部长度就达到 60 字节。当 IP 分组的首部长度不是 4 字节的整数倍时,必须利用最后的填充字段加以填充。

数据部分永远在 4 字节的整数倍开始,这样在实现 IP 协议时较为方便。首部长度限制为 60 字节的缺点是,长度有时可能不够用,之所以限制长度为 60 字节,是希望用户尽量减少开销。最常用的首部长度就是 20 字节(即首部长度为 0101),这时不使用任何选项。

3) 区分服务(tos)

也被称为服务类型,占 8 位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998 年 IETF 把这个字段改名为区分服务(Differentiated Services,DS)。只有在使用区分服务时,这个字段才起作用。

4) 总长度(totlen)

首部和数据之和,单位为字节。总长度字段为 16 位,因此数据报的最大长度为 2^16-1=65535 字节。

5) 标识(identification)

用来标识数据报,占 16 位。IP 协议在存储器中维持一个计数器。每产生一个数据报,计数器就加 1,并将此值赋给标识字段。当数据报的长度超过网络的 MTU,而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报。

6) 标志(flag)

占 3 位。第一位未使用,其值为 0。第二位称为 DF(不分片),表示是否允许分片。取值为 0 时,表示允许分片;取值为 1 时,表示不允许分片。第三位称为 MF(更多分片),表示是否还有分片正在传输,设置为 0 时,表示没有更多分片需要发送,或数据报没有分片。

7) 片偏移(offsetfrag)

占 13 位。当报文被分片后,该字段标记该分片在原报文中的相对位置。片偏移以 8 个字节为偏移单位。所以,除了最后一个分片,其他分片的偏移值都是 8 字节(64 位)的整数倍。

8) 生存时间(TTL)

表示数据报在网络中的寿命,占 8 位。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。

路由器在转发数据报之前,先把 TTL 值减 1。若 TTL 值减少到 0,则丢弃这个数据报,不再转发。因此,TTL 指明数据报在网络中最多可经过多少个路由器。TTL 的最大数值为 255。若把 TTL 的初始值设为 1,则表示这个数据报只能在本局域网中传送。 

9) 协议

表示该数据报文所携带的数据所使用的协议类型,占 8 位。该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。

例如,TCP 的协议号为 6,UDP 的协议号为 17,ICMP 的协议号为 1。

10) 首部检验和(checksum)

用于校验数据报的首部,占 16 位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。

11) 源地址

表示数据报的源 IP 地址,占 32 位。

12) 目的地址

表示数据报的目的 IP 地址,占 32 位。该字段用于校验发送是否正确。

13) 可选字段

该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。

14) 填充

由于可选字段中的长度不是固定的,使用若干个 0 填充该字段,可以保证整个报头的长度是 32 位的整数倍。

15) 数据部分

表示传输层的数据,如保存 TCP、UDP、ICMP 或 IGMP 的数据。数据部分的长度不固定。

猜你喜欢

转载自blog.csdn.net/mijichui2153/article/details/121224783