
传输层 TCP+UDP
传输层 TCP+UDP
传输层概述
实现 “端到端” 的通信。端口(port)为逻辑端口,端口号范围是 0 - 65535 。其中 0 - 1023 端口是知名端口,为提前保留出来的端口。
常见协议端口分配
- TCP 协议:
- 22 - SSH:用于安全远程登录,保障远程管理服务器等设备时数据传输的安全性。
- 23 - telnet:早期用于远程终端连接,但由于安全性较差,逐渐被 SSH 替代。
- 80 - http:超文本传输协议,用于网页浏览时客户端与服务器之间的通信,传输网页数据。
- 443 - https:基于 SSL/TLS 加密的 HTTP 协议,在传输敏感信息(如用户登录密码、银行卡信息等)时保证数据安全。
- UDP 协议:
- 53 - DNS:域名系统,将人类可读的域名(如baidu.com)解析为对应的 IP 地址,实现网络设备间基于 IP 的通信。
- 67/68 - DHCP:动态主机配置协议,67 号端口用于服务器端,68 号端口用于客户端,自动为网络中的设备分配 IP 地址及相关网络参数。
TCP 协议
传输控制协议,是面向连接的协议。
全双工特性:同一时刻,既可以接收数据,也可以发送数据。例如在文件传输过程中,客户端向服务器上传文件的同时,也能接收服务器反馈的传输进度等信息。
通信模式限制:只能适用于单播通信。这意味着数据从一个发送端准确地发送到一个接收端,确保数据传输的可靠性和准确性。
数据控制灵活性:可以基于已经建立好的连接,灵活地对接下来的数据进行控制。比如在数据传输过程中,根据网络拥塞情况调整发送速率,保证数据稳定传输。
应用场景:无法很好地满足即时性的需求,适用于传递一些大文件或对稳定性要求较高的场景。像软件更新包、数据库备份文件等大文件传输,以及金融交易系统中的数据交互,要求数据准确无误,TCP 协议能够保证数据完整性。
三次握手建立连接:客户端发送 SYN 包(同步序列编号)到服务器,进入 SYN_SENT 状态;服务器收到 SYN 包,回应一个 SYN + ACK 包,进入 SYN_RECV 状态;客户端收到服务器的 SYN + ACK 包后,再发送一个 ACK 包,双方进入 ESTABLISHED 状态,连接建立成功。
四次挥手断开连接:客户端发送 FIN 包(结束标志),进入 FIN_WAIT_1 状态;服务器收到 FIN 包后,发送 ACK 包确认,客户端进入 FIN_WAIT_2 状态;服务器处理完剩余数据后,发送 FIN 包给客户端,进入 LAST_ACK 状态;客户端收到服务器的 FIN 包后,发送 ACK 包确认,服务器进入 CLOSED 状态,客户端等待一段时间后也进入 CLOSED 状态,连接断开。
TCP 报文头部结构
- 源端口(Source Port):16 位,标识发送数据的应用程序所使用的端口,用于接收方正确将回复数据返回给对应的发送应用。
- 目的端口(Destination Port):16 位,标识接收数据的应用程序端口,帮助数据准确投递到目标应用。
- 序号(Sequence Number):32 位,用于标识 TCP 发送端向接收端发送的字节流编号,在建立连接时由双方协商确定初始值,可确保数据按序传输,在数据重传、乱序处理等方面起关键作用。
- 确认号(Acknowledge Number):32 位,接收方使用它告知发送方下一个期望接收的字节序号,即已成功接收数据的最后一个字节序号加 1 ,发送方根据确认号判断数据是否被正确接收。
- 头部长度(Header length):4 位,以 4 字节为单位表示 TCP 头部的长度,由于 TCP 头部可能包含选项字段,长度不固定,该字段用于确定头部结束位置和数据开始位置。
- 保留位(Resv.):6 位,保留供未来使用,目前应全部置 0 。
- 标志位(Flags):6 位,包括多个重要标志:
- URG(Urgent):紧急指针标志,置 1 时表示紧急指针字段有效,用于指示有紧急数据需要优先处理。
- ACK(Acknowledge):确认标志,置 1 时表示确认号字段有效,用于确认已接收数据,只有 ACK = 1 时,ack 才有意义。
- PSH(Push):推送标志,置 1 时提示接收方应尽快将数据交付给应用层,而不是缓存起来。
- RST(Reset):重置标志,置 1 时用于复位连接,如遇到异常情况终止连接等。
- SYN(Synchronize):同步标志,用于建立连接时同步序号,在三次握手中起关键作用。
- FIN(Finish):结束标志,置 1 时表示发送方已完成数据发送,请求断开连接,在四次挥手中使用。
- 窗口(Window):16 位,用于流量控制,接收方通过此字段告知发送方自己当前接收缓存的空闲空间大小(以字节为单位),发送方据此调整发送速率。
- 校验和(Checksum):16 位,对 TCP 头部和数据部分进行校验,用于检测数据在传输过程中是否发生错误,保证数据的完整性。
- 紧急指针(Urgent Pointer):16 位,当 URG 标志位为 1 时有效,它指向紧急数据的末尾,用于指示发送方的紧急数据位置,使接收方优先处理紧急数据。
- 选项(Options):长度可变,用于实现一些可选功能,如最大报文段长度(MSS)协商、窗口扩大因子设置、时间戳选项等,可根据具体通信需求添加。
- 填充(Padding):用于保证 TCP 头部长度为 32 位的整数倍,通过添加若干个 0 字节实现。
UDP 协议
用户数据包协议,是面向无连接的协议。
- 可以很好地满足即时性流量,适用于对时间要求较高的流量场景。如实时视频会议、在线游戏等场景,少量数据包丢失或乱序对整体体验影响较小,但对数据传输的实时性要求极高,UDP 协议能快速传输数据,保证画面和操作的流畅性。
- 头部结构简单:UDP 数据包头部仅包含源端口、目的端口、长度、校验和等字段,相比 TCP 协议头部,开销小,数据传输效率高。这使得 UDP 在一些对数据完整性要求不高但追求速度的场景中具有优势。
- 支持多播和广播:不同于 TCP 仅支持单播,UDP 能够将数据同时发送到多个目标地址(多播)或网络中的所有设备(广播)。在一些需要向大量设备发送相同数据的场景,如网络电视直播、大规模软件更新通知等,UDP 的多播和广播特性可以提高传输效率。
连接概念
正式发送数据之前,提前建立好一种虚拟的 “点到点” 式的连接,即单播的模式。这种连接通过一系列握手过程(如 TCP 的三次握手)来确保双方设备准备好进行数据传输,在连接建立期间,双方协商传输参数,如最大报文段长度(MSS)等,为后续可靠数据传输奠定基础。
相关重要概念
- ack:对已经收到的数据进行确认。只有当 ACK 置为 1,ack 才有意义。接收方通过发送 ACK 包告知发送方数据已成功接收,发送方根据 ACK 确认信息来决定是否继续发送下一批数据或进行重传操作,保证数据传输的可靠性。
- 重传机制:对于 TCP 而言,如果收到的数据并没有按照顺序排列,无序报文会缓存,对有序报文确认。
- 如果发送了数据,但是一直没有得到确认,会在一个时间周期后,重新发送数据,即超时重传 - RTTS(加权的平均往返时间)。RTTS 通过不断测量数据往返时间并加权计算,动态调整超时时间,以适应网络状况变化,确保在网络波动时仍能保证数据可靠传输。
- MSS:最大报文段长度,即每一段数据的长度,通常为 1460 字节。MSS 的设置要考虑网络链路层的最大传输单元(MTU),避免数据在传输过程中因超过链路层限制而被分片,提高传输效率。
- 缓存与窗口:对于数据的发送方而言有发送缓存,对于数据的接收方而言有接收缓存。缓存区长度即 window(窗口)。接收方调整 window 窗口,以此去影响发送端的发送速率。当接收方缓存充足时,增大窗口值,允许发送方更快地发送数据;当接收方缓存接近满负荷时,减小窗口值,防止数据溢出,通过这种方式实现流量控制,保证数据传输的稳定性。
- TCP 拥塞控制:除了接收方窗口控制发送速率外,TCP 还采用拥塞控制机制应对网络拥塞。主要算法有慢开始、拥塞避免、快重传和快恢复。慢开始阶段,发送方初始拥塞窗口设置为 1 个 MSS,每收到一个 ACK 确认,拥塞窗口就增加 1 个 MSS,快速增加发送速率;拥塞避免阶段,当拥塞窗口增长到慢开始门限(ssthresh)时,改为线性增长,避免网络拥塞;快重传机制下,当接收方连续收到多个相同序号的 ACK 时,发送方立即重传丢失的数据包,而不必等待超时;快恢复阶段,在快重传后,将慢开始门限减半,拥塞窗口设置为慢开始门限,然后进入拥塞避免阶段,继续线性增长窗口,以恢复数据传输效率并避免再次拥塞。