TCP的窗口控制和重发控制【TCP原理(笔记三)】
发布人:shili8
发布时间:2025-01-06 12:23
阅读次数:0
**TCP 的窗口控制和重发控制**
在 TCP 协议中,窗口控制和重发控制是两个重要的机制,它们共同作用来确保数据传输的可靠性。
### **1. 窗口控制**
窗口控制是 TCP 协议中的一个关键概念,它决定了发送方可以发送多少个字节的数据到接收方之前。这个值称为"窗口大小"(Window Size),它由接收方在 SYN 报文中告诉发送方。
**窗口大小的计算**
窗口大小 = 最大分段大小 ×2其中,最大分段大小是指 TCP 协议允许传输的最大数据块大小。这个值通常为1460 个字节(以太网帧头和尾部各18 个字节)。
**窗口控制流程**
1. 接收方在 SYN 报文中告诉发送方自己的窗口大小。
2. 发送方根据接收方的窗口大小计算出可以发送多少个字节的数据。
3. 发送方将数据分成多个小块,每个小块的大小不超过窗口大小。
4. 发送方发送每个小块的数据时,会附带一个序号和确认号。
5. 接收方接收到数据后,将确认号发送回发送方。
6. 发送方根据确认号更新自己的窗口大小。
**示例代码**
c// TCP 客户端代码int main() { // 创建 socket int sockfd = socket(AF_INET, SOCK_STREAM,0); // 设置窗口大小 struct tcp_info info; getsockopt(sockfd, SOL_TCP, TCP_INFO, &info, sizeof(info)); int window_size = info.tcpi_snd_wnd; // 发送数据 char buffer[1024]; send(sockfd, buffer, strlen(buffer),0); return0; }
c// TCP服务器代码int main() { // 创建 socket int sockfd = socket(AF_INET, SOCK_STREAM,0); // 设置窗口大小 struct tcp_info info; getsockopt(sockfd, SOL_TCP, TCP_INFO, &info, sizeof(info)); int window_size = info.tcpi_rcv_wnd; // 接收数据 char buffer[1024]; recv(sockfd, buffer, strlen(buffer),0); return0; }
### **2. 重发控制**
重发控制是 TCP 协议中用于确保数据传输的可靠性的另一个机制。它通过在发送方和接收方之间建立一个确认-重发循环来实现。
**确认-重发流程**
1. 发送方将数据发送到接收方。
2. 接收方接收到数据后,将确认号发送回发送方。
3. 如果发送方在规定时间内没有收到确认号,则会重发数据。
4. 重发数据的过程与步骤1-3 相同。
**示例代码**
c// TCP 客户端代码int main() { // 创建 socket int sockfd = socket(AF_INET, SOCK_STREAM,0); // 发送数据 char buffer[1024]; send(sockfd, buffer, strlen(buffer),0); return0; }
c// TCP服务器代码int main() { // 创建 socket int sockfd = socket(AF_INET, SOCK_STREAM,0); // 接收数据 char buffer[1024]; recv(sockfd, buffer, strlen(buffer),0); return0; }
**总结**
TCP 的窗口控制和重发控制是两个重要的机制,它们共同作用来确保数据传输的可靠性。窗口控制决定了发送方可以发送多少个字节的数据到接收方之前,而重发控制则通过在发送方和接收方之间建立一个确认-重发循环来实现。
**参考**
* TCP/IP 协议详解(第3 版)
* TCP/IP 协议栈源码分析(第1 版)