在网络中,一个很大的文件,通常会被分为许多小的数据包进行传输,但是在小数据包传输的过程中,可能会有丢失,而且就算没有丢失,传送完成的顺序肯定也不相同,那么传送完成的小数据包又是怎么拼接成原来的数据呢?想知道这些,我们需要先了解一个数据包的旅程。
数据包的传输过程
想要理解数据包的传输过程,我们需要先分解一下他所包含的三部分传输过程,数据包到主机、主机将数据送达应用、以及数据包到应用的完整过程。
数据包到主机的过程
数据包想在互联网上进行传输,就要符合国际协议(internet protocol,简称IP)标准,不同的设备都有不同的ip,ip指的就是计算机的地址,访问其他网站,实际上就是你的计算机向另一台计算机请求信息。
因此如果想从主A发送数据到主机B,就需要知道主机B的ip地址,数据包就会附加上主机B的ip地址,这样在发送过程中,数据包才能正确寻址,除此之外,数据包还会附加上主机A自身的ip地址,这样方便主机B回复消息给主机A,这些信息会被存入ip头这一数据结构中,ip头主要包括的信息IP版本,源ip地址、目标ip地址、生存时间等。
引用一张图片,理解这个过程
-
主机A上层将含有信息的数据包交给网络层
-
网络层为数据包附加ip头,形成新的数据包,并将新的数据包发送给底层
-
底层通过物理网络将数据包传送到主机B
-
数据包被传送到主机B的网络层,主机B的网络层将ip头与数据包分离,并将分离出来的数据包上传到上层
-
最终含有信息的数据包到达主机B的上层
了解完这一步后,我们还需要知道,主机是如何将数据包发送给指定程序的
数据包传输到应用程序
ip是很底层的协议,只负责把数据传输到对方的电脑上,但是具体要传送到哪个应用程序,ip协议并不知道,这就需要另一个协议“用户数据包协议(user datagram protocol)”简称UDP
UDP中一个最重要的信息就是端口号,端口号就是一个数字,每个想访问网络的应用程序都需要绑定一个端口号。这样,通过端口号,就可以知道数据包需要发送给哪一个应用程序了,和ip一样,UDP的端口号也会被装入到UDP头中,UDP头和原始的数据包组合成新的数据包,并且,UDP头中也包含源端口号等信息。
引用一张图片,说明这个过程
-
主机A的上层将含有信息的数据包交给传输层
-
传输层附加UDP头到原始数据包,形成新的UDP数据包,并传输到网络层
-
网络层附加IP头到数据包,再次形成新的IP数据包,并发送到底层
-
数据包被传输到主机B的网络层,主机B在这里分离IP头与数据包,并将数据包发送到传输层
-
主机B在传输层分离UDP头与原始数据包,并将数据包发送到上层
-
最终含有信息的数据包到达主机B的上层应用程序
但是,在使用UDP发送数据包的时候,会有各种可能造成数据包出错,虽然UDP能够检验数据包是否出错,但是对于出错的数据包,UDP并不提供重发,只会丢弃当前出错的包,而且UDP发送后,也不知道数据包是否到达了目的地。
虽然UDP并不能保证数据的可靠性,但是速度非常快,因此适合于关注速度,但是不追求信息完整性的场景,如在线视频等
数据包到达浏览器的完整过程
对于浏览器请求以及邮件这类要求数据传输可靠完整的应用,如果使用UDP来传输,显然存在以下问题
-
数据包在传输过程中容易丢失
-
大文件可能会被分成无数的小数据包进行传输,这些小数据包会经过不同的路由,在不同时间到达接受端,但是UDP协议并不知道如何组装这些小数据包,将他们还原成原始数据
基于这两个问题,就引入了TCP协议(transmission control protocol,传输控制协议),是一种面向连接、可靠的、基于字节流的传输层通信协议,相比于UDP,TCP主要有以下特点
-
对于丢失的数据包,TCP提供重传机制
-
TCP引入数据包排序机制,用于将乱序的数据包还原成完整的数据
和UDP头不同的是,TCP头除了包含目的端口号、源端口号之外,还包含了用于排序的序列号,以便接收端可以通过序号进行数据包组合。
通过上图,我们可以发现,TCP的传输过程实际和UDP差不多,但是TCP可以通过TCP头包含的序列号,来将传输过来的小文件包组合成原来的大文件,保证大文件的完整性
下面,我们在了解一下TCP完整的连接过程,通过这个过程,我们就可以知道TCP是如何完成数据的重传以及小数据包的排序
建立连接阶段 建立连接主要通过”三次握手“来建立服务器与客户端的连接,即建立一个连接,需要服务器与客户端间发送三次数据包,确认连接建立完成
传输数据阶段 在该阶段,接收端需要对接受的每个数据包进行确认,即接收端在接收每个数据包后,都会给发送端回复确认信息的数据,如果发送端在规定时间内未接受到回复确认的数据包,就判定为该数据包丢失,则会重发该数据包。除此之外,一个大文件在传输过程中被分为许多小的数据包,这些小的数据包在到达接收端后,会根据TCP头中包含的序列号,还原成原始的大文件。
断开连接阶段 断开连接阶段,主要采用”四次挥手“
由此我们可知,TCP主要就是通过牺牲了传输的速度,换来了传输的可靠性,因为“三次握手”以及数据包校验,将数据包的传输量提升了一倍。