TCP/IP 协议簇的逐层封装 收藏 在使用 TCP 协议的网络程序中,用户数据从产生到从网卡发出去一般要经过如下的逐层封装过程: 从下往上看: 1)链路层通过加固定长度的首部、尾部来封装 IP 数据报(Datagram) 产生以太网帧(Frame),其中首部存在对封装数据的标识:是 IP(0x 0800,本例) 、ARP(0x 0806) 还是 RARP(0x 0835)。 2)网络层通过加首部来封装 TCP 段(Segment) 产生 IP 数据报,其中首部存在对封装数据的标识:是 ICMP(0x 01)、IGMP(0x 02)、TCP(0x 06,本例) 还是 UDP(0x 11)。 3)传输层通过加首部来封装应用数据产生 TCP 段,其中首部存在对封装数据的标识:端口号,来标识是那个应用程序产生的数据。 4)按这种处理逻辑,在应用层,对于我们要处理的应用数据理所当然的加上固定长度的首部,首部中同样含有某些标识,标识些什么呢?按经验,一般会标识本次数据的业务意义,在程序中一般处理为业务集合(枚举型)的某个元素;如果是 TCP 应用(本例) 还可能包括应用数据总体长度。 Ethernet、Tcp、Udp 等协议的数据包格式 收藏 TCP/IP 协议是一个比较复杂的协议集,有很多专业书籍介绍。在此,我仅介绍其与编程密切相关的部分:以太网上 TCP/IP 协议的分层结构及其报文格式。我们知道 TCP/IP 协议采用分层结构,其分层模型及协议如下表: 应 用 层 (Application) HTTP、Telnet、FTP、SMTP、SNMP 传 输 层 (Transport) TCP、UDP 网 间 网层 (Internet) IP【ARP、RARP、ICMP】 网络接口层 (Netw ork) Ethernet、X.25、SLIP、PPP 协议采用分层结构,因此,数据报文也采用分层封装的方法。下面以应用最广泛的以太网为例说明其数据报文分层封装,如下图所示: 任何通讯协议都有独特的报文格式,TCP/IP 协议也不例外。对于通讯协议编程,我们首先要清楚其报文格式。由于 TCP/IP 协议采用分层模型,各层都有专用的报头,以下就简单介绍以太网下 TCP/IP 各层报文格式。 8 字节的前导用于帧同步,CRC 域用于帧校验。这些用户不必关心其由网卡芯片自动添加。目的地址和源地址是指网卡的物理地址,即 MAC 地址,具有唯一性。帧类型或协议类型是指数据包的高级协议,如 0x0806 表示 ARP 协议,0x0800 表示 IP 协议等。 ARP/RARP(地址解析/反向地址解析)报文格式如下图: “硬件类型”域指发送者本机网络接口类型(值“1”代表以太网)。“协议类型”域指发送者...