【网络知识】协议篇

用多了网络请求框架中的GET和POST等既有API,回头发现对网络的请求过程是怎么实现的,网络请求API又是怎么封装起来的完全懵逼状态,所以就到处查找资料,疯狂的学习,在这里将其中的核心知识点加以总结,方便以后查阅,也方便大家共享学习。


一个完整的网络,不仅要能高效率传输网络数据,还要具备好的网络体系结构和容错能力,这里我们不讨论网络的体系结构方面的知识,如果你对网络体系搭建感兴趣,请查阅思科的CCNA系列教程。

本文计划以HTTP的网络请求为例,从网络层来讲解一个网络请求是如何产生的,网络数据是以什么样的方式,怎样在网络中传输。基础篇中不涉及任何API的封装实现。

首先我们来回顾一下OSI七层网络模型TCP/IP四层网络参考模型,如下图所示,TCP/IP将OSI七层网络模型压缩成了四层,但是网络模型只是通信过程的参考,它并不是实际存在的。

【网络知识】协议篇_第1张图片
OSI和TCP/IP模型.png

应用层负责产生数据,然后将数据提交给传输层,由传输层协议进行必要的传输控制操作(如:传输校验,数据段分割,编址端口号等),再交给网络IP层,由网络IP层对数据段进行包装(如:加入IP路由信息,进行路由寻址等),最后通过网络接口层进行数据输出来完成传送。

应用层

应用层位于整个网络模型的最上层,负责直接访问用于网络通信的底层进程,当我们使用应用程序产生了消息后,特定的应用层服务为我们定义了网络通信接口,特定的协议为我们提供了数据处理的规则和格式,进一步将数据传入到下一层操作。

以HTTP协议为例,客户端使用应用程序(浏览器)操作以后,同时用到的服务和协议包含但不限于:

  • DNS域名解析服务:进行域名解析服务,返回通信目的地的IP地址;
  • HTTP协议:规定数据处理规则和格式(请求/响应头、请求/响应行、请求/响应体)

经过各种服务和协议调用以后,即产生了一个二进制流的通信数据对象,进入下一层协议。

如果是数据接收过程,则是相反的过程,调用各种数据解析服务和协议。

传输层

传输层位于应用层之下,为应用层提供可靠的数据传输,存在于终端用户之间。在给定的链路上通过流量控、分段/重组和差错控制来保证数据传输的可靠性。也就是说传输层可以跟踪分段数据传输,并且重传那些传送失败的分段。

传输层的主要功能:

  • 跟踪会话:保证各个分段数据正确传送到对应的应用程序,不会出现接收错误。(如:IP电话的数据传送给了web浏览器)
  • 分段数据:将数据切分成小的片段,并给每段数据添加报头。
  • 重组数据段:接收到数据后,按照编号,将分段数据重新排列并重新组合成原始数据。(网络按照不同的路径传输分段数据,所以数据到达次序不同)
  • 标识应用程序:一台计算机上有很多个应用程序,为了区分各个应用程序,传输层会分配端口号来标识应用程序,端口号被封装在了分段数据的报头中。
  • 流量控制:当网络受阻或网络带宽过载时,传输层可以减小数据源传输的数据大大小,防止丢失分段和重传。
  • 错误恢复:传输层可以重传未传送成功的数据分段。
  • 开始会话:提供面向连接的会话(分段数据)服务,使通信数据被严格管理。
  • 数据要求不同:由于应用程序的不同需求,所以传输层协议也不同,如:对即时性有要求的UDP、对可靠性有要求的TCP等。

综上所述,传输层主要功能就是管理主机会话(分段数据)过程中的传输数据,但是由于不同的应用程序对数据的传送有不同的要求,所以开发了不同的传输层协议来满足这些要求。最长见的就是我们的TCP协议和UDP协议:

TCP协议

TCP是网络层协议,能确保数据可靠传输,可以跟踪已发送数据;确认已发送数据;重新传送已发送数据。实现方式是将收发主机之间的控制数据放入到分段数据报头中进行交换,而不是直接交换控制数据,这样避免了交换控制数据所造成的流量占用。

根据RFC 793文档,TCP是一种面向连接的协议,为了实现额外的功能,会有额外的开销,TCP描述的其他功能包括原序处理、可靠传输和流量控制。每个TCP数据段在切割封装数据段的报头中都有一个20字节的开销,而每个UDP数据段只需要8字节的开销。TCP的数据片段称为分段,UDP的片段数据称为数据报。使用TCP协议的应用有:

  • web浏览器:需要可靠传输,否则数据不完整;
  • 电子邮件:邮件的丢失是不允许的;
  • 文件传输程序:某个分段的丢失将导致文件接收重组失败;
【网络知识】协议篇_第2张图片
TCP数据报格式.png

