TCP/IP协议栈在Linux内核中的运行时序分析

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

本文主要是讲解TCP/IP协议栈在Linux内核中的运行时序,文章较长,里面有配套的视频讲解,建议收藏观看。

1 Linux概述

  1.1 Linux操作系统架构简介

Linux操作系统总体上由Linux内核和GNU系统构成,具体来讲由4个主要部分构成,即Linux内核、Shell、文件系统和应用程序。内核、Shell和文件系统构成了操作系统的基本结构,使得用户可以运行程序、管理文件并使用系统。

内核是操作系统的核心,具有很多最基本功能,如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络功能。我们所调研的工作,就是在Linux内核层面进行分析。

Linux内核协议栈相关视频讲解:Linux内核网络协议栈详解

底层原理到徒手实现 TCP/IP网络协议栈视频讲解:底层原理到徒手实现 TCP/IP网络协议栈

C/C++ Linux服务器开发高级架构学习视频点击:C/C++Linux服务器开发/Linux后台架构师-学习视频

1.2 协议栈简介

  OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。

ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐所有公司使用这个规范来控制网络。这样所有公司都有相同的规范,就能互联了。

OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。如下图。

每一层实现各自的功能和协议,并完成与相邻层的接口通信。OSI的服务定义详细说明了各层所提供的服务。某一层的服务就是该层及其下各层的一种能力,它通过接口提供给更高一层。各层所提供的服务与这些服务是怎么实现的无关。

  osi七层模型已经成为了理论上的标准,但真正运用于实践中的是TCP/IP五层模型。

  TCP/IP五层协议和osi的七层协议对应关系如下:

在每一层实现的协议也各不同,即每一层的服务也不同.下图列出了每层主要的协议。

  1.3 Linux内核协议栈

  Linux的协议栈其实是源于BSD的协议栈,它向上以及向下的接口以及协议栈本身的软件分层组织的非常好。
  Linux的协议栈基于分层的设计思想,总共分为四层,从下往上依次是:物理层,链路层,网络层,应用层。
  物理层主要提供各种连接的物理设备,如各种网卡,串口卡等;链路层主要指的是提供对物理层进行访问的各种接口卡的驱动程序,如网卡驱动等;网路层的作用是负责将网络数据包传输到正确的位置,最重要的网络层协议当然就是IP协议了,其实网络层还有其他的协议如ICMP,ARP,RARP等,只不过不像IP那样被多数人所熟悉;传输层的作用主要是提供端到端,说白一点就是提供应用程序之间的通信,传输层最著名的协议非TCP与UDP协议末属了;应用层,顾名思义,当然就是由应用程序提供的,用来对传输数据进行语义解释的“人机界面”层了,比如HTTP,SMTP,FTP等等,其实应用层还不是人们最终所看到的那一层,最上面的一层应该是“解释层”,负责将数据以各种不同的表项形式最终呈献到人们眼前。
  Linux网络核心架构Linux的网络架构从上往下可以分为三层,分别是:
  用户空间的应用层。
  内核空间的网络协议栈层。
  物理硬件层。
  其中最重要最核心的当然是内核空间的协议栈层了。
  Linux网络协议栈结构Linux的整个网络协议栈都构建与Linux Kernel中,整个栈也是严格按照分层的思想来设计的,整个栈共分为五层,分别是 :
  1,系统调用接口层,实质是一个面向用户空间应用程序的接口调用库,向用户空间应用程序提供使用网络服务的接口。
  2,协议无关的接口层,就是SOCKET层,这一层的目的是屏蔽底层的不同协议(更准确的来说主要是TCP与UDP,当然还包括RAW IP, SCTP等),以便与系统调用层之间的接口可以简单,统一。简单的说,不管我们应用层使用什么协议,都要通过系统调用接口来建立一个SOCKET,这个SOCKET其实是一个巨大的sock结构,它和下面一层的网络协议层联系起来,屏蔽了不同的网络协议的不同,只吧数据部分呈献给应用层(通过系统调用接口来呈献)。
  3,网络协议实现层,毫无疑问,这是整个协议栈的核心。这一层主要实现各种网络协议,最主要的当然是IP,ICMP,ARP,RARP,TCP,UDP等。这一层包含了很多设计的技巧与算法,相当的不错。
  4,与具体设备无关的驱动接口层,这一层的目的主要是为了统一不同的接口卡的驱动程序与网络协议层的接口,它将各种不同的驱动程序的功能统一抽象为几个特殊的动作,如open,close,init等,这一层可以屏蔽底层不同的驱动程序。
  5,驱动程序层,这一层的目的就很简单了,就是建立与硬件的接口层。
  可以看到,Linux网络协议栈是一个严格分层的结构,其中的每一层都执行相对独立的功能,结构非常清晰。
  其中的两个“无关”层的设计非常棒,通过这两个“无关”层,其协议栈可以非常轻松的进行扩展。在我们自己的软件设计中,可以吸收这种设计方法。

