网络协议栈基本知识

【注】:文章中的内容主要收集来自网上或者书籍中。

1、网络协议分层

按照分层的思想把网络协议栈进行分层主要有以下好处:

1.促进标准化工作,允许各个供应商进行开发

2.各层间相互独立,把网络操作分成低复杂单元

3.灵活性好,某一层变化不会影响到其它层

4.各层间通过一个接口在相邻层上下通信

OSI七层模型和TCP/IP五层模型的对比如下,我们现在用的是五层协议模型:

2、PDU、封装和解封装

  • PDU(protocol data unit):每一层使用自己层的协议和别的系统的对应层相互通信,协议层的协议在对等层之间交换的信息叫协议数据单元
  • 上层:message
  • 传输层:segment
  • 网络层:packet
  • 数据链路层:frame
  • 物理层:bit
  • 封装:数据要通过网络进行传输,要从高层一层一层的向下传送,如果一个主机要传送数据到别的主机,先把数据装到一个特殊协议报头中,这个过程叫封装
  • 封装分为:切片和加控制信息
  • 解封装:上述的逆向过程

数据进入TCP/IP协议栈时的封装过程如下:

数据进入TCP/IP协议栈时的解封装过程如下:

3、以太帧和常见的报文格式

(1)以太网帧(Ethernet II Frame)

  • D-MAC:目的MAC地址
  • S-MAC:源MAC地址
  • 类型域:表示帧里面上层协议数据的类型,0x0800代表IP协议帧,0x0806代表ARP协议帧
  • CRC:帧校验

(2)IP数据报

  • 版本号:4代表IPv4,
  • 头长度:报头的长度,值为4字节的倍数,故首部长度最大为60字节
  • 服务类型:暂未使用
  • 总长度:IP数据报的长度(报头区+数据区),单位为字节,故总长度最大为65535字节,但总长度不能超过最大传输单元MTU
  • 标识:一个计数器,用来产生数据报的标识
  • 标志:占3位,最低位MF,为1表示还有分片,中间为DF,为0,表示允许分片
  • 片偏移:较长的分组在分片后,某片在原分组中的相对位置,单位为8字节
  • TTL:生存时间,数据报可以经过的最大路由器数
  • 上层协议标识:1:ICMP,2:IGMP、6:TCP、17:UDP等;

分片举例:

IP数据报解析:

(3)TCP数据报

  • 协议、源IP、源端口、目的IP、目的端口确定一个TCP连接
  • 顺序号:TCP段所发送的数据部分第一个字节的序号
  • 确认号:期望收到对方下次发送的数据的第一个字节的序号
  • 头部长度:单位为4字节,因此TCP首部的最大长度为60字节
  • 窗口大小:窗口通告值,发送方根据接收方的窗口告值调整窗口大小
  • 紧急指针:指示紧急数据在报文段中的结束位置此时URG置位
  • URG:表示紧急指针字段有效
  • ACK:表示确认号字段有效
  • PSH:表示当前报文需要推操作
  • RST:置位表示复位TCP连接
  • SYN:用于建立TCP连接时同步序列号
  • FIN:用于释放TCP连接时标识发送方比特流结束

TCP报文解析:

(4)UDP数据包

      

常见协议对应的端口号:

UDP DHCP服务器端:67,DHCP客户端:68,DNS服务:53

TCP POP3(邮件接收协议):110,SMTP(邮件传输协议):25,HTTP服务:80

TCP FTP:数据传输为20,控制命令传输为21,Telnet:23

端口号范围为:1~65535,1~1024为熟知端口号,1025~65535称为动态端口

(5)ARP协议

  • ARP(Address Resolution Protocol)地址解析协议,是根据 IP 地址获取物理 MAC 地址的一个 TCP/IP 协议。
  • ARP 高速缓冲表:用来记录 IP 和 主机 MAC 地址的对应关系。会不断更新。
  • 功能:通过目标设备的 IP 地址,查询目标设备的 MAC 地址,同时维护 ARP 高速缓冲表,以保证通信的顺利进行。

ARP分组格式

  • 硬件类型:以太网为1
  • 协议类型:网络层协议类型,IP协议为0x0800
  • OP:操作码,ARP请求为1,ARP应答为2

