02 TCP 协议:如何保证页面文件能被完整送达浏览器
一、数据包的旅程
互联网中的数据是通过数据包来传输的,传输的两端需要有一个共同的协议标准,这样数据包才能正确发送,准确送达
数据包如何送达主机
数据包在网络上传输,要遵守 IP 协议,每一个网络设备都有一个唯一的标识,就是 IP 地址,用于在网络上寻址
1.1 主机 A 发送数据包给主机 B
- 传输前
数据包上附加主机 B 的 IP 地址,用于在接下来的传输过程中正确的寻址
数据包上附加主机 A 的 IP 地址,用于主机 B 收到数据包后回复主机 A
附加的信息放在 IP 头(IP 数据包开头),包含:IP 版本、生存时间、源 IP、目标 IP 等信息 - 传输中:上层数据包交给网络层,网络层附加 IP 头到数据包,组成 IP 数据包,交给底层
- 数据包通过物理网络达到主机 B
数据包到主机 B 的网络层,拆开数据包的 IP 头,然后将数据部分交给上层
如果主机 B 需要回复信息给主机 A,重复上面的流程即可
1.2 UDP:把数据包送达应用程序
IP 协议只负责把数据包送达目标主机,那到底是给哪个应用程序呢,这就需要有一个和应用程序打交道的协议,可以使用 UDP
UDP(User Datagram Protocol):用户数据报协议包含一个信息,就是端口号,通过端口号就能把置顶的数据包发送到指定的应用程序
那么端口号会被放在 UDP 头(用户数据报首部),包含:源端口、目的端口等信息
可以看出,主机 A 发送数据包给主机 B 的流程有了 UDP 应该是
传输前会先将数据包交给传输层,传输层在数据包前面上附加 UDP 头,组成 UDP 数据包,再将 UDP 数据包交给网络层
网络层再对数据包附加 IP 头,组成 IP 数据包,交给底层
数据包通过物理网络达到主机 B
数据包到主机 B 的网络层,拆开数据包的 IP 头,然后将数据部分(包含 UDP 头)交给传输层
数据包到达传输层,UDP 头就露出来了,那么此时拆开 UDP 头,查看里面的目的端口,将数据包交给对应端口号的目标应用
UDP 是不可靠(尽最大努力交付,不保证可靠交付,同时不使用阻塞控制)、无连接(发送之前不需要建立连接)的,但是速度快
应用场景:在线视频、对讲机、视频会议…
TCP:把数据完整的送达应用程序
TCP(Transmission Control Protocol):传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层协议
数据包丢失,TCP 提供重传机制
数据包乱序,TCP 提供数据包排序机制
TPC 和 UDP 一样,提供了源端口、目的端口,另外还提供了用于排序的序列号,用于接收端通过序列化来重排乱序的数据包
TCP 传输数据
- 传输数据前:需要建立连接,通过三次握手建立客户端和服务端的连接
- 传输数据时
接收端需要对每个数据包进行确认,即接收端收到数据包后,需要发送确认数据包给发送端,如果发送端发了数据包而没收到确认消息,则认为数据包丢失,会触发重发机制
大的数据包会拆分成小的数据包,这些小的数据包到达接收端后,接收端会根据 TCP 头中的序号进行排序,恢复成完整的数据 - 传输数据后:数据传输完毕后,需要终止连接,通过四次挥手确保客户单和服务端都能断开连接
二、总结
- 互联网中的数据通过数据包进行传输,数据包在传输过程中容易丢失或出错
- IP 负责把数据包送达至目的主机
- UDP 负责把数据包送达给目标应用
- TCP 保证数据完整传输,通信过程:三次握手建立连接、传输数据、四次挥手断开连接