一、TCP 协议
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。它在网络通信中扮演着重要的角色,用于保证数据的可靠传输。
TCP协议的特点如下:
1. 面向连接:在通信前需要先建立连接,通信结束后再关闭连接。连接的建立和关闭过程需要进行三次握手和四次挥手。
2. 可靠性:TCP提供可靠的数据传输,通过序列号、确认应答、超时重传、流量控制和拥塞控制等机制来确保数据的正确性和完整性。
3. 字节流传输:TCP将数据流划分为以字节为单位的数据段进行传输,保证了数据的顺序性。
4. 面向字节流:TCP把应用程序交给它的数据看成是一连串无结构的字节流,不关心具体的数据内容和格式。
5. 流量控制:TCP通过滑动窗口机制来控制发送方发送数据的速率,以防止接收方来不及处理过多的数据。
6. 拥塞控制:TCP通过拥塞窗口和慢启动等机制来控制网络拥塞,避免网络过载。
7. 支持全双工通信:TCP连接是全双工的,双方可以同时发送和接收数据。
TCP协议的工作流程如下:
1. 建立连接:客户端向服务器发送连接请求(SYN),服务器回复确认(SYN+ACK),客户端再回复确认(ACK),建立连接。
2. 数据传输:建立连接后,双方可以通过TCP连接进行数据传输。发送方将数据划分为适当大小的数据段,并添加序列号,接收方收到数据后进行确认应答。
3. 连接关闭:当数据传输完成时,任意一方可以发送连接关闭请求(FIN),对方回复确认,然后发送自己的连接关闭请求,对方再回复确认,完成连接关闭。
总结:TCP协议通过面向连接、可靠的数据传输、流量控制和拥塞控制等机制,保证了数据在网络中的可靠传输。它是应用层协议中最常用的一种,广泛应用于互联网中。
二、TCP 报头
以下是TCP报头的详细格式,按照表格形式列出:
字段名称 | 长度(位) | 描述 |
源端口号 | 16 | 指示发送端口号 |
目的端口号 | 16 | 指示接收端口号 |
序列号 | 32 | 用于对数据进行排序和重组 |
确认号 | 32 | 用于确认接收到的数据 |
数据偏移 | 4 | 指示TCP报头的长度 |
保留 | 6 | 保留字段,暂未使用 |
控制位 | 6 | 用于控制TCP的各种功能,如SYN、ACK、FIN等 |
窗口大小 | 16 | 指示发送方的接收窗口大小 |
校验和 | 16 | 用于检验TCP报头和数据的完整性 |
紧急指针 | 16 | 指示紧急数据的位置 |
选项 | 可变 | 可用于在TCP报头中添加一些可选的功能 |
填充 | 可变 | 用于填充TCP报头,使其长度为32位的整数倍 |
三、TCP 端口
TCP端口是TCP协议中用于标识不同应用程序或服务的端口号。在TCP/IP协议栈中,每个主机都有65535个端口号可用,它们被分为三个范围:
1. 知名端口(Well-known Ports):范围从0到1023,用于标识一些常见的服务和应用程序。例如,HTTP使用端口号80,HTTPS使用端口号443,FTP使用端口号21等。这些端口号在大多数操作系统中都有预定义的用途。
2. 注册端口(Registered Ports):范围从1024到49151,用于用户注册的应用程序或服务。这些端口号可以被开发人员用于自定义应用程序或服务。
3. 动态/私有端口(Dynamic/Private Ports):范围从49152到65535,用于临时分配给客户端应用程序。当客户端应用程序与服务器建立TCP连接时,操作系统会自动分配一个可用的动态端口。
TCP端口号是一个16位的无符号整数(0到65535),客户端应用程序使用源端口号,服务器应用程序使用目的端口号。通过源和目的端口号的组合,TCP协议可以将接收到的数据包传递给正确的应用程序或服务。
在通信过程中,当客户端向服务器发起连接请求时,客户端应用程序会选择一个空闲的源端口号,并将其包含在请求中。服务器收到连接请求后,会将目的端口号设置为客户端发送的源端口号,以便建立双向通信。
TCP端口号的分配需要遵循相关的规范和标准,以确保端口号的唯一性和正确性。
所有基于 TCP 的通信都是以相同的方式工作:选择一个随机的源端口与一个已知的目的端口通信
四、TCP 三次握手
TCP三次握手是建立TCP连接的过程,用于确保双方能够正常通信。以下是TCP三次握手的详细步骤:
Client Server | | |---- SYN (X) ---------->| | | |<--- SYN-ACK (Y, X+1) ---| | | |---- ACK (Y+1) --------->| | |
- 第一次握手 (SYN):
- 客户端发送一个 SYN (同步) 报文段to服务器,报文段中指定了客户端的初始序号 X。
- 客户端进入 SYN_SENT 状态,等待服务器确认。
- 第二次握手 (SYN-ACK):
- 服务器收到客户端的 SYN 报文段后,如果同意连接,就会发送一个 SYN-ACK 报文段,
- 报文段中包含了服务器的初始序号 Y,同时将客户端的序号 X+1 放在确认号(ACK)字段中。
- 服务器进入 SYN_RCVD 状态。
- 第三次握手 (ACK):
- 客户端收到服务器的 SYN-ACK 报文段后,再发送一个确认报文段(ACK),
- 报文段中把服务器的序号 Y+1 放在确认号(ACK)字段中。
- 此时,TCP 连接建立,客户端进入 ESTABLISHED 状态,服务器也进入 ESTABLISHED 状态。
TCP三次握手过程的目的是确保双方都能收到对方的请求和确认,并建立起可靠的双向通信。通过握手过程,双方交换了初始序列号和窗口大小等重要信息,以便后续的数据传输能够正确进行。
值得注意的是,TCP三次握手是双向的,即客户端向服务器发起握手请求,服务器响应后再向客户端发送确认,确保双方都能同步建立连接。这样的握手过程可以防止已失效的连接请求报文段突然又传到了服务器,导致服务器错误地打开连接。
初始 SYN 数据包
SYN/ACK 响应
最后的 ACK 包
五、TCP 连接断开
TCP 连接的断开是一个四次挥手的过程,用于正常关闭连接。
客户端 服务器 | | |---- SYN 报文 -------->| |<--- SYN-ACK 报文 -----| |---- ACK 报文 -------->| | | | |---- 数据报文 -------->| |<---- ACK 报文 --------| | | | |---- FIN 报文 -------->| |<---- ACK 报文 --------| |<---- FIN 报文 --------| |---- ACK 报文 -------->| | | |
- 客户端发起连接请求:
- 客户端选择一个随机的源端口号(通常为大于 1024 的数字)。
- 客户端向服务器的目标端口号发送一个 SYN 报文,表示请求建立连接。
- 服务器响应连接请求:
- 服务器接收到客户端的 SYN 报文后,会分配一个端口号来作为此次连接的目标端口。
- 服务器发送一个 SYN-ACK 报文,表示接受了客户端的连接请求。
- 客户端确认连接建立:
- 客户端收到服务器的 SYN-ACK 报文后,会发送一个 ACK 报文,表示确认连接建立。
- 数据传输:
- 在连接建立后,客户端和服务器就可以开始传输数据了。
- 数据传输过程中,双方会不断地发送 ACK 报文,确认对方发送的数据已经正确接收。
- 连接释放:
- 当通信结束时,任意一方都可以发起连接释放请求。
- 通常是客户端先发送 FIN 报文,表示自己已经没有数据要发送了。
- 服务器收到 FIN 报文后,会发送 ACK 报文以确认,然后再发送自己的 FIN 报文。
- 客户端收到服务器的 FIN 报文后,会发送 ACK 报文以确认,至此连接就释放完毕了。
六、TCP 重置
TCP重置(TCP RST)是一种TCP协议中的控制消息,用于在通信过程中快速终止连接或重置连接状态。TCP重置消息可以由发送方或接收方发送,用于指示对方立即关闭连接。
TCP重置消息的常见用途包括以下几种情况:
1. 异常情况下的连接终止:当通信中发生了无法恢复的错误或异常时,TCP重置消息可以立即终止连接,避免继续传输数据。
2. 拒绝未建立的连接:当接收方收到一个未建立连接的TCP数据包时,可以发送TCP重置消息来拒绝该连接请求。
3. 处理网络拥塞:在网络拥塞情况下,TCP重置消息可以用于快速关闭连接,以减轻网络负载和恢复正常通信。
TCP重置消息的特点如下:
- TCP重置消息是一个独立的TCP数据包,它不承载任何应用数据。
- TCP重置消息中的标志位被设置为RST。
- TCP重置消息可以在连接建立前或连接建立后发送。
- TCP重置消息会立即中断连接,终止数据传输。
- TCP重置消息不需要等待对方的确认,可以单方面发送。
需要注意的是,TCP重置消息的使用应谨慎,不当的使用可能导致连接中断或通信中断。在正常情况下,应该使用TCP的正常关闭过程来终止连接,以确保数据的完整性和可靠性。