前端镀金计划:网络传输之TCP/IP协议族

前言

作为一名前端开发人员,我们最主要的日常工作之一就是与网络打交道。众所周知,浏览器获取一个页面资源依托于HTTP协议。当我们想浏览器的地址栏中输入一段url时,浏览器会首先通过访问DNS服务器获得url域名所对应的ip地址,然后将http报文发送给ip所在的服务器。服务器接收报文后作出响应,将请求的资源发送给浏览器。

以上过程看起来非常直观且容易理解,然而这个过程只是真正的网络传输过程的一个抽象。实际上,HTTP协议得以准确无误的发送和接受数据,依托于其下面的TCP/IP协议族以及更底层(物理层)的种种协议。通过大致了解TCP/IP协议族的规则和特性,可以为我们理解HTTP协议以及处理网络传输过程中发生的种种问题提供非常大的帮助。本文就将通过一名前端的视角,带领大家了解一些TCP/IP协议族的基本知识。


正文

TCP/IP协议族是什么

我们知道,在网络的世界中,数据之间的主要在计算机之间进行传递。然而,这些计算机却由各种不同的厂商生产,型号各异,甚至运行着完全不同的操作系统。那么是什么促使这些形态各异的计算机彼此连接,相互通信呢?答案就是依靠TCP/IP协议族。

TCP/IP为什么被称为协议族呢?原因在于它不仅仅是单个协议,而是一组不同层次上的多个协议的组合。

四层模型

网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。传统上,我们将网络分为七层,即著名的OSI七层模型。这样做的好处是显而易见的,通过将一个复杂的流程,分化为一些功能独立的子进程,可以有效的降低复杂度。同时使流程更加清晰,出现问题也可以更加快速的定位。

在TCP/IP协议族中,将协议系统划分为四层,每一层负责不同的功能:

  • 数据链路层:有时也被成为链路层或者网络接口层,一般包括计算机中的网卡以及对用的驱动程序。数据链路层主要负责处理从电缆,网线等传输媒介传递过来的信号,将其转化为对应的二进制数据。

  • 网络层:网络层也被成为互联网层。这一层中主要负责管理数据分组在网络中的活动,例如数据分组传输的选路。在TCP/IP协议族中,网络层主要包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议)以及IGMP协议(Internet组管理协议)。

  • 传输层:传输层中主要负责为计算机中的应用程序提供端到端的通信。这一层的主要协议是TCP协议和UDP协议。这两个协议互不相同:TCP协议的特点是高可靠性,他负责把应用程序交给它的数据分成合适的大小的数据块,然后交给下面的网络层或者反过来将网络层传过来的数据块拆解成适合应用程序使用的数据段传递给应用程序。TCP拥有非常完备的校验,分发,重传等确保数据传输可靠的手段,因此应用层可以无需考虑这些细节。而另一方面,UDP则是更注重传输效率的协议,它为应用程序提供快速简单的端到端的数据分组传输,而不确保这些数据能否真正的道道另一端。这两种协议各有优缺点,下面的内容会再次介绍。

  • 应用层:应用层可以简单理解为中计算机应用程序,我们日常接触的HTTP,FTP等协议就是这一层的协议。

当我们日常通过浏览器发送一条http请求的时候,http报文即从我们计算机的应用层开始向下传递,每经过一层,该层对应的协议就会在上层传来数据的基础上添加一个首部,这个首部中包含了该层协议所管理的一些信息。通过这种方式将数据层层打包最后经由数据链路层交给最下面的物理层传递出去,这些数据在互联网中经过数台路由器或其他代理服务器等设备,最终交给目标计算机。目标计算机得到数据后层层向上传递,每一层会将该层对应协议负责的首部摘除后再传给上层。最后抵达应用层对应的某个应用程序。

虽然实际的过程中充满了各种其他细节和问题,不过互联网一份数据的传输过程大体就是如上面所说的这样一个过程。

上面的这个过程可以用一张图来展示:

TCP/IP四层模型

下面我们就依据一份数据在各层中传递时的形式来逐个详细分析这四层每一层的特点

数据链路层

数据链路层位于TCP/IP四层模型的最底端,位于OSI七层模型的第二层。

数据结构

在这一层中,上层传来的数据经过协议处理后的一份数据,我们称之为一帧(Frame),下面一张图展示了链路层中一帧数据的格式

数据帧

目的地址与源地址

在链路层中的地址指的的是计算机中网卡的硬件地址,即mac地址。我们知道,每一个网卡在出厂时,其内部都存有一个全世界独一无二的硬件标识,称为mac地址,它是的长度为6个字节。在网络中,两个计算机之间的通信实际上就是计算机中的两张网卡之间的通信。如果没有mac地址,就无法得知通信的具体位置,因此获取mac地址是计算机通信的基础保障。

