首页 > 代码库 > Socket编程实践(16) --TCP/IP各层报文(1)

Socket编程实践(16) --TCP/IP各层报文(1)

以太网帧格式

 

 

    说明1:链路层的数据包,称为以太网帧。

    说明2:链路层不识别IP地址[因为IP地址是逻辑地址],链路层识别物理网卡MAC地址[硬件地址]

    说明3:需要根据IP地址找到对方的MAC地址(ARP地址解析协议)[MAC —> IP地址方向地址解析:RARP反向地址解析协议]。

    说明4:应用层根据对等方的IP地址进行通讯,在数据封装过程中,链路层需要目的地址的MAC地址从何而来?需要将IP地址转换成MAC地址,也就是地址解析。

 

以太网首部代码:

struct ethernet_hdr
{
    char dest_mac[6];
    char src_mac[6];
    short protocol;
};


ARP地址解析协议

 

ARP首部代码:

struct arp_hdr
{
    unsigned short hwtype;	// 固定1
    unsigned short protype;	// 固定0x0800(代表为IP协议做请求)
    unsigned char hwaddrlen;	// 固定6(即MAC地址长度)
    unsigned char proaddrlen;	// 固定4 (即IP地址长度)
    unsigned short opcode;	// Request - 1, Reply - 0x0002
    unsigned char sender_mac[6];	// 发送者MAC
    unsigned char sender_ip[4];	// 发送者IP
    unsigned char dest_mac[6];	// 接收者MAC
    unsigned char dest_ip[4];	// 接收者IP
};
 

以太网的MTU和路径MTU 

    以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit)

    如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就要进行分片(Fragmentation),把数据报分成若干片,这样每一片都小于MTU。

    当网络上的两台主机互相进行通信时,两台主机之间要经过多个网络,每个网络的链路层可能有不同的MTU,其中两台通信主机路径中的最小MTU被称作路径MTU

 

IP数据报

 

    版本号,目前取值4

    首部长度,4个字节为单位,取值范围5~15

    服务类型,指定传输的优先级、传输速度、可靠性和吞吐量等

    报文总长度,最大长度为65535字节

    报文标识,唯一标识一个数据报,如果数据报分段,则每个分段的标识都一样

    标志,最高位未使用,定义为0,其余两位为DF(不分段)和MF(更多分段)

    段偏移量,以8个字节为单位,指出该分段的第一个数据字在原始数据报中的偏移位置

    生存时间(TTL),取值0~255,每经过一个路由节点减1,为0时被丢弃(Tranceroute程序的实现原理)

    协议,指明该数据报的协议类型,如1为ICMP,4为IP,6为TCP,17为UDP等

    首部校验和,每通过一次网关都要重新计算该值,用于保证IP首部的完整性

    选项,长度可变,提供某些场合下需要的控制功能,IP首部的长度必须是4个字节的整数倍,如果选项长度不是4的整数倍,必须填充数据

 

IP首部代码:

struct ip_hdr
{
    char  ver_hl;
    char  tos;
    unsigned short len;
    unsigned short id;
    unsigned short fragment;
    char ttl;
    char protocol;
    unsigned short hdr_chksum;
    char src_ip [4];
    char dest_ip [4];
};
 

ICMP协议

    ICMP协议用于传递差错信息、时间、回显、网络信息等控制数据

    当我们ping 一台主机想看它是否运行时,就产生了一条ICMP 信息。远程主机将用它自己的ICMP 信息对ping 请求作出回应。

 

 

ICMP协议说明:

    本身是IP的一部分。

    用途:网关或者目标机器利用ICMP与源通讯,当出现问题时,提供反馈信息

    在IP协议栈中必须实现

    ICMP包含在IP数据包的净荷数据中,IP头中协议类型为1

    ICMP数据的第一个字节代表ICMP报文的类型,它决定了后续数据的格式

 

特点:

    其控制能力并不用于保证传输的可靠性

    它本身也不是可靠传输的

 

ICMP数据包

    ICMP包含在IP数据包的净荷数据中,IP头中协议类型为1

    ICMP数据的第一个字节代表ICMP报文的类型,它决定了后续数据的格式

 

ICMP首部代码:

struct icmp_hdr
{
    char	type;			// ICMP报文类型
    char 	code;			// “子类型”
    unsigned short  icmpchksum;	// 校验和
};

ICMP报文类型

 

报文类型说明

    2 0 Echo Reply

    2 3 Destination Unreachable

    2 4 Source Quench 

    2 5 Redirect 

    2 8 Echo 

    2 11 Time Exceeded

    2 12 Parameter Problem

    2 13 Timestamp 

    2 14 Timestamp Reply 

    2 15 Information Request 

    2 16 Information Reply 

    2 17 Address Mask Request 

    2 18 Address Mask Reply 


报文分类

  2 ICMP差错报文

    2 目的不可达报文(类型3)

    2 超时报文(类型11)

    2 参数出错报文(类型12)

  2 ICMP控制报文

     2 报源抑制报文(类型4)

     2 重定向(类型5)

  2 ICMP请求/应答报文

     2 回送请求和响应报文(类型0和8)

     2 时间戳请求和响应报文(类型13和14)

     2 地址掩码请求和响应报文(类型17和18)

  2 其他

 

ICMP Echo报文

 

    类型:0表示Echo Reply,8表示Echo

    代码:0

    标识符:标识一个会话,例如,用进程ID

    序号:例如每个请求增1

    选项数据:回显

 

ICMP 目的不可达报文

 

    类型:3

    代码:0表示网络不可达,1表示主机不可达;2表示协议不可达;3表示端口不可达;等等

    出错的IP包的IP首部+原始IP数据包中前8个字节 

Socket编程实践(16) --TCP/IP各层报文(1)