嵌入式第三十六天(网络编程(TCP))

一.TCP

2.

TCP(传输控制协议)通过"三次握手"建立连接,通过"四次挥手"终止连接,以此保证数据传输的可靠性。

一、三次握手(建立连接)

目的是确认双方的发送和接收能力正常,并协商初始序列号。

过程如下:

  1. 客户端→服务器(SYN=1,seq=x):客户端发送连接请求报文,标记SYN为1(请求同步),随机生成初始序列号x。此时客户端进入"SYN-SENT"状态。

  2. 服务器→客户端(SYN=1,ACK=1,seq=y,ack=x+1):服务器收到请求后,同意连接,回复报文:

  • SYN=1(表示服务器也发起同步),生成自己的初始序列号y;

  • ACK=1(确认收到客户端请求),ack=x+1(表示期望接收客户端下一个序列号为x+1的数据)。

此时服务器进入"SYN-RCVD"状态。

  1. 客户端→服务器(ACK=1,seq=x+1,ack=y+1):客户端收到服务器回复后,再次发送确认报文:
  • ACK=1(确认收到服务器的同步请求);

  • seq=x+1(基于自己的初始序列号递增);

  • ack=y+1(表示期望接收服务器下一个序列号为y+1的数据)。

双方收到后均进入"ESTABLISHED"状态,连接建立完成。

二、四次挥手(终止连接)

目的是确保双方都已完成数据传输,安全关闭连接(因TCP是全双工通信,需双向关闭)。

过程如下:

  1. 客户端→服务器(FIN=1,seq=u):客户端数据发送完毕,发送终止连接请求(FIN=1),序列号为u。客户端进入"FIN-WAIT-1"状态。

  2. 服务器→客户端(ACK=1,seq=v,ack=u+1):服务器收到FIN后,先回复确认报文(ACK=1),ack=u+1(确认收到客户端的终止请求),序列号为v。此时服务器进入"CLOSE-WAIT"状态,客户端收到后进入"FIN-WAIT-2"状态(等待服务器的FIN)。

(注:此时服务器可能仍有数据未发送完,会继续向客户端传输数据)

  1. 服务器→客户端(FIN=1,ACK=1,seq=w,ack=u+1):服务器数据发送完毕后,发送自己的终止请求(FIN=1),同时再次确认ack=u+1,序列号为w。服务器进入"LAST-ACK"状态。

  2. 客户端→服务器(ACK=1,seq=u+1,ack=w+1):客户端收到服务器的FIN后,回复确认报文(ACK=1),ack=w+1(确认收到服务器的终止请求),序列号为u+1。客户端进入"TIME-WAIT"状态(等待2MSL时间,确保服务器收到确认后再关闭),服务器收到后进入"CLOSED"状态。

客户端等待2MSL后,也进入"CLOSED"状态,连接彻底关闭。

关键区别:

  • 三次握手:第三次握手是客户端对服务器"SYN+ACK"的确认,避免"已失效的连接请求报文"被服务器误接收后建立无效连接。

  • 四次挥手:因服务器收到客户端FIN后,可能仍有数据需传输,无法同时发送FIN和ACK(需先确认接收,再发终止请求),因此比握手多一次交互。

三.TCP编程流程

四.相关函数接口

示例:

cs 复制代码
#include "head.h"

int main(int argc,const char argv[])
{
    int client_socket;
    struct sockaddr_in seraddr;
    char buff[1024] = {0};

    client_socket = socket(AF_INET,SOCK_STREAM,0);
    if(client_socket < 0)
    {
        perror("socket error");
        return -1;
    }

    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(50000);
    seraddr.sin_addr.s_addr  = inet_addr("192.168.19.129");

    int ret = connect(client_socket,(struct sockaddr*)&seraddr,sizeof(seraddr));
    if(ret < 0)
    {
        perror("connect error");
        return -1;
    }

    while(1)
    {
        printf("B> ");
        fgets(buff,sizeof(buff),stdin);
        send(client_socket,buff,strlen(buff),0);
        memset(buff,0,sizeof(buff));
        ssize_t cnt = recv(client_socket,buff,sizeof(buff),0);
        if(cnt <= 0)
        {
            perror("recv perror");
            return -1;
        }
        printf("A> %s\n",buff);
    }

    close(client_socket);

    return 0;
}
cs 复制代码
#include "head.h"

int main(int argc,const char *argv[])
{
    int server_socket;
    int client_socket;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    socklen_t client_addr_len = sizeof(client_addr);
    char buff[1024];

    server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket < 0)
    {
        perror("socket error");
        return -1;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(50000);
    server_addr.sin_addr.s_addr = inet_addr("192.168.19.129");

    int ret = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));
    if(ret < 0)
    {
        perror("bind error");
        return -1;
    }

    if (listen(server_socket, 5) < 0)
    {
        perror("listen error");
        return -1;
    }

    client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len);
    if (client_socket < 0)
    {
        perror("accept error");
        return -1;
    }

    while (1)
    {
        memset(buff,0,sizeof(buff));
        ssize_t cnt = recv(client_socket,buff,sizeof(buff),0);

        if (cnt <= 0)
        {
            perror("recv error");
            break;
        }

        printf("B> %s\n", buff);

        printf("A> ");
        fgets(buff,sizeof(buff),stdin);
        send(client_socket,buff,strlen(buff),0);
    }

    close(client_socket);
    close(server_socket);

    return 0;
}

五.相关问题

相关推荐
网络研究院2 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest2 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
2601_961845152 天前
粉笔行测题库|系统班|刷题
网络·百度·微信·微信公众平台·facebook·新浪微博
程序员mine2 天前
HTTPS-TLS加密与证书完全指南(中)
网络协议·https·ssl
程序猿阿伟2 天前
《Chrome离线扩展安装的底层逻辑与场景落地指南》
服务器·网络·chrome
之歆2 天前
现代 HTTP 客户端深度解析:Fetch 与 Axios
chrome·网络协议·http
InHand云飞小白2 天前
无人值守站点网络困境?工业级路由器IR315破解连接难题
网络·物联网·4g·工业路由器·4g路由器·iiot·蜂窝路由器
森G2 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt