TCP/IP-页面被完整送到浏览器

TCP/IP-页面被完整送到浏览器

Posted by limantang on August 12, 2019

TCP/IP-页面文件完整送到浏览器

衡量页面性能时有一个重要的指标叫做FP(first paint), 是指从页面加载到首次开始绘制的时长, 这是一个很重要的指标, 其中影响它的一个重要因素就是网络加载速度

一个数据包的旅程

互联网中的数据通过数据包来传输, 如果发送的数据很大, 那么该数据就会被拆分为很多小的数据包来传输

  1. 数据包如何送达主机

    数据包要在互联网上传输, 就要符合网际协议(Internet Protocol, 简称IP)标准, 互联网上不同的在线设备都有唯一的地址, 计算机的地址就成为IP地址, 访问任何网站实际上只是你的计算机向另外一台计算机请求信息而已

    数据包从主机A发送给主机B, 传输之前, 数据包会被附加上主机B的IP地址信息, 这样是为了保证正确的寻址, 额外的数据包还会附加主机A本身的IP地址, 这样主机B才可以回复消息给主机A, 这些信息会被装进IP头数据结构里, IP头是IP数据包开头的信息, 包括IP版本, 源IP地址, 目的IP地址, 生存时间

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

    • 上层(应用层, 传输层等)将数据包交给网络层
    • 网络层再将IP头附加到数据包上, 组成新的IP数据包, 交给底层
    • 底层通过物理网络将数据包传送给主机B
    • 主机B拆开数据包的IP头信息, 将拆开的数据部分交给上层
    • 最终数据包到达了主机B的上层
  2. 数据包送到应用程序

    IP是很底层的协议, 只负责把数据包送到对方的电脑, 但是对方电脑并不知道把数据包交给哪个程序, UDP(User Data Protocol 用户数据包协议)就是基于IP之上能和应用打交道的协议

    UDP中最重要的信息是端口号, 通过端口号UDP就可以把制定的数据包发送给指定的程序了所以IP通过IP地址信息把数据包发送给指定的电脑, 而UDP通过端口号把数据包分发给正确的程序

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

    • 上层(应用层, 传输层等)将数据包交给传输层
    • 传输层会在数据包前面附加上UDP头, 组成新的UDP数据包, 而将新的UDP数据包交给网络层
    • 网络层再将IP头附加到数据包上, 组成新的IP数据包, 交给底层
    • 底层通过物理网络将数据包传送给主机B
    • 主机B拆开数据包的IP头信息, 将拆开的数据部分交给上层
    • 在传输层, 数据包中UDP头会被拆开, 并且根据UDP中所提供的的端口号把数据部分交给上层应用程序
    • 最终数据包到达了主机B的上层

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

    虽然UDP不能保证数据可靠性, 但是传输速度却非常快, 所以UDP会应用在一些速度关注,但是不严格要求数据完整性的领域, 游戏, 在线视频

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

    对于浏览器, 邮件这类要求数据可靠性传输的应用, UDP是无法满足要求的

    • 数据包传输过程中容易丢失
    • 大文件会被拆成小数据包来传输, 这些小数据包经过不同的路由, 并在不同的时间到达终端, UDP不知道如何组装这些数据包还原成完整的文件

    基于这两个问题引入了TCP(Transmission Control Protocol, 传输控制协议), 是一种面向连接的, 可靠的, 基于字节流的传输层通信协议

    相对于UDP, TCP的两个特点

    • 对于数据丢失提供重传机制
    • TCP一如数据包排序机制, 用来把乱序的数据包组合成为一个完成的文件

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

    一个完整的TCP连接的生命周期包括了建立连接, 传输数据, 断开连接三个阶段

    • 首先建立连接, 通过三次握手来建立客户端和服务器之间的连接, TCP提供面向连接的通信传输, 面向连接是指在数据通信开始之前先做好两端之间的准备工作, 所谓三次握手, 是指在建立一个TCP连接时, 客户端和服务端总共要发送三个数据包以确认连接的建立
    • 其次传输数据阶段, 在该阶段, 接收端会对每个数据包进行确认操作, 也就是接收端在接收到数据包之后, 需要发送数据包给发送端, 所以当发送端发送一个数据包之后再规定时间内没有收到客户端反馈信息, 就判定数据包丢失, 并触发发送端重发机制, 同样的一个大文件会被拆分为很多小数据包, 这些数据到达接收端之后, 接收端按照TCP头中的序号为其排序, 从而保证数据完整性
    • 最后断开连接, 数据传输完毕之后, 要终止连接, 通过四次挥手来保证双方都能断开连接

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