TCP/IP 协议栈是一系列网络协议的总和,是构成网络通讯的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成本身的需求。因为咱们大部分时间都工做在应用层,下层的事情不用咱们操心;其次网络协议体系自己就很复杂庞大,入门门槛高,所以很难搞清楚TCP/IP的工做原理,通俗一点讲就是,一个主机的数据要通过哪些过程才能发送到对方的主机上。 接下来,咱们就来探索一下这个过程。html
物理介质就是把电脑链接起来的物理手段,常见的有光纤、双绞线,以及无线电波,它决定了电信号(0和1)的传输方式,物理介质的不一样决定了电信号的传输带宽、速率、传输距离以及抗干扰性等等。缓存
TCP/IP协议栈分为四层,每一层都由特定的协议与对方进行通讯,而协议之间的通讯最终都要转化为 0 和 1 的电信号,经过物理介质进行传输才能到达对方的电脑,所以物理介质是网络通讯的基石。服务器
下面咱们经过一张图先来大概了解一下TCP/IP协议的基本框架:网络
当经过http发起一个请求时,应用层、传输层、网络层和链路层的相关协议依次对该请求进行包装并携带对应的首部,最终在链路层生成以太网数据包,以太网数据包经过物理介质传输给对方主机,对方接收到数据包之后,而后再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。架构
网络通讯就比如送快递,商品外面的一层层包裹就是各类协议,协议包含了商品信息、收货地址、收件人、联系方式等,而后还须要配送车、配送站、快递员,商品才能最终到达用户手中。框架
通常状况下,快递是不能直达的,须要先转发到对应的配送站,而后由配送站再进行派件。tcp
配送车就是物理介质,配送站就是网关, 快递员就是路由器,收货地址就是IP地址,联系方式就是MAC地址。 post
快递员负责把包裹转发到各个配送站,配送站根据收获地址里的省市区,确认是否须要继续转发到其余配送站,当包裹到达了目标配送站之后,配送站再根据联系方式找到收件人进行派件。 ui
有了总体概念之后,下面咱们详细了解一下各层的分工。url
网络通讯就是把有特定意义的数据经过物理介质传送给对方,单纯的发送 0 和 1 是没有意义的,要传输有意义的数据,就须要以字节为单位对 0 和 1 进行分组,而且要标识好每一组电信号的信息特征,而后按照分组的顺序依次发送。以太网规定一组电信号就是一个数据包,一个数据包被称为一帧, 制定这个规则的协议就是以太网协议。一个完整的以太网数据包以下图所示:
整个数据帧由首部、数据和尾部三部分组成,首部固定为14个字节,包含了目标MAC地址、源MAC地址和类型;数据最短为46个字节,最长为1500个字节,若是须要传输的数据很长,就必须分割成多个帧进行发送;尾部固定为4个字节,表示数据帧校验序列,用于肯定数据包在传输过程当中是否损坏。所以,以太网协议经过对电信号进行分组并造成数据帧,而后经过物理介质把数据帧发送给接收方。那么以太网如何来识接收方的身份呢?
以太网规协议定,接入网络的设备都必须安装网络适配器,即网卡, 数据包必须是从一块网卡传送到另外一块网卡。而网卡地址就是数据包的发送地址和接收地址,也就是帧首部所包含的MAC地址,MAC地址是每块网卡的身份标识,就如同咱们身份证上的身份证号码,具备全球惟一性。MAC地址采用十六进制标识,共6个字节, 前三个字节是厂商编号,后三个字节是网卡流水号,例如 4C-0F-6E-12-D2-19
有了MAC地址之后,以太网采用广播形式,把数据包发给该子网内全部主机,子网内每台主机在接收到这个包之后,都会读取首部里的目标MAC地址,而后和本身的MAC地址进行对比,若是相同就作下一步处理,若是不一样,就丢弃这个包。
因此链路层的主要工做就是对电信号进行分组并造成具备特定意义的数据帧,而后以广播的形式经过物理介质发送给接收方。
对于上面的过程,有几个细节问题值得咱们思考:
发送者如何知道接收者的MAC地址?
发送者如何知道接收者和本身同属一个子网?
若是接收者和本身不在同一个子网,数据包如何发给对方?
为了解决这些问题,网络层引入了三个协议,分别是IP协议、ARP协议、路由协议。
经过前面的介绍咱们知道,MAC地址只与厂商有关,与所处的网络无关,因此没法经过MAC地址来判断两台主机是否属于同一个子网。
所以,网络层引入了IP协议,制定了一套新地址,使得咱们可以区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的IP地址。
IP地址目前有两个版本,分别是IPv4和IPv6,IPv4是一个32位的地址,常采用4个十进制数字表示。IP协议将这个32位的地址分为两部分,前面部分表明网络地址,后面部分表示该主机在局域网中的地址。因为各种地址的分法不尽相同,以C类地址192.168.24.1为例,其中前24位就是网络地址,后8位就是主机地址。所以, 若是两个IP地址在同一个子网内,则网络地址必定相同。为了判断IP地址中的网络地址,IP协议还引入了子网掩码, IP地址和子网掩码经过按位与运算后就能够获得网络地址。
因为发送者和接收者的IP地址是已知的(应用层的协议会传入), 所以咱们只要经过子网掩码对两个IP地址进行AND运算后就可以判断双方是否在同一个子网了。
即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议。其工做原理以下:
ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,而后这个数据包会在链路层进行再次包装,生成以太网数据包,最终由以太网广播给子网内的全部主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,而后和本身的IP地址进行比较,若是相同就返回本身的MAC地址,若是不一样就丢弃该数据包。ARP接收返回消息,以此肯定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留必定时间,下次请求时直接查询ARP缓存以节约资源。cmd输入 arp -a 就能够查询本机缓存的ARP数据。
经过ARP协议的工做原理能够发现,ARP的MAC寻址仍是局限在同一个子网中,所以网络层引入了路由协议,首先经过IP协议来判断两台主机是否在同一个子网中,若是在同一个子网,就经过ARP协议查询对应的MAC地址,而后以广播的形式向该子网内的主机发送数据包;若是不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。网关是互联网上子网与子网之间的桥梁,因此网关会进行屡次转发,最终将该数据包转发到目标IP所在的子网中,而后再经过ARP获取目标机MAC,最终也是经过广播形式将数据包发送给接收方。
而完成这个路由协议的物理设备就是路由器,在错综复杂的网络世界里,路由器扮演者交通枢纽的角色,它会根据信道状况,选择并设定路由,以最佳路径来转发数据包。
在网络层被包装的数据包就叫IP数据包,IPv4数据包的结构以下图所示:
IP数据包由首部和数据两部分组成,首部长度为20个字节,主要包含了目标IP地址和源IP地址,目标IP地址是网关路由的线索和依据;数据部分的最大长度为65515字节,理论上一个IP数据包的总长度能够达到65535个字节,而以太网数据包的最大长度是1500个字符,若是超过这个大小,就须要对IP数据包进行分割,分红多帧发送。
因此,网络层的主要工做是定义网络地址,区分网段,子网内MAC寻址,对于不一样子网的数据包进行路由。
链路层定义了主机的身份,即MAC地址, 而网络层定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就从能够从一个主机发送到另外一台主机。但实际上数据包是从一个主机的某个应用程序发出,而后由对方主机的应用程序接收。而每台电脑都有可能同时运行着不少个应用程序,因此当数据包被发送到主机上之后,是没法肯定哪一个应用程序要接收这个包。
所以传输层引入了UDP协议来解决这个问题,为了给每一个应用程序标识身份,UDP协议定义了端口,同一个主机上的每一个应用程序都须要指定惟一的端口号,而且规定网络中传输的数据包必须加上端口信息。 这样,当数据包到达主机之后,就能够根据端口号找到对应的应用程序了。UDP定义的数据包就叫作UDP数据包,结构以下所示:
UDP数据包由首部和数据两部分组成,首部长度为8个字节,主要包括源端口和目标端口;数据最大为65527个字节,整个数据包的长度最大可达到65535个字节。
UDP协议比较简单,实现容易,但它没有确认机制, 数据包一旦发出,没法知道对方是否收到,所以可靠性较差,为了解决这个问题,提升网络可靠性,TCP协议就诞生了,TCP即传输控制协议,是一种面向链接的、可靠的、基于字节流的通讯协议。简单来讲TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,若是有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。
为了保证传输的可靠性,TCP 协议在 UDP 基础之上创建了三次对话的确认机制,也就是说,在正式收发数据前,必须和对方创建可靠的链接。因为创建过程较为复杂,咱们在这里作一个形象的描述:
主机A:我想发数据给你,能够么?
主机B:能够,你何时发?
主机A:我立刻发,你接着!
通过三次对话以后,主机A才会向主机B发送正式数据,而UDP是面向非链接的协议,它不与对方创建链接,而是直接就把数据包发过去了。因此 TCP 可以保证数据包在传输过程当中不被丢失,但美好的事物必然是要付出代价的,相比 UDP,TCP 实现过程复杂,消耗链接资源多,传输速度慢。
TCP 数据包和 UDP 同样,都是由首部和数据两部分组成,惟一不一样的是,TCP 数据包没有长度限制,理论上能够无限长,可是为了保证网络的效率,一般 TCP 数据包的长度不会超过IP数据包的长度,以确保单个 TCP 数据包没必要再分割。
总结一下,传输层的主要工做是定义端口,标识应用程序身份,实现端口到端口的通讯,TCP协议能够保证数据传输的可靠性。
理论上讲,有了以上三层协议的支持,数据已经能够从一个主机上的应用程序传输到另外一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操做性差。所以,应用层定义了各类各样的协议来规范数据格式,常见的有 HTTP、FTP、SMTP 等,HTTP 是一种比较经常使用的应用层协议,主要用于B/S架构之间的数据通讯,其报文格式以下:
在 Resquest Headers 中,Accept 表示客户端指望接收的数据格式,而 ContentType 则表示客户端发送的数据格式;在 Response Headers 中,ContentType 表示服务端响应的数据格式,这里定义的格式,通常是和 Resquest Headers 中 Accept 定义的格式是一致的。
有了这个规范之后,服务端收到请求之后,就能正确的解析客户端发来的数据,当请求处理完之后,再按照客户端要求的格式返回,客户端收到结果后,按照服务端返回的格式进行解析。
因此应用层的主要工做就是定义数据格式并按照对应的格式解读数据。
首先咱们梳理一下每层模型的职责:
而后再把每层模型的职责串联起来,用一句通俗易懂的话讲就是:
当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包作了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通讯的应用程序;而后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,造成数据帧,采用广播方式,经过传输介质发送给对方主机。而对于不一样网段,该数据包首先会转发给网关路由器,通过屡次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,而后再经过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。
以上内容是对TCP/IP四层模型作了简单的介绍,而实际上每一层模型都有不少协议,每一个协议要作的事情也不少,但咱们首先得有一个清晰的脉络结构,掌握每一层模型最基本的做用,而后再去丰富细枝末节的东西,也许会更容易理解。
原创发布 @一像素 2017.06.29
更新: 2018.06.06
参考文献:
[1] 互联网协议入门(一)
[2] TCP/IP协议知识科普