Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux tcp/ip 源码分析 - three way handshake

Linux tcp/ip 源码分析 - three way handshake

作者头像
KINGYT
修改于 2019-06-11 08:11:13
修改于 2019-06-11 08:11:13
2.6K223
代码可运行
举报
运行总次数:23
代码可运行

在上一篇文章中我们讲到,connect方法会发送syn消息给服务端,之后客户端会进入TCP_SYN_SENT状态。

这就是tcp三次握手的第一步。

接下来我们看下,服务端收到syn消息后的处理逻辑。

首先,ip层在收到消息后,会调用tcp_v4_rcv方法将消息转给tcp层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_ipv4.c
int tcp_v4_rcv(struct sk_buff *skb)
{
  ...
  const struct iphdr *iph;
  const struct tcphdr *th;
  ...
  struct sock *sk;
  int ret;
  ...
  th = (const struct tcphdr *)skb->data;
  iph = ip_hdr(skb);
  ...
  sk = __inet_lookup_skb(&tcp_hashinfo, skb, __tcp_hdrlen(th), th->source,
             th->dest, sdif, &refcounted);
  ...
  if (sk->sk_state == TCP_LISTEN) {
    ret = tcp_v4_do_rcv(sk, skb);
    goto put_and_return;
  }
  ...
  return ret;
  ...
}

方法描述

1. 调用__inet_lookup_skb方法,根据ip、端口等信息在全局的hashtable中找到对应的sock。

2. 此时sk->sk_state应该是TCP_LISTEN状态,所以会继续调用tcp_v4_do_rcv方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_ipv4.c
int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
{
  struct sock *rsk;
  ...
  if (tcp_rcv_state_process(sk, skb)) {
    ...
    goto reset;
  }
  return 0;
  ...
}
EXPORT_SYMBOL(tcp_v4_do_rcv);

该方法会继续调用tcp_rcv_state_process方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_input.c
int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
{
  ...
  struct inet_connection_sock *icsk = inet_csk(sk);
  const struct tcphdr *th = tcp_hdr(skb);
  ...
  switch (sk->sk_state) {
  ...
  case TCP_LISTEN:
    ...
    if (th->syn) {
      ...
      acceptable = icsk->icsk_af_ops->conn_request(sk, skb) >= 0;
      ...
      return 0;
    }
  ...
  }
  ...
}
EXPORT_SYMBOL(tcp_rcv_state_process);

因为客户端发来的是syn消息,而服务端此时是TCP_LISTEN状态,所以该方法最终会调用icsk->icsk_af_ops->conn_request(sk, skb)方法。

由第一篇文章我们可以知道,icsk->icsk_af_ops字段的值为&ipv4_specific,所以icsk->icsk_af_ops->conn_request指向的方法为tcp_v4_conn_request。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_ipv4.c
int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
{
  ...
  return tcp_conn_request(&tcp_request_sock_ops,
        &tcp_request_sock_ipv4_ops, sk, skb);
  ...
}
EXPORT_SYMBOL(tcp_v4_conn_request);

该方法又调用了tcp_conn_request方法,其中前两个参数为两个结构体,内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_ipv4.c
struct request_sock_ops tcp_request_sock_ops __read_mostly = {
  .family    =  PF_INET,
  .obj_size  =  sizeof(struct tcp_request_sock),
  .rtx_syn_ack  =  tcp_rtx_synack,
  .send_ack  =  tcp_v4_reqsk_send_ack,
  .destructor  =  tcp_v4_reqsk_destructor,
  .send_reset  =  tcp_v4_send_reset,
  .syn_ack_timeout =  tcp_syn_ack_timeout,
};

static const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = {
  .mss_clamp  =  TCP_MSS_DEFAULT,
#ifdef CONFIG_TCP_MD5SIG
  .req_md5_lookup  =  tcp_v4_md5_lookup,
  .calc_md5_hash  =  tcp_v4_md5_hash_skb,
#endif
  .init_req  =  tcp_v4_init_req,
#ifdef CONFIG_SYN_COOKIES
  .cookie_init_seq =  cookie_v4_init_sequence,
#endif
  .route_req  =  tcp_v4_route_req,
  .init_seq  =  tcp_v4_init_seq,
  .init_ts_off  =  tcp_v4_init_ts_off,
  .send_synack  =  tcp_v4_send_synack,
};

