TCP/IP协议栈及网络基础,协议栈原理及实现

1. TCP/IP协议栈及网络基础

推荐这个在B站几千观看的视频讲解:

底层原理到徒手实现 TCP/IP网络协议栈;tcp协议栈,如何实现?

C/C++ Linux服务器开发高级架构学习视频点击:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频

内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。

1.1 OSI网络模型

OSI网路模型分为7层,7层模型及其意义如下图所示:

OSI模型每一层都使用自己的协议,OSI模型每一层都利用下层提供的服务与对等层通信。

OSI每层之间数据报文进行交互的格式如下:

1.2 TCP/IP网络模型

OSI网络模型在程序开发中较为臃肿,各个层次在实现的功能上有所重复,因此TCP/IP协议栈对OSI模型进行了精简,只剩下了5个层次。

TCP/IP网络模型的5个层次分别是物理层,数据链路层,网络层,传输层和应用层,以下对5个层次依次说明。

1.2.1 物理层

物理层的主要作用是把数字信号转变为电信号然后在传输介质中进行传输,物理层处理的数据为二进制数据,也就是bit流。

物理层还描述了传输介质的特性,如传输速率,全双工和半双工等。

常见的传输介质有网线,光纤,无线频段等。

物理层传输的电信号时没有进行分组的,没有规定开头和结尾,无法识别其中的意义,这就需要数据链路层来解决了。

1.2.2 数据链路层

数据链路层定义了电信号分组的标准,使用了相关的通信协议来控制物理层数据的传输。把实现这些协议的硬件和软件加到链路上,就构成了数据链路。

现在最常用的方法是使用适配器(即网卡)来实现这些协议的硬件和软件,一般的适配器都包括了数据链路层和物理层这两层的功能。

数据链路层的传输单元是帧Frame。封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。首部和尾部的一个重要作用就是进行帧定界。

数据帧的封装示意图如下:

MTU为最大传输单元,也就是一个数据帧数据部分的最大字节数,在以太网上一般为1500字节,超过1500字节的数据包就需要进行分片传输。

数据链路层常见的协议标准有以太网,PPP等。

1.2.2.1 以太网协议

以太网为局域网中使用最为广泛的数据链路层协议。在有线以太网中,数据的收发需要遵循CSMA/CD协议,而在无线局域网中,数据的收发需要遵循CSMA/CA协议。

  • MAC地址在以太网中,每个主机或网卡都有一个硬件地址,称为MAC地址。MAC地址是一个全球唯一的地址。共有48bit组成,其中前24bit由IEEE注册管理机构分配给设备厂商的OUI地址,后24位则由厂商自行编码,保证MAC地址无重复。
  • 以太网的帧格式如下:

主要包括目的MAC地址,源MAC地址,类型,数据部分和FCS校验和。

其中类型用于标识数据部分的协议类型,其中ip协议为0x0800,ARP协议对应的Type值为0x0806。

  • 设备收到数据帧的处理流程网卡(适配器)从网络上收到的 MAC 帧会使用用硬件检查 MAC 帧中的目的 MAC 地址,如果是发往本站的帧则收下,然后再进行其他的处理。否则就将此帧丢弃,不再进行其他的处理。
  • 以太网中的帧类型以太网中共有三种帧类型:单播帧:即目的MAC地址是一个主机的单播MAC地址,只有该主机会收到该报文。组播帧:目的MAC为一个组播的MAC地址,只有一个组播域中的主机才会收到并处理。广播帧:目的MAC地址为全1,表示广播域中的所有主机都会收到。

1.2.2.2 vlan概述

交换机的每个端口都是一个冲突域,都需要遵循之前提到的CSMA/CD协议,交换机可以隔离冲突域,但是无法隔离广播域,交换机对收到的广播包会进行泛洪处理,即转发给除了收到报文端口的其他所有端口,当网路中存在大量的ARP报文,例如ARP攻击时就会对一个广播域的中的所有主机造成影响,因此我们需要在局域网中缩写广播域。

vlan,虚拟局域网,可以隔离广播域,主要作用如下:

  • 有效控制广播域范围
  • 灵活构建虚拟工作组
  • 增强局域网的安全性

vlan使用tag来区分不同的vlan值,共有1-4096个vlan可以使用,带有vlan的数据帧格式为:

1.2.3 网络层

网络层用于隔离广播域,并引入了IP地址的概念。

网络层主要作用如下:

  • 标识节点和链路用唯一的IP地址标识每一个节点用唯一的IP网络号标识每一个链路
  • 寻址和转发确定节点所在网络的位置,进而确定节点所在的位置IP路由器选择适当的路径将IP包转发到目的节点
  • 适应各种数据链路根据链路的MTU对IP包进行分片和重组为了通过实际的数据链路传递信息,须建立IP地址到数据链路层地址的映射

关于C/C++ Linux后端开发网络底层原理知识 点击 后端开发学习资料 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。

1.2.3.1 ipv4数据包格式

一个 IP 数据报由首部和数据两部分组成。

ip首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的,最少占用20字节,不足时会自动填充。

ip数据包没有对数据部分做校验,数据部分在传输层和数据链路层中会进行校验。

ip首部的格式如下:

  • 版本号占 4 位,指 IP 协议的版本,对于ipv4,版本号为4
  • 首部长度占 4 位,可表示的最大数值是 15 个单位(一个单位为 4 字节),因此 IP 的首部长度的最大值是 60 字节。可选项部分最小数值为5个单位,就是20个字节。
  • 服务类型即区分服务TOS,用于区分不同类型的数据包,例如区分高优先级数据包和低优先级数据包,只有在使用区分服务(DiffServ)时,这个字段才起作用。早期只使用这个字段的前3位,即最多8个数据类型,称为Cos;后来对服务类型字段进行了重新定义,使用前6位做分区服务,称为DSCP,可以标记64中ip数据类型。
  • 数据包长度指的是ip数据报文的总长度,包括ip首部和ip数据部分,单位是字节,占用16bit,最大可表示的报文长度为65535字节,不过一般会根据MTU进行分片传输。使用数据包长度减去首部长度就可以得到ip报文的数据有效载荷的大小。
  • 标识符标识符通常与标志和片偏移量一起用于数据包的分片。因为在数据链路层规定了MTU值,即ip数据包的最大长度,因此超过MTU值的数据包就需要被分片发送,然后在接收端对这些分片的报文进行重组,得到完整的数据包。标识符的作用就是在一个数据包进行分片后,对这些分片的数据包打上同一个标识符,这样接收端就可以识别出这是属于同一个数据包的分片,然后进行重组。
  • 标志标志共有3位,其中第1位未使用,第二位为不分段位(DF位)。当DF设置为1时,表示数据包不允许被分片,若超过MTU值,路由器会因为不能分片而丢弃该数据包。DF位为0则代表该数据包可以被分片。第3位是MF位,MF位置1表示这个分片的数据包不是报文的分片的最后一个报文,MF位置0表示这个数据包是分片的最后一个数据包。
  • 片偏移片偏移用于指明分段的起始位置相对于报头起始位置的偏移量,用于接收者根据片偏移量对数据包进行重组。如果一个数据包中的某个分段在网络中丢失,这个数据包需要被整个重新分段和发送。片偏移以 8 个字节为偏移单位,片偏移的示意图如下:

  • 生存时间生存

时间即TTL值,标识数据包在网络中传输的最大条数

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值