(6)ICMP协议

  • ICMP 是 "Internet Control Message Protocol"(网络控制报文协议)的缩写,用于在 IP 主机、路由器之间传递控制消息。
  • 控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
  • ICMP 层区分不是很明显,一般划分在 IP 层中,通过 IP 包来封装ICMP数据 ,在实际传输中数据包的格式一般都是 IP 包 + ICMP包的格式

ICMP包格式:

代码:用来表示ICMP报文类型的少数参数,

例如:代码值为0,表示网络不可达;代码值为1,表示主机不可达

(7)DNS协议简介

  • DNS(Domain Name System):域名系统,将域名和IP地址相互映射的一个分布式数据库
  • 采用Client/Sever工作模式
  • DNS 协议运行在 UDP 协议之上,使用端口号 53
  • 过程图解

(8)DHCP协议简介

  • DHCP(Dynamic Host Configuration Protocol):动态主机配置协议
  • 采用Client/Sever工作模式
  • 为主机提供配置参数、自动分配可重复利用的网络地址
  • DHCP 协议运行在 UDP 协议之上,服务器端口号 67,客户端口号68

4、ping演示

Ping命令是为了检查网络的连接状况而使用的网络工具之一,用来检测数据包到达目的主机的可能性。

原理:使用ICMP协议的回送请求、回送应答。客户端发送回送请求给服务器,服务器返回一个ICMP回应应答。

Ping过程图解:

 

  • 首先开发板要解析百度的域名,获取到百度主机的 IP 地址,涉及到 DNS 协议,传输层用的是 UDP 协议
  • DNS 主机利用 UDP 协议,回复百度的 IP 地址给开发板。
  • 现在开发板要发送 Ping 请求包给百度主机,但是发现百度主机 IP 地址与自己不在同一网段,因此要发送 Ping 请求包给默认网关。
  • 要发送给默认网关的时候,忽然发现并没有默认网关对应的 MAC 地址,因此发送一个 ARP 广播包,如果交换机存储了默认网关的 MAC 地址,就直接告诉开发板默认网关的 MAC 地址,否则就会向所有端口发送ARP广播,直到路由1收到了报文后,立即响应,单播自己的 MAC 地址给开发板。
  • 这样开发板就可以把 Ping 包发送给默认网关(路由1)了。
  • 然后路由1 经过路由协议,经过一个个路由的转发,最后发送到了百度的主机上。百度主机检测到 IP 是自己的 IP,接收并处理 Ping 请求,接着百度主机发送一个 Ping 回应报文给开发板。

5、TCP客户端服务器通信演示

TCP(传输控制协议):提供一种面向连接的、可靠的传输层协议(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)。

TCP三次握手过程:

TCP四次挥手过程:

 

 

为什么以太网MTU值被设定为1500Byte

最早的以太网工作方式:载波多路复用/冲突检测(CSMA/CD),因为网络是共享的,即任何一个节点发送数据之前,先要侦听线路上是否有数据在传输,如果有,需要等待,如果线路可用,才可以发送。

假设A发出第一个bit位,到达B,而B也正在传输第一个bit位,于是产生冲突,冲突信号得让A在完成最后一个bit位之前到达A,这个一来一回的时间间隙slot time是57.6μs。

在10Mbps的网络中,在57.6μs的时间内,能够传输576个bit,所以要求以太网帧最小长度为576个bits,从而让最极端的碰撞都能够被检测到。这个576bit换算一下就是72个字节,去掉8个字节的前导符和帧开始符,所以以太网帧的最小长度为64字节。

为什么标准以太网帧长度上限为1518字节

IP头total length为两个byte,理论上IP packet可以有65535 byte,加上Ethernet Frame头和尾,可以有65535 +14 + 4 = 65553 byte。如果在10Mbps以太网上,将会占用共享链路长达50ms,这将严重影响其它主机的通信,特别是对延迟敏感的应用是无法接受的。

由于线路质量差而引起的丢包,发生在大包的概率也比小包概率大得多,所以大包在丢包率较高的线路上不是一个好的选择。

但是如果选择一个比较小的长度,传输效率又不高,拿TCP应用来说,如果选择以太网长度为218byte,TCP payload = 218 - Ethernet Header - IP Header - TCP Header = 218 - 18 - 20 - 20 = 160 byte

那有效传输效率= 160 / 218 = 73%

而如果以太网长度为1518,那有效传输效率= 1460 / 1518 = 96%