但是实际上,计算机程序在发送连接请求时,一般只知道目的主机的IP地址,那么mac地址是如何获取的呢?这就要靠ARP协议来实现。

ARP协议(地址解析协议)可以看做是链路层的一个协议,它的作用是为IP地址与对应的mac地址之间提供动态的映射,这个过程是自动完成的,因此无需用户或管理员关心。ARP协议将IP映射为mac地址的过程大致如下:

如果目的主机与源主机位于同一网段,那么ARP协议会向本网段发送一个广播,网段中的所有主机都会受到一条消息,这条消息询问哪台主机的IP地址与目的主机地址相同。当目的主机接受到这条消息,就做出应答,将自己的mac地址发送过去。其他主机则将这条消息忽略。

如果目的主机与源主机位于不同网段,那么ARP协议会将消息发送给本地的路由,路由经过IP寻址找到目的主机所在网段的路由,再由目的路由将消息广播出去,获得目的主机响应后再返回给源主机。

一般来说, 每台机器都维护的有一个ARP缓存表, 存储了近期的IP地址和硬件地址的映射关系, 可以用 arp -a 命令来查看缓存表中内容。

类型

类型字段通过一个2字节的数据来标识上层使用的协议,链路层通过这个字段来执行不同的操作,通常的类型有:TCP,ARP,RARP(逆地址解析协议)。

数据

帧中的数据即是上层传来的数据本身,数据的大小存在一个范围,其上限是由MTU(最大传输单元)所决定的。图中数据的大小范围为46到1500字节,1500这个上限是以太网标准所规定的MTU。实际上数据链路层支持着数种不同的传输标准,如以太网,IEEE 802.3,换回接口等不同标准下MTU的大小不尽相同,如IEEE 802.3规定MTU大小为1492。由于超出MTU的数据将被抛弃,因此如何处理MTU就至关重要。我们知道数据在传送到目的主机所在网络前将会经由数个路由转发,那么发送前就要确定的本地MTU应以两台通信主机路径中的最小MTU为依据。

CRC

CRC是数据的校验码, 又称为校验和,这是根据数据内容通过算法生成的一个摘要,确保数据传输正确。

注意:上面这个数据格式是以太网标准下的数据封装格式,实际上链路层同时着支持多种标准,在这些标准下数据的封装格式不尽相同,不过由于篇幅有限,这里不再做展开。

网络层

网络层位于链路层的上方,在这一层中,主要由TCP/IP协议族最为核心的协议:IP协议来处理和传输数据。IP协议是一种不可靠,无连接的数据传输服务。所谓不可靠,意思是IP协议不能保证数据能够成功到达目的地,IP协议提供最好的传输服务,但是如果传输过程中发生错误,数据丢失,IP协议将发送一个消息给上层,因此可靠性需要由上层来实现。而无连接的意思是IP协议不会为何任何关于数据的状态信息。对于IP协议来说,数据之间都是独立的,前后两个数据的接受和发送顺序可能会改变。

数据格式

和数据链路层一样,由IP协议处理过的数据拥有自己的名字:IP数据报,让我们从下图来了解一下IP数据报的格式:

ip数据报格式

从图中可以看出,一个IP数据报由首部和数据组成。数据即上层传来的数据本体,而首部则是由IP协议添加的,通常长度为20个字节。这里主要介绍IP首部的各个字段含义。

协议版本

一个4位二进制数的标识,用来标识IP协议的版本,目前大部分的协议版本号为4,因此IP有时也称为IPv4。目前另一种新的版本正在逐步被推广,即IPv6。IPv6主要解决IPv4地址不足的问题,关于IP地址的问题会在下面介绍。

首部长度

首部长度指的是IP的首部占32位的数目。前面说IP数据报首部一般为20字节,但如果首部存在选项,那么首部长度可能会超过20字节。由于首部长度字段是一个4位的二进制数,因此首部的长度最长为60的字节。

TOS服务类型

服务类型长度为8位。其中3位位优先权子字段,这个字段现在已经被忽略了;4位用来标识TOS子字段;剩下的1位是未用字段,必须置为0。

TOS子字段的4位分别标识:最小时延、最大吞吐量、最高可靠性和最小费用。这4位中只能选择1位设为1.如果4位都为0,那么IP协议将选择默认的一般服务。值得注意的是,现在大多数的TCP/IP实现都不支持TOS的这些特性,因此关于这些字段的详细内容请参考官方文档,这里不做详细介绍。

总长度

一个16位的二进制数表示的是整个IP数据报的长度,它的单位是字节。利用首部长度和总长度字段,就可以算出数据报中数据部分的其实位置和长度,它是首部中必不可少的内容。原因在于网络层下面的数据链路层存在着最小的数据大小限制,如以太网中为46字节。但是IP数据报的大小可能小于这一数字,因此链路层会对不足部分进行填充。而如果没有总长度字段,接受方的IP层就无法得知46字节中有多少是实际的数据。

