本篇文章是总结一下最近所学, 关于TCP工作流程的一篇文章

带着如下思考我们来走进TCP: TCP是如何保证页面文件能被完整送达浏览器?

首先我们知道衡量Web页面性能的时候有一个重要指标,FP(First Paint), 他是指从页面加载到首次开始绘制的时长。我们一看就知道这个指标的重要性, 这完全是关联到用户在使用的时候会不会骂你。影响FP指标其中一个重要因素是网络加载速度

相同的网络环境下, 有的页面打开快, 有的打开慢, 有的视频加载快, 有的加载慢...., 但是不管快慢, 他们都是基于TCP/IP的, 我们用一个数据包来举例子。

这个一个关于数据包的"旅程"

互联网, 他实际上是一套理念和协议组成的体系架构. 只有各方都同意使用, 才能相互之间进行通信

互联网中的数据都是通过数据包来传输的。如果发送的数据很大, 那这条数据就会被拆分成很多个小数据包来传输

那怎么从一台电脑传输到另一台电脑的???

1. IP: 把数据包送达目的主机

数据包在互联网上进行传输, 就要符合网际协议(简称IP)标准。我们大家都知道, 每一台电脑上都有这样的一串数字,比如: 192.168.1.1, 这就是IP, 他是干嘛用的呢? 他就像是每个电脑的名字, 比如有人叫大V, 那我就知道了, 有人叫我。计算机就是通过IP地址来进行相互查找的。

计算机的地址叫做IP地址, 访问任何网站实际上只是你的计算机向另外一台计算机请求信息

如果你的主机A, 想要将数据包发送给我主机B, 在传输之前就要将这个数据包附加上主机B的IP地址信息, 这样就能在万千太主机中找到我的主机B, 当然还需要加上你的主机A本身的IP地址, 有了你的IP地址, 我才能将数据返回给。

为了方便理解, 将网络简单分为三层结构, 如下图:
image.png

我们一起来看一下从主机A到主机B的旅程:

  1. 上层将含有'阿里巴巴'的数据包交给网络层
  2. 网络层再将IP头附加到数据包上, 组成新的IP数据包
  3. 底层通过物理网络将数据包传输给主机
  4. 数据包被传输到主机B的网络层,在这里主机B拆开数据包的IP头信息, 并将拆开的数据部分交给上层
  5. 最终, 含有'阿里巴巴'信息的数据包就到达了主机B的上层。

image.png
2. UDP: 把数据包送达应用程序

我们知道IP是找到了对应的计算机, 但是一台计算机里肯定不止一个应用程序, 比如王者荣耀和爱奇艺是完全不同的应用程序, 如何找到对应的应用程序呢?

这就需要基于IP智商开发能和应用打交道的协议, 最常见的是"用户数据包协议", 简称UDP

UDP里面有啥啊?能有这么大能力...

UDP中一个最重要的信息是端口号, 噢哟?端口号原来有这样的作用哦....。通过端口号就能把指定的数据包发送给指定的应用程序了, 所以IP通过IP地址信息把数据包发送给指定电脑,而UDP通过端口号把数据包分发给正确的程序。

你肯定能想想到, 它和IP头一样, 端口号会被装进UDP头里面, UDP再和原始数据包合并组成新的UDP数据包

为了支持UDP协议, 我们把前面的三层结构扩展成四层结构, 在网络层上面增加了传输层, 如下图:
image.png

数据包从主机A到主机B的旅程:

  1. 上层将含有"阿里巴巴"的数据包交给传输层;
  2. 传输层会在数据包前加上UDP头, 组成新的UDP数据包, 再将新的UDP数据包交给网络层;
  3. 网络层再将I碰头加到数据包上, 组成新的IP数据包交给底层;
  4. 数据包被传输到主机B的网络层, 在这里主机B拆开IP头信息,并将拆开来的数据部分交给传输层;
  5. 在传输层, 数据包中得UDP头会被拆开, 并根据UDP中所提供的端口号, 把数据交给上层的应用程序;
  6. 最终, 含有"阿里巴巴"信息的数据包就旅行到了主机B的应用程序这里。

在使用UDP发送数据的时候, 有各种因素会导致数据包出错, 虽然UDP可以校验数据是否正确, 但是对于错误的数据包, UDP并不会提供重发机制, 只是丢弃当前的包, 而且UDP在发送之后也无法知道是否能达到目的地。

虽然UDP不能保证数据的可靠性, 但是传输速度很快。

3. TCP: 把数据完整的送达应用程序

UDP存在两个问题:

1. 在传输过程中, 容易丢包
2. 大文件会被拆分成很多个小的数据包, 接收到的时间肯定是不同的, UDP不知道如何组装这些数据包

TCP: 我能解决他的问题!!! 哇哦...., 你是谁??? TCP: 我是一种面向连接的、可靠的、基于字节流的传输层通信协议。

相对于UDP, TCP有以下两个特点:

  1. 对于数据包丢失情况, TCP提供重传机制
  2. TCP引入了数据包排序机制, 用来保证把乱序的数据包组成一个完整的文件。

和UDP一样, TCP仍然包含目标端口和本机端口号, 但是还提供了排序的序列号, 以便接收端通过序号来重排数据包。

我们来看看TCP下, 单个数据包的传输流程:
image.png

通过上图, 我们可以看出TCP和UDP流程差不多, 不同的地方在于, 通过TCP头的信息保证了一块大的数据传输的完整性。

下面我们再看下完整的TCP连接过程, 来看看他是如何保证重传机制和数据包的排序功能的。

一个完整TCP链接包括了三个阶段:"建立连接"、"传输数据"、"断开连接"。
image.png

首先,建立连接阶段

  1. 首先是客户端向服务端发送一个SYN来创建一个主动打开链接, 客户端把这端连接的序号定为随机数A。意思就是告诉服务端: 我要开启连接了。
  2. 服务端收到之后为客户端送回一个SYN/ACK。ACK的确认码为A+1,SYN/ACK这个包本身又有一个随机产生的序号B。此时服务端告诉客户端: 我准备好了, 连接吧。
  3. 最后, 客户端再次发送一个ACK。此时包的序号被设定为A+1,而ACK的确认码则是B+1。这样就完成了三次握手,进入了连接创建状态

其次, 传输数据阶段

在该阶段, 接收端需要对每个数据包进行确认操作, 也就是接收端在接收到数据包之后, 需要发送确认数据包给发送端。所以当发送端发送了一个数据包之后, 在规定时间内没有收到接收端反馈的确认消息, 则判断为数据包丢失, 并触发发送端的重发机制。

一个大文件在传输过程中被拆分成很多小数据包, 接收端会按照TCP头中的序号为其排序, 从而保证组成完整的数据

最后, 断开连接阶段
数据传输完毕之后, 就要终止连接了, 进入到最后一个阶段"四次挥手"来保证双方都能断开连接。

到这里我们大家就能明白, TCP为了保证数据传输的可靠性, 牺牲了数据包的传输速度, 因为"三次握手"和"数据包校验机制"等于把传输过程中的数据包的数量提高一倍。

总结:


  1. 我们知道了互联网中的数据是通过数据包来传输的, 数据包在传输过程中容易丢失或出错。
  2. IP负责找到对应主机
  3. UDP负责找到对应的具体应用
  4. TCP保证了数据的完整传输, 他分为三个阶段, 三次握手在第一个阶段。

大V是个啥
10 声望1 粉丝

喜欢前端,不断学习的自我驱动型!!!