0%

TCP/IP 协议栈

TCP/IP 协议栈是互联网的核心通信框架,它定义了计算机之间如何通过网络进行数据传输的一系列规则。这个协议栈采用分层结构设计,将复杂的网络通信过程分解为多个独立的功能层,每层专注于特定任务,并通过接口与上下层协作。

TCP/IP 协议栈的分层结构(4 层模型)

通常将 TCP/IP 协议栈分为 4 层(从底层到上层),每层包含不同的协议,共同完成数据的封装、传输和解析:

1. 网络接口层(Network Interface Layer)

  • 作用:负责将数据通过物理网络(如以太网、Wi-Fi)传输,处理硬件相关的通信细节。

  • 核心协议 / 技术

    • 以太网(Ethernet):定义了局域网内数据传输的帧格式(包含 MAC 地址、校验码等)。
    • Wi-Fi(802.11 协议):无线局域网的通信标准。
    • ARP(地址解析协议):将 IP 地址转换为物理 MAC 地址,用于局域网内设备定位。
  • 数据单元:帧(Frame)

2. 网络层(Internet Layer)

  • 作用:负责跨网络(如局域网到广域网)的数据路由和转发,确保数据从源设备能找到目标地址。

  • 核心协议

    • IP(网际协议):最核心的协议,定义了 IP 地址(如 IPv4、IPv6),负责数据的分组和路由。
    • ICMP(互联网控制消息协议):用于网络诊断(如 ping 命令通过 ICMP 检测主机可达性)。
    • IGMP(互联网组管理协议):用于多播通信(如视频会议)。
  • 数据单元:数据包(Packet)

3. 传输层(Transport Layer)

  • 作用:提供端到端的可靠数据传输,处理数据的分段、重组、流量控制等。

  • 核心协议

    • TCP(传输控制协议):面向连接的可靠协议,通过三次握手建立连接、序列号保证顺序、重传机制处理丢包,适用于对可靠性要求高的场景(如网页、文件传输)。
    • UDP(用户数据报协议):无连接的不可靠协议,不保证数据到达顺序和完整性,但但传输速度快,适用于实时性要求高的场景(如视频通话、游戏)。
  • 数据单元:TCP 称为段(Segment),UDP 称为数据报(Datagram)

4. 应用层(Application Layer)

  • 作用:直接为用户应用程序提供服务,定义了数据交互的格式和规则。

  • 核心协议

    • HTTP/HTTPS:用于 Web 页面传输(如浏览器访问网站)。
    • FTP/SFTP:用于文件传输。
    • SMTP/POP3/IMAP:用于邮件发送和接收。
    • DNS:用于将域名(如 example.com)解析为 IP 地址。
    • SSH/Telnet:用于远程登录服务器。
  • 数据单元:数据(Data)

数据传输的封装与解封装过程

TCP/IP 协议栈通过 “封装” 和 “解封装” 实现数据传输,以浏览器访问网站为例:

  1. 封装(发送端)
    • 应用层:浏览器生成 HTTP 请求数据(如 GET /index.html)。
    • 传输层:TCP 为数据添加头部(源端口、目标端口、序列号等),形成 TCP 段。
    • 网络层:IP 为 TCP 段添加头部(源 IP、目标 IP、路由信息等),形成 IP 数据包。
    • 网络接口层:以太网为 IP 包添加头部(源 MAC、目标 MAC)和尾部(校验码),形成帧,通过物理介质(网线 / Wi-Fi)发送。
  2. 解封装(接收端)
    • 网络接口层:接收帧,校验并移除以太网头部,将 IP 数据包交给网络层。
    • 网络层:解析 IP 头部,确认目标 IP 匹配后,移除 IP 头部,将 TCP 段交给传输层。
    • 传输层:TCP 验证序列号,重组分段数据,移除 TCP 头部,将 HTTP 数据交给应用层。
    • 应用层:服务器解析 HTTP 请求,处理后返回响应,重复封装过程回传客户端。

总结

TCP/IP 协议栈是互联网的 “交通规则”,通过分层设计实现了功能解耦:

  • 底层(网络接口层、网络层)负责 “数据怎么传”(物理传输、路由);
  • 上层(传输层、应用层)负责 “传什么数据”(可靠传输、应用交互)。

这种结构使得不同厂商的设备(如电脑、路由器、服务器)能遵循统一标准通信,是互联网互联互通的基础。

我们以日常生活中 **“浏览网页(HTTP 请求)”为例,详细说明 TCP/IP 协议栈各层(应用层、传输层、网络层、网络接口层)的协作关系,以及数据在各层之间的封装、传递、解封装 ** 过程。

