传输层及其以下的机制由内核提供,是操作系统的一部分,应⽤层由⽤户进程提供应⽤层数据通过协议栈发到⽹络上时,每层协议都要加上⼀个数据⾸部(header),称为封装。不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在⽹络层叫做数据报(datagram),在链路层叫做帧(frame)。

1、以太网帧格式

♦源地址和⽬的地址是指⽹卡的硬件地址(也叫MAC地址),长度是48位,是在⽹卡出⼚时固化的。Linux下可以⽤ifconfig命令看⼀下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。

♦ 帧协议类型字段有三种值,分别对应IP、 ARP、 RARP。

♦ 帧末尾是CRC校验码。

♦数据长度规定最⼩46字节,最⼤1500字节,ARP和RARP数据包的长度不够46 字节,要在后⾯补填充位。

称为以太⽹的最⼤传输单元(MTU),不同的⽹络类型有不同的MTU,如果⼀个数据包从以太⽹路由到拨号链路上,数据包长度⼤于拨号链路的MTU了,则需要对数据包进⾏分⽚。 ifconfig命令的输出中也有“MTU:1500”。注 意,MTU这 个概念指数据帧中有效载荷的最⼤长度,不包括帧⾸部的长度。

2、IP数据报格式(这⾥讨论IPv4)

♦4 位版本号指定 IP 协议的版本。对 IPv4 来说,其值是 4;

♦4 位头部长度标识该 IP 头部有多少个 32 bit字(4 字节 ),最⼩值为5,也就是说⾸部长度最⼩是4x5=20字节, 也就是不带任何选项的IP⾸部,4位能表⽰的最⼤值是15,也就是说⾸部长度最⼤是60字 节。

♦8位TOS字段有3个位⽤来指定IP数据报的优先级(⽬前已经废弃不⽤),还有4个位表⽰可选的服务类型(最⼩延迟、最⼤呑吐量、最⼤可靠性、最⼩成本),还有⼀个位总 是0。

♦16位总长度是整个数据报(包括IP⾸部和IP层payload)的字节数,以字节为单位,因 此 IP 数据报的最大长度为 65535 (2,6-1 ) 字节。但由于MTU的限制, 长度超过 MTU的数据报都将被分片传输,所以实际传输的 IP 数据报 (或分片)的长度都远远没有达到最大值。

♦16位标识唯一地标识主机发送的每一个数据报。初始值由系统随机生成 :每发送一个数据报,其值就加 1。该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。

♦3 位标志字段的第一位保留。第二位表 示“ 禁止分片”。如果设S 了这个位,IP 模块将不对数据报进行分片。在这种情况下,如 果 1P数据报 K 度 超 过 MTU的话, IP 模块将丢弃该数据报并返回一个丨CMP差错报文 。第 三 位及 示 “ 更多分片 ”。除了数据报的最后一个分片外,其他分片都要把它置1。

♦13位分片偏移是分片相对原始丨P 数据报开始处 (仅指数据部分 )的偏移。实际的偏移值是该值左移 3 位(乘 8 ) 后得到的。由于这个原因,除了最后一个丨P 分片外,每 个 IP 分片的数据部分的长度必须垃8 的整数倍 (这样才能保证后面的 1P分片拥有一个合适的偏移侦)。

♦8 位生存时间 (Time To Live, T T L) 是数据报到达目的地之前允许经过的路rfl器跳数。TTL值被发送端设置 (常见的值记 64)。数据报在转发过程中每经过一个路由,该值就被路由器减 1。当 TTL值减为 0 时 ,路由器将丢弃数据报,并向源端发送一个 ICMP 差错报文aTTL值可以防止数据报陷入路由循环。

♦8 位协议用来区分上层协议,/etc/prmocols 文件定义了所有上层协议对应的 protocol字段的数值。其中 ICMP是 1,TCP是 6, UDP是 17。 /etc/
protocols文件是 RFC 1700的一个子集。

♦16位头部校验和由发送端填充,接收端对其使用 CRC 算法以检验IP 数据报头部(注意,仅检验头部)在传输过程中是否损坏。

♦32位的源端 IP 地址和目的端 IP 地址用来标识数据报的发送端和接收端 。—般情况下,这两个地址在整个数据报的传递过程中保持不变,而不论它中间经过多少个中转路由器。♦选项字段是可变长的可选信息 。这部分最多包含40字节 ,因为丨P头部最长是 60 字节(其中还包含前面讨论的 20 字节的同定部分)。可用的 IP 选项包括:记录路由、时间戳、松散路由源路由选择、严格源路由选择。

3、 UDP的段格式

4、分析⼀帧基于UDP的TFTP协议帧

以太⽹⾸部

0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00

分析:目的MAC地址:00:05:5d:67:d0:b1;源MAC地址:00 05 5d 61 58 a8;上层协议类型:0x0800表⽰IP。

IP ⾸部
0000: 45 00
0010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a8 0020: 00 01

分析: 4位版本号:4,即IPv4;4位⾸部长度:5,说 明IP⾸部不带有选项字段;8位服务类型:0,没有使⽤服务; 16位总长度字段:(包括IP⾸部和IP层payload的长度)0x0053,即83字节,加上以太⽹⾸部14字节可知整个帧长度是97字;IP报标识:0x9325;标志字段与⽚偏移字段:0x0000,就是DF=0允许分⽚,MF=0此数据报没有更多分⽚,没有分⽚偏移; TTL:0x80,也就是12;上层协议:0x11表⽰UDP协议; IP ⾸部校验和:0x25ec;源主机IP:c0 a8 00 37(192.168.0.55),⽬的主机IP:c0 a8 00 01(192.168.0.1)。

UDP⾸部
0020: 05 d4 00 45 00 3f ac 40

分析:16位源端口号:0x05d4(1492)是客户端的端口号;⽬的端口号:0x0045(69)是TFTP服务的well-known端口号;16位UDP长度: 0x003f,即63字节,包括UDP⾸部和UDP层payload的长度;UDP⾸部和UDP层payload的校验和:0xac40。

TFTP协议
0020:
0030:
'w''e''r''q''.''q''w''e'00 'n''e''t''a''s''c''i' 0040: 'i'00
'b''l''k''s''i''z''e'00 '5''1''2'00 't''i' 0050:
'm''e''o''u''t'00'1''0'00 't''s''i''z''e'00 '0' 0060: 00

TFTP:基于⽂本的协议,各字段之间⽤字节0分隔,开头的 00 01 表⽰请求读取⼀个⽂件,接下来的各字段是:c:\qwerq.qwe netascii blksize 512 timeout 10 tsize 0

⼀般的⽹络通信方式:客户端主动发起 请求,⽽服务器被动地等待、接收和应答请求。

5、TCP段格式

♦源端口(16位):标识发送报文的计算机端口或进程。一个 TCP 报文段必须包括源端口号,使目的主机知道应该向何处发送确认报文。

♦目的端口(16位):标识接收报文的目的主机的端口或进程。

♦序号(也叫序列号)(32位):用于标识每个报文段,使目的主机可确认已收到指定报文段中的数据。当源主机用于多个报文段发送一个报文时,即使这些报文到达目的主机的顺序不一样。在 SYN 标志未置位时,该字段指示了用户数据区中第一个字节的序号;在
SYN 标志置位时,该字段指示的是初始发送的序列号。

  在建立连接时发送的第一个报文段中,双方都提供一个初始序列号。TCP 标准推荐使用以 4ms 间隔递增 1 的计数器值作为这个初始序列号的值。使用计数器可以防止连接关闭再重新连接时出现相同的序列号。对于那些包含数据的报文段,报文段中第一个数据字节的数量就是初始序列号,其后数据字节按顺序编号。如果源主机使用同样的连接发送另一个报文段,那么这个报文段的序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。    如果序列号增大至最大值将复位为 0。