tcp_conn_request方法如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_input.c
int tcp_conn_request(struct request_sock_ops *rsk_ops,
         const struct tcp_request_sock_ops *af_ops,
         struct sock *sk, struct sk_buff *skb)
{
  ...
  struct request_sock *req;
  ...
  req = inet_reqsk_alloc(rsk_ops, sk, !want_cookie);
  ...
  tcp_rsk(req)->af_specific = af_ops;
  ...
  if (fastopen_sk) {
    ...
  } else {
    ...
    if (!want_cookie)
      inet_csk_reqsk_queue_hash_add(sk, req,
        tcp_timeout_init((struct sock *)req));
    af_ops->send_synack(sk, dst, &fl, req, &foc,
            !want_cookie ? TCP_SYNACK_NORMAL :
               TCP_SYNACK_COOKIE);
    ...
  }
  ...
  return 0;
  ...
}
EXPORT_SYMBOL(tcp_conn_request);

方法描述

1. 调用inet_reqsk_alloc方法,分配并初始化一个struct request_sock实例,用于存储连接请求数据。

2. 将tcp_rsk(req)->af_specific的值设置为af_ops,即&tcp_request_sock_ipv4_ops。

3. 调用inet_csk_reqsk_queue_hash_add方法,将连接请求实例req添加到全局hashtable中。

4. 调用af_ops->send_synack发送synack消息给客户端。

我们再来看下inet_reqsk_alloc方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_input.c
struct request_sock *inet_reqsk_alloc(const struct request_sock_ops *ops,
              struct sock *sk_listener,
              bool attach_listener)
{
  struct request_sock *req = reqsk_alloc(ops, sk_listener,
                 attach_listener);

  if (req) {
    struct inet_request_sock *ireq = inet_rsk(req);
    ...
    ireq->ireq_state = TCP_NEW_SYN_RECV;
    ...
  }

  return req;
}
EXPORT_SYMBOL(inet_reqsk_alloc);

该方法中要注意的就是,ireq->ireq_state的值被设置为TCP_NEW_SYN_RECV,这个后面会用到。

该方法有调用了reqsk_alloc方法,继续看下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// include/net/request_sock.h
static inline struct request_sock *
reqsk_alloc(const struct request_sock_ops *ops, struct sock *sk_listener,
      bool attach_listener)
{
  struct request_sock *req;

  req = kmem_cache_alloc(ops->slab, GFP_ATOMIC | __GFP_NOWARN);
  ...
  if (attach_listener) {
    ...
    req->rsk_listener = sk_listener;
  }
  req->rsk_ops = ops;
  req_to_sk(req)->sk_prot = sk_listener->sk_prot;
  ...
  return req;
}

该方法需要注意的是

1. req->rsk_listener字段被设置为sk_listener,即listen sock。

2. req->rsk_ops被设置为ops,即&tcp_request_sock_ops。

到这里tcp_conn_request方法就算分析结束了。

至此,tcp三次握手的第二步结束。

我们再来看下客户端在收到synack消息时是如何处理的。

还是回到tcp_v4_rcv方法,此时sock的状态为TCP_SYN_SENT。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_ipv4.c
int tcp_v4_rcv(struct sk_buff *skb)
{
  ...
  const struct tcphdr *th;
  struct sock *sk;
  ...
  th = (const struct tcphdr *)skb->data;
  ...
  sk = __inet_lookup_skb(&tcp_hashinfo, skb, __tcp_hdrlen(th), th->source,
             th->dest, sdif, &refcounted);
  ...
  ret = 0;
  if (!sock_owned_by_user(sk)) {
    ret = tcp_v4_do_rcv(sk, skb);
  } else if (tcp_add_backlog(sk, skb)) {
    ...
  }
  ...
  return ret;
  ...
}

方法描述

1. 调用__inet_lookup_skb方法,根据ip、端口等信息,从全局hashtable中找到对应的sock。

2. 调用tcp_v4_do_rcv方法,继续处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_ipv4.c
int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
{
  struct sock *rsk;
  ...
  if (tcp_rcv_state_process(sk, skb)) {
    ...
    goto reset;
  }
  return 0;
  ...
}
EXPORT_SYMBOL(tcp_v4_do_rcv);