场景:用户在浏览器输入www.example.com并回车,请求加载网页

步骤 1:应用层(HTTP 协议)生成数据

  • 功能:应用层负责处理用户的具体需求(这里是 “获取网页内容”),使用 HTTP 协议定义数据格式。

  • 过程

    浏览器(应用层程序)生成一个 HTTP 请求报文,内容大致如下:

    plaintext

    1
    2
    3
    GET /index.html HTTP/1.1  
    Host: www.example.com
    User-Agent: Chrome/100.0.0.0

    这部分是 “原始数据”,需要交给下层(传输层)处理。

步骤 2:传输层(TCP 协议)封装:添加 “端口信息”

  • 功能:传输层负责 “端到端” 的可靠传输(TCP 是可靠协议),通过端口号区分同一设备上的不同应用(如浏览器用 80/443 端口,QQ 用其他端口)。

  • 过程

    传输层(TCP)会在 HTTP 数据前添加一个

    TCP 头部

    ,包含:

    • 源端口(浏览器随机分配,如54321):标记 “哪个应用发送的”;
    • 目标端口(80,HTTP 默认端口):标记 “目标服务器的哪个应用接收”;
    • 序列号、确认号:用于确保数据有序、不丢失(TCP 的 “可靠” 特性)。
      此时数据单元称为TCP 段(Segment),交给下层(网络层)。

步骤 3:网络层(IP 协议)封装:添加 “IP 地址信息”

  • 功能:网络层负责 “跨网络路由”,通过IP 地址确定数据的传输路径(从用户设备到目标服务器)。

  • 过程

    网络层(IP)在 TCP 段前添加

    IP 头部

    ,包含:

    • 源 IP 地址(用户设备的 IP,如192.168.1.100);
    • 目标 IP 地址(www.example.com对应的 IP,如93.184.216.34,通过 DNS 解析获得);
    • 协议类型(此处为6,表示上层是 TCP)。
      此时数据单元称为IP 数据包(Packet),交给下层(网络接口层)。

步骤 4:网络接口层(以太网协议)封装:添加 “MAC 地址信息”

  • 功能:网络接口层负责 “物理介质传输”,通过MAC 地址在局域网内识别设备(如路由器、交换机)。

  • 过程

    网络接口层(以太网)在 IP 数据包前添加

    以太网头部

    ,包含:

    • 源 MAC 地址(用户设备的网卡 MAC,如00:1A:2B:3C:4D:5E);
    • 目标 MAC 地址(局域网内下一跳设备的 MAC,通常是路由器的 MAC,如AA:BB:CC:DD:EE:FF);
    • 类型(0x0800,表示上层是 IP 协议)。
      同时在数据尾部添加帧校验序列(FCS),用于校验数据传输是否出错。
      此时数据单元称为以太网帧(Frame),通过物理介质(网线 / Wi-Fi)发送。

步骤 5:数据在网络中传输(路由转发)

  • 以太网帧从用户设备发送到路由器,路由器解析以太网头部(验证 MAC 地址是否匹配),然后移除以太网头部,提取 IP 数据包。
  • 路由器根据 IP 头部的 “目标 IP 地址”(93.184.216.34)查询路由表,确定下一跳设备(可能是其他路由器),重新封装新的以太网帧(目标 MAC 地址改为下一跳设备的 MAC),继续转发。
  • 经过多跳路由后,数据最终到达www.example.com所在的服务器局域网。

步骤 6:接收端(服务器)解封装:逐层还原数据

服务器收到数据后,按 “从下到上” 的顺序解封装:

  1. 网络接口层:验证 FCS 无误后,移除以太网头部,提取 IP 数据包,交给网络层。
  2. 网络层:解析 IP 头部,确认目标 IP 是自己,移除 IP 头部,提取 TCP 段,交给传输层。
  3. 传输层:解析 TCP 头部,通过目标端口(80)确定交给 HTTP 服务,验证序列号确保数据完整,移除 TCP 头部,提取 HTTP 请求数据,交给应用层。
  4. 应用层:HTTP 服务处理请求,生成响应数据(网页内容),然后按上述步骤反向封装,发送回用户设备。

总结:各层关系的核心体现

  • 依赖关系:应用层(HTTP)依赖传输层(TCP)的端口标识,传输层依赖网络层(IP)的地址路由,网络层依赖网络接口层(以太网)的物理传输。
  • 封装 / 解封装:发送端每层添加头部(封装),接收端每层移除头部(解封装),数据像 “剥洋葱” 一样逐层还原。
  • 独立性:如果用户切换网络(如从有线换 Wi-Fi),只需网络接口层调整 MAC 地址和传输介质,上层(IP/TCP/HTTP)无需任何修改,体现了分层设计的灵活性。