2 代码简介

本文采用的测试代码是一个非常简单的基于socket的客户端服务器程序,打开服务端并运行,再开一终端运行客户端,两者建立连接并可以发送hello\hi的信息,server端代码如下:

#include <stdio.h>     /* perror */
#include <stdlib.h>    /* exit    */
#include <sys/types.h> /* WNOHANG */
#include <sys/wait.h>  /* waitpid */
#include <string.h>    /* memset */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netdb.h> /* gethostbyname */

#define true        1
#define false       0

#define MYPORT      3490    /* 监听的端口 */
#define BACKLOG     10      /* listen的请求接收队列长度 */
#define BUF_SIZE    1024

int main()
{
    int sockfd;
    if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
    {
        perror("socket");
        exit(1);
    }

    struct sockaddr_in sa;         /* 自身的地址信息 */
    sa.sin_family = AF_INET;
    sa.sin_port = htons(MYPORT);     /* 网络字节顺序 */
    sa.sin_addr.s_addr = INADDR_ANY; /* 自动填本机IP */
    memset(&(sa.sin_zero), 0, 8);    /* 其余部分置0 */

    if (bind(sockfd, (struct sockaddr *)&sa, sizeof(sa)) == -1)
    {
        perror("bind");

        exit(1);
    }

    struct sockaddr_in their_addr; /* 连接对方的地址信息 */
    unsigned int sin_size = 0;
    char buf[BUF_SIZE];
    int ret_size = recvfrom(sockfd, buf, BUF_SIZE, 0, (struct sockaddr *)&their_addr, &sin_size);
    if(ret_size == -1)
    {
        perror("recvfrom");
        exit(1);
    }
    buf[ret_size] = '\0';
    printf("recvfrom:%s", buf); 
}

client端代码如下:

#include <stdio.h>     /* perror */
#include <stdlib.h>    /* exit    */
#include <sys/types.h> /* WNOHANG */
#include <sys/wait.h>  /* waitpid */
#include <string.h>    /* memset */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netdb.h> /* gethostbyname */

#define true 1
#define false 0

#define PORT 3490       /* Server的端口 */
#define MAXDATASIZE 100 /* 一次可以读的最大字节数 */

int main(int argc, char *argv[])
{
    int sockfd, numbytes;
    char buf[MAXDATASIZE];
    struct hostent *he;            /* 主机信息 */
    struct sockaddr_in server_addr; /* 对方地址信息 */
    if (argc != 2)
    {
        fprintf(stderr, "usage: client hostname\n");
        exit(1);
    }

    /* get the host info */
    if ((he = gethostbyname(argv[1])) == NULL)
    {
        /* 注意:获取DNS信息时,显示出错需要用herror而不是perror */
        /* herror 在新的版本中会出现警告,已经建议不要使用了 */
        perror("gethostbyname");
        exit(1);
    }

    if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
    {
        perror("socket");
        exit(1);
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT); /* short, NBO */
    server_addr.sin_addr = *((struct in_addr *)he->h_addr_list[0]);
    memset(&(server_addr.sin_zero), 0, 8); /* 其余部分设成0 */
 
    if ((numbytes = sendto(sockfd, 
                           "Hello, world!\n", 14, 0, 
                           (struct sockaddr *)&server_addr, 
                           sizeof(server_addr))) == -1)
    {
        perror("sendto");
        exit(1);
    }

    close(sockfd);

    return true;
}