如图所示,是TCP的报头信息:

  • 源/目的端口号:标识了通信的始发应用程序和目的应用程序;
  • 序列号(SYN):使用序列号开启三次握手,在源主机上对数据分段编号、在目的主机上重组分段数据;
  • 确认号(ACK):在发回源端的报头序列中使用确认号来确认已经接收到相关数据;

TCP标准实施流程:主机传输数据段->并将数据段的副本列入重新发送队列->然后启动计时器->当接收到数据确认信息时,主机将从队列中删除对应数据段;如果计时器超时还没有收到确认信息,将重新传输数据段。

  • 窗口大小:通过窗口大小控制在确认信息之前可以传输的数据量
    • Flow控制:三次握手连接建立阶段,设置一个窗口值(如:窗口3000,发送1-1500->1501-3000->确认ACK)
    • 动态窗口控制:TCP目的主机根据网络当前状态动态调整窗口值;
UDP协议

根据RFC 768文档,UDP是一种简单的无连接协议。该协议不关心数据是否可靠传输(成功传输),所以它可以提供低开销的数据传输。使用UDP协议的应用一般需要快速传输,不关心是否传送成功,如:

  • 域名系统(DNS):失败会重新请求;
  • 视屏流:某个数据分段的丢失不影响视频观看;
  • IP语音:某个语音分段数据的丢失,造成未听清楚,可以要求对话者重新讲一次(喂!你再说一遍我没听清)。
【网络知识】协议篇_第3张图片
�UDP数据报格式.png

UDP不对数据排序,按照先来后到的顺序排列,所以如果对数据的顺序有要求,那么需要应用程序自己标识数据的顺序;

网络IP层

传输层将数据段交给IP层,IP层负责封装IP报头并路由数据包,下面时IP报头格式:

【网络知识】协议篇_第4张图片
IP报头.png
  • 版本(Version)字段:占4比特。用来表明IP协议实现的版本号,当前一般为IPv4,即0100。
  • 报头长度(Internet Header Length,IHL)字段:占4比特。是头部占32比特的数字,包括可选项。普+ 通IP数据报(没有任何选项),该字段的值是5,即160比特=20字节。此字段最大值为60字节。
  • 服务类型(Type of Service ,TOS)字段:占8比特。其中前3比特为优先权子字段(Precedence,现已被忽略)。第8比特保留未用。第4至第7比特分别代表延迟、吞吐量、可靠性和花费。当它们取值为1时分别代表要求最小时延、最大吞吐量、最高可靠性和最小费用。这4比特的服务类型中只能置其中1比特为1。可以全为0,若全为0则表示一般服务。服务类型字段声明了数据报被网络系统传输时可以被怎样处理。例如:TELNET协议可能要求有最小的延迟,FTP协议(数据)可能要求有最大吞吐量,SNMP协议可能要求有最高可靠性,NNTP(Network News Transfer Protocol,网络新闻传输协议)可能要求最小费用,而ICMP协议可能无特殊要求(4比特全为0)。实际上,大部分主机会忽略这个字段,但一些动态路由协议如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)可以根据这些字段的值进行路由决策。
  • 总长度字段:占16比特。指明整个数据报的长度(以字节为单位)。最大长度为65535字节。
  • 标志字段:占16比特。用来唯一地标识主机发送的每一份数据报。通常每发一份报文,它的值会加1。
  • 标志位字段:占3比特。标志一份数据报是否要求分段
  • 段偏移字段:占13比特。如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置。
  • 生存期(TTL:Time to Live)字段:占8比特。用来设置数据报最多可以经过的路由器数。由发送数据的源主机设置,通常为32、64、128等。每经过一个路由器,其值减1,直到0时该数据报被丢弃。
    协议字段:占8比特。指明IP层所封装的上层协议类型,如ICMP(1)、IGMP(2) 、TCP(6)、UDP(17)等。
  • 头部校验和字段:占16比特。内容是根据IP头部计算得到的校验和码。计算方法是:对头部中每个16比特进行二进制反码求和。(和ICMP、IGMP、TCP、UDP不同,IP不对头部后的数据进行校验)。
    源IP地址、目标IP地址字段:各占32比特。用来标明发送IP数据报文的源主机地址和接收IP报文的目标主机地址。
  • 可选项字段:占32比特。用来定义一些任选项:如记录路径、时间戳等。这些选项很少被使用,同时并不是所有主机和路由器都支持这些选项。可选项字段的长度必须是32比特的整数倍,如果不足,必须填充0以达到此长度要求。

如果省略掉传输层,使用IP层直接传输数据也是可以的,只不过这种传输类似于UDP,是不可靠的,其实有某些协议就是基于IP层直接传输的,有兴趣的可以自己研究!

网络接口层

这里涉及的内容较多且比较低层,不做讲解,但是有一个比较重要的概念,以太网帧,平时需要了解,具体请查阅CCNA的课程【】!

完整的TCP/IP报文头.png

参考:
CCNA网络基础
TCP/IP网络四层模型

你可能感兴趣的:(【网络知识】协议篇)