网络层次与协议
大约 6 分钟
网络层次与协议
目录
网络层次与协议
参考:
- https://zhuanlan.zhihu.com/p/362826470
- 网络相关个人博客 (这网站不错,即包括基础,又包括更深入的SDN、NFV、DPDK、OVS、eBPF、XDP等)
网络层次结构
先复习一下网络层次结构:
OSI模型 (七层)
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
TCP/IP模型 (四层)
- 应用层
- 传输层
- Internet层
- 网络接口层
(不常见) (五层)
5层只是OSI和TCP/IP的综合,是业界产生出来的非官方协议模型,但是很多具体的应用。
不展开讲解,内容和功能参照7层的
这几种模型的映射关系
- (TCP/IP模型)
- (OSI模型)
- 应用层
- 应用层
- 表示层
- 会话层
- 传输层
- 传输层
- Internet层
- 网络层
- 网络接口层
- 数据链路层
- 物理层
流程复习
网络层次结构
数据包封装与拆解
协议
如何快速判断一个协议到底在几层?
快速查找表
按知道的信息简单判断
参考:https://www.zhihu.com/question/27668104/answer/37622036
- 连MAC都不知道的算第1层,例如已经死绝了的hub
- 只知道MAC不知道IP的算第2层,例如普通交换机
- 知道IP不知道port(也就不管TCP还是UDP)的算第3层,例如普通路由器(ICMP被分到这里是因为这个原因)
- 知道IP还知道port 的算第4层,例如 NAT
- 关心payload的算第7层,例如 http proxy
按功能判断
略
混乱
参考问题:
- 在《图解TCP/IP》第五版一书中,作者将ARP协议划分在了网络层。而在维基百科里,将ARP划分在数据链路层。请问一个协议应该属于哪一层是以什么为标准划分的?
- ICMP在OSI第几层?有人说二层(链路层) 有人说三层(网络层) 还有人说四层(传输层)?
先有osi七层模型和tcp/ip四层模型的,再有各类网络协议。
像ICMP、IGMP和ARP这类协议应该放在几层呢?存在争议
在 W.Richard Stevens 所著的《tcp/ip详解卷一: 协议》中的前几章已经说的很明白了,这类介于二三层之间的协议可以按照自己的理解去归类,不必强行按照理论模型分层。
一句话:理论要为实践服务
IP协议
IP报文格式(网络层)
- 固定部分; 20Byte
- 1st; 4Byte
- 版本; 4bit; IPV4/IPV4
- 首部长度; 4bit; 固定长度与可变长度之和, 其中固定长度20字节
- 区分服务; 8bit
- 报文的优先级; 3bit
- 要求更低时延、更高的吞吐量、更高的可靠性、更低的路由代价等。对应位为1即有相应要求,为0则不要求; 5bit
- 总长度; 16bit; IP报文的总长度。报头的长度和数据部分的长度之和
- 2nd; 4Byte
- 标识; 16bit; 唯一的标识主机发送的每一分数据报。通常每发送一个报文,它的值加一。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到所有数据分片的标识字段中,使得这些分片在达到最终目的地时可以依照标识字段的内容重新组成原先的数据。
- 标志; 3bit
- R; 目前无效
- DF; 1则不分片,0则分片
- MF; 1则“更多的片”,0则表示是最后一片
- 片偏移; 13bit; 本分片在原先数据报文中相对首位的偏移位
- 3rd
- 生存时间; 8bit; IP报文所允许通过的路由器的最大数量。每经过一个路由器,TTL减1,当为0时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64。发送 ICMP 回显应答时经常把 TTL 设为最大值 255。
- 协议; 8bit; 指出IP报文携带的数据使用的是那种协议,以便目的主机的IP层能知道要将数据报上交到哪个进程(不同的协议有专门不同的进程处理)。和端口号类似,此处采用协议号,TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.
- 首部校验和; 16bit; 计算IP头部的校验和,检查IP报头的完整性。为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。由于接受方在计算过程中包含了发送方存在首部中的校验和。因此,如果首部在传输过程中没有发生任何差错,那么接受方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报
- 源IP地址; 4Byte; 标识IP数据报的源端设备
- 目的IP地址; 4Byte; 标识IP数据报的目的地址
- 1st; 4Byte
- 可变部分; NByte; 根据首部长度判断大小
- 数据部分; NByte
TCP协议
报头固定长度为 40Byte
- 1st; 4Byte
- 源端口; 16bit
- 目的端口; 16bit
- 序号; 4Byte; 用来标识TCP发端向TCP收端发送的数据字节流
- 确定序号; 4Byte; ACK标志为0,故没有确认序号(ACK标志为1时确认序号才有效,一旦连接建立,该值将始终发送(同ACK标志)
- 4nd
- 首部长度; 4bit; 报文头长度(单位:位)/32,1000(转化为10进制为8,8*32/8 = 32,该报文报头长度为32个字节),存在该字段是因为TCP报头中任选字段长度可变,报头不包含任何任选字段则长度为20字节;4位所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。
- ……
- ……
ICMP报文格式
检验和字段覆盖整个ICMP报文。使用的算法与IP首部检验和算法相同。ICMP的检验和是必需的。
ICMP分为差错报文和查询报文,具体的类型和报文格式见《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记
- 8bit
- 8bit
- 16bit
ICMP
报文可以分为两类:查询报文和差错报文,具体报文类型如下图所示:
下面各种情况都不会导致产生ICMP
差错报文:
ICMP
差错报文(但是,ICMP
查询报文可能会产生ICMP
差错报文)- 目的地址是广播地址或多播地址的
IP
数据报。 - 作为链路层广播的数据报。
- 不是
IP
分片的第一片。 - 源地址为零地址、环回地址、广播地址或多播地址。
这些规则是为了防止过去允许ICMP
差错报文对广播分组响应所带来的广播风暴。