总长度字段为16位,意味着整个数据报大小可达65535字节,然而实际上大多数链路层会将它进行切分,即分片处理。同时,上层的TCP协议和主机不能接受超过576字节数据报等限制,IP数据报的长度通常无法达到65535字节这一上限。

标识、标志和片偏移

标识字段是主机发送的 每一份数据报的唯一标识,通常没法送一份报文,它的值就会加1。它与标志和片偏移字段用来实现数据报分片技术。IP分片是将一份数据分割成多份数据报的一种技术,本文不做详细介绍。

TTL

TTL(time-to-live)是指一份数据报的生存时间,它表示数据报最多可以经过多少个路由器。TTL的初始值由源主机设定,一但经过一个处理它的路由器,TTL的值就减去1,当这个字段的值为0时,这份数据报就会被丢弃,并发送消息通知源主机。

协议

协议字段用来标识是哪个协议像IP传送数据,根据上层使用协议的不同,IP处理数据报的行为也不同。

首部校验和

校验和是根据IP首部计算出的一个值,它不对首部后面的数据进行计算。接收方在接收到数据报后同样对首部求值,一旦计算结果与校验和不符,那么IP将丢弃这个数据报。指的注意的是IP不会发送错误报文,而是交给上层去发现丢失了数据报并进行重传。

源地址与目标地址

即IP地址,他们是一个32位的值。为了便于查看,通常IP地址会以每8位转成一个10进制的数字的方式变为4个10进制数,并且4个数字之间用 . 来划分。这种表示方法称为点分十进制。

一个IP地址分为网络位和主机位,网络为用来划分不同的网络,主机位用来区分网络中的特定的某一主机。根据网络位的长度,IP地址被划分为5类:A、B、C、D、E。

  • A类IP地址: 一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。

  • B类IP地址: 一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。

  • C类IP地址: 一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。

上面三类IP地址是主要IP地址,其中存在一些特殊地址如:全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。

同时在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下: A类地址:10.0.0.0~10.255.255.255 B类地址:172.16.0.0~172.31.255.255 C类地址:192.168.0.0~192.168.255.255。这三种地址是一个网段内部使用,通常无法与公共IP进行通信。

至于D类地址和E类地址。但这两类地址用途比较特殊,在这里只是简单介绍一下:D类地址称为广播地址,供特殊协议向选定的节点发送信息时用。E类地址保留给将来使用。

除了以上的IP分类外,网络之间彼此划分还有赖于另一个概念:子网掩码。

简单来说,一个子网掩码用来标识一个IP地址中的网络位的长度。一个子网掩码也是32个二进制位,其对应IP的网络部分用1表示,对应IP地址的主机部分用0表示。将一个IP地址和子网掩码做逻辑与运算就可得到这个IP地址得到网络位。而网络位不同即表示两台主机位于不同的网络之中。

综上所述,一个完整的IP地址通常由IP加子网掩码组成。


网络层中最重要的协议就是IP协议,而IP协议又是TCP/IP协议族的核心内容,本文碍于篇幅所限,很多关于IP协议的详细内容如IP选址等都没有介绍,感兴趣的朋友建议阅读相关文档和书籍来进一步了解。

传输层

传输层中主要有TCP和UDP两种协议。本文着重讲解TCP协议的相关特性。

TCP协议即传输控制协议,它为应用程序提供端到端的连接服务,是一种面向连接的,可靠的字节流服务。面向连接意味着,两个使用TCP的应用,在交换数据之前必须先建立一个TCP连接。如同打电话,首先要拨号,然后等待对方响应后才能彼此交流。可靠性是指TCP协议拥有数种保证数据切实被另一方接受的方法。

数据格式

TCP协议负责接收从应用层传来的数据,它不对其内容最任何解释(意味着TCP无法得知传输的数据是二进制数据还是ascii字符),直接将数据添加上TCP首部,成为一个TCP报文段。一个TCP报文段的结构如下图所示:

TCP报文段

从图中可以看出,一个TCP数据段的首部如果不计任选字段,其大小通常为20个字节。下面我们来逐一分析首部的字段:

源端口号和目标端口号

每隔TCP数据段都包含这两个字段,用于寻找发送和接收端应用程序的进程。这两个值加上IP首部中的IP地址即可确定一个唯一的TCP连接。一个端口号的的长度为16位,这就是为什么计算机中的端口号最多为65535的原因。在这写端口中,存在这一些私有端口,即被计算机或一些应用程序保留的端口,如80端口用于HTTP协议,21端口用于FTP协议等。

序号与确认序号

序号(SYN)是一个32位的数值,用来标识从TCP发送端想TCP接收端发送的数据,它表示在这个报文段中的数据的字节长度。这个字段的值是累计的,下一次发送的数据段的序号总为上一个数据段的序号加当前数据段数据的字节长度。