简单来说,主要流程如下图所示:

专攻Linux内核,从事内核开发的朋友,需要学习资料可以看看下面的视频是否需要学习,点击:Linux内核学习资料 获取

Linux内核开发学习路线大纲:

3 应用层流程

  3.1 发送端

解析pcap文件,逐步认识tcp/ip协议栈 通过解析pcap初步认识协议栈 阅读详情

相关推荐

【C语言】tcp_sendmsg_locked

整体上,`tcp_sendmsg_locked` 函数处理了一系列复杂的 TCP 发送逻辑,包括 TCP 发送缓冲区的管理、段的创建及填充、发送拥塞控制、零拷贝优化等。该函数首先锁定目标socket,然后调用实际发送消息实现的内部函数`tcp_sendmsg_locked`,发送过程完成后释放锁,并返回发送操作的结果(成功发送的字节数或错误码)。这个函数`tcp_sendmsg`用于处理TCP socket的发送消息操作。- 数据发送后,函数执行必要的清理操作,返回拷贝的字节数,或者发送失败时的错误码。

数字人生 1774

TCPIP Architecture, Design and Implementation in Linux 无水印pdf

TCPIP Architecture, Design and Implementation in Linux 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

linux内核协议栈 TCP层数据发送之TSO/GSO

TSO相关的内容充斥着TCP的整个发送过程,弄明白其机制对理解TCP的发送过程至关重要,这篇笔记就来看看TSO相关内容。 1. 基本概念 我们知道,网络设备一次能够传输的最大数据量就是MTU,即IP传递给网络设备的每一个数据包不能超过MTU个字节,IP层的分段和重组功能就是为了适配网络设备的MTU而存在的。从理论上来讲,TCP可以不关心MTU的限定,只需要按照自己的意愿随意的将数据包丢给IP,是否需要分段可以由IP透明的处理,但是由于分片会带来效率和性能上的损失,所以TCP在实现时总是会基于MTU设定自

8885

TCPIP_Architecture_Design_And_Implementation_In_Linux.pdf

TCPIP_Architecture_Design_And_Implementation_In_Linux压缩包2 解压方法:下载所有3个包全选后7-zip解压即可

tcp协议之报文发送流程

1.若开启了tcp pacing功能则每次的报文发送实际是由高精度定时器pacing_timer的回调函数中进入tcp_write_xmit->tcp_transmit_skb将报文发送到ip层。若没有开启tcp pacing功能则每次tcp_write_xmit函数再判断是否使用Nagle机制进行报文的合并发送。

xxt99的博客 2020

linux 内核网络发送技术栈(一)