通过比较,选择较大的帧长度,有效传输效率更高,而更大的帧长度同时也会造成上述的问题,于是最终选择一个折衷的长度:1518 byte ! 对应的IP packet 就是 1500 byte,这就是最大传输单元MTU的由来。

MTU不能定义太大还有以下考虑:

首先,底层网络I/O控制器是按照一帧一帧向网线上传送数据的,该帧有一定大小限制,原因取决于传送链路的性质,有些链路连续传送大量用户数据之后,通信双方的时钟会变得不同步,导致问题。 另外,对于上行链路,会有多个计算机的数据帧排队等待传输,如果某个数据帧太大的话,那么其他数据帧等待的时间就会加长,导致体验变差,这就像一个十字路口的红绿灯,你可以让绿灯持续亮一小时,但是等红灯的人一定不愿意的,所以,公平,是限制帧长度的一个最重要的原因。 再者,网络I/O控制器需要从Host端主存中的缓冲区中取数据,缓冲区的大小是有限制的,Host主存资源有限,一般无法分配太大的缓冲区,只能将数据碎片化,一小份一小份的放置,并用环形队列追踪组织起来。另外,如果一次传送太大量的数据,一旦该数据中有一小部分被干扰,那么接收方的数据校验算法由于无法判断具体是哪里产生了错误以及如何修复错误,所以只能将这份数据全部丢弃,并通知发送方重传,这极度浪费了网络带宽资源。还有,如果一份数据太大,则接收方必须将该数据全部接收完之后,才会通知上游程序“有新数据到了请来处理”,这个延迟太大了,如果能将数据切片,一小片一小片传递,那么接收方的处理程序可以更快的拿到数据,虽然数据本身并不完整,但是程序可以经过设计,也跟着一点一点的处理数据,这样,形成类似流水线的过程,反而能够增加最终的数据处理速度。

Jumbo Frame

最早的以太网是通过Hub或集线器来工作的,在任意时刻只能有一台主机发送,这种共享方式发送效率很低,而现代高速交换机则让每个连接交换机的主机工作在独占模式,带宽独享,可以同时收发,而且现在早已不是早期的10Mbps的带宽,而是1000M、10000M,即使发送大包也不会影响别的主机,影响的只是交换机的接收和发送队列,既然发送大包效率要比小包效率搞,而且特定的应用也有发大包的需求,比如NFS文件系统,那为什么不把接口MTU提高一些,再高一些呢?

这是一个好主意,于是网卡、交换机、路由器网络接口可以实现更大的MTU,可以达到> 9000字节的大小,我们称这种远大于标准以太帧尺寸的帧为巨型帧Jumbo Frame 。

于是网络接口提供可以修改MTU的配置命令,比如缺省为1500,可以修改为1508以支持QinQ,或者1512以支持802.1q Mpls label,这样既可以支持终端用户标准1500 字节IP packet,又可以避免分片。

有一点需要说明,二层交换机的接口,我们可以看成一块普通的网卡,网卡工作在数据链路层,所以分片不是它的职责,如果一个帧需要从交换机一个接口发送出去,而帧的长度>接口MTU,怎么办?丢弃!会发什么消息告诉源主机吧?不会的,默默地丢,当作什么都没有发生,这种情况最难以排查,如果traceroute可以看到端对端使通的,而发送数据就是会失败。

所以切记,一台交换机要保证接口MTU的一致性。如果在一个VLAN上、或整个交换机都采用同样的MTU,就不会发生上述情况。而如果入接口是9000字节,而出接口是1500,就会发生上述问题。

如果一条物理链路的两端MTU不一致,则会发生什么情况,比如一侧是1500,一侧是9000,1500一侧发出来的数据肯定没有问题,但是如果从9000侧发给1500呢?

数据也背默默地丢了。为什么呢?我们来谈另外一个很少提及的词汇:MRU,最大接收单元。

我们一直谈的最大传输单元MTU是关于出方向的流量处理,而MRU恰恰相反,是关于入方向的流量处理。

一般情况下MTU = MRU,但比如9000侧的数据到达1500,由于9000 > MRU,所以直接默默丢弃。

所以在配置链路时,要确保两侧的设备MTU要匹配,无论各家厂商对MTU理解如何、实现如何,一定要保证两端匹配,即各自允许在以太网线上发送、接收的数据流,以太网帧的最大长度一样!

 

posted @ 2020-11-12 15:18  青蛙的博客  阅读(19)  评论(0)    收藏  举报