本文部分内容摘自 极客时间:趣谈网络协议和网络协议入门,只是个人的一个学习总结

参考资料:

极客时间:趣谈网络协议

网络协议入门

网络协议指的是计算机网络中互相通信的对等实体之间交换信息时所必须遵守的规则的集合。

​ 由于网络节点之间联系的复杂性,在制定协议时,通常把复杂成分分解成一些简单成分,然后再将它们复合起来,最常用的复合技术就是层次方式,无论是OSI七层模型,还是TCP/IP模型,从上而下,每一层都依赖下一层,每一层都在他的下层提供的服务基础上提供更高级的服务,所以在传输数据时可以没有层但是一定会有下层,比如使用传输层传输数据,一定会有网络层和链路层,不一定会有应用层,如果使用应用层传输数据,一定有传输层,网络层,链路层。

TCP/IP五层模型

TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇;

开篇的图片中,在TCP/IP概念层模型中将数据链路层与物理层统称为链路层,其实这个分不分对于我们学习网络协议的影响不大;

下图中右侧是每一层常用的协议,通过上面我们知道应用层依赖传输层,传输层依赖网络层,网络层依赖数据链路层,数据链路层依赖物理层,我们从最下层开始逐层递进,分析每一层的作用及数据包格式。

物理层

物理层提供的服务:在物理主机之间传输比特流。

​ 两台电脑之间需要通信,首先我们需要将电脑连接起来。物理层就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。数据的单位称为比特(bit)。

数据链路层

数据链路层提供的服务:在同一子网络主机之间的数据传输。

​ 在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。数据链路层在不可靠的物理介质上提供可靠的传输(确定了0和1的分组方式,数据的单位称为帧)。

以太网

​ 以太网规定,连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,数据包的发送地址和接收地址,每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示,前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。

MAC地址示例:0A-11-22-33-44-01

​ 现在我们已经知道了,接入网络的设备需要通过MAC地址进行通信,那么电脑A(本机)要与电脑B(目标)进行通信,电脑A是如何知道电脑B的MAC地址那?

答案是ARP协议。

ARP协议

​ 地址解析协议(英语:Address Resolution Protocol,缩写:ARP)是一个通过解析网络层地址来找寻数据链路层地址的网络传输协议。

百度百科:https://baike.baidu.com/item/ARP/609343?fromtitle=ARP%E5%8D%8F%E8%AE%AE&fromid=1742212&fr=aladdin

简单理解就是,可以通过已知的目标机器的IP来获取目标机器的MAC地址。

ARP协议使用广播的方式来获取目标的MAC地址

​ 如果两台主机在同一个子网络,那么我们可以用ARP协议,得到对方的MAC地址。ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个“广播”地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址(会缓存),否则就丢弃这个包。

向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方:

广播过程:

这样就可以获取到机器D的MAC地址了,之后可以进行通信了;

为了避免每次都用 ARP 请求,机器本地也会进行 ARP 缓存。当然机器会不断地上线下线,IP 也可能会变,所以 ARP 的 MAC 地址缓存过一段时间就会过期 ;

跨子网获取MAC地址

我们看一下ARP协议在跨子网的时候ip和MAC是如何变化的?

​ 如果目标IP和源IP不在同一个子网络,就需要发送ARP协议,首先获取到网关的MAC地址,然后将源MAC和网关MAC放入链路层数据包的标头,网关收到数据包后,发现MAC地址匹配然后取出IP地址,查看是否是自己局域网的,如果不是就继续跳转,直到找到这个目标IP所在的局域网,在这个局域网上发送ARP,获取到目标地址的MAC地址。

数据格式:

链路层的数据的单位称为帧,每一帧分成两个部分:标头Head和数据Data。

链路层数据包格式:

网络层

网络层提供的服务:跨子网络的主机之间的数据传输

​ 以太网协议,依靠MAC地址发送数据,但是互联网是由无数个子网络组成的一个巨大网络,而且以太网采用广播方式发送数据包,这时如果要使用广播的方式进行数据传递肯定是不行的,所以跨子网中通信需要采用路由的方式进行通信(数据的单位称为数据包)

这个路由就是网络地址,使得我们能够区分不同的计算机是否属于同一个子网络;

网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。

IP协议

规定网络地址的协议,叫做IP协议,IP协议是不可靠、无连接的协议。

​ IP协议所定义的地址,就被称为IP地址,它的任务仅仅是根据源主机和目的主机的地址来传送数据。为此目的,IP定义了寻址方法和数据报的封装结构。第一个架构的主要版本为IPv4,目前仍然是广泛使用的互联网协议,尽管世界各地正在积极部署IPv6。

