分享

Ethernet/IP/UDP/TCP/HTTP 数据帧结构说明

 花信风zq 2023-08-15 发布于重庆

Ethernet/IP/UDP/TCP/HTTP 的帧结构

1  OSI 分层架构

OSI(Open Systems Interconnection)分层结构是计算机网络体系结构的一种标准化模型,将网络通信划分为七个不同的层级,每个层级负责不同的功能和任务。下面是对每个层级和常用协议的简要介绍:

l物理层(Physical Layer):负责定义物理介质和电信号传输。常用协议有Ethernet、Wi-Fi、Bluetooth。

l数据链路层(Data Link Layer):负责在物理链接上传输数据帧,提供可靠的数据传输和错误检测。常用协议有Ethernet(MAC层)、PPP、HDLC。

l网络层(Network Layer):负责在网络中选择路由和进行分组传输。常用协议有IP(Internet Protocol)、ICMP、ARP。

l传输层(Transport Layer):提供端到端的可靠数据传输和错误恢复。常用协议有TCP(Transmission Control Protocol)、UDP(User Datagram Protocol)。

l会话层(Session Layer):负责建立、管理和终止会话连接。常用协议有SSH、SIP。

l表示层(Presentation Layer):处理数据的表示和转换,确保数据的可靠传输。常用协议有TLS、JPEG、ASCII。

l应用层(Application Layer):提供网络服务和用户应用程序的接口。常用协议有HTTP、SMTP、FTP。

2  TCP/IP协议集

TCP/IP协议集是互联网通信中最常用的协议集合,它是基于TCP(Transmission Control Protocol)和IP(Internet Protocol)的一组通信协议。TCP/IP协议集定义了在计算机网络中数据如何在不同设备之间传输和交换。TCP | IP 协议集包括多种协议,如下图所示:

         图片

TCP/IP协议集包含以下几个主要协议:

IP(Internet Protocol):IP协议是互联网的核心协议,负责将数据包从源地址传输到目的地址,实现数据的分组和路由。

TCP(Transmission Control Protocol):TCP协议提供可靠的数据传输,确保数据在网络中按序到达目的地,并进行错误检测和重传。TCP建立了端到端的连接,适用于需要可靠数据传输的应用,如文件传输、网页浏览等。

UDP(User Datagram Protocol):UDP协议是一种无连接的传输协议,不提供可靠性和重传机制。它通过将数据包发送到目标地址来进行数据传输,适用于实时性要求高的应用,如实时音视频流传输、DNS等。

ICMP(Internet Control Message Protocol):ICMP协议用于在IP网络中发送错误报告和控制消息。它提供了网络的状态信息、错误检测和诊断工具,如ping命令就是基于ICMP协议实现的。

ARP(Address Resolution Protocol):ARP协议用于将IP地址解析为MAC地址,实现数据包在局域网中的传递。

除了以上核心协议外,TCP/IP协议集还包含其他众多的协议,如HTTP、FTP、SMTP等应用层协议,以及路由协议如OSPF、BGP等。

3  以太网帧结构

以太网帧遵守IEEE 802.3协议标准。以太网帧是在以太网中传输数据的基本单位,它定义了数据在物理介质上的格式和传输规则。

图片

以太网帧的结构说明如下:

1.前导码(Preamble):7个字节的前导码,用于数据传输过程中的双方发送、接收的速率的同步。

2.帧起始定界符(Start Frame Delimiter,SFD):1个字节的特殊定界符,标识帧的开始。

3.目标MAC地址(Destination MAC Address):6个字节的目标MAC地址,指示数据帧的接收方。

4.源MAC地址(Source MAC Address):6个字节的源MAC地址,指示数据帧的发送方。

5.长度/类型字段(Length/Type):2个字节的长度或类型字段,指示帧中有效数据的长度或指明上层协议类型,比如常见的IPv4中ip协议采用0x0800。

6.数据(Data):46到1500个字节的数据字段,包含要传输的实际数据。

7.帧校验序列(Frame Check Sequence,FCS):4个字节的循环冗余校验(CRC)值,用于检测帧是否在传输过程中发生错误。

以太网帧的总长度为最小64个字节(不包括Preamble和SFD)到最大1518个字节(不包括Preamble、SFD)。如果数据长度不足46个字节,将会用填充字节(Padding)补齐到最小长度。

