首页 > 代码库 > 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)