♦确认号(32位):目的主机返回确认号,使源主机知道某个或几个报文段已被接收。

  例如,序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主 机发送 3 个报文段,每个报文段有 100 字节的数据,且第一个报文段的序列号是 1000,那么接收到第一个报文段后,目的主机返回含确认号1100 的报头。接收到第二个报文段(其序号为 1100 )后,目的主机返回确认号 1200。接收到第三个报文段后,目的主机返回确认号 1300 。目的主机不一定在每次接收到报文段后都返回确认号。在上面的例子中,目的主机可能等到所有 3 个报文段都收到后,再返回一个含确认号 1300 的报文段,表示已接收到全部 1200 字节的数据。但是如果目的主机再发回确认号之前等待时间过长,源主机会认为数据没有到达目的主机,并自动重发。上面的例子中,如果目的主机接收到了报文段号为 1000 的第一个报文段以及报文段号为 1200 的最后一个报文段,则可返回确认号 1100,但是再返回确认号 1300 之前,应该等待报文段号为 1100 的中间报文段。

  ♦数据偏移(首部长度)(4位)

♦保留位(6位):由跟在数据偏移字段后的 6 位构成, 全部为 0 。

♦控制位(6位)

♦窗口(16位):此字段用来进行流量控制,这个值是本机期望一次接收的字节数,即发送数据的窗口大小。告诉对方在不等待确认的情况下,可以发来多大的数据。这里表示的最大长度是2^16 - 1 = 65535,如需要使用更大的窗口大小,需要使用选项中的窗口扩大因子选项。指发送本报文段的一方的接收窗口(而不是自己的发送窗口)。

♦校验和(16位):源主机和目的主机根据 TCP 报文段以及伪报头的内容计算校验和。在伪报头中存放着来自 IP 报头以及 TCP 报文段长度信息。与 UDP 一样,伪报头并不在网络中传输,并且在校验和中包含伪报头的目的是为了防止目的主机错误地接收存在路由的错误数据报。

伪首部,
又称为伪包头(Pseudo Header):是指在 TCP 的分段或 UDP 的数据报格式中,在数据报首部前面增加源 IP 地址、目的 IP
地址、IP 分组的协议字段、TCP 或 UDP
数据报的总长度等共12字节,所构成的扩展首部结构。此伪首部是一个临时的结构,它既不向上也不向下传递,仅仅只是为了保证可以校验套接字的正确性。

UDP的首部结构和TCP的伪首部相同,只不过TCP中协议字段为6。

♦紧急指针(16位):仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),即指出了紧急数据的末尾在报文中的位置,注意:即使窗口为零时也可发送紧急数据。如果 URG 为 1 ,则紧急指针标志着紧急数据的结束。其值是紧急数据最后 1 字节的序号,表示报文段序号的偏移量。例如,如果报文段的序号是 1000,前 8 个字节都是紧急数据,那么紧急指针就是 8 。紧急指针一般用途是使用户可中止进程。

♦选项、填充字段:可能包括“窗口扩大因子”、“时间戳”等选项。长度可变,最长可达 40 字节,当没有使用选项时,TCP 首部长度是 20 字节。填充用于保证任选项为 32bit 的整数倍。

♦数据(长度可变):TCP 首部结束之后的部分

以太网帧、TCP与UDP段以及IP数据报格式总结的更多相关文章

  1. 以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解

    转载:http://www.cnblogs.com/lifan3a/articles/6649970.html 以太网帧格式.IP数据报格式.TCP段格式+UDP段格式 详解   1.ISO开放系统有 ...

  2. IP数据报格式和IP地址路由

    一.IP数据报格式 IP数据报格式如下: 注:需要注意的是网络数据包以大端字节序传输,当然头部也得是大端字节序,也就是说: The most significant bit is numbered 0 ...

  3. 计算机网络(3)-----IP数据报格式

    IP数据报(IP Datagram) 格式 解析 (1)版本 占4位,指IP协议的版本.通信双方使用的IP协议版本必须一致.目前广泛使用的IP协议版本号为4(即IPv4). (2)首部长度 占4位,可 ...

  4. IP数据报格式 及路由转发算法

    ip数据报分首部和数据两部分组成: 首部分为固定部分和可变部分 版本--占 4 位,指 IP 协议的版本 目前的 IP 协议版本号为 4 (即 IPv4) 首部长度--占 4 位,可表示的最大数值 是 ...

  5. IP数据报格式 及分组转发算法

    ip数据报分首部和数据两部分组成: 首部分为固定部分和可变部分 版本——占 4 位,指 IP 协议的版本 目前的 IP 协议版本号为 4 (即 IPv4) 首部长度——占 4 位,可表示的最大数值 是 ...

  6. 【面试】IP数据报格式分析

    (除选项外的报头区总共20个字节) 1)版本:IPV4/IPV6 2)头长度:报头区长度,用于计算数据区的开始位置,比如头长度为6,代表报头区长度为6*4个字节,头长度的单位为4字节,所以报头区长度不 ...

  7. 以太网帧,IP,TCP,UDP首部结构

    1.以太网帧的格式 以太网封装格式 2.IP报头格式 IP是TCP/IP协议簇中最为重要的协议.所有的TCP,UDP, ICMP和IGMP数据都以IP数据报格式传输.IP提供的是不可靠.无连接的协议. ...

  8. 计算机网络-数据结构-MAC帧头-IP头-TCP头-UDP头

    第0章 数据是如何进行一步步的封装的 第一章:mac帧头定义 帧头数据结构的定义: 一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/ typedef struct _MAC_FRAME ...

  9. TCP,UDP,IP包头格式及说明(zz)

    一.MAC帧头定义 /数据帧定义,头14个字节,尾4个字节/ typedef struct _MAC_FRAME_HEADER { ]; //目的mac地址 ]; //源mac地址 short m_c ...