4  IP帧结构

IP(Internet Protocol)协议的标准是由IETF(Internet Engineering Task Force)制定的。IP协议是在TCP/IP协议族中的网络层协议,负责在网络中传输数据包

图片

IP帧的结构说明如下:

1)版本(Version):4位字段,表示IP协议的版本号。通常为4(IPv4)或6(IPv6)。

2)首部长度(Header Length):4位字段,表示IP首部的长度,以32位字(4字节)为单位。最小值为5,表示20字节的首部长度。由于可选字段的存在,首部长度可以超过20字节。

3)服务类型(Differentiated Services):8位字段,用于指定数据包的优先级和服务质量要求。

4)总长度(Total Length):16位字段,指示整个IP数据包的长度,包括IP首部和数据部分。最大值为65535字节。

5)标识(Identification):16位字段,用于标识数据包的唯一性。在分片传输中,用于标识属于同一数据报的不同片段。

6)标志(Flags):3位字段,用于指示分片传输的状态。包括禁止分片(DF)、更多片(MF)和保留位。

7)分片偏移(Fragment Offset):13位字段,表示分片在原始数据报中的相对位置,以8字节为单位。

8)生存时间(Time to Live,TTL):8位字段,表示数据包在网络中可以经过的最大跳数,用于防止数据包在网络中无限循环。

9)协议(Protocol):8位字段,指示数据部分所使用的上层协议,例如TCP(6)、UDP(17)等。

10)首部校验和(Header Checksum):16位字段,用于检验IP首部的完整性。

11)源IP地址(Source IP Address):32位字段,指示数据包的源IP地址。

12)目标IP地址(Destination IP Address):32位字段,指示数据包的目标IP地址。

13)选项(Options):可选字段,用于提供额外的功能或控制。长度可变,最大可达40字节。

IP帧的首部长度是固定的20字节(不包括选项字段),但由于选项字段的存在,IP数据包的实际长度可能超过20字节。总长度字段指示了整个IP数据包的长度,包括首部和数据部分的字节数。

/*IP 头定义,共 20 个字节*/

typedef struct _IP_HEADER

{

    char m_cVersionAndHeaderLen;    //前4位:版本信息;后4位:头长度

    char m_cTypeOfService;          //服务类型 8 位

    short m_sTotalLenOfPacket;      //数据包长度

    short m_sPacketID;              //数据包标识

    short m_sSliceinfo;             //分片使用

    char m_cTTL;                    //存活时间

    char m_cTypeOfProtocol;         //协议类型

    short m_sCheckSum;              //校验和

    unsigned int m_uiSourIp;        //源IP

    unsigned int m_uiDestIp;        //目的IP

}__attribute__((packed))IP_HEADER,*PIP_HEADER;

5  UDP帧结构

UDP(User Datagram Protocol)遵守的协议标准是由IETF(Internet Engineering Task Force)制定的。UDP是一种无连接的传输层协议,用于在网络上发送数据报。

图片

UDP帧的结构说明如下:

(1)源端口号(Source Port):16位字段,表示发送端的端口号。

(2)目标端口号(Destination Port):16位字段,表示接收端的端口号。

(3)长度(Length):16位字段,指示UDP数据报的总长度,包括UDP首部和数据部分。

(4)校验和(Checksum):16位字段,用于检验UDP数据报的完整性。在IPv4中,校验和字段可以为0表示不进行校验,而在IPv6中则需要进行校验。

(5)数据(Data):变长字段,包含要传输的数据。

UDP帧的首部长度固定为8字节(64位),其中源端口号和目标端口号各占16位,长度字段和校验和字段各占16位。数据部分可以根据需要进行变长,根据长度字段指示的长度进行传输。

/*UDP 头定义,共 8 个字节*/

typedef struct_UDP_HEADER

{

    unsigned short m_usSourPort;     //源端口号 16 bit

    unsigned short m_usDestPort;     //目的端口号 16 bit

    unsigned short m_usLength;      //数据包长度 16 bit

    unsigned short m_usCheckSum;    //校验和 16 bit

}__attribute__((packed))UDP_HEADER,*PUDP_HEADER;

6  TCP帧结构

