# 前言
衡量Web性能有一个指标FP(First Paint):页面加载到首次开始绘制的时长。该指标直接影响用户的跳出率,更快的页面响应意味着更多的PV、更高的转化率。
网络加载速度是影响FP的一个重要指标。
HTTP、WebSocket,它们都是基于TCP/IP的。
# 互联网 -- 一套理念和协议组成的体系架构
协议是一套众所周知的规则和标准,如果各方都同意使用,那么通信将变得毫无障碍。
互联网传输是通过数据包进程传输的,一个大的文件数据一般会被拆分成很多的数据包来进行传输,并非一个大的文件一次性传输的,但是数据包在传输的过程中会有很大概率会丢失或出错。
# IP -- 传输数据包
数据包要在互联网上进行传输,就需要符合网际协议(IP -- Internet Protocol)标准。只要是在互联网上在线的设备都有唯一的地址。
计算机的地址就称为IP地址,访问网站实际是一台计算机向另一台计算机请求数据信息。
A主机想把数据包发送给B主机,传输之前,数据包会被附加上B主机的IP地址信息,另外也会附加上A主机本身的IP地址,有了这些信息,B主机才能回复信息给A主机,附加的信息会被放到IP头(IP数据包开头信息)的数据结构中
IP头:
- IP版本
- 源IP地址
- 目标IP地址
- 有效时间
# UDP -- 指定数据包送达的应用程序
基于IP之上开发的能和应用程序通讯的协议,用户数据包协议(User Datagram Protocol)。
UDP重要的关键是端口号,每个想要访问网络的程序都是需要绑定一个端口号的。通过端口号UDP就能把指定的数据包发送给指定的程序,类似于IP根据IP地址信息把数据包发送给指定的电脑主机,所以端口号会被放到UDP头中,UDP头 + 原始数据包组合成新的UDP数据包。
UDP头一般包含:
- 源端口号
- 目标端口号
为了支持UDP协议,IP地址传输的三层结构扩充为四层结构,在网络层和上层之间增加传输层。
优点:UDP传输速度快,UDP一般应用在一些关注速度,对于数据完整性要求不严格的领域(在线视频、互动游戏)。
缺点:UDP不能保证数据可靠性,使用UDP发送数据时候,有很多因素导致数据包出错,虽然UDP可以校验数据是否正确,但是对于错误的数据包UDP并不提供重发机制,只是丢弃当前的包,并且UDP在发送之后也无法知道是否到达目标主机。
# TCP -- 确保数据包完整送达应用程序
对于浏览器or邮件此类要求数据传输可靠性(reliability)的应用,如果使用UDP传输会存在两个问题:
- 数据包传输过程中容易丢失
- 大文件被拆分成很多小的数据包进行传输,小的数据包经过不同的路由,在不同的时间点到达目标主机,UDP协议是无法知道组装这些数据包还原完整的文件
所以引入了TCP(Transmission Control Protocol,传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP机制:
- 对于数据包丢失,TCP支持重传机制
- TCP引入数据包排序机制,确保乱序的数据包能组装还原成完整的文件
TCP头:
- 本机端口号
- 目标端口号
- 排序序列号(便于接收端通过序号重排数据包)
# TCP连接生命周期
- 建立连接
通过三次握手,客户端服务端建立连接。
TCP提供面向连接的通信传输。面向连接是指在数据传输之前先做好两端之间连接的准备工作。
三次握手是指建立一个TCP连接时,客户端服务端总共需发送三个数据包来确认连接建立。 - 传输数据
重发机制:接受端需要对每个数据包进行确认操作,接受端接收到数据包后,需要发送”确认数据包”给发送端。当发送端发送一个数据包,规定时间内没有接收到接收端反馈的确认消息,则判断数据丢失,触发发送端重发机制。
序号排序:一个大文件传输过程被拆分成很多数据包,数据包到达接收端后,接收端按照TCP头中的序号进行排序,确保组装成完整的数据。 - 断开连接
四次挥手确保双方断开连接。
TCP为了保证数据传输的可靠性,牺牲了数据包的传输速度,因为“三次握手”和“数据包校验机制”等把传输过程中的数据包的数量提高了一倍。
# 总结
- 互联网通过数据包来传输信息,数据包在传输过程容易丢失出错
- IP负责把数据包送达给目标主机
- UDP负责把数据包送达具体应用
- TCP确保了数据传输的完整性,牺牲了数据包传输速度
- TCP连接三个阶段:建立、传输、断开