随机推荐

  1. 使用react-router setRouteLeaveHook的钩子函数

    今天在使用react-router setRouteLeaveHook的钩子函数,不知道怎么实验就是成功.最后功夫不负有心人,终于让我找到使用setRouteLeaveHook的方法了 1.我在网络上 ...

  2. JavaScript函数部分

    函数部分学习:+parseInt(): -parseInt()函数将其收到的任何输入值(通常是字符串)转换成整数类型输出,如果转换失败就返回NaN. -parseInt(“参数”,第二参数基数):没有 ...

  3. Object-C知识点 (四) 性能优化

    #pragma mark - 性能优化 1. 行高一定要缓存 缓存行高是解决性能优化的最佳途径(除非刷新频率已经很高了,否则一定要缓存)2. 尽量减少计算,所有需要素材提前计算好3. 控件不要设置圆角 ...

  4. SQL Server 文件结构 与 全局变量,函数

    SQL Server 文件结构与全局变量 数据库和表 文件类型 主数据文件 .mdf 次要数据文件 .ndf 日志文件 .ldf 系统数据库 master 数据库 记录所有的登陆账户和系统配置设置 记 ...

  5. springmvc 前端 发ajax请求的几种方式

    一.传json单值或对象 1.前端 var data = {'id':id,'name':name}; $.ajax({ type:"POST", url:"user/s ...

  6. 集群之mysql主从配置(windows和linux版)

    起因 由于网站进一步开发运行的需求,要求主机7*24小时运行正常,同时要求能够防止数据库灾难.考虑到后期的开发程度和业务量,准备向高可用系统进行改变,同时通过负载均衡提高网络性能.于是第一步就考虑到了 ...

  7. jvm005 从jvm的角度谈谈线程的实现

    一.线程的实现 在谈谈线程之前,我们要先知道线程是何物?在学习操作系统时,我们得知进程和线程的概念,接下来我们将开始揭示线程. 什么是进程?通过任务管理器我们就看到了进程的存在.而通过观察,我们发现只 ...

  8. JVM学习(1)——通过实例总结Java虚拟机的运行机制-转载http://www.cnblogs.com/kubixuesheng/p/5199200.html

    JVM系类的文章全部转载自:http://www.cnblogs.com/kubixuesheng/p/5199200.html 特别在此声明.那位博主写的真的很好 ,感谢!! 俗话说,自己写的代码, ...

  9. GIT - 代码管理工具之命令集

    GIT 是一个快速.可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问.它会把你的每次提交的文件的全部内容都会记录下来. GIT特点 速度 简单的设计 对非线性开发 ...

  10. Jmeter使用代理服务器录制脚本

    Mark一下Jmeter使用代理服务器录制脚本,以备自己可以翻阅,也可以帮助其他人了解一下Jmeter的这个功能.其实录制脚本只是在我们工作中的一个小插曲而已,只是为了能快速看到应用程序跑的逻辑及实现 ...