与序号相对,确认序号(ASK)表示接受方所收到的下一个序号的初始值,因此确认序号是上次已经成功收到的数据段序号加1,只有ACK标志(下面会提到)被设为1时,确认序号字段才有效。

通过序号与确认序号可以保证发送端发送的每一条数据报都被接收端成功接收,如果中间丢失了一些文件,那么两者就无法匹配,发送端就会重新发送从丢失处开始的所有数据。

首部长度

同IP数据报一样,这个字段表示首部长度为多少个32位。由于TCP首部存在可选字段,因此这个字段必须存在。

保留位

保留位是个6位的标识,通过把其中的一位设为1可以表示6中不同的含义:

  • URG:使紧急指针有效。
  • ACK:使确认序号有效。
  • PSH:接收方应尽快将这个报文段交给应用层。
  • RST:重建连接。
  • SYN:用来表示发起连接。
  • FIN:用来表示结束请求结束连接。
窗口大小

这一字段用来进行TCP传输的流量控制,这个大小的单位字节数,表示接收端期望接受的字节。它的长度为16位,即最大65535字节。通过首部选项改变窗口刻度,这个值可以按比例扩大,这一技术成为滑动窗口。相关知识这里不做详解。

校验和

同样如同上文,校验和用于验证数据是否改变,这是一个强制性的字段,由发送端进行计算和存储,由接收端进行验证。

紧急指针

只有URG标志位1的时候这个字段才有效。它使一端可以告诉另一端有些具有某种方式的“紧急数据”存放于普通的数据流中,这个字段的值是一个正的偏移量,通过与首部的序号相加即可得出紧急数据的最后一个字节的序号。它的具体使用方法这里就不做介绍。

TCP连接的建立与断开

由于TCP是一种面向连接的协议,在两端间传输数据之前要先建立一个虚拟的连接。相信对TCP有过了解的朋友都听说过所谓“三次握手”、“四次挥手”,它描述了TCP连接之前,发送端与接受段需要进行的三次信息传递以及连接断开之前要做的4次信息传递。这两个个过程可以通过下图来简单展示:

三次握手与四次挥手

三次握手的过程可以简单描述如下:

  • 第一次握手主机A通过一个标识为SYN标识位的数据段发送给主机B请求连接,通过该数据段告诉主机B希望建立连接,需要B应答,并告诉主机B传输的起始序列号。
  • 第二次握手是主机B用一个确认应答ACK和同步序列号SYNC标志位的数据段来响应主机A,一是发送ACK告诉主机A收到了数据段,二是通知主机A从哪个序列号做标记。
  • 第三次握手是主机A确认收到了主机B的数据段并可以开始传输实际数据。

四次挥手的过程可以简单描述如下:

  • 主机A发送FIN控制位发出断开连接的请求。
  • 主机B进行响应,确认收到断开连接请求。
  • 主机B提出反方向的关闭要求。
  • 主机A确认收到的主机B的关闭连接请求。

实际上这两个过程中存在着一些比较复杂的特殊情况和状态转移,碍于篇幅所限,这里就不过多介绍了。

应用层

作为前端而言,我们最熟悉也是使用最多的应用层协议就是HTTP协议,HTTP协议又叫超文本传输协议,它的请求发送和接受相应依靠的基础便是以上几层中的协议。由于HTTP协议内容复杂,同时它是我们前端开发者所必须详细掌握的内容,这篇文章就不做过多叙述。有时间我会单独再开一篇文章来详细解析HTTP协议的种种内容和特性,敬请期待!


尾声

这篇文章从头至尾主要是介绍了一份数据,在不同的网络层,不同的协议中所对应的不同形式。通过了解这些数据形式,可以使我们对每一层中的主要特性有一个大致的了解。如文章开头所言,作为一名前端开发者,了解这些知识可能不会对你实际编写代码有什么帮助,但是却可以让我们在网络传输出现问题的时候快速定位其出错位置,帮助后端开发人员解决相关的问题,从而提升我们在团队中的价值。然而另一方面,因为我们的目的并不是要成为一名网络通讯专家,因此这篇文章基本是一种走马观花式的介绍,很多深入且重要的内容通通一笔带过了。对此有兴趣有志向的朋友可以通过阅读书籍等相关资料来加深对这些知识的理解。

最后还是老规矩,这篇文章期望用最易理解的方式和语言带大家了解TCP/IP协议族的相关内容,但由于作者自己水平有限,文章中难免出现疏漏。如果您发现了文章中的一些问题,欢迎在留言中提出,我会尽量回复这些评论,及时把错误更正。


参考与引用

TCP/IP协议知识科普
《TCP/IP 协议详解 卷一:协议》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值