该方法又调用了tcp_rcv_state_process方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_input.c
int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
{
  ...
  const struct tcphdr *th = tcp_hdr(skb);
  ...
  switch (sk->sk_state) {
  ...
  case TCP_SYN_SENT:
    ...
    queued = tcp_rcv_synsent_state_process(sk, skb, th);
    ...
    return 0;
  }
  ...
}
EXPORT_SYMBOL(tcp_rcv_state_process);

因为客户端此时的状态为TCP_SYN_SENT,所以该方法最终会调用tcp_rcv_synsent_state_process方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_input.c
static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
           const struct tcphdr *th)
{
  struct inet_connection_sock *icsk = inet_csk(sk);
  ...
  if (th->ack) {
    ...
    if (!th->syn)
      goto discard_and_undo;
    ...
    tcp_finish_connect(sk, skb);
    ...
    if (!sock_flag(sk, SOCK_DEAD)) {
      sk->sk_state_change(sk);
      ...
    }
    ...
    if (sk->sk_write_pending ||
        icsk->icsk_accept_queue.rskq_defer_accept ||
        icsk->icsk_ack.pingpong) {
      ...
    } else {
      tcp_send_ack(sk);
    }
    return -1;
  }
  ...
}

方法描述

1. 如果此ack消息里没有syn标志,则丢弃消息。

2. 调用tcp_finish_connect方法,将sk->sk_state设置为TCP_ESTABLISHED,表示tcp建立连接成功。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_input.c
void tcp_finish_connect(struct sock *sk, struct sk_buff *skb)
{
  ...
  tcp_set_state(sk, TCP_ESTABLISHED);
  ...
}

3. 调用sk->sk_state_change方法,通知sock状态发生变化。

在上一篇文章中我们讲到,如果socket没设置nonblock状态,则当connect时,会阻塞等待状态变化,而这里的sk->sk_state_change方法,正是用于告知等待线程sock状态变化了,可以从阻塞状态退出了。

4. 调用tcp_send_ack方法发送三次握手的最终的ack消息。

我们再来看下,服务端在收到这个ack消息后是如何处理的。

还是看tcp_v4_rcv方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_ipv4.c
int tcp_v4_rcv(struct sk_buff *skb)
{
  ...
  const struct tcphdr *th;
  ...
  struct sock *sk;
  ...
  th = (const struct tcphdr *)skb->data;
  ...
  sk = __inet_lookup_skb(&tcp_hashinfo, skb, __tcp_hdrlen(th), th->source,
             th->dest, sdif, &refcounted);
  ...
  if (sk->sk_state == TCP_NEW_SYN_RECV) {
    struct request_sock *req = inet_reqsk(sk);
    struct sock *nsk;

    sk = req->rsk_listener;
    ...
    nsk = NULL;
    if (!tcp_filter(sk, skb)) {
      ...
      nsk = tcp_check_req(sk, skb, req, false);
    }
    ...
    if (nsk == sk) {
      ...
    } else if (tcp_child_process(sk, nsk, skb)) {
      ...
    } else {
      ...
      return 0;
    }
  }
  ...
}

方法描述

1. 调用__inet_lookup_skb方法,根据ip、端口等信息找到对应的sock。

2. 因为sk->sk_state为TCP_NEW_SYN_RECV,所以将sk转成struct request_sock类型,并赋值给req。

3. 将sk值设置为req->rsk_listener,即listen sock。

4. 调用tcp_check_req方法,创建一个新的struct sock实例newsk,把newsk->sk_state状态设置为TCP_SYN_RECV,之后把struct request_sock实例中的数据赋值到newsk中,再之后把newsk放到全局的hashtable中,最后把newsk放到listen sock的icsk_accept_queue队列中,这样后面的accept方法就能从这个队列获取这个sock了。

由于涉及到的代码太多,这里就不贴代码了,只说下相关方法

// net/ipv4/tcp_ipv4.c tcp_v4_syn_recv_sock // net/ipv4/inet_connection_sock.c inet_csk_complete_hashdance