网卡启动 static int __igb_open(struct net_device *netdev, bool resuming) { //分配RingBuffer //发送队列 err = igb_setup_all_tx_resources(adapter); //接收队列 err = igb_setup_all_rx_resources(adapter); //开启全部队列 netif_tx_start_all_queues(netdev); } ..

1653

深入理解TCP协议及其源代码——send和recv背后数据的收发过程

函数向被服务端监听的socket发起一个连接请求,即发起一次TCP连接的三次握手。函数的缓冲区分别是buff和ubuf指向的内存空间,我们从源码中看一看这两个缓冲区中的数据是如何被处理的。只管拷贝,真正的发送和接收是由TCP连接负责的。为了实现数据的收发,每个TCP socket在内核中都维护了一个发送缓冲区和一个接收缓冲区,函数把应用缓冲区中的数据拷贝到TCP发送缓冲区中,接下来的发送过程由TCP负责;函数创建一个socket对象,生成一个socket文件描述符,然后通过。可以看到,这两个函数相当复杂。

木牛的博客 1942

linux内核tcp/ip协议栈分析,TCP/IP协议栈Linux内核中的运行时序分析

一、调研要求在深入理解Linux内核任务调度(中断处理、softirg、tasklet、wq、内核线程等)机制的基础上,分析梳理send和recv过程中TCP/IP协议栈相关的运行任务实体及相互协作的时序分析。编译、部署、运行、测评、原理、源代码分析、跟踪调试等应该包括时序图二、Linux内核与网络体系结构在我们了解整个linux系统的网络体系结构之前,我们需要对整个网络体系调用,初始化和交互的...

weixin_34704521的博客 1265

TCP/IP 协议栈Linux 内核中的 运行时序分析

一个完整的Linux内核一般由5部分组成,它们分别是内存管理、进程管理、进程间通信、bai虚拟文件系统和网络接口。内存管理主要完成的是如何合理有效地管理整个系统的物理内存,同时快速响应内核各个子系统对内存分配的请求。Linux内存管理支持虚拟内存,而多余出的这部分内存就是通过磁盘申请得到的,平时系统只把当前运行的程序块保留在内存中,其他程序块则保留在磁盘中。在内存紧缺时,内存管理负责在磁盘和内存间交换程序块。进程管理主要控制系统进程对CPU的访问。

1317

TCP/IP协议栈Linux内核中的运行时序分析【万字长文】

1 Linux概述   1.1 Linux操作系统架构简介 Linux操作系统总体上由Linux内核和GNU系统构成,具体来讲由4个主要部分构成,即Linux内核、Shell、文件系统和应用程序。内核、Shell和文件系统构成了操作系统的基本结构,使得用户可以运行程序、管理文件并使用系统内核是操作系统的核心,具有很多最基本功能,如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络功能。我们所调研的工作,就是在Linux内核层面进行分析。 1.2 协议栈简介   OSI(.

一口Linux的专栏 1143

linux内核tcp协议栈分析,TCP/IP协议栈Linux内核中的运行时序分析

TCP/IP协议栈Linux内核中的运行时序分析姓名:唐全意 学号:SA20225432调研要求1.在深入理解Linux内核任务调度(中断处理、softirg、tasklet、wq、内核线程等)机制的基础上,分析梳理send和recv过程中TCP/IP协议栈相关的运行任务实体及相互协作的时序分析。2.编译、部署、运行、测评、原理、源代码分析、跟踪调试等。3.应该包括时序图1:TCP/I...

weixin_39714835的博客 220

linuxIPROTO_TCP,TCP/IP协议栈Linux内核中的运行时序分析

可选题目三:TCP/IP协议栈Linux内核中的运行时序分析在深入理解Linux内核任务调度(中断处理、softirg、tasklet、wq、内核线程等)机制的基础上,分析梳理send和recv过程中TCP/IP协议栈相关的运行任务实体及相互协作的时序分析。编译、部署、运行、测评、原理、源代码分析、跟踪调试等应该包括时序一, 基础概念简介1.什么是TCP/IP?TCP/IP 也即传输控制协议/网...

weixin_39608509的博客 415

linux内核tcp ip协议栈分析,TCP/IP协议栈Linux内核中的运行时序分析

一、Linux内核运行实体1.内容运行实体包括内核线程、系统调用过程、中断处理过程、软中断、tasklet、work queue等内核线程跟其他线程一样,参与线程调度。在系统进行线程切换的时候,会保存相应的上下文,然后根据线程调用算法,选择要调度的线程进行CPU的分配和执行。这里主要介绍软中断线程ksoftirqd系统调用是内核向用户进程提供服务的唯一方法,应用程序调用操作系统提供的功能模块。用户...

weixin_30341571的博客 186

内核网络TCP/IP协议

参考:TCP/IP协议栈Linux内核中的运行时序分析【万字长文】 - 维科号

luoye_369的博客 367
上一篇: WebRTC学习—WebRTC详解
下一篇: 现在后端开发都在用什么数据库存储数据?
Linux服务器开发
博客等级 码龄7年 609粉丝 589原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值