2.2.3 Posix API与网络协议栈

简介: 2.2.3 Posix API与网络协议栈

1.connect(fd, serveraddr, size)
a. fd -> tcb
  syn
///
2.listen
a. listenfd -> tcb
b. tcb -> listen
//
3.accept
a. while(acceptqueue == NULL) {
  pthread_cond_wait();
}
b. *tcb = get_tcb_from(acceptqueue);
c. clientfd = get_fd_fdtable();
d. tcb -> clientfd;
return clientfd;

如何通过网络数据包,查找半链接队列的节点

五元组(sip, dip, sport, dport, proto)

端口65535个,如何做百万级别的连接

连接 tcb 五元组

连接断开

FIN包一般是携带包,比如携带在最后一次发送数据包的标志位上,如果一直没有发送数据,则会单独发送FIN包。

大量close_wait状态?没有及时调用close();

两端同时调用close() ? 进入CLOSING状态(下图的同时关闭状态)

思考:

使用tcpdump抓取三次握手

SYN_SENT如何转为SYN_RECV ? (同时打开)

listenfd能不能够connect ?

这里使用一个拿来即用的TCP测试程序:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main(void)
{
    //初始化套接字
    int listenfd = socket(AF_INET, SOCK_STREAM, 0);
    if (listenfd < 0)
    {
        perror("socket");
        return -1;
    }
    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = htonl(INADDR_ANY);
    address.sin_port = htons(8888);
    int ret = bind(listenfd, (struct sockaddr *)&address, sizeof(address));
    if (ret < 0)
    {
        perror("bind");
        return -1;
    }
    ret = listen(listenfd, 5);
    if (ret < 0)
    {
        perror("listen");
        return -1;
    }
    struct sockaddr_in client_address;
    socklen_t client_addrlength = sizeof(client_address);
    int connfd = accept(listenfd, (struct sockaddr *)&client_address, &client_addrlength);
    if (connfd < 0)
    {
        perror("accept");
    }
    printf("The connection is successful : %d\n", connfd);
    char buf[1024] = {0};
    ret = recv(connfd, buf, 1024, 0);
    if (ret <= 0) {
        perror("recv");
    }
    printf("recv: %s\n", buf);
    close(connfd);
    close(listenfd);
    return 0;
}

程序监听在8888端口上,我们使用网络调试助手连接一下,并使用tcpdump查看8888端口的状态:

上面的是建立连接抓取的包,下面的是服务端主动断开连接发送的网络包。

仍然使用上面那个服务端程序,使用下面这个客户端程序连接,看看listenfd能不能connect:

int main(void)
{
    //初始化套接字
    int listenfd = socket(AF_INET, SOCK_STREAM, 0);
    if (listenfd < 0)
    {
        perror("socket");
        return -1;
    }
    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = htonl(INADDR_ANY);
    address.sin_port = htons(8889);//这里绑定在8889端口
    int ret = bind(listenfd, (struct sockaddr *)&address, sizeof(address));
    if (ret < 0)
    {
        perror("bind");
        return -1;
    }
    ret = listen(listenfd, 5);
    if (ret < 0)
    {
        perror("listen");
        return -1;
    }
    struct sockaddr_in srv_addr;
    srv_addr.sin_family = AF_INET;
    srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    srv_addr.sin_port = htons(8888);//连接8888
    //使用listenfd
    if(-1 == connect(listenfd, (struct sockaddr*)&srv_addr, sizeof(srv_addr)))
    {
        perror("connect");
        return 1;
    } else {
        printf("connect success!");
    }
    return 0;
}

运行发现连接失败:

gaoyuelong@ubuntu:~/23040voice/06/test$ ./client 
connect: Transport endpoint is already connected

文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:https://ke.qq.com/course/417774?flowToken=1020253

相关文章
|
1月前
|
弹性计算 负载均衡 网络协议
这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
【2月更文挑战第20天】这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
62 1
|
2月前
|
分布式计算 API Linux
通义千问API:找出两篇文章的不同
本章我们将介绍如何利用大模型开发一个文档比对小工具,我们将用这个工具来给互联网上两篇内容相近但版本不同的文档找找茬,并且我们提供了一种批处理文档比对的方案
|
11天前
|
网络协议 Linux SDN
虚拟网络设备与Linux网络协议栈
在现代计算环境中,虚拟网络设备在实现灵活的网络配置和隔离方面发挥了至关重要的作用🔧,特别是在容器化和虚拟化技术广泛应用的今天🌐。而Linux网络协议栈则是操作系统处理网络通信的核心💻,它支持广泛的协议和网络服务🌍,确保数据正确地在网络中传输。本文将深入分析虚拟网络设备与Linux网络协议栈的关联,揭示它们如何共同工作以支持复杂的网络需求。
|
2月前
|
存储 网络协议 安全
POSIX API与网络协议栈
POSIX API与网络协议栈
36 0
|
2月前
|
机器学习/深度学习 人工智能 API
人工智能应用工程师技能提升系列2、——TensorFlow2——keras高级API训练神经网络模型
人工智能应用工程师技能提升系列2、——TensorFlow2——keras高级API训练神经网络模型
31 0
|
3月前
|
网络协议 Linux API
Posix API与网络协议栈
Posix API与网络协议栈
128 0
|
10天前
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。
|
17天前
|
监控 前端开发 JavaScript
实战篇:商品API接口在跨平台销售中的有效运用与案例解析
随着电子商务的蓬勃发展,企业为了扩大市场覆盖面,经常需要在多个在线平台上展示和销售产品。然而,手工管理多个平台的库存、价格、商品描述等信息既耗时又容易出错。商品API接口在这一背景下显得尤为重要,它能够帮助企业在不同的销售平台之间实现商品信息的高效同步和管理。本文将通过具体的淘宝API接口使用案例,展示如何在跨平台销售中有效利用商品API接口,以及如何通过代码实现数据的统一管理。
|
29天前
|
安全 算法 API
产品经理必备知识——API接口
前言 在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代,我通过一部手机就可以实现衣食住行的方方面面,比如:在家购物、远程控制家电、自动驾驶等等,背后都离不开我们今天要聊的API接口。
|
29天前
|
数据采集 JSON API
如何实现高效率超简洁的实时数据采集?——Python实战电商数据采集API接口
你是否曾为获取重要数据而感到困扰?是否因为数据封锁而无法获取所需信息?是否因为数据格式混乱而头疼?现在,所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据采集API接口。