IP协议第四版,简称IPv4:

用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255,这个地址分成两个部分,前一部分代表网络,后一部分代表主机,比如前24位,后24位

子网掩码:用来判断两个ip是否处于同一个子网络。

​ 形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0,比如:11111111.11111111.11111111.00000000

判断是两个IP否是子网的方法:

​ 将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同。

DHCP协议

​ 动态主机配置协议,DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

数据格式:

根据IP协议发送的数据,就叫做IP数据包,我们将IP数据包放到链路层数据包的数据部分:

IP数据包的标头格式:

在网络层进行数据传输时:

​ 首先查看目标IP和自己是否在同一个子网络,如果是就发送ARP协议获取这个地址对应的MAC地址,然后将源MAC和目标MAC地址放入链路层数据包,发送出去即可,如果不在同一个子网络,就需要发送ARP协议,首先获取到网关的MAC地址,然后将源MAC和网关MAC放入链路层数据包的标头,网关收到数据包后,发现MAC地址匹配然后取出IP地址,查看是否是自己局域网的,如果不是就继续跳转,直到找到这个目标IP所在的局域网,在这个局域网上发送ARP,获取到目标地址的MAC地址。

传输层

传输层提供的服务:在进程之间提供数据传输

​ 传输层(Transport Layer)在计算机网络中是互联网协议包与开放系统互连(OSI)网络堆栈中协议的分层结构中的方法的一个概念划分。该层的协议为应用进程提供端到端的通信服务。它提供面向连接的数据流支持、可靠性、流量控制、多路复用等服务。

作用就是建立端口到端口的通信。相比之下,网络层的功能是建立主机到主机的通信。只要确定主机和端口,我们就能实现程序之间的交流。

传输层的数据包格式也是分为标头和数据两部分,嵌在IP数据包的数据部分:

UDP协议

​ 用户数据报协议,无连接协议,无服务状态,会丢包,不能保证数据包顺序到达,基于数据报,不需要建立连接,谁监听谁就能收到消息,数据报是一个一个的发,一个一个的收,处理速度快,延时低。

UDP数据包的标头格式:

看这个包含的内容就只UDP比较简单,负责的比较少,只有源端口号和目标端口号,根据端口号,将数据交给相应的应用程序 。

UDP协议适用场景:

  • 需要资源少,在网络情况比较好的内网,或对于丢包不敏感的应用
  • 不需要一对一建立连接,而是可以广播的应用
  • 需要处理速度快,时延低,可以容忍少数丢表

TCP协议

​ 传输控制协议,为了提高网络的可靠性,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了,所以TCP协议是可靠的,面向连接的协议,基于字节流,没有顺序,丢包的问题,提供了连接维护,流量控制,拥塞控制,缺点就是过程复杂,相比UDP消耗更多的资源。

TCP数据包的标头格式:

对比UDP的标头明显复杂了很多:

  • 源端口号和目的端口号跟UDP一样
  • 序号用来解决乱序问题
  • 确认序号用来解决丢包问题
  • 还有一些状态位,例如 SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN 是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更
  • 窗口大小用来做流量控制,通信双方各声明一个窗口,标识自己当前能够的处理能力

应用层

应用层提供的服务:规定好应用的数据格式

​ 应用程序收到传输层的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。所以应用层的作用,就是规定应用程序的数据格式

HTTP协议

​ HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

​ HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

​ HTTP 是基于 TCP 协议的 ,所以它使用面向连接的方式发送请求,通过 stream 二进制流的方式传给对方。当然,到了 TCP 层,它会把二进制流变成一个的报文段发送给服务器 。

http请求的格式:

  • 请求行中的方法是指请求的方式,常用的就GET,PUT,POST,DELETE等;

  • 首部每一行以键/值的形式写入,键值间用:分割,多个值之间以;分割,每行以回车符换行符为结束;

    常见的键有:

    ​ User-Agent:产生请求的浏览器类型

    ​ Host:请求的主机名,允许多个域名同处一个IP地址

    ​ Accept:客户端可识别的内容类型列表

  • 实体就是我们请求的正文实体;

http响应的格式:

响应的格式与请求的类似,少了方法,多了响应的状态码,就是请求的结果,比如:200,404,500

HTTP的数据包是嵌在TCP数据包的数据部分,所以这是我们最终的数据包格式:

完整的HTTP请求过程: