学习笔记——网络基础

网络基础模型

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是否在正确监听或连接。

相关推荐
你撅嘴真丑20 分钟前
字符环 与 变换的矩阵
算法
想放学的刺客22 分钟前
单片机嵌入式试题(第29期)嵌入式系统的电源完整性设计与去耦电容选型。抗干扰设计与EMC合规性
c语言·stm32·嵌入式硬件·物联网·51单片机
早点睡觉好了37 分钟前
重排序 (Re-ranking) 算法详解
算法·ai·rag
gihigo199841 分钟前
基于全局自适应动态规划(GADP)的MATLAB实现方案
算法
酒鼎1 小时前
学习笔记(4)HTML5新特性(第3章)- WebSocket
笔记·学习·html5
qq_411262421 小时前
用 ESP32-C3 直接连 Starlink 路由器/热点并完成配网
网络·智能路由器
郝亚军1 小时前
ubuntu-18.04.6-desktop-amd64安装步骤
linux·运维·ubuntu
-Springer-1 小时前
STM32 学习 —— 个人学习笔记2-2(新建工程)
笔记·stm32·学习
Konwledging2 小时前
kernel-devel_kernel-headers_libmodules
linux
Web极客码2 小时前
CentOS 7.x如何快速升级到CentOS 7.9
linux·运维·centos