TCP:修订间差异
创建页面,内容为“传输控制协议 {{Infobox | 标题 = 传输控制协议 | 内容 = {{!}}- ! 中文名 {{!}} 传输控制协议 {{!}}- ! 英文名 {{!}} Transmission Control Protocol {{!}}- ! 缩写 {{!}} TCP {{!}}- ! 标准编号 {{!}} STD 7(RFC 9293) {{!}}- ! 首次发布 {{!}} RFC 793(1981年9月) {{!}}- ! 当前版本 {{!}} RFC 9293(2022年8月) {{!}}- ! 端口类型 {{!}} 传输层协议,协议号6 {{!}}- ! 主要功能 {{!}} 面向连接的可靠字节…” |
IdleTap-bot(留言 | 贡献) 由旧格式Infobox转换为新参数格式(label/data),修复空信息框(由IdleTap-bot执行) |
||
| (未显示另一用户的1个中间版本) | |||
| 第2行: | 第2行: | ||
{{Infobox | {{Infobox | ||
| | | title = 传输控制协议 | ||
| | |||
| label1 = 中文名 | |||
| data1 = 传输控制协议 | |||
| label2 = 英文名 | |||
| data2 = Transmission Control Protocol | |||
| label3 = 缩写 | |||
| data3 = TCP | |||
| label4 = 标准编号 | |||
| data4 = STD 7(RFC 9293) | |||
| label5 = 首次发布 | |||
| data5 = RFC 793(1981年9月) | |||
| label6 = 当前版本 | |||
| data6 = RFC 9293(2022年8月) | |||
| label7 = 端口类型 | |||
| data7 = 传输层协议,协议号6 | |||
| label8 = 主要功能 | |||
| data8 = 面向连接的可靠字节流传输 | |||
| label9 = 关键机制 | |||
| data9 = 序列号、确认应答、滑动窗口、拥塞控制 | |||
| label10 = 设计者 | |||
| data10 = Vint Cerf、Bob Kahn | |||
| label11 = 标准化机构 | |||
| data11 = IETF | |||
}} | }} | ||
'''传输控制协议(Transmission Control Protocol,缩写TCP)''' 是TCP/IP协议套件中的核心传输层协议,设计用于在不可靠的IP网络上提供面向连接的、可靠的、有序的字节流传输服务<ref name="RFC9293">[https://datatracker.ietf.org/doc/rfc9293/ Eddy, W., "Transmission Control Protocol (TCP)", STD 7, RFC 9293, August 2022.]</ref>。TCP通过序列号机制和累积确认应答实现对丢失或乱序数据段的检测与重传,利用滑动窗口协议实施流量控制以防止接收方缓冲区溢出,并内置拥塞控制算法以防止发送方速率过快导致网络过载<ref name="RFC9293" />。TCP与上层应用之间通过端口号建立复用/解复用通道,使单台主机上的多个应用程序能够同时维持独立的TCP连接<ref name="RFC9293" />。TCP具有全双工特性——每一个TCP连接支持两条独立的字节流,分别向两个方向传输数据<ref name="RFC9293" />。自1981年首次标准化以来,TCP历经数十年的持续演进,在原始规范基础上增加了多项扩展和改进,是当今互联网中承载Web浏览、电子邮件、文件传输、远程登录等绝大多数应用流量的基础协议<ref name="RFC9293" />。2022年8月发布的RFC 9293收集并整合了自RFC 793以来的所有重要修订,正式取代后者成为TCP的现行标准<ref name="RFC9293" />。 | '''传输控制协议(Transmission Control Protocol,缩写TCP)''' 是TCP/IP协议套件中的核心传输层协议,设计用于在不可靠的IP网络上提供面向连接的、可靠的、有序的字节流传输服务<ref name="RFC9293">[https://datatracker.ietf.org/doc/rfc9293/ Eddy, W., "Transmission Control Protocol (TCP)", STD 7, RFC 9293, August 2022.]</ref>。TCP通过序列号机制和累积确认应答实现对丢失或乱序[[数据]]段的检测与重传,利用滑动窗口协议实施流量控制以防止接收方缓冲区溢出,并内置拥塞控制算法以防止发送方速率过快导致网络过载<ref name="RFC9293" />。TCP与上层应用之间通过端口号建立复用/解复用通道,使单台主机上的多个应用程序能够同时维持独立的TCP连接<ref name="RFC9293" />。TCP具有全双工特性——每一个TCP连接支持两条独立的字节流,分别向两个方向传输数据<ref name="RFC9293" />。自1981年首次标准化以来,TCP历经数十年的持续演进,在原始规范基础上增加了多项扩展和改进,是当今[[互联网]]中承载Web浏览、电子邮件、文件传输、远程登录等绝大多数应用流量的基础协议<ref name="RFC9293" />。2022年8月发布的RFC 9293收集并整合了自RFC 793以来的所有重要修订,正式取代后者成为TCP的现行标准<ref name="RFC9293" />。 | ||
== 历史 == | == 历史 == | ||
| 第69行: | 第68行: | ||
=== 端口号与连接标识 === | === 端口号与连接标识 === | ||
TCP使用16位的端口号对上层应用进行标识。IANA将端口号空间划分为三类:0至1023为系统端口或熟知端口,由IANA统一分配给标准的网络服务( | TCP使用16位的端口号对上层应用进行标识。IANA将端口号空间划分为三类:0至1023为系统端口或熟知端口,由IANA统一分配给标准的网络服务(如[[HTTP]]使用80端口,[[HTTPS]]使用443端口);1024至49151为[[用户]]端口或注册端口,可供IANA注册或自由使用;49152至65535为动态端口或私有端口,通常由[[操作系统]]在客户端建立连接时临时分配<ref name="IANAPorts">[https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml Service Name and Transport Protocol Port Number Registry,IANA.]</ref>。 | ||
一个TCP连接由四元组唯一标识:(源IP地址,源端口,目的IP地址,目的端口)。TCP通过该四元组在收发两端正确地将数据段分发到对应的应用进程<ref name="RFC9293" />。 | 一个TCP连接由四元组唯一标识:(源IP地址,源端口,目的IP地址,目的端口)。TCP通过该四元组在收发两端正确地将数据段分发到对应的应用进程<ref name="RFC9293" />。 | ||
| 第79行: | 第78行: | ||
=== 连接建立与释放 === | === 连接建立与释放 === | ||
TCP连接通过“三报文握手”(Three-Way Handshake)过程建立。具体步骤如下:首先,主动连接发起方(客户端)发送SYN报文段(SYN标志位为1),携带客户端选择的初始序列号ISN_c<ref name="ThreeWayHandshake" />。服务器收到后,回复SYN+ACK报文段,在确认客户端的序列号(ACK号置为ISN_c+1)的同时,携带有服务器初始序列号ISN_s。客户端收到SYN+ACK报文后,回复ACK报文,确认服务器的序列号(ACK号置为ISN_s+1)<ref name="ThreeWayHandshake" />。至此连接进入ESTABLISHED状态,双方可以进行数据通信<ref name="MSThreeWay">[https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/three-way-handshake-via-tcpip 透過 TCP/IP 進行三向交握的說明,Microsoft Learn.]</ref>。 | TCP连接通过“三报文握手”(Three-Way Handshake)过程建立。具体步骤如下:首先,主动连接发起方(客户端)发送SYN报文段(SYN标志位为1),携带客户端选择的初始序列号ISN_c<ref name="ThreeWayHandshake" />。[[服务器]]收到后,回复SYN+ACK报文段,在确认客户端的序列号(ACK号置为ISN_c+1)的同时,携带有服务器初始序列号ISN_s。客户端收到SYN+ACK报文后,回复ACK报文,确认服务器的序列号(ACK号置为ISN_s+1)<ref name="ThreeWayHandshake" />。至此连接进入ESTABLISHED状态,双方可以进行数据通信<ref name="MSThreeWay">[https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/three-way-handshake-via-tcpip 透過 TCP/IP 進行三向交握的說明,Microsoft Learn.]</ref>。 | ||
TCP连接的释放采用“四报文挥手”过程。主动关闭方发送FIN报文段,表示己方已无数据需要发送;对端回复ACK确认该FIN,并继续发送可能尚未发送完毕的数据;当对端也完成数据发送后,发送FIN报文段;最后主动关闭方回复ACK确认该FIN,经过一段时间的等待后完全关闭连接。TCP协议状态机包含十一种状态(LISTEN、SYN-SENT、SYN-RECEIVED、ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、LAST-ACK、CLOSING、TIME-WAIT、CLOSED),系统性地描述了一个TCP端点在整个连接生命周期中的行为,并定义了各状态间的合法迁移路径<ref name="RFC9293" />。 | TCP连接的释放采用“四报文挥手”过程。主动关闭方发送FIN报文段,表示己方已无数据需要发送;对端回复ACK确认该FIN,并继续发送可能尚未发送完毕的数据;当对端也完成数据发送后,发送FIN报文段;最后主动关闭方回复ACK确认该FIN,经过一段时间的等待后完全关闭连接。TCP协议状态机包含十一种状态(LISTEN、SYN-SENT、SYN-RECEIVED、ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、LAST-ACK、CLOSING、TIME-WAIT、CLOSED),系统性地描述了一个TCP端点在整个连接生命周期中的行为,并定义了各状态间的合法迁移路径<ref name="RFC9293" />。 | ||
| 第124行: | 第123行: | ||
=== TCP CUBIC === | === TCP CUBIC === | ||
CUBIC | CUBIC是[[Linux]]、[[Windows]]和[[macOS]]等主流操作系统中TCP拥塞控制的默认实现。与Reno的线性窗口增长不同,CUBIC使用三次函数来描述窗口随时间的增长曲线,在拥塞窗口接近上一次丢包时的窗口值后进入稳定区域,窗口增长较为平缓,在此稳定区域之外则采用更积极的窗口增长策略。CUBIC的窗口增长函数与RTT无关,使其在高带宽长距离网络以及存在不同RTT的竞争流时具有更好的扩展性和带宽利用率<ref name="CUBICDefault">[https://mail.openjdk.org/pipermail/security-dev/2024-August/001234.html HTTP Client CUBIC Congestion Control,OpenJDK Security-dev Mailing List.]</ref>。 | ||
=== 其他拥塞控制算法变体 === | === 其他拥塞控制算法变体 === | ||
在CUBIC之外,业界也发展出了多种旨在优化特定网络场景的TCP拥塞控制变体,包括但不限于:BBR | 在CUBIC之外,业界也发展出了多种旨在优化特定网络场景的TCP拥塞控制变体,包括但不限于:BBR([[Go]]ogle开发的基于瓶颈带宽和RTT的拥塞控制算法)、NewReno(对Reno算法在恢复机制上的改进和细化)、Westwood+(适用于无线网络的拥塞控制算法)以及Compound TCP(由[[微软]]开发,在长RTT高带宽环境中引入延迟敏感组件来改进拥塞窗口增长)。 | ||
=== 显式拥塞通告 === | === 显式拥塞通告 === | ||
| 第150行: | 第149行: | ||
=== 常见应用 === | === 常见应用 === | ||
TCP在数据完整性要求严格而时延容忍度相对宽松的场景中占据主导地位,其服务模型掩盖了丢包、乱序、重传和拥塞等底层网络的复杂性。绝大多数现代网络应用依赖TCP作为其传输协议:HTTP/1.x、HTTP/2及HTTP/3尽管QUIC使用了UDP和类似可靠性层,但web传统流量中的大部分仍运行于TCP之上;SMTP及IMAP/POP3邮件传输与收取;FTP数据与命令通道;SSH安全远程登录;Telnet早期远程登录;数据库客户端/服务器远程交互等。 | TCP在数据完整性要求严格而时延容忍度相对宽松的场景中占据主导地位,其服务模型掩盖了丢包、乱序、重传和拥塞等底层网络的复杂性。绝大多数现代网络应用依赖TCP作为其传输协议:HTTP/1.x、HTTP/2及HTTP/3尽管QUIC使用了UDP和类似可靠性层,但web传统流量中的大部分仍运行于TCP之上;SMTP及IMAP/POP3邮件传输与收取;FTP数据与命令通道;SSH安全远程登录;Telnet早期远程登录;[[数据库]]客户端/服务器远程交互等。 | ||
== 安全 == | == 安全 == | ||
TCP在设计之初优先考虑了数据可靠传输和流量/拥塞控制问题,安全并非首要设计目标。因此,TCP面临多种已知的安全威胁,包括TCP序列号预测攻击(1985年罗伯特·莫里斯最早描述)、会话劫持和连接复位攻击等。由于TCP头部校验和覆盖了IP伪头部部分信息,该校验和可以在一定程度上帮助接收端验证IP地址合法性,但并不提供对加密性的保证。在实际部署中,传输层安全协议 | TCP在设计之初优先考虑了数据可靠传输和流量/拥塞控制问题,安全并非首要设计目标。因此,TCP面临多种已知的安全威胁,包括TCP序列号预测攻击(1985年罗伯特·莫里斯最早描述)、会话劫持和连接复位攻击等。由于TCP头部校验和覆盖了IP伪头部部分信息,该校验和可以在一定程度上帮助接收端验证IP地址合法性,但并不提供对加密性的保证。在实际部署中,[[传输层安全协议]]([[TLS]])通常工作在TCP之上,通过在TCP字节流中插入加密/认证握手和加密数据帧,为上层应用提供通信的机密性、数据完整性及端到端身份认证能力。RFC 9293中提及早期TCP校验和依赖于伪头部中的IP源和目标地址进行校验,以维护TCP的端到端属性,但该设计也带来了一些对IP变化的不适应性。现代TCP安全主要依赖上层加密隧道和网络基础设施中的通用安全机制,而非协议本身的内建安全特征。 | ||
== 实现 == | == 实现 == | ||
主流操作系统的内核协议栈中都包含TCP的完整实现 | 主流操作系统的内核协议栈中都包含TCP的完整实现。[[Linux内核]]的TCP/IP协议栈版本持续演进,长期支持Reno、CUBIC、BBR等多种拥塞控制算法并通过sysctl接口允许用户动态切换;微软Windows中的TCP/IP协议栈从Windows Vista和Windows Server 2008开始引入CTCP等多种改进,自Windows 10及Windows Server 2019起默认启用了基于类似CUBIC的拥塞控制和现代流量/拥塞窗口参数等调优;[[Apple]]的macOS和[[iOS]]则基于BSD协议栈的XNU内核TCP/IP实现,并同样将CUBIC作为默认拥塞控制算法;除上述完整内核实现外,学术界和嵌入式[[软件]]生态中还存在多个简约或形式验证驱动的TCP实现,例如LwIP、μC/TCP-IP以及经过高阶逻辑证明的TCP/HOL4实现等。 | ||
== 参考文献 == | == 参考文献 == | ||
<references /> | <references /> | ||