0%

02 | TCP协议:如何保证页面文件能被完整送达浏览器?

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

计算机的地址称为IP地址,访问任何网站实际上只是你的计算机向另外一台计算机请求信息。
image.png

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

  • 上层将“极客时间”的数据包交给数据层
  • 网络层再将IP头附加到数据包上,组成新的IP数据包,并交给底层
  • 底层通过物理网络将数据包传输给主机B
  • 数据包被传输到主机B的网络层,主机B拆分数据包的IP头信息,并将拆开的数据部分交给上层
  • 最后,含有“极客时间”信息的数据包就到达了主机B的上层

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

IP是非常底层的协议,只负责把数据包传送到对方电脑,但是对方并不知道要把数据包传输给哪个程序,是交给浏览器还是交给王者荣耀?因此,基于IP之上开发能和应用打交道的协议。最常见的就是“用户数据包协议(User Datagram Protocol),简称UDP

UDP中一个最重要的信息就是端口号,通过端口号UDP就能把指定的数据包发送给指定的程序。

IP通过IP地址信息把数据包发送给指定的电脑,UDP通过端口号把数据分发给正确的程序。

UDP头中除了目的端口,还有源端口信息。
image.png

数据包从主机A到主机B的过程

  • 上层将含有“极客时间”的数据包交给传输层
  • 传输层在数据包前面加上UDP头,组成新的UDP数据包,再将新的UDP数据包交给网络层
  • 网络层再将IP头附加到数据包上,组成新的IP数据包,并交给底层
  • 数据包被传输给主机B的网络层,在这里主机B拆分IP头信息,并将拆开来的数据交给传输层
  • 在传输层中,数据包的UDP头会把拆开,并根据UDP中提供的端口号,找到对应的程序,将数据交给上层的应用程序。
  • 最终,含有“极客时间”信息的数据就到了主机B的上层应用程序这里。

UDP存在的问题

  • UDP可以校验数据是否正确,但发送后无法确认数据是否到达目标程序
  • 数据有可能在传输过程中丢失,但是UDP不提供重传机制,丢失的数据无法再重发到目标程序

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

UDP存在的问题

  1. 不提供重传的机制,丢失的数据包无法被再次传输,导致数据容易丢失。
  2. 数据包在传输的过程中会被分成很多小的数据包来传输,这些小的数据包会经过不同的路由,并在不同的时间到达接收端。但是UDP协议并不知道该如何组装这些数据包,从而把这些数据包还原成完整的文件。

引入TCP

TCP是一种面向连接,可靠的,基于字节流的传输层通信协议。相对于UDP,TCP有以下两个特点:

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

和UDP头一样,TCP头除了包含了目标端口和本机端口号外,还提供了用于排序的序列号,以便接收端通过序号来重排数据包。

下图是TCP下单个数据包的传输过程:

image.png
再来继续看完整的TCP连接过程,通过这个过程我们就能明白TCP是如何保证重传机制和数据包的排序功能的。
image.png
一个完整的TCP连接的生命周期包括了“**建立连接” “传输数据 ” “断开连接” **这三个阶段。

  • 建立连接阶段。这个阶段通过三次握手来建立服务器端和客户端之间的连接。三次握手,就是指在建立一个TCP连接时,客户端和服务器端总共要发生三个数据包来确定连接的建立
  • 传输数据阶段。在该阶段,接收端需要对每个数据包进行确认操作,也就是接收端在接收到数据包之后,需要发送确认数据包给发送端。所以当发送端发送了一个数据包之后,在规定时间内没有收到接收端反馈的确认消息,则判断为数据包丢失,并触发发送端的重传机制。同样,一个大的文件在传输过程中会被拆分成很多小的数据包来进行传输,这些数据包到达接收端后,接收端会按照TCP头中的序号为其排序,从而保证组成完整的数据。
  • 最后,断开连接阶段。数据传输完毕之后,就要终止连接了,涉及到最后一个阶段“四次挥手”来保证双方都能断开连接。

TCP为了保证数据传输的可靠性,牺牲了数据包的传输速度,因此“三次握手”和“数据包校验机制”等把传输过程中的数据包的数量提高了一倍。

思考:如何理解HTTP和TCP的关系?

  1. HTTP和TCP都是TCP/IP协议簇的子集。
  2. HTTP属于应用层,TCP属于传输层,HTTP协议位于TCP协议的上层。
  3. 请求方要发送的数据,在应用层加上HTTP头以后会交给传输层的TCP协议处理,应答方接收到的数据包,在传输层拆掉TCP头以后交给应用层HTTP协议处理。
  4. 建立TCP连接后会顺序收发数据,请求方和应答方都必须依据HTTP规范构建和解析HTTP报文。