TCP/IP五层网络协议
- 应用层:是网络应用程序及其应用层协议存留的地方。因特网的应用层包括许多协议,常见的有HTTP(它为web文档提供了请求和传送)、SMTP(它提供了电子邮件报文的传输)和FTP(它提供了两个端系统之间的文件传送)。
- 传输层:负责为信源和信宿提供应用程序进程(包括同一终端上的不同进程)间的数据传输服务,这一层上主要定义了两个传输协议,传输控制协议即TCP和用户数据报协议UDP。
- 网络层:负责将数据报独立地从信源发送到信宿,主要解决路由选择、拥塞控制和网络互联等问题。
- 链路层:负责将IP数据报封装成合适在物理网络上传输的帧格式并传输,或将从物理网络接收到的帧解封,取出IP数据报交给网络层。
- 物理层:负责将比特流在结点间传输,即负责物理传输。该层的协议既与链路有关也与传输介质有关。
以太网帧
由于物理层更多的是与物理介质有关,所以直接从链路层开始分析。在链路层中,使用的最多的是以太网,而以太网帧因为历史原因存在多个版本,这里以IEEE802.3以太网帧格式为例介绍。
- 前导码:7个字节,用于数据传输过程中的双方发送、接收的速率的同步
- 帧开始符:1个字节,表明下一个字节开始是真实数据(目的MAC地址)
- 目的MAC地址:6个字节,指明帧的接受者
- 源MAC地址:6个字节,指明帧的发送者
- 类型/长度:2个字节,0-1500保留为长度域值,1536-65535保留为类型域值(0x0600-0xffff),通过wireshark抓包看到的,这2个字节指明帧中数据的协议类型,比如常见的IPv4中ip协议采用0x0800
- 数据:46~1500个字节,包含了上层协议传递下来的数据,如果加入数据字段后帧长度不够64字节,会在数据字段“填充至46字节”以使整个帧达到64字节(除去前导码和帧开始符的8个字节,包含帧尾FCS),即6+6+2+46+4=64
- 帧校验序列:4个字节,对接收网卡(主要是检测数据字段)提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。目前最为流行的用于FCS的算法是循环冗余校验(cyclic redundancy check –CRC)
备注:除去前导码和帧开始符,也可称为mac帧头,其定义如下所示,wireshark抓包一般看不到FCS,mac帧头都可以看到
typedef struct _MAC_FRAME_HEADER
{
char m_cDstMacAddress[6]; //目的mac地址
char m_cSrcMacAddress[6]; //源mac地址
short m_cType; //上一层协议类型,如0x0800代表上一层是IP协议,0x0806为arp
}__attribute__((packed))MAC_FRAME_HEADER,*PMAC_FRAME_HEADER;
typedef struct _MAC_FRAME_TAIL
{
unsigned int m_sCheckSum; //数据帧尾校验和
}__attribute__((packed))MAC_FRAME_TAIL, *PMAC_FRAME_TAIL;
IP帧
- 上面说到的数据字段是上层协议传递下来的数据,而最常见的上层协议便是ip协议。
- IP协议是TCP/IP协议族中最为核心的协议。它提供不可靠、无连接的服务,也即依赖其他层的协议进行差错控制。在局域网环境,IP协议往往被封装在以太网帧中传送。而所有的TCP、UDP、ICMP、IGMP数据都被封装在IP数据报中传送
- ip帧的格式如下:
- Version:版本,4位,用来表明IP协议实现的版本号,当前一般为IPv4,即0100,IPv6的为0110。这个字段确保可能运行不同IP版本的的设备之间的兼容性
- IHL:报头长度,4位,以32比特的字(即4字节)来定义IP首部的长度,包括可选项。若该字段的值是5,即5*32=160比特=20字节。此字段最大值为60(15*32/8=60)字节,没有任何选项的ip头部为20字节
- TOS:服务类型,8位,用于携带提供服务质量特征信息的字段,服务类型字段声明了数据报被网络系统传输时可以被怎样处理。其中前