学习笔记——网络基础

网络基础模型

1. OSI七层参考模型(理论标准)

这是描述计算机网络通信功能的通用框架。理解它有助于分析任何网络协议。

  • 应用层 :直接面向用户,提供如HTTP(网页)、FTP(文件传输)、SMTP(电子邮件)、DNS(域名解析) 等服务。

  • 表示层 :负责数据格式转换,如加密解密、压缩解压,确保不同系统能理解彼此的数据。

  • 会话层 :建立、管理和终止应用程序之间的会话(对话),如断点续传

  • 传输层 :提供端到端的通信,核心是TCP(可靠、面向连接)UDP(高效、无连接) 协议。

  • 网络层 :负责将数据包从源主机路由到目标主机,核心协议是 IP(网际协议)

  • 数据链路层 :在相邻节点(如通过交换机相连)间可靠传输数据帧,处理物理地址(MAC地址)寻址和差错控制

  • 物理层 :定义物理媒介(如网线、光纤)的电气、机械特性,传输比特流

2. TCP/IP四层模型(实际标准)

这是互联网实际采用的协议族,可以看作是OSI模型的简化与实践。

  • 应用层 :对应OSI的应用层表示层会话层,包含所有高层协议。

  • 传输层 :对应OSI的传输层,提供TCP/UDP

  • 网络层 :对应OSI的网络层,核心是IP协议。

  • 网络接口层 :对应OSI的数据链路层物理层

核心协议详解

1. 应用层关键协议

  • DNS :将人类可读的域名(如 www.baidu.com 翻译成机器可识别的IP地址

  • DHCP :自动为网络中的设备分配IP地址、子网掩码、网关等配置,避免手动设置的麻烦。

  • HTTP/HTTPS:用于传输网页内容。

2. 传输层核心协议

特性 TCP (传输控制协议) UDP (用户数据报协议)
连接性 面向连接(三次握手建立连接) 无连接(直接发送)
可靠性 高可靠,提供确认、重传、排序机制 不可靠,尽最大努力交付
数据形式 字节流,无边界 数据报,有边界
速度与开销 速度相对慢,头部开销大(20字节) 速度极快,延迟低,头部开销小(8字节)
典型应用 Web浏览(HTTP)、文件传输(FTP)、电子邮件 视频流、语音通话、DNS查询

3. 网络层与接口层协议

  • IP :根据IP地址在网络中寻址和路由数据包。

  • ICMP :用于网络诊断,如 ping命令 (测试连通性)和 traceroute命令(跟踪路径)。

  • ARP :在局域网内,根据IP地址 查找对应的MAC(物理)地址

Linux网络配置与C语言Socket编程

1. 常用网络配置命令

  • ifconfig / ip addr:查看和临时配置网络接口信息。

  • ping:测试与目标主机的网络连通性。

  • netstat -anp:查看本机所有的网络连接、监听端口及对应进程。

  • 永久配置 :编辑 /etc/network/interfaces 文件,然后使用 sudo /etc/init.d/networking restart 重启网络服务。

2. C语言Socket编程核心概念

  • Socket(套接字) :网络通信的端点,本质是操作系统内核提供的一个文件描述符

  • IP + 端口IP地址唯一标识网络中的一台主机;端口号(1-65535)标识主机上的一个具体应用程序。

  • 字节序 :网络传输统一使用大端字节序 。编程时需使用 htonl(), ntohl() 等函数进行主机序(通常是小端)与网络序的转换。

3. UDP Socket编程流程与关键函数

UDP通信是无连接的,流程简单,适用于对实时性要求高、可容忍少量丢失的场景。

复制代码
服务端:创建Socket -> 绑定地址 (bind) -> 接收数据 (recvfrom) -> 关闭 (close)
客户端:创建Socket -> 发送数据 (sendto) -> 关闭 (close)

关键数据结构 (struct sockaddr_in)

复制代码
#include <netinet/in.h>
struct sockaddr_in {
    sa_family_t    sin_family; // 地址族,如 AF_INET
    in_port_t      sin_port;   // 端口号(网络字节序)
    struct in_addr sin_addr;   // IP地址(网络字节序)
};
// 设置示例
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 设置端口,htons转换为主机到网络序
inet_pton(AF_INET, "192.168.1.100", &server_addr.sin_addr); // 设置IP

核心函数

  • int socket(int domain, int type, int protocol);

    • 创建一个Socket。对于UDP,type参数应为 SOCK_DGRAM
  • int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    • 服务器调用,将Socket与本地IP和端口绑定。
  • ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

    • 发送数据 。必须指定目标地址(dest_addr)。
  • ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

    • 接收数据 。可通过 src_addr 获取发送方的地址信息。

学习与实验建议

  1. 抓包分析 :使用 Wireshark 工具抓取 ping、浏览网页时的数据包,直观观察各层协议头(以太网帧头、IP头、TCP/UDP头)的结构,这是理解理论最有效的方式。

  2. 动手编码 :按流程图完成一个简单的 UDP 回声(Echo)程序 (客户端发什么,服务器原样返回什么),再进阶为 TCP 版本,体会两者的区别。

  3. 理解"边界" :重点体会UDP的数据报有边界 与TCP的字节流无边界在编程处理上的不同(TCP需要应用层自己处理消息边界,如约定长度或分隔符)。

  4. 网络调试 :在编程时,多用 netstat 命令查看你的Socket是否在正确监听或连接。

相关推荐
yashuk1 分钟前
C语言入门教程:程序结构与算法举例
c语言·算法·教程·程序设计·开发过程
zsc_1185 分钟前
pvz3解码小游戏求解算法 (二)
算法
菜_小_白5 分钟前
RTP协议收发组件开发
linux·网络·c++
Deitymoon8 分钟前
linux——UDP编程
linux·网络·udp
华普微HOPERF8 分钟前
如何善用Sub-GHz射频芯片,打造低功耗、高稳定的IoT通信网络?
网络·物联网
Amelio_Ming9 分钟前
linux内存管理-页面回收之内核线程 kswapd (二)
linux·服务器
hanbr13 分钟前
每日一题day1(Leetcode 76最小覆盖子串)
算法·leetcode
AI科技星14 分钟前
张祥前统一场论中两个电荷定义的统一性解析
开发语言·线性代数·算法·数学建模·平面
代码地平线15 分钟前
C语言实现堆与堆排序详解:从零手写到TopK算法及时间复杂度证明
c语言·开发语言·算法
小江的记录本15 分钟前
【大语言模型】大语言模型——核心概念(预训练、SFT监督微调、RLHF/RLAIF对齐、Token、Embedding、上下文窗口)
java·人工智能·后端·python·算法·语言模型·自然语言处理