网络中TCP、IP、MAC、UDP的头部格式信息

  • Post author:
  • Post category:其他




1 计算机网络

计算机网络体系结构:

在这里插入图片描述

现在多是参考(c)五层协议。



2 UDP/TCP、IP、MAC报文协议格式



2.1 数据链路层(MAC层)

以太网V2的MAC帧格式:
在这里插入图片描述

类型:2字节,指出数据域中携带的数据应交给哪些协议实体处理

校验码:校验数据段(采用32位CRC冗余校验方式进行校验)

MAC帧头部结构体定义:

// u_char:	1字节,8位
// u_short:	2字节,16位
// u_int:	4字节,32位 
// 以太网帧数据头部 - 固定 14 个字节
typedef struct ethernet_header
{
	u_char	dest_mac[6];	// 目的地址(MAC地址)
	u_char	src_mac[6];		// 源地址(MAC地址)
	u_short	type;// 类型字段,用来标志上一层使用的协议,以便把MAC帧数据交给上一层的这个协议(IP:0x0800; )
}ETHERNET_HEADER;



2.2 网络层

IP数据包的格式:

在这里插入图片描述

版本:IP协议版本,这里为4

首部长度:占4位

总长度:占16位,指首部和数据之和的长度

标识:占16位,它是一个计数器,每产生一个数据报就加1

标志:占3位,标志字段的最低位为MF,MF=1表示后面还有分片;MF=0表示最后一个分片。标识字段中间的一位是DF,只有DF=0时才允许分片

片偏移:占13位,它指出较长的分组在分片后,某片在原分组中的相对位置,片偏移一8个字节为偏移单位

首部校验和:占16位,只校验分组的首部,而不校验数据部分

生存时间TTL:占8位,及数据报在网络中通过的路由器数的最大值

协议:占8位,指出使用何种协议,其中6表示TCP,17表示UDP

固定部分20个字节,可变部分40字节,首部最长60字节。

首部长度的单位为32位字(4 bytes),所以需要 *4 计算有多少个字节长度。

总长度的单位为字节。

IP数据包头部结构体定义:

// 网络层 IP数据包 首部 - 固定 20 个字节
typedef struct ip_header
{
	u_char		ver_ihl;// 版本(4 bits)+首部长度(4 bits), 首部长度单位是32位字,所以需要 *4 计算有多少个字节
	u_char		tos;// 区分服务(Type of Service, 8 bits)
	u_short		tlen;// 总长(Total Length, 16 bits),=首部长度+数据长度,最大为65535字节(2^16-1)
	u_short		identify;// 标识(Identify, 16 bits),IP软件在存储器中维持的一个计数器,每产生一个数据包,计数器就加1(不是序号)
	u_short		flags_fo;// 标志位(Flags 3 bits)+段偏移量(Fragment offset 13 bits)
	u_char		ttl;// 存活时间(Time to Live, 8 bits)
	u_char		proto;// 协议(Protocol, 8 bits),指出此数据报携带的数据是何种协议,以便目的主机IP层知道应将数据交由哪个协议进行处理
	u_short		crc;// 首部校验和(Header checkSum, 16 bits)
	u_long		src_addr;// 源地址(Source Address, 32 bits)
	u_long		des_addr;// 目的地址(Destination Address, 32 bits)
	//u_int		op_pad;	// 选项与填充(Option * Padding, 32 bits)
}IP_HEADER;



2.3 传输层

传输层主要有UDP协议以及TCP协议。



UDP协议

UDP时面向报文的:

在这里插入图片描述
UDP用户数据的首部格式

在这里插入图片描述
长度:UDP用户数据报的长度(首部 + 数据部分),单位为字节。

长度:UDP数据报长度,其最小值是8

校验和:检测UDP数据报在传输中是否出错,有错就丢弃,如果字段全为0,表明不校验。

UDP数据包头部结构体定义:

// 传输层 UDP数据包 首部 - 固定首部 8 个字节
typedef struct udp_header
{
	u_short	src_port;	// 源端口(Source Port, 16 bits)
	u_short	des_port;	// 目的端口(Destination Port, 16 bits)
	u_short	len;		// UDP数据包长度(Datagram Length, UDP用户数据包的长度,单位为字节)
	u_short	crc;		// 校验和(CheckSum, 16 bits)
}UDP_HEADER;



TCP协议

TCP报文段的首部格式:

在这里插入图片描述
需要注意的是,“数据偏移”实际上就是TCP报文首部的长度,单位为 32位字(4 bytes)

序号字段:占4个字节,TCP是面向字节流的

确认号字段:占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。确认号=N,则表明到序号N-1为止的所有数据都已经收到

数据偏移:占4位,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远

保留字段:占6位

标志位:

URG:URG=1时,表明紧急指针有效

ACK:ACK=1时,确认号字段(TCP三次握手里面的ack)才有效

PSH:就收到PSH=1的报文时,就尽快地交付接收应用进程,不用等到整个缓存都填满了后再向上交付

RST:当RST=1时,表明TCP连接中出了很严重的差错,必须释放连接,然后在重新建立连接

SYN:SYN=1、ACK=0,表明这是一个连接请求报文,对方若同意建立连接,则在响应报文中使用SYN=1、ACK=1

FIN:用来释放一个连接,FIN=1表明此报文段的发送方数据已经传送完毕

窗口字段:占2字节,它指出了现在允许对方发送的数据量

检验和:占2字节,检验范围包括首部和数据这两部分

紧急指针字段:占16位,指出文本中紧急数据共有多少字节

选项字段:长度可变

填充字段:为了使整个首部长度4字节的整数倍

TCP数据包头部结构体定义:

// 传输层 TCP数据包 首部 - 固定首部 20 个字节
typedef struct tcp_header
{
	u_short	src_port;// 源端口(2 bytes = 16 bits)
	u_short	des_port;// 目的端口(2 bytes = 16 bits)
	u_int	seq_num;// 序号(4 bytes = 32 bits)
	u_int	ack_num;// 确认号(4 bytes = 32 bits)
	u_short	hl_resv;// 首部长度(4 bits)+保留(6 bits)+ URG + ACK + PSH + RST + SYN + FIN(各 1 bit)
	u_short	wind;// 窗口(2 bytes = 16 bits)
	u_short	check_sum;// 校验和(2 bytes = 16 bits)
	u_short ur_point;// 紧急指针(2 bytes = 16 bits)
	//u_int	op_pad;	// 选项与填充(Option * Padding, 32 bits)
}TCP_HEADER;



版权声明:本文为mocas_wang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。