当前位置:实例文章 » 其他实例» [文章]6、传输层TCP28

6、传输层TCP28

发布人:shili8 发布时间:2024-12-30 22:21 阅读次数:0

**传输控制协议(TCP)概述**

TCP(Transmission Control Protocol)是互联网的核心协议之一,负责在网络中传递数据包。它提供了可靠的、有序的数据传输服务,使得应用程序能够安全地通信。

**TCP特点**

1. **连接式**: TCP建立连接后,会为每个连接分配一个端口号和序列号,以保证数据传输的顺序。
2. **可靠性**: TCP使用校验和、重传机制等手段确保数据包的完整性和准确性。
3. **流控**: TCP通过滑动窗口算法控制数据的发送速率,避免网络拥塞。

**TCP连接建立过程**

1. **三次握手**: 客户端和服务器端之间进行三次握手,以建立TCP连接。第一次握手:客户端向服务器端发送SYN包(同步序列号),请求建立连接。第二次握手:服务器端收到 SYN 包后,回复一个 SYN-ACK 包(同步确认序列号),确认客户端的请求,并且自己也准备好接收数据。第三次握手:客户端收到 SYN-ACK 包后,向服务器端发送 ACK 包(确认包),确认连接建立成功。

c// TCP 三次握手示例代码#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER_SIZE1024int main() {
 // 客户端 socket int client_fd = socket(AF_INET, SOCK_STREAM,0);
 if (client_fd == -1) {
 perror("socket");
 exit(1);
 }
 struct sockaddr_in server_addr;
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(8080); //服务器端口号 inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
 // 发送 SYN 包 char syn_msg[] = "SYN";
 sendto(client_fd, syn_msg, strlen(syn_msg),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
 // 等待服务器端回复 SYN-ACK 包 recvfrom(client_fd, NULL,0,0, NULL, NULL);
 // 发送 ACK 包 char ack_msg[] = "ACK";
 sendto(client_fd, ack_msg, strlen(ack_msg),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
 return0;
}


**TCP连接断开过程**

1. **四次挥手**: 客户端和服务器端之间进行四次挥手,以断开TCP连接。第一次挥手:客户端向服务器端发送FIN包(结束序列号),请求断开连接。第二次挥手:服务器端收到 FIN 包后,回复一个ACK包(确认包),确认客户端的请求,并且自己也准备好接收数据。第三次挥手:服务器端向客户端发送FIN包(结束序列号),确认自己已经准备好断开连接。第四次挥手:客户端收到 FIN 包后,回复一个ACK包(确认包),确认连接断开成功。

c// TCP 四次挥手示例代码#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER_SIZE1024int main() {
 // 客户端 socket int client_fd = socket(AF_INET, SOCK_STREAM,0);
 if (client_fd == -1) {
 perror("socket");
 exit(1);
 }
 struct sockaddr_in server_addr;
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(8080); //服务器端口号 inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
 // 发送 FIN 包 char fin_msg[] = "FIN";
 sendto(client_fd, fin_msg, strlen(fin_msg),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
 // 等待服务器端回复 ACK 包 recvfrom(client_fd, NULL,0,0, NULL, NULL);
 // 发送 FIN 包 char fin2_msg[] = "FIN";
 sendto(client_fd, fin2_msg, strlen(fin2_msg),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
 // 等待服务器端回复 ACK 包 recvfrom(client_fd, NULL,0,0, NULL, NULL);
 return0;
}


**TCP连接状态**

1. **LISTENING**: TCP连接处于监听状态,等待客户端的连接请求。
2. **SYN_SENT**: TCP连接处于 SYN_SENT 状态,表示客户端已经发送了 SYN 包,但尚未收到服务器端的回复。
3. **ESTABLISHED**: TCP连接处于 ESTABLISHED 状态,表示连接已经建立成功,并且可以进行数据传输。
4. **FIN_WAIT_1**: TCP连接处于 FIN_WAIT_1 状态,表示客户端已经发送了 FIN 包,但尚未收到服务器端的回复。
5. **CLOSING**: TCP连接处于 CLOSING 状态,表示客户端和服务器端都已经发送了 FIN 包,并且正在等待对方的回复。
6. **LAST_ACK**: TCP连接处于 LAST_ACK 状态,表示服务器端已经发送了 FIN 包,但尚未收到客户端的回复。
7. **TIME_WAIT**: TCP连接处于 TIME_WAIT 状态,表示客户端和服务器端都已经发送了 FIN 包,并且正在等待对方的回复。

**TCP连接状态转换**

1. **LISTENING -> SYN_SENT**: 当客户端发送 SYN 包时,TCP连接状态会从 LISTENING 转换为 SYN_SENT。
2. **SYN_SENT -> ESTABLISHED**: 当服务器端收到 SYN 包并回复 SYN-ACK 包时,TCP连接状态会从 SYN_SENT 转换为 ESTABLISHED。
3. **ESTABLISHED -> FIN_WAIT_1**: 当客户端发送 FIN 包时,TCP连接状态会从 ESTABLISHED 转换为 FIN_WAIT_1。
4. **FIN_WAIT_1 -> CLOSING**: 当服务器端收到 FIN 包并回复 ACK 包时,TCP连接状态会从 FIN_WAIT_1 转换为 CLOSING。
5. **CLOSING -> LAST_ACK**: 当客户端发送 FIN 包时,TCP连接状态会从 CLOSING 转换为 LAST_ACK。
6. **LAST_ACK -> TIME_WAIT**: 当服务器端收到 FIN 包并回复 ACK 包时,TCP连接状态会从 LAST_ACK 转换为 TIME_WAIT。

**TCP连接状态转换示例代码**

c// TCP 连接状态转换示例代码#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER_SIZE1024int main() {
 // 客户端 socket int client_fd = socket(AF_INET, SOCK_STREAM,0);
 if (client_fd == -1) {
 perror("socket");
 exit(1);
 }
 struct sockaddr_in server_addr;
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(8080); //服务器端口号 inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
 // 发送 SYN 包 char syn_msg[] = "SYN";
 sendto(client_fd, syn_msg, strlen(syn_msg),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
 // 等待服务器端回复 SYN-ACK 包 recvfrom(client_fd, NULL,0,0, NULL, NULL);
 // 发送 FIN 包 char fin_msg[] = "FIN";
 sendto(client_fd, fin_msg, strlen(fin_msg),0, (struct sockaddr*)&server_addr, sizeof(server_addr));
 // 等待服务器端回复 ACK 包 recvfrom(client_fd, NULL,0,0, NULL, NULL);
 return0;
}


**TCP连接状态转换图示**

1. **LISTENING -> SYN_SENT**:* 客户端发送 SYN 包* TCP连接状态从 LISTENING 转换为 SYN_SENT2. **SYN_SENT -> ESTABLISHED**:*服务器端收到 SYN 包并回复 SYN-ACK 包* TCP连接状态从 SYN_SENT 转换为 ESTABLISHED3. **ESTABLISHED -> FIN_WAIT_1**:* 客户端发送 FIN 包* TCP连接状态从 ESTABLISHED 转换为 FIN_WAIT_14. **FIN_WAIT_1 -> CLOSING**:*服务器端收到 FIN 包并回复 ACK 包* TCP连接状态从 FIN_WAIT_1 转换为 CLOSING5. **CLOSING -> LAST_ACK**:* 客户端发送 FIN 包* TCP连接状态从 CLOSING 转换为 LAST_ACK6. **LAST_ACK -> TIME_WAIT**:

相关标签:网络运维服务器
其他信息

其他资源

Top