四大金刚

一个二进制文件运行起来需要四个核心部件: 可执行文件,操作系统(os),内存(ram),处理器(cpu)协同操作。

1. 可执行文件(二进制文件)

  • 作用:程序的 “静态载体”,包含计算机可直接执行的机器指令(二进制代码)、数据(如常量、初始化变量)、以及用于加载的元信息(如文件格式、内存布局描述、入口点地址等)。
  • 常见格式:Windows 的 .exe、Linux 的 ELF(Executable and Linkable Format)、macOS 的 Mach-O 等。这些格式规定了指令和数据的组织方式,让操作系统能正确解析并加载。

2. 操作系统(OS)

  • 作用

    :程序运行的 “管理者”,负责协调硬件资源并提供运行环境,核心功能包括:

    • 加载程序:将可执行文件从磁盘读入内存,根据文件中的元信息(如段表)分配内存区域(代码段、数据段、栈、堆等),并设置权限(如代码段设为只读可执行)。
    • 进程管理:为程序创建进程(或线程),分配进程控制块(PCB)记录进程状态(如 PID、寄存器值、内存映射等),并调度进程获得处理器时间。
    • 资源抽象与分配:通过系统调用(如文件操作、内存分配)为程序提供统一的硬件访问接口,避免程序直接操作硬件。
    • 内存管理:通过虚拟内存机制将程序的逻辑地址映射到物理内存,实现内存隔离(不同程序互不干扰)和高效利用(如内存分页、交换)。

3. 内存(RAM)

  • 作用

    :程序运行的 “临时数据空间”,用于存储程序执行过程中的指令和数据:

    • 代码段(Text Segment):存放可执行文件中的机器指令,供处理器读取并执行。
    • 数据段(Data Segment):存放初始化的全局变量、静态变量(编译时已知值)。
    • BSS 段:存放未初始化的全局变量、静态变量(默认初始化为 0,由操作系统在加载时分配空间)。
    • 栈(Stack):存储函数参数、局部变量、返回地址等(见前文详解)。
    • 堆(Heap):动态分配的内存(如malloc申请的空间),供程序运行时灵活使用。

4. 处理器(CPU)

  • 作用

    :程序执行的 “运算核心”,负责逐条执行内存中的机器指令:

    • 通过程序计数器(PC) 指向当前要执行的指令地址,执行后自动更新为下一条指令地址。
    • 通过寄存器暂存运算数据(如累加器、地址寄存器),加速指令执行(寄存器速度远快于内存)。
    • 执行指令时涉及的运算(如加减、逻辑判断)、内存访问(如读数据、写结果)、跳转(如函数调用)等操作,均由 CPU 完成。

运行过程

  1. 启动程序:用户通过操作系统(如调用系统的shell函数)触发程序运行请求。
  2. 加载到内存:操作系统解析可执行文件(elf文件格式),根据其元信息在内存中分配空间(代码段、数据段、栈等),将文件中的指令和数据复制到对应内存区域。
  3. 创建进程:操作系统为程序创建进程,初始化进程控制块(PCB),设置程序入口点(第一条指令的内存地址)。
  4. 调度执行:操作系统将进程放入调度队列,当分配到 CPU 时间片时,CPU 从程序入口点开始执行指令:
    • 从内存中读取指令到 CPU,解码后执行(如运算、读写内存、调用函数等)。
    • 执行过程中动态使用栈(函数调用)和堆(动态内存),操作系统负责维护内存映射和权限。
  5. 终止程序:程序执行完main函数(或调用exit)后,操作系统回收进程占用的内存、CPU 等资源,进程终止。

注意 :1.可执行文件是elf格式 启动阶段 操作系统为起分配 虚拟内存(连续)也就是在此时 堆和栈诞生(与程序的生命周期相同)其中堆需要可执行文件中具有申请堆操作 而 栈是与生俱来的。

2.程序启动的初期阶段(如创建进程、分配虚拟内存、设置堆栈)需要操作系统内核完成,因此代码运行在内核态

3.虚拟内存加载到物理内存的过程是动态且按需发生的执行到哪加载到哪 cpu 只能处理实际地址的内容

4.启动程序的过程本质是将静态的可执行文件加载到系统中,并创建对应的进程

听说hexo很好玩