TCP(Transmission Control Protocol)遵守的标准是由IETF(Internet Engineering Task Force)制定的,具体的协议文档是RFC 793。

图片

TCP帧的结构如下:

1.源端口号(Source Port):16位字段,表示发送端的端口号。

2.目标端口号(Destination Port):16位字段,表示接收端的端口号。

3.序列号(Sequence Number):32位字段,用于标识TCP数据流中的字节序列。

4.确认号(Acknowledgment Number):32位字段,指示期望接收的下一个字节的序列号。

5.数据偏移(Data Offset):4位字段,表示TCP首部的长度,以4字节为单位。由于TCP首部中的选项字段是可选的,因此数据偏移字段用于指示首部的长度。

6.保留(Reserved):6位字段,保留供将来使用,目前设置为0。

7.控制标志(Flags):6位字段,用于指示TCP的不同控制标志,如SYN、ACK、FIN等。

URG:为 1 表示紧急指针有效,为 0 则忽略紧急指针值

ACK:为 1 表示确认号有效,为 0 表示报文中不包含确认信息,忽略确认号字段

PSH:为 1 表示是带有 PUSH 标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满

RST:用于复位由于主机崩溃或其他原因而出现错误的连接。它还可以用于拒绝非法的报文段和拒绝连接请求。一般情况下,如果收到一个 RST 为 1 的报文,那么一定发生了某些问题

SYN:同步序号,为 1 表示连接请求,用于建立连接和使顺序号同步( synchronize )

FIN:用于释放连接,为 1 表示发送方已经没有数据发送了,即关闭本方数据流

8.窗口大小(Window Size):16位字段,表示发送端可接收的字节数,用于流量控制。

9.校验和(Checksum):16位字段,用于检验TCP首部和数据的完整性。

10.紧急指针(Urgent Pointer):16位字段,仅当控制标志中的URG标志位被设置时才有效,用于指示紧急数据的结束位置。

11.选项(Options):变长字段,可选的TCP选项,如最大段大小(MSS)、窗口扩大因子等。

12.数据(Data):变长字段,包含要传输的数据。

TCP帧的首部长度是变长的,根据数据偏移字段指示的值计算得出,最小为20字节(160位),最大为60字节(480位),其中各字段长度如上述所示。数据部分根据需要进行变长,根据数据偏移字段和选项长度计算得出。

/*TCP 头定义,共 20 个字节*/

typedef struct_TCP_HEADER

{

    short m_sSourPort;                  //源端口号 16 bit

    short m_sDestPort;                  //目的端口号 16 bit

    unsigned int m_uiSeqNum;            //序列号 32 bit

    unsigned int m_uiAcknowledgeNum;    //确认号 32 bit

    short m_sHeaderLenAndFlag;          //前4位:TCP 头长度;中6位:保留;后6位:标志位

    short m_sWindowSize;                //窗口大小 16 bit

    short m_sCheckSum;                  //校验和 16 bit

    short m_surgentPointer;             //紧急数据偏移量 16 bit

}__attribute__((packed))TCP_HEADER,*PTCP_HEADER;

三次握手的过程:

1.客户端发送一个 SYN 报文段( SYN 为 1 )指明客户端打算连接的服务器的端口,以及初始顺序号( ISN ) (客户端----》服务端)

2.服务器发回包含服务器的初始顺序号( ISN )的 SYN 报文段( SYN 为 1 )作为应答。同时,将确认号设置为客户的 ISN 加 1 以对客户的 SYN 报文段进行确认( ACK 也为 1 )(服务端----》客户端)

3.客户端必须将确认号设置为服务器的 ISN 加 1 以对服务器的 SYN 报文段进行确认( ACK 为 1 ),该报文通知目的主机双方已完成连接建立(客户端----》服务端)

四次挥手的过程:

1.客户端发送一个FIN(FIN为1),用来关闭客户端到服务器的数据传送 (客户端----》服务端)

2.服务器收到这个FIN,它发回一个ACK(ACK为1),确认序号为收到的序号加1 (服务端----》客户端)

3.服务器关闭与客户端的连接,发送一个FIN给客户端 (服务端----》客户端)

4.客户端发回ACK报文确认,并将确认序号设置为收到序号加1 (客户端----》服务端)

7  HTTP

