杂谈——TCP/IP 协议栈详解

Posted 青城博雅教育科技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杂谈——TCP/IP 协议栈详解相关的知识,希望对你有一定的参考价值。

说到协议栈,我们就先来看看它的定义是什么。 


TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。

本帅博主之前写过一篇关于OSI模型的博客,OSI模型采用了七层结构,分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。


而TCP/IP 协议则采用4层结构,分别是应用层、传输层、网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成自己的需求。由于我们大部分时间都工作在应用层,下层的事情不用我们操心;其次,网络协议体系本身就很复杂庞大,入门门槛高,因此很难搞清楚TCP/IP的工作原理,通俗一点讲就是,一个主机的数据要经过哪些过程才能发送到对方的主机上。


这个过程需要好好了解一下,而咱们今天的任务,就是一起探索一下这个过程。


1.TCP/IP协议的基本框架

物理介质就是把电脑连接起来的物理手段,常见的有光纤、双绞线,以及无线电波,它决定了电信号(0和1)的传输方式,物理介质的不同决定了电信号的传输带宽、速率、传输距离以及抗干扰性等等。


上文说到TCP/IP协议栈分为四层,其中每一层都由特定的协议与对方进行通信,而协议之间的通信最终都要转化为 0 和 1 的电信号,通过物理介质进行传输才能到达对方的电脑,因此物理介质是网络通信的基石。


下面我们通过一张图先来大概了解一下TCP/IP协议的基本框架:



当通过http发起一个请求时,应用层、传输层、网络层和链路层的相关协议依次对该请求进行包装并携带对应的首部(如上图所示),最终在链路层生成以太网数据包,以太网数据包通过物理介质传输给对方主机,对方接收到数据包以后,然后再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。



一般情况下,快递是不能直达的,需要先转发到对应的配送站,然后由配送站再进行派件。




有了整体概念以后,下面我们详细了解一下各层的分工。


1、链路层

网络通信就是把有特定意义的数据通过物理介质传送给对方,单纯的发送 0 和 1 是没有意义的,要传输有意义的数据,就需要以字节为单位对 0 和 1 进行分组,并且要标识好每一组电信号的信息特征,然后按照分组的顺序依次发送。以太网规定一组电信号就是一个数据包,一个数据包被称为一帧, 制定这个规则的协议就是以太网协议。一个完整的以太网数据包如下图所示:


杂谈——TCP/IP 协议栈详解


整个数据帧由首部、数据和尾部三部分组成。


数据最短为46个字节,最长为1500个字节,如果需要传输的数据很长,就必须分割成多个帧进行发送;

尾部固定为4个字节,表示数据帧校验序列,用于确定数据包在传输过程中是否损坏。

因此,以太网协议通过对电信号进行分组并形成数据帧,然后通过物理介质把数据帧发送给接收方。那么以太网如何来识接收方的身份呢?




所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。


2、网络层

对于链路层中的工作流程过程,有几个细节问题值得我们思考:


发送者如何知道接收者和自己同属一个子网?

如果接收者和自己不在同一个子网,数据包如何发给对方?

为了解决这些问题,网络层引入了三个协议,分别是IP协议、ARP协议、路由协议。


(1)IP协议






(2)ARP协议




cmd输入 arp -a 就可以查询本机缓存的ARP数据。


(3)路由协议



而完成这个路由协议的物理设备就是路由器,在错综复杂的网络世界里,路由器扮演者交通枢纽的角色,它会根据信道情况,选择并设定路由,以最佳路径来转发数据包。


(4)IP数据包


在网络层被包装的数据包就叫IP数据包,IPv4数据包的结构如下图所示:


杂谈——TCP/IP 协议栈详解


从上图我们可以看到,IP数据包由首部和数据两部分组成。


数据部分的最大长度为65515字节,理论上一个IP数据包的总长度可以达到65535个字节,而以太网数据包的最大长度是1500个字符,如果超过这个大小,就需要对IP数据包进行分割,分成多帧发送。


3、传输层


那如何确定是哪一个应用呢? 


传输层引入了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协议可以保证数据传输的可靠性。


4、应用层

理论上讲,有了以上三层协议的支持,数据已经可以从一个主机上的应用程序传输到另一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操作性差。


因此,应用层定义了各种各样的协议来规范数据格式,常见的有 HTTP、FTP、SMTP 等。HTTP 是一种比较常用的应用层协议,主要用于B/S架构之间的数据通信,其报文格式如下:



在 Resquest Headers 中,Accept 表示客户端期望接收的数据格式,而 ContentType 则表示客户端发送的数据格式;在 Response Headers 中,ContentType 表示服务端响应的数据格式,这里定义的格式,一般是和  Resquest Headers 中 Accept 定义的格式是一致的。


有了这个规范以后,服务端收到请求以后,就能正确的解析客户端发来的数据,当请求处理完以后,再按照客户端要求的格式返回,客户端收到结果后,按照服务端返回的格式进行解析。


所以应用层的主要工作就是定义数据格式并按照对应的格式解读数据。


5、全流程

首先我们梳理一下每层模型的职责:


传输层:定义端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序;

应用层:定义数据格式,并按照对应的格式解读数据。

然后再把每层模型的职责串联起来,用一句通俗易懂的话讲就是:



6、总结

TCP/IP四层模型每一层模型都有很多协议,每个协议要做的事情也很多,但我们首先得有一个清晰的脉络结构,掌握每一层模型最基本的作用,然后再去丰富细枝末节的东西,也许会更容易理解。


 


好啦,以上就是关于TCP/IP协议栈的相关知识总结啦!


以上是关于杂谈——TCP/IP 协议栈详解的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP协议栈及OSI参考模型详解

TCP/IP 协议栈

TCP/IP协议栈

几个主流TCP/IP协议栈介绍

TCP/IP 协议栈

TCP/IP协议栈概述及各层包头分析