Tcp网络通信的基本流程梳理

先来一张经典的流程图

接下介绍一下大概流程,各个函数的参数大家自己去了解加深一下印象

服务端流程

1.创建套接字 :使用 socket 函数创建一个套接字,这个套接字后续会被用于监听客户端的连接请求。 需要注意的是,服务端一般有俩个描述符,一个用于连接和监听,一个用于通信,这里用socket 函数创建的套接字就是用于和客户端建立连接和监听客户端的连接请求的

例如在 C 语言中:

复制代码
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    int listenSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (listenSocket == -1) {
        perror("socket creation failed");
        return -1;
    }
    // 后续操作
    return 0;
}

2.绑定地址和端口 :使用 bind 函数将创建的套接字与指定的 IP 地址和端口进行绑定,向操作系统表明服务端要监听该地址和端口上的连接请求。示例如下:

复制代码
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY; // 监听所有可用网络接口
serverAddr.sin_port = htons(8888); // 绑定到 8888 端口

if (bind(listenSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {
    perror("bind failed");
    close(listenSocket);
    return -1;
}

为什么bind绑定时一定要将套接字和服务器的ip和端口绑定在一起呢?我的理解是客户端相当于一个想入住酒店的旅客,套接字就相当于房卡,有了这张房卡旅客才能知道楼层和具体房间在哪里。

3.监听连接请求 :使用 listen 函数将套接字设置为监听状态,指定最大允许的连接请求队列长度。

示例如下:

复制代码
if (listen(listenSocket, 5) == -1) {
    perror("listen failed");
    close(listenSocket);
    return -1;
}

4.接受连接并创建新套接字 :使用 accept 函数接受客户端的连接请求。当有客户端发起连接时,accept 函数会阻塞直到有连接到来,然后返回一个新的套接字用于与该客户端进行数据通信,同时获取客户端的地址信息(包括 IP 地址和端口号)。示例如下:

复制代码
struct sockaddr_in clientAddr;
socklen_t clientAddrLen = sizeof(clientAddr);
int clientSocket = accept(listenSocket, (struct sockaddr *)&clientAddr, &clientAddrLen);
if (clientSocket == -1) {
    perror("accept failed");
    close(listenSocket);
    return -1;
}

客户端流程

1.创建套接字 :同样使用 socket 函数创建一个套接字,用于与服务端建立连接和进行数据通信。示例如下:

复制代码
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == -1) {
    perror("socket creation failed");
    return -1;
}

2.发起连接请求 :使用 connect 函数向服务端发起连接请求,在 connect 函数中指定服务端的 IP 地址和端口号。示例如下:

复制代码
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务端 IP 地址
serverAddr.sin_port = htons(8888); // 服务端端口

if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {
    perror("connect failed");
    close(clientSocket);
    return -1;
}

3.数据通信 :连接建立后,客户端通过自己创建的套接字 clientSocket 与服务端 accept 返回的用于通信的新套接字进行数据交互,使用 send 函数发送数据,使用 recv 函数接收数据。

相关推荐
MeowKnight95821 小时前
【Linux】常见的系统调用 函数和功能简单总结
linux·1024程序员节
Dobby_0521 小时前
【Linux】安装 Rocky Linux 9 并配置 Kubernetes 集群基础环境 | VMware | Win11
linux·云原生·kubernetes
爱隐身的官人21 小时前
Ubuntu安装开源堡垒机JumpServer
linux·ubuntu·堡垒机·1024程序员节
杨筱毅21 小时前
【底层机制】Linux内核4.10版本的完整存储栈架构讲解--用户空间到物理设备完整IO路径
linux·架构·1024程序员节·底层机制
千里马-horse21 小时前
Boost.Iostreams 简介
开发语言·c++·boost
wanhengidc21 小时前
站群服务器都有什么作用
服务器·安全·智能手机·玩游戏
陌路2021 小时前
C17值类别概念
开发语言·c++
徐sir(徐慧阳)21 小时前
搭建属于自己的网站HEXO静态页(二)发布网站到gihub
服务器·node.js·github·hexo
Wang's Blog21 小时前
Linux小课堂: 网络接口与连接监控命令详解
linux·运维·服务器
纳切威1 天前
CentOS 10 系统安装
linux