5. 调用tcp_child_process将nsk->sk_state设置为TCP_ESTABLISHED,表示连接建立成功。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_minisocks.c
int tcp_child_process(struct sock *parent, struct sock *child,
          struct sk_buff *skb)
{
  int ret = 0;
  int state = child->sk_state;
  ...
  if (!sock_owned_by_user(child)) {
    ret = tcp_rcv_state_process(child, skb);
    ...
  } else {
    ...
  }
  ...
  return ret;
}
EXPORT_SYMBOL(tcp_child_process);

该方法调用了tcp_rcv_state_process方法,此时参数child的sk_state为TCP_SYN_RECV。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// net/ipv4/tcp_input.c
int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
{
  ...
  switch (sk->sk_state) {
  case TCP_SYN_RECV:
    ...
    tcp_set_state(sk, TCP_ESTABLISHED);
    sk->sk_state_change(sk);
    ...
    break;
  ...
  }
  ...
  return 0;
}
EXPORT_SYMBOL(tcp_rcv_state_process);

6. return 0 给上层,表示成功。

至此,tcp三次握手全部结束,tcp连接建立成功。

完。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux内核及JVM底层相关技术研究 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
解释的很好,很详细,谢谢
解释的很好,很详细,谢谢
回复回复1举报
步骤还是很清晰的
步骤还是很清晰的
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
小白也能看懂的DeepSeek-R1本地部署指南
春节期间 Deepseek 凭借其出色的性能表现,吸引了众多技术爱好者的目光,会用的人说巨好用,但是也有很多人说也不过如此,其实这么多国际巨头都震惊,自然是非常惊艳的一款产品。如果你也渴望在本地部署该模型,深入探索其强大功能,那么这篇攻略将为你提供详细的指导。这里面我将给大家演示的是 windows 和 mac 双平台的部署。废话不多说,现在开始和大家一起部署。
徐建国
2025/02/06
53.5K5
小白也能看懂的DeepSeek-R1本地部署指南
如何在本地部署 DeepSeek R1 模型?
在这个科技日新月异的时代,人工智能早已不再是遥不可及的未来幻想,而是悄然融入了我们的日常生活。
JanYork_简昀
2025/05/20
3020
如何在本地部署 DeepSeek R1 模型?
在本地电脑部署自己的 DeepSeek 大模型 AI:小白也能轻松上手
最近 DeepSeek 大模型 AI 火遍全网,我也忍不住去了解了一番。尝试在本地部署后,发现整个过程非常简单,于是决定记录下来,分享给大家。本文将以最基础的方式演示如何部署,无需使用 Docker 容器,也不需要“魔法上网”,即使是计算机小白也能按照步骤轻松完成。
后端码匠
2025/02/06
3.3K0
基于Ollama的DeepSeek R1本地部署全流程指南:从零到推理实战
在人工智能技术快速发展的今天,本地化部署大型语言模型(LLM)已成为开发者与研究人员的重要需求。本文将详细介绍如何通过Ollama框架实现DeepSeek R1模型的本地部署,涵盖从硬件选型到推理实战的全流程,并提供针对不同场景的优化方案。
Towserliu
2025/02/06
11K0
基于Ollama的DeepSeek R1本地部署全流程指南:从零到推理实战
如何快速高效本地部署DeepseekR1大模型?保姆级教程 无惧隐私威胁
DeepSeek 隐私政策中提到了关于用户输入信息收集的条款,无论你输入什么文本,以及上传什么文件都会被第三方机构所收集,所以如果是在进行相关的项目研究或者实验进展分析的时候,就很有必要对数据进行隐私保护,且本地部署是支持离线的
DARLING Zero two
2025/02/02
5.7K0
如何快速高效本地部署DeepseekR1大模型?保姆级教程 无惧隐私威胁
一文读懂DeepSeek-R1本地部署配置要求(建议收藏)
发布把AI带回家:DeepSeek-R1本地部署指南!再也不怕宕机了!!后,有不少读者私信询问本地部署DeepSeek-R1的电脑配置要求。
一臻AI
2025/03/06
1.7K0
一文读懂DeepSeek-R1本地部署配置要求(建议收藏)
高效快速教你deepseek如何进行本地部署并且可视化对话
随着最近一个新的人工智能deepseek的爆火,很多大佬都开始了在本地进行deepseek的部署操作,并且离线也可以使用,这里的话我就一步一步带你们部署本地的deepseek,说实话这个人工智能的实力不亚于open ai 的gpt
Undoom
2025/02/02
14.8K8
高效快速教你deepseek如何进行本地部署并且可视化对话
使用 DeepSeek R1 和 Ollama 搭建一个 RAG 系统(包含完整代码)
你有没有想过,能不能像跟人聊天一样,直接问 PDF 文件或技术手册问题?比如你有一本很厚的说明书,不想一页页翻,只想问它:“这个功能怎么用?”或者“这个参数是什么意思?”现在有了 AI 技术,这完全可以实现!
wayn
2025/02/12
1.8K1
使用 DeepSeek R1 和 Ollama 搭建一个 RAG 系统(包含完整代码)
AI 最佳实战:最简单、最强大的 DeepSeek R1 本地部署及配置建议指南
只会用 Ollama 本地运行 DeepSeek R1 等大模型?本文介绍一款简单、强大的本地运行各种 LLM 的工具,LM Studio。
运维有术
2025/02/12
6720
AI 最佳实战:最简单、最强大的 DeepSeek R1 本地部署及配置建议指南
1分钟学会DeepSeek本地部署,小白也能搞定!
DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型,具备数学推理、代码生成等深度能力,堪称"AI界的六边形战士"。
磊哥
2025/02/09
2.1K0
1分钟学会DeepSeek本地部署,小白也能搞定!
教你 1 小时搭建属于自己的 AI 知识库,Ollama + MaxKB 超详细教程略
我们经常为海量文档找不到关键内容而烦恼,那么可以使用AI 帮忙轻松检索个人笔记,并且还能优化我们的文章,以我们的风格生成文章。今天,我来教你用 Ollama 和 MaxKB 搭建一个属于自己的 AI 知识库,让你的知识随时为你服务. Ollama 作为轻量级模型管理平台,可以快速安装、运行多种 AI 模型,如 DeepSeek-R1、Llama3 等。本文将手把手教你如何:
神的孩子都在歌唱
2025/03/29
9130
教你 1 小时搭建属于自己的 AI 知识库,Ollama + MaxKB 超详细教程略
DeepSeek-R1 671B 满血版完整本地部署教程,来了!!!
过年这几天,DeepSeek 算是彻底破圈了,火遍大江南北,火到人尽皆知。虽然网络版和 APP 版已经有了,但把模型部署到本地,才能真正实现独家定制,让 DeepSeek R1 的深度思考「以你为主,为你所用」。
码农编程进阶笔记
2025/02/19
13.1K0
DeepSeek-R1 671B 满血版完整本地部署教程,来了!!!
本地部署DeepSeek-R1大模型
想不依赖网络、零门槛运行AI大模型?Ollama帮你轻松实现!本文手把手教你部署DeepSeek模型,并通过本地API实现对话、编程、数据分析,小白也能秒变AI玩家!🌟
全栈开发日记
2025/02/10
1.1K0
本地部署DeepSeek-R1大模型
大模型系列:Win10环境下部署DeepSeek图文教程
DeepSeek作为国内目前最火的AI技术,相信许多互联网爱好者都有所了解,大家可以通过DeepSeek官网进行体验访问,不过比较纠结的是大家估计都遇到过访问超时的情况。
小明互联网技术分享社区
2025/02/10
1.7K0
大模型系列:Win10环境下部署DeepSeek图文教程
【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)
2025年1月,中国春节期间,DeepSeek爆火,称为全球最炙手可热的大模型。DeepSeek一路 “狂飙”,在美国科技界和美股市场掀起惊涛骇浪,1月27日,美国三大股指开盘即暴跌,英伟达、微软、谷歌母公司Alphabet、Meta等美国主要科技股均遭遇股市地震,其中英伟达跌近17%,单日市值蒸发约6000亿美元,创美股最高纪录。
Francek Chen
2025/02/12
1.7K0
【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)
DeepSeek-R1本地部署如何选择适合你的版本?看这里
如果你正在考虑将DeepSeek-R1部署到本地服务器上,了解每种类型的硬件需求是非常重要的。DeepSeek-R1是一个非常强大的语言模型,它有多个不同的版本,每个版本在计算资源和硬件要求上都有不同的需求。本文将帮助你理解每个版本的参数、所需硬件以及如何根据自己的需求选择合适的类型。
凯哥Java
2025/02/11
6.4K0
DeepSeek-R1本地部署如何选择适合你的版本?看这里
windows本地部署DeepSeek-R1模型
最近,在学习之余,我关注到了一个备受瞩目的热点话题——deepseek。这个横空出世的AI模型不仅效果超越了同期顶级AI,离谱的是,参数量不增反降的情况下,性能却大幅提升。最重要的是,deepseek是一个开源模型,这意味着人人都能享受到AI的强大力量。国内科技爱好者们对此激动不已,纷纷热议这一突破性进展。
柳神
2025/02/09
6910
windows本地部署DeepSeek-R1模型
无需云端服务器: 三步实现DeepSeek大模型本地化部署deepseek、Ollama和Chatbox
还在为云端AI服务的高昂费用而苦恼?是否总担心数据隐私会在云端泄露?别愁啦!DeepSeek R1——这款与OpenAI o1性能相媲美的开源大模型,结合Ollama和Chatbox工具,就能让你轻松在本地实现大模型的部署,零成本、高隐私,畅享AI应用的无限可能!🤗
猫头虎
2025/02/02
1.9K0
无需云端服务器: 三步实现DeepSeek大模型本地化部署deepseek、Ollama和Chatbox
Deepseek 本地部署“网页版”与“软件版”超级详细教学(deepseek+Ollama+OpenWebUI+Chatbox AI+Cherry Studi
近期,人工智能领域迎来了一股新的热潮,DeepSeek作为一款备受瞩目的开源语言模型,凭借其卓越的性能和广泛的应用场景,迅速在全球范围内引起了广泛关注。从技术社区到商业领域,DeepSeek的热度不断攀升,甚至有“挤爆”的趋势。这不仅反映了其强大的技术实力,也体现了市场和用户对其的高度期待。
久绊A
2025/02/20
2.5K0
【人工智能】学会这几个命令,你也能快速完成DeepSeek R1的本地部署!!!
相信大家现在对DeepSeek这个国产AI已经并不陌生了,并且大部分的朋友已经开始用上了DeepSeek。
蒙奇D索隆
2025/02/09
7602
【人工智能】学会这几个命令,你也能快速完成DeepSeek R1的本地部署!!!
推荐阅读
小白也能看懂的DeepSeek-R1本地部署指南
53.5K5
如何在本地部署 DeepSeek R1 模型?
3020
在本地电脑部署自己的 DeepSeek 大模型 AI:小白也能轻松上手
3.3K0
基于Ollama的DeepSeek R1本地部署全流程指南:从零到推理实战
11K0
如何快速高效本地部署DeepseekR1大模型?保姆级教程 无惧隐私威胁
5.7K0
一文读懂DeepSeek-R1本地部署配置要求(建议收藏)
1.7K0
高效快速教你deepseek如何进行本地部署并且可视化对话
14.8K8
使用 DeepSeek R1 和 Ollama 搭建一个 RAG 系统(包含完整代码)
1.8K1
AI 最佳实战:最简单、最强大的 DeepSeek R1 本地部署及配置建议指南
6720
1分钟学会DeepSeek本地部署,小白也能搞定!
2.1K0
教你 1 小时搭建属于自己的 AI 知识库,Ollama + MaxKB 超详细教程略
9130
DeepSeek-R1 671B 满血版完整本地部署教程,来了!!!
13.1K0
本地部署DeepSeek-R1大模型
1.1K0
大模型系列:Win10环境下部署DeepSeek图文教程
1.7K0
【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)
1.7K0
DeepSeek-R1本地部署如何选择适合你的版本?看这里
6.4K0
windows本地部署DeepSeek-R1模型
6910
无需云端服务器: 三步实现DeepSeek大模型本地化部署deepseek、Ollama和Chatbox
1.9K0
Deepseek 本地部署“网页版”与“软件版”超级详细教学(deepseek+Ollama+OpenWebUI+Chatbox AI+Cherry Studi
2.5K0
【人工智能】学会这几个命令,你也能快速完成DeepSeek R1的本地部署!!!
7602
相关推荐
小白也能看懂的DeepSeek-R1本地部署指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验