数据是如何传输的?
互联网中的数据是通过数据包来传输的,如果传输的数据很大,会被拆分为多个小的数据包来传输(比如音频、视频)。
主机A的数据,怎么知道要传到指定的主机B呢:IP
通过IP地址。IP地址是计算机的唯一地址。如果想要把一个数据包从主机A传到主机B,在传输之前,数据包会被附加一个IP头信息,如下图:
上层应用将数据包交给网络层,网络层附加IP头到数据包上,经过底层物理网络传输给主机B的网络层,解开IP头,把解开的数据交给上层应用。这样两端之间的数据包就完成了数据传输。
数据如何知道要到达哪个应用:UDP
IP是非常底层的协议,只负责把数据包传到对方的电脑,具体要把这个数据包应用在哪个程序,是某个聊天工具?还是某个网页?
这时候,基于IP之上,再加一个传输层,用来识别数据应该到达哪个应用。最常见的协议是UDP和TCP。
UDP:用户数据包协议(User Datagram Protocol)。UDP最重要的信息是端口号,每个想访问网络的程序都需要绑定一个端口号,通过端口号,UDP就能把指定的数据包发送给指定的程序。就是说,IP通过IP地址信息把数据包发送给指定的电脑,而UDP通过端口号把数据包分发给正确的程序。
和IP头一样,端口号会被装进UDP头里面,UDP头再和原始数据包合并组成新的UDP数据包。UDP头中包含源端口号和目标端口号等信息。
上层应用将数据包交给传输层,传输层在数据包前面加上UDP头,组成新的UDP数据包给到网络层,网络层再将IP头加到数据包上,组成新的IP数据包交给底层物理网络。底层把数据传到主机B,主机B的网络层拆开IP头,然后把数据交给传输层,传输层识别数据包上UDP头的端口号,把数据部分交给指定的上层应用。这样,数据就完成了从主机A到主机B指定程序的传输。
可是可是,UDP也有它自身的缺陷:UDP是不可靠的,在传输过程中,有各种因素会导致数据包出错,虽然UDP可以校验数据是否正确,但是对于错误的数据包,UDP并不提供重发机制,只是丢弃当前的包,并且UDP在发送之后无法知道是都到达了目的地。但是!正因为这样,UDP的传输速度是非常快的。在一些对速度要求比较高但不要求准确性的应用,仍然会采用UDP的传输方式,比如游戏、视频等应用。
如何把数据"完整地"送到指定的应用程序:TCP
对于大的数据包,传输过程中会被拆分为多个小包传输,那么如何保证每次传输的包顺序,以及完整地传输了数据呢。这里用到TCP协议。
TCP:传输控制协议(Transmission Control Protocol):是一种可靠的、面向链接的、基于字节流的传输层通信协议。
相对于UDP,TCP主要有两个特点:
- 针对数据包丢失的情况,TCP提供重传机制。
- 引入数据包排序机制,用来保证把乱序的数据包合成一个完整的文件。
和UDP头一样,TCP头除了包含目标端口和源端口号外,还提供了用于排序的序列号,以便接收端通过序号来重排数据包。
完整的TCP连接过程包括:建立连接、传输数据、断开连接。
建立连接:需进行“三次握手”。在数据通信开始之前先做好两端之间的准备工作,因此TCP也是属于面向连接的通信传输。
传输数据:接收端需要对每个数据包进行确认操作。如果发送端在规定时间内没有接收到接收端的反馈确认消息,则判断为数据包丢失,并触发发送端的重发机制。同样,一个大的文件在传输过程中会被拆分为很多小的数据包,这些数据包到达接收端后,接收端会按照TCP头中的序号为其排序,从而保证数据的完整性。
最后,断开连接阶段。“四次挥手”来保证双方都能断开连接。
总的来说:
- 互联网中的数据是同故宫数据包来传输的,在传输过程中容易丢失或出错。
- IP负责把数据包送到目的主机。
- UDP负责把数据包送到具体的应用。
- TCP保证数据完整地传输,它的连接分为三个阶段:建立连接、传输数据、断开连接。
参考:李兵《浏览器工作原理与实践》