网络中的传输层
在上篇文章中我们谈到了网络的分层模型(我的前端札记—初识网络分层模型 - 掘金 (juejin.cn)),而其中传输层可以说是模型中起承上启下的作用,所以我认为在前端的学习中了解传输中的相关协议还是有必要的。 传输层负责在两个网络节点的应用程序之间提供端到端的通信服务,即使是在不同网络上的进程也能进行有效的通信。并且在传输层中使用的是端口号来标识特定的应用程序或服务,从而允许不同应用程序在同一个主机上同时通信。本文主要了解TCP协议(因为在前端中较多用到的应用层协议大多基于TCP协议,如:HTTP/HTTPS、WebSocket等)。
传输层的两种协议
TCP
对于TCP我们要知道的是TCP协议是一种面向连接的、可靠的传输层通信协议,用于在不可靠的互联网中提供可靠的数据传输服务。
而TCP的三次握手与四次挥手并是为了保障我们连接的可靠,大致过程可参考下图, 其中符号分别代表:
- seq: 表示序列号
- ack: 确认号ack = 对方seq +1
- ACK: 确认序列号是否有效
- SYN: 发起新连接的标识
- FIN: 连接完成请求标识
为了更好的理解TCP的过程,我们可以通过Wireshark这个抓包工具对TCP连接建立和关闭的过程有更直观的了解,如图是我从中截取的某个TCP连接的建立过程:
从上图中我们可以看到,我从本机的65532端口开始向对方服务器的443端口发送了一条TCP连接请求,三次握手开始:
- 客户端发送一个带有SYN标志的TCP段至服务器,并且设Seq=0。
- 服务器接收到客户端的连接请求后,同样回复一个带有SYN、ACK的建立连接请求确认报文,并将请求的ack设为客户端Seq+1(确认已收到客户端的SYN请求),请求Seq设为0。
- 客户端同样接收到了服务端的请求后,向服务器最后发送一条ACK确认报文,并将ack设为服务器Seq+1(表示确认收到服务端SYN请求),至此,TCP连接建立,两端间开始进行通信。
然后就是TCP的连接断开过程:
本次连接的断开是由客户端发起,四次挥手开始:
- 客户端(源端口65532)发起连接关闭,发送一个带有FIN标志、Seq=3637的TCP段至服务器(目的端口443),同时客户端进入FIN_WAIT_1状态。。
- 服务器接收到客户端的FIN请求后,回复一个ACK确认报文,确认序号ack=3638,表示已收到客户端的FIN报文,此时服务器进入CLOSE_WAIT状态。
- 当服务器完成其发送任务后,也会向客户端发送一个带有FIN标志的TCP段,请求关闭服务器到客户端这个方向的连接,同时服务器进入LAST_ACK状态。
- 客户端接收到服务器的FIN请求后,回复一个ACK确认报文,此时客户端进入TIME_WAIT状态,等待2MSL时间以确保服务器收到其ACK确认。一旦确认服务器收到ACK,客户端将进入CLOSED状态。服务器在收到客户端的ACK后,也进入CLOSED状态,完成整个连接的关闭过程。
经过上述两端之间的相互拉扯才得以确保TCP连接的可靠性,当然上面描述的情况只是TCP连接建立的常见情况,期间可能出现异常TCP可通过序列号、确认应答、超时重传、拥塞控制等机制来确保数据的可靠传输。如果数据包在传输过程中丢失,TCP会自动重传丢失的数据包,直到数据被成功接收。
同时TCP可以进行流控制,TCP采用滑动窗口机制来进行流量控制,确保发送方的发送速率不会超过接收方的接收能力,避免接收缓冲区溢出。
UDP
TCP的设计目标是为了在网络条件不确定的情况下,为应用程序提供一个稳定、可靠的数据传输环境,然而,TCP的可靠性和稳定性是以增加网络延迟和计算资源消耗为代价的,而且并不是所有的请求都需要可靠性等特点,所以我们会有UPD协议。UDP适合于那些对延迟敏感、数据量不大、对数据丢失有一定容忍度的应用场景。
UPD主要有如下特点:
- 无连接:与TCP不同,UDP在数据传输之前无需建立连接,发送数据结束时也不需要终止连接。这意味着发送端可以随时向接收端发送数据,而无需事先通知接收端。
- 不可靠传输:UDP不保证数据的可靠传输,数据报可能在传输过程中丢失、重复或乱序到达。
- 低开销:由于UDP不提供复杂的错误校验、排序和重传机制,因此其头部开销比TCP小,数据传输速度更快,适用于实时性要求高的应用场景,如在线游戏、语音和视频通话等。
- 广播和多播:UDP支持广播和多播,可以将数据同时发送给多个接收者,主要应用在多媒体流媒体和网络管理中。
TCP与UPD的应用场景
TCP
- 文件传输:如FTP(File Transfer Protocol),需要确保文件传输的完整性和准确性。
- 网页浏览:如HTTP(Hypertext Transfer Protocol)和HTTPS(HTTP Secure),确保网页内容的正确加载。
- 远程登录:如SSH(Secure Shell),需要可靠的数据传输来保障命令执行和数据的安全。
- 数据库通信:如MySQL、Oracle等数据库服务,需要数据传输的准确性和一致性。
UDP
- 实时通信:如视频会议、在线游戏,实时性要求高,可以容忍少量数据包丢失。
- 多媒体流:如视频直播、音频流,实时播放,不希望因为等待重传数据而导致延迟。
- 域名解析(DNS):需要快速查询和响应,通常单个数据包即可完成