UDP 的特点
- 无连接:UDP 是无连接的协议,不需要建立连接即可发送数据。
- 不可靠传输:UDP 不提供数据包的确认机制,也不保证数据包的顺序或是否送达。
- 低延迟:由于没有连接建立和维护过程,UDP 具有较低的传输延迟,适用于对延迟敏感的应用。
- 无流量控制:UDP 不进行流量控制,发送端可以以任意速度发送数据包。
- 简单性:UDP 协议头较短,开销小,仅包含源端口、目的端口、长度和校验和。
TCP 的特点
- 面向连接:TCP 是面向连接的协议,在数据传输前需要建立连接(三次握手)。
- 可靠传输:TCP 提供可靠的数据传输,保证数据包按序到达,并通过确认机制重传丢失的数据包。
- 流量控制:TCP 实现流量控制,通过调整发送窗口大小避免网络拥塞。
- 拥塞控制:TCP 包含拥塞控制算法,动态调整发送速率以防止网络拥塞。
- 数据完整性:TCP 提供数据包的校验和,确保数据在传输过程中不被篡改。
- 连接管理:TCP 提供连接建立和断开机制(四次挥手)。
UDP 和 TCP 的区别
特性 | UDP | TCP |
---|---|---|
连接类型 | 无连接 | 面向连接 |
传输可靠性 | 不可靠 | 可靠 |
传输顺序 | 不保证 | 保证按序传输 |
数据包重传 | 不支持 | 支持(通过确认和重传机制) |
流量控制 | 不支持 | 支持 |
拥塞控制 | 不支持 | 支持 |
延迟 | 低 | 相对较高 |
传输速度 | 快 | 较慢(由于可靠性机制) |
开销 | 低(协议头较短) | 高(协议头较长,包含更多信息) |
应用场景 | 实时应用(如视频、语音) | 可靠性高的应用(如文件传输、邮件) |
UDP 适用场景:
- 实时通信:如 VoIP(语音通信)、视频会议、在线游戏等,需要低延迟而不一定需要可靠传输的场景。
- 广播和组播:如局域网中的服务发现协议(如 mDNS、SSDP)等。
- 简单的请求-响应协议:如 DNS 查询、SNMP 等。
TCP 适用场景:
- 文件传输:如 FTP、SFTP,需要保证文件完整传输的场景。
- 电子邮件:如 SMTP、IMAP、POP3,需要可靠传输的场景。
- 网页浏览:如 HTTP、HTTPS,需要数据完整性和可靠性的场景。
- 数据库连接:如 MySQL、PostgreSQL 等,需要稳定和可靠数据传输的场景。
TCP 的三次握手(为什么三次)
三次握手过程
-
第一次握手:客户端发送 SYN
- 客户端向服务器发送一个 SYN(Synchronize Sequence Numbers)包,请求建立连接。
- 这个 SYN 包包含了客户端的初始序列号
Seq = x
。 - 客户端进入 SYN_SENT 状态。
Client -> Server: SYN, Seq = x
-
第二次握手:服务器发送 SYN-ACK
- 服务器收到客户端的 SYN 包后,发送一个 SYN-ACK 包给客户端,表示同意连接。
- 这个 SYN-ACK 包包含了服务器的初始序列号
Seq = y
,以及对客户端 SYN 包的确认Ack = x + 1
。 - 服务器进入 SYN_RECEIVED 状态。
Server -> Client: SYN, Seq = y, ACK, Ack = x + 1
-
第三次握手:客户端发送 ACK
- 客户端收到服务器的 SYN-ACK 包后,发送一个确认包 ACK 给服务器。
- 这个 ACK 包包含了对服务器 SYN 包的确认
Ack = y + 1
,以及客户端的下一个序列号Seq = x + 1
。 - 客户端进入 ESTABLISHED 状态,连接建立完成。
Client -> Server: ACK, Seq = x + 1, Ack = y + 1
- 服务器收到这个 ACK 包后,也进入 ESTABLISHED 状态,连接建立完成。
为什么需要三次握手?
1. 确认双方接收能力:
- 第一次握手:客户端发送 SYN 包,告诉服务器希望建立连接,并发送初始序列号
Seq = x
。 - 第二次握手:服务器发送 SYN-ACK 包,确认收到客户端的 SYN 包,并发送服务器的初始序列号
Seq = y
。 - 第三次握手:客户端发送 ACK 包,确认收到服务器的 SYN-ACK 包,并确认双方可以接收和发送数据。
2. 防止重复的历史连接初始化:
- 如果只进行两次握手,无法保证客户端和服务器都知道对方的接收能力。
- 三次握手确保双方都确认了各自的接收和发送能力,并且不会误认为过期的 SYN 包是一个新的连接请求。
3. 防止 SYN 洪泛攻击:
- 三次握手过程中的第二次握手(SYN-ACK)和第三次握手(ACK)有助于减轻 SYN 洪泛攻击的影响。
- 服务器在收到 SYN 包后,会为这个连接分配一定的资源,但只有在收到客户端的第三次握手 ACK 包后,才会正式分配更多资源。
- 这使得攻击者很难通过伪造大量 SYN 包来消耗服务器资源。
TCP 的四次挥手(为什么四次?)
四次挥手过程
-
第一次挥手:客户端发送 FIN
- 客户端向服务器发送一个 FIN(Finish)包,表示客户端已经没有数据要发送了,请求关闭连接。
- 这个 FIN 包包含了客户端的序列号
Seq = u
。 - 客户端进入 FIN_WAIT_1 状态。
Client -> Server: FIN, Seq = u
-
第二次挥手:服务器发送 ACK
- 服务器收到客户端的 FIN 包后,发送一个 ACK 包作为确认,表示已经收到客户端的关闭请求。
- 这个 ACK 包包含了服务器的确认号
Ack = u + 1
。 - 服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
Server -> Client: ACK, Ack = u + 1
-
第三次挥手:服务器发送 FIN
- 服务器确认完客户端的 FIN 包后,若服务器也没有数据要发送了,就会发送一个 FIN 包给客户端,表示服务器也准备关闭连接。
- 这个 FIN 包包含了服务器的序列号
Seq = v
。 - 服务器进入 LAST_ACK 状态。
Server -> Client: FIN, Seq = v
-
第四次挥手:客户端发送 ACK
- 客户端收到服务器的 FIN 包后,发送一个 ACK 包作为确认,表示已经收到服务器的关闭请求。
- 这个 ACK 包包含了客户端的确认号
Ack = v + 1
。 - 客户端进入 TIME_WAIT 状态,并在等待一段时间(通常为 2 * 最大报文段寿命,2 * MSL)后,进入 CLOSED 状态,正式关闭连接。
- 服务器收到这个 ACK 包后,立即进入 CLOSED 状态,正式关闭连接。
Client -> Server: ACK, Ack = v + 1
为什么需要四次挥手?
1. 全双工通信的关闭:
- TCP 是全双工的,即数据可以同时在两个方向上传输。
- 因此,关闭连接时,两个方向的数据传输都需要单独关闭。
- 四次挥手确保了双方各自的数据传输都能正常结束。
2. 双向确认关闭:
- 每一方都需要确认对方的 FIN 包,以确保对方已经准备好关闭连接。
- 四次挥手中的每一步都提供了必要的确认,保证了连接的可靠关闭。
3. 防止丢包和重传:
- 每次挥手中的 ACK 包确认了对方的 FIN 包,确保没有数据包丢失。
- 通过分开传输和确认 FIN 包,可以避免丢包和重传带来的问题。
4. TIME_WAIT 状态的必要性:
- 客户端在最后一次挥手后进入 TIME_WAIT 状态,以确保最后的 ACK 包能够被服务器收到。
- TIME_WAIT 状态的存在可以防止延迟的 FIN 包对未来的新连接产生影响。
四次挥手的必要性
每次挥手都起到重要作用:
- 第一次挥手:客户端发送 FIN,通知服务器没有数据要发送了。
- 第二次挥手:服务器确认 FIN 包,并通知客户端还需要发送数据。
- 第三次挥手:服务器发送 FIN,通知客户端服务器也没有数据要发送了。
- 第四次挥手:客户端确认 FIN 包,完成整个关闭过程。
TCP 可靠传输
TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。
一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:
其中,0 ≤ a < 1,RTTs 随着 a 的增加更容易受到 RTT 的影响。超时时间 RTO 应该略大于 RTTs,TCP 使用的超时时间计算如下:
其中 RTTd 为偏差的加权平均值。
TCP 滑动窗口
窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。
接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
TCP 流量控制
流量控制是为了控制发送方发送速率,保证接收方来得及接收。
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
实际上,为了避免此问题的产生,发送端主机会时不时的发送一个叫做窗口探测的数据段,此数据段仅包含一个字节来获取最新的窗口大小信息。
TCP 拥塞控制
拥塞控制的四个阶段
慢启动、 拥塞避免、快速重传、快速恢复
1. 慢启动(Slow Start)
慢启动是为了防止网络突然被大量数据包淹没。在连接建立初期,发送窗口(拥塞窗口,cwnd)从一个较小的值开始,并逐渐增大。
- 初始状态:cwnd = 1 MSS(最大报文段大小)
- 增长方式:每收到一个 ACK,cwnd 增加 1 MSS
- 指数增长:cwnd 以指数方式增长,即每个 RTT(往返时间)cwnd 值会翻倍
- 阈值:如果 cwnd 超过慢启动阈值(ssthresh),则进入拥塞避免阶段
2. 拥塞避免(Congestion Avoidance)
在慢启动阶段,当 cwnd 达到慢启动阈值后,就会进入拥塞避免阶段,以避免拥塞。
- 增长方式:cwnd 每个 RTT 增加 1 MSS
- 线性增长:cwnd 以线性方式增长,即每个 RTT 增加一个固定值,而不是指数增长
- 目的:防止网络过载,确保网络稳定运行
3. 快速重传(Fast Retransmit)
当发送方收到三个重复的 ACK 时,立即重传认为丢失的数据包,而不等待超时。
- 三次重复 ACK:当收到三个重复的 ACK(即连续三个相同的 ACK),认为数据包丢失
- 立即重传:立即重传丢失的数据包,而不是等待超时
4. 快速恢复(Fast Recovery)
在快速重传之后,进入快速恢复阶段,试图快速恢复传输速率。
- 减半 cwnd:将 cwnd 减半,同时将 ssthresh 设置为 cwnd 的一半
- 增加 cwnd:在每次收到新的 ACK 时,cwnd 增加 1 MSS,直到 cwnd 达到 ssthresh
- 恢复到拥塞避免:当 cwnd 达到 ssthresh 时,恢复到拥塞避免阶段
不同的拥塞控制算法如 Tahoe、Reno、New Reno 和 CUBIC,进一步优化了拥塞控制机制,以适应不同的网络环境和需求。
OSI七层协议
OSI(Open Systems Interconnection)模型是一个标准化的网络通信框架,将网络通信划分为七个不同的层次。每一层都有特定的功能,并与上下层相互配合以完成数据的传输。
1. 物理层
功能:
- 传输原始的比特流
- 通过物理媒体(如电缆、光纤、无线电波)进行比特传输
- 定义物理连接的硬件规范,如电压、电缆规格、数据传输速率等
设备:
- 网线、光纤、电缆、集线器、调制解调器
2. 数据链路层
功能:
- 将数据帧从一个节点传输到相邻节点
- 提供介质访问控制(MAC)和逻辑链路控制(LLC)
- 检测和纠正物理层可能引入的错误
设备:
- 交换机、网卡、桥接器
协议:
- Ethernet、PPP、HDLC
3. 网络层
功能:
- 负责路径选择(路由)和逻辑地址(IP地址)分配
- 管理数据包的传输和重组
- 处理拥塞控制和网络间的互联
设备:
- 路由器
协议:
- IP、ICMP、IGMP
4. 传输层
功能:
- 提供端到端的可靠传输服务
- 管理数据流量控制和错误校正
- 确保数据包按序到达并无重复
协议:
- TCP、UDP
5. 会话层
功能:
- 管理应用程序之间的会话
- 建立、维护和终止会话
- 提供会话恢复和同步服务
协议:
- NetBIOS、RPC
6. 表示层
功能:
- 数据格式化、加密、解密和压缩
- 处理数据的编码和转换,确保数据的语法和语义正确
协议:
- JPEG、MPEG、GIF、TLS/SSL
7. 应用层
功能:
- 为用户和应用程序提供网络服务
- 直接与应用程序交互,提供诸如电子邮件、文件传输和网络浏览等功能
协议:
- 确保数据包按序到达并无重复
协议:
- TCP、UDP
5. 会话层
功能:
- 管理应用程序之间的会话
- 建立、维护和终止会话
- 提供会话恢复和同步服务
协议:
- NetBIOS、RPC
6. 表示层
功能:
- 数据格式化、加密、解密和压缩
- 处理数据的编码和转换,确保数据的语法和语义正确
协议:
- JPEG、MPEG、GIF、TLS/SSL
7. 应用层
功能:
- 为用户和应用程序提供网络服务
- 直接与应用程序交互,提供诸如电子邮件、文件传输和网络浏览等功能
协议:
- HTTP、FTP、SMTP、DNS、POP3、IMAP