TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP/IP协议族中,TCP协议负责在两个网络节点之间建立可靠的连接,并保证数据包的顺序传输和数据的完整性。
1.TCP三次握手
TCP三次握手(Three-way Handshake)是TCP/IP协议中用于建立TCP连接的过程。这个过程确保了两个通信节点的初始化序列号(ISN)是同步的,同时也交换了彼此的初始窗口大小等参数。三次握手的过程如下:
-
第一次握手(SYN):
- 客户端发送一个SYN(同步序列编号)标志的TCP段,以便开始一个新的连接。这个段中包含客户端的初始序列号(client_isn)。
-
第二次握手(SYN-ACK):
- 服务器接收到客户端的SYN请求后,需要确认客户端的SYN,同时自己也发送一个SYN请求。服务器在响应中包含它自己的初始序列号(server_isn),并将确认序号设置为客户端的初始序列号加1,即
client_isn + 1
。
- 服务器接收到客户端的SYN请求后,需要确认客户端的SYN,同时自己也发送一个SYN请求。服务器在响应中包含它自己的初始序列号(server_isn),并将确认序号设置为客户端的初始序列号加1,即
-
第三次握手(ACK):
- 客户端收到服务器的SYN-ACK响应后,再次发送一个确认响应,这个响应中包含确认序号,设置为服务器的初始序列号加1,即
server_isn + 1
。
- 客户端收到服务器的SYN-ACK响应后,再次发送一个确认响应,这个响应中包含确认序号,设置为服务器的初始序列号加1,即
完成三次握手后,TCP连接就建立成功了,接下来就可以开始数据的传输了。
这个握手过程保证了双方都知道对方已经准备好接收和发送数据,同时也防止了因网络中遗留的、失效的连接请求而错误地建立连接。
在代码中实现TCP三次握手通常不需要手动编写底层的网络通信代码,因为TCP三次握手是由操作系统和网络协议栈自动完成的。当你使用高级编程语言(如Python、Java、C++等)中的套接字(Socket)库时,底层的TCP握手过程是由操作系统负责的。
在C语言中,使用套接字API(通常称为BSD套接字API)可以实现TCP客户端和服务器。以下是一个简单的例子,展示了如何在C语言中实现TCP服务器和客户端。
TCP服务器 (server.c
):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
const char* hello = "Hello from server";
// 创建socket文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 绑定socket