当前位置:实例文章 » 其他实例» [文章]TCP的窗口控制和重发控制【TCP原理(笔记三)】

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 版)

其他信息

其他资源

Top