HTTP(Hypertext Transfer Protocol)是一种应用层协议,用于在客户端和服务器之间传输超文本资源。它是Web通信的基础,常用于浏览器和Web服务器之间的通信。

HTTP的工作原理如下:

A.客户端发起请求:客户端(通常是浏览器)向服务器发起HTTP请求。请求包括请求方法(如GET、POST)、请求URL、协议版本以及可选的请求头部。

B.服务器响应请求:服务器接收到请求后,进行处理,并生成响应。响应包括协议版本、状态码、响应头部和响应体。常见的状态码包括200(成功)、404(未找到)等。

C.客户端接收响应:客户端接收服务器的响应,并根据响应的内容进行处理。例如,浏览器可以将响应的HTML内容解析并显示在页面上。

HTTP协议具有以下特点:

a.无连接:HTTP协议是无连接的,即每次请求都是独立的,服务器不会保留客户端的连接状态。这意味着每次请求都需要建立连接、传输数据和断开连接,会增加一定的开销。

b.无状态:HTTP协议是无状态的,服务器不会保存客户端的状态信息。每个请求都是独立的,服务器无法识别两个请求是否来自同一客户端。

c.基于请求-响应模型:HTTP协议基于请求-响应模型,客户端发起请求,服务器返回响应。请求中包含客户端需要的资源信息,响应中包含服务器返回的资源内容。

d.支持多种媒体类型:HTTP协议支持多种媒体类型的传输,如文本、图像、音频、视频等。通过在请求头部中指定合适的Content-Type,服务器可以返回相应的媒体类型数据。

e.可扩展性:HTTP协议是可扩展的,通过添加自定义的请求头部和响应头部,可以实现额外的功能和约定。

HTTP协议的常见应用场景包括浏览器访问网页、发送HTTP请求获取API数据、上传文件等。它是构建Web应用和进行Web通信的基础协议。

7.1 HTTP 请求报文

图片

 1. 请求行:

请求行包括请求方法、URL、协议版本,它们之间用空格分隔(所以我们输入的 URL 是不允许带有空格),且都不定长度。

请求方法:常用的 POST (将表单数据存入请求体里面,多数用于上传数据),GET(将请求参数都放置在 URL ? 后,参数之间用 & 连接,用于获取数据),HEAD (服务端只返回响应头,所以处理响应速度快,用于检测请求是否可用)。

2. 请求头

每一行以键值对的形式写入,键值间用 :分割,多个值之间以 ;分割,每行以回车符换行符结束。常见的键有:User-Agent:产生请求的浏览器类型;Accept:客户端可识别的内容类型列表;Host:请求的主机名,允许多个域名同处一个 IP 地址;Range:指定请求实体的一个或者多个子范围,采用多线程下载时可以设置该键。要注意请求头与请求体间有一个空行,它表示通知服务端没有更多请求头了,下面的都是请求体。

3. 请求体

请求数据不在 GET 方法中使用,而是在 POST 方法中使用,POST 方法适用于需要客户填写表单的场合。

7.2 响应报文

图片

1. 状态行:

状态行包括协议版本,状态码,状态码描述,常见的一个状态行的例子是(HTTP/1.1 200 OK),其中 200 表示请求正常状态码中的第一个数字定义了相应的类别,第一个数字可以取如下所示的 5 个不同的值之一,含义如下。

1XX:信息响应类,表示接收到请求并且继续处理。

2XX:请求处理成功的响应类,表示请求被成功接收和处理,如 HTTP 200 (表示一切正常)。

3XX:重定向响应类,为了完成指定的请求动作,必须接受进一步的请求处理。

4XX:客户端错误,客户请求包含语法错误或者不能正确执行,如 HTTP 400 (表示请求无效)。

5XX:服务端错误,服务器不能正常执行一个正确的 HTTP 请求,如 HTTP 500 (服务器内部出现错误)。

2. 响应头:

与请求头类似,通过键值对的形式向客户端传递关键消息,常见的有:Content-Type:用于向接收方指示实体的介质类型;Content-Range:用于向接收方指示实体的传送范围;Content-Length:用于向接收方指示实体的传送长度;Date:传送系统的日期与时间。

3. 响应体:

服务端真正返回的文本数据,如果客户端请求一个网页的话,该数据段将填充